Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 自定义窗口管理器:一些GTK+;3个窗口接收焦点,但不接受鼠标单击_Rust_Window Managers_Xcb_Ewmh_Icccm - Fatal编程技术网

Rust 自定义窗口管理器:一些GTK+;3个窗口接收焦点,但不接受鼠标单击

Rust 自定义窗口管理器:一些GTK+;3个窗口接收焦点,但不接受鼠标单击,rust,window-managers,xcb,ewmh,icccm,Rust,Window Managers,Xcb,Ewmh,Icccm,正如标题所说。我正在使用库用Rust编写一个自定义X11窗口管理器。一个特定的窗口——的“配置”窗口——在聚焦时不会点击按钮1,尽管取消了该窗口上的按钮1 以前,我以为那个窗口并没有对焦,但那个结果是不正确的。相反,该窗口接收焦点,但不允许任何按钮1点击 设置焦点的相关代码: #[允许(clippy::单匹配)] fn设置焦点(&mut self,窗口:xproto::window){ 如果window!=self.root&&window!=self.focus{ 让prev=自我聚焦; /

正如标题所说。我正在使用库用Rust编写一个自定义X11窗口管理器。一个特定的窗口——的“配置”窗口——在聚焦时不会点击按钮1,尽管取消了该窗口上的按钮1

以前,我以为那个窗口并没有对焦,但那个结果是不正确的。相反,该窗口接收焦点,但不允许任何按钮1点击


设置焦点的相关代码:

#[允许(clippy::单匹配)]
fn设置焦点(&mut self,窗口:xproto::window){
如果window!=self.root&&window!=self.focus{
让prev=自我聚焦;
//从上一个窗口取消选中焦点
xproto::ungrab_按钮(
赛尔夫康恩,
xproto::按钮索引1为u8,
自我关注,
0
);
//确保我们没有意外地抓住按钮1
xproto::ungrab_按钮(
赛尔夫康恩,
xproto::按钮索引1为u8,
窗口,
0
);
//看https://github.com/i3/i3/blob/b61a28f156aad545d5c54b9a6f40ef7cae1a1c9b/src/x.c#L1286-L1337
如果自我需要聚焦(窗口)
&&自聚焦(窗口)
&&窗口!=基::无
&&window!=self.root{
让客户端发送消息=
xproto::ClientMessageEvent::新建(
32,
窗口,
self.atom(“WM_协议”),
xproto::ClientMessageData::from_data32(
[
self.atom(“WM_TAKE_FOCUS”),
self.last_时间戳,
0,
0,
0
]
)
);
xproto::send_事件(self.conn、false、window、base::NONE作为u32和client_消息);
}否则{
调试!(“{}可以正常聚焦”,窗口);
xproto::设置输入焦点(
赛尔夫康恩,
xproto::输入\焦点\父级作为u8,
窗口,
self.last_时间戳,
);
}
自行更换道具(
自我根,
self.atom(“\u NET\u ACTIVE\u WINDOW”),
32,
&[窗口]
);
调试!(“用聚焦的网络状态更新网络状态!”);
self.remove_prop(prev,self.atom(“\u NET\u WM\u STATE”)、self.atom(“\u NET\u WM\u STATE\u FOCUSED”);
self.append_prop(窗口,self.atom(“\u NET\u WM\u STATE”)、self.atom(“\u NET\u WM\u STATE\u FOCUSED”);
self.focus=窗口;
调试!(“聚焦窗口:{}”,self.focus);
}如果window==self.root,则为else{
self.remove_prop(self.focus、self.atom(“\u NET\u WM\u STATE”)、self.atom(“\u NET\u WM\u STATE\u FOCUSED”);
调试!(“聚焦根->无”);
self.replace_prop(self.root、self.atom(“_NET_ACTIVE_WINDOW”)、32、&[base::NONE]);
xproto::设置输入焦点(self.conn,0,base::NONE,base::CURRENT\u TIME);
self.focus=xcb::无;
}
}
fn append_prop(&self,window:xproto::window,prop:u32,atom:u32){
//TODO:检查结果
xproto::更改\u属性(
赛尔夫康恩,
xproto::PROP_MODE_追加为u8,
窗口,
道具
xproto::ATOM\u ATOM,
32,
&[原子]
);
}
fn删除_prop(&self,window:xproto::window,prop:u32,atom:u32){
让cookie=xproto::get_属性(self.conn,false,window,prop,xproto::get_属性类型_ANY,0,4096);
匹配cookie.get_reply(){
Ok(res)=>{
匹配res.value::(){
[] => {},
值=>{
让mut新值:Vec=Vec::from(值);
新的|值。保留(|值|值!=&atom);
自我替换_属性(窗口、属性、32和新_值);
},
}
},
Err(Err)=>error!(“无法从以下位置移除道具:{:#?}”,Err),
}
}
fn需要焦点(&self,window:xproto::window)->bool{
让属性成为cookie=
xproto::get\u属性(
赛尔夫康恩,
假,,
窗口,
self.atom(“WM_协议”),
xproto::ATOM_ANY,
0,
2048
);
匹配属性\u cookie.get\u reply(){
正常(协议)=>{
let mut needs_help=false;
用于协议中的proto.value::().iter(){
匹配self.atom\u by\u id\u checked(proto){
一些(“WM_TAKE_FOCUS”)=>{
需要帮助=正确
},
_ => (),
}
}
需要帮助吗
},
//修理工
Err()=>false,
}
}
fn不获取焦点(&self,window:xproto::window)->bool{
匹配xcb_util::icccm::get_wm_提示(self.conn,window){
好(提示)=>{
如果让一些(输入)=提示。输入(){
输入
}否则{
假的
}
},
//修理工
Err()=>false,
}
}

原来我的问题是我没有正确地解开按钮1;焦点实际上是正确传递的(参见问题编辑历史记录),我只是忘记了正确取消抓取,因为我忘记了初始抓取上有一个按钮掩码。非常感谢乌利·施拉赫特在评论中帮助我解决了这个问题。

什么是“无法聚焦”呢?是“当我键入文本时,它不会出现在窗口的文本字段中”还是“窗口没有呈现为具有焦点”?另外,你有没有检查过窗口本身是否会聚焦到其他东西上?例如:您是否获得了窗口的
FocusNotify
事件以及其他事件?此外,您对如何设置焦点的描述似乎有些奇怪