问题描述
我试图创建一个小的窗口管理器(只是为了好玩),但我有在处理由火狐(只与应用,其他应用程序正常工作)创建的窗口的问题。
问题是,我启动Firefox后,并加入我的装饰,看起来做工精细,但如果比如我尝试点击菜单键,(子)窗口不会出现。
有什么事发生的是,点击后,一个ClientMessage事件与以下值触发:
数据:(空)
数据:_NET_WM_STATE_HIDDEN
数据:(空)
数据:(空)
数据:(空)
现在的问题是,我不知道如何来显示窗口,哪个窗口。
我试着用:
- XRaiseWindow
- XMapWindow
- 我试图让短暂的窗口,并显示它
但没有成功。我不明白的是,如果通过菜单子窗口或不产生此客户端消息。
我应该如何显示一个窗口,在_NET_WM_STATE_HIDDEN?
另一个奇怪的问题是,接受ClientMessage后,我总是收到2 UnMapNotify活动。
我也有另外一个问题,如果我想显示文件,编辑菜单(在Firefox看来,如果我没有记错,当你preSS Alt键的。
也许火狐创建窗口的树?
这是我处理事件循环:
而(1){
XNextEvent例行(显示器,功放及; local_event);
开关(local_event.type){
案例ConfigureNotify:
configure_notify_handler(local_event,显示器);
打破;
案例MotionNotify:
motion_handler(local_event,显示器);
打破;
案例CreateNotify:
cur_win = local_event.xcreatewindow.window;
字符* window_name;
XFetchName(显示,cur_win,&安培; window_name);
的printf(窗口名称:%s \\ n,window_name);
如果(window_name!= NULL){
如果(!STRCMP(window_name,父)){
的printf(添加边框的\\ n);
XSetWindowBorderWidth(显示,cur_win,BORDER_WIDTH);
}
XFree的(window_name);
}
打破;
案例MapNotify:
map_notify_handler(local_event,显示相关信息);
打破;
案例UnmapNotify:
的printf(UnMapNotify \\ n);
打破;
案例DestroyNotify:
的printf(Destroy事件\\ n);
destroy_notify_handler(local_event,显示器);
打破;
案例按钮preSS:
的printf(事件按钮pressed \\ n);
button_handler(local_event,显示相关信息);
打破;
案例重点preSS:
的printf(键盘键pressed \\ n);
keyboard_handler(local_event,显示器);
打破;
案例ClientMessage:
的printf(------------ ClientMessage \\ n);
的printf(\\ tMessage:%S \\ n,XGetAtomName(显示器,local_event.xclient.message_type));
的printf(\\ tFormat数:%d \\ n,local_event.xclient.format);
原子的原子* =(原子*)local_event.xclient.data.l;
INT I = 0;
对于(i = 0; I< = 5;我++){
的printf(\\ t \\ TDATA%D:%S \\ n,我,XGetAtomName(显示,原子由[i]));
}
INT nchild;
窗口* child_windows;
窗口parent_window;
窗口root_window;
XQueryTree(显示,local_event.xclient.window,&安培; root_window,&安培; parent_window,&安培; child_windows,&安培; nchild);
的printf(童车的\\ tNumber数:%d \\ n,nchild);
打破;
}
现在在clientmessage其实我只是想看看收集一些信息,了解发生了什么。而我可以从上面的code看到的,是引发事件的窗口包含一个孩子(也是:是菜单或不?)
在code为MapNotify活动期间,凡我添加了装修如下:
无效map_notify_handler(XEvent local_event,显示*显示,ScreenInfos的相关信息){
的printf(----------地图通知\\ n);
XWindowAttributes win_attr;
字符* CHILD_NAME;
XGetWindowAttributes(显示,local_event.xmap.window,&安培; win_attr);
XFetchName(显示,local_event.xmap.window,&安培; CHILD_NAME);
的printf(\\ tAttributes:W:%d个 - H:%d个 - 名称:%s - ID%禄\\ n,win_attr.width,win_attr.height,CHILD_NAME,local_event.xmap.window);
窗反=无;
XGetTransientForHint(显示,local_event.xmap.window,&安培;反式);
的printf(\\ t已瞬态:%ld个\\ N,反式);
如果(CHILD_NAME!= NULL){
如果(STRCMP(CHILD_NAME,父)及和放大器; local_event.xmap.override_redirect ==假){
窗口new_win = draw_window_with_name(显示器,RootWindow(显示器,infos.screen_num),父母,infos.screen_num,
win_attr.x,win_attr.y,win_attr.width,win_attr.height + DECORATION_HEIGHT,0,
BlackPixel(显示器,infos.screen_num));
XMapWindow(显示器,new_win);
XReparentWindow(显示,local_event.xmap.window,new_win,0,DECORATION_HEIGHT);
set_window_item(local_event.xmap.window,new_win);
XSelectInput(显示,local_event.xmap.window,StructureNotifyMask);
的printf(\\ tParent窗口ID:%lu个\\ N,new_win);
put_text(显示,new_win,CHILD_NAME,9x15,10,10,BlackPixel(显示,infos.screen_num),WhitePixel(显示,infos.screen_num));
}
}
XFree的(CHILD_NAME);
}
现在有人可以帮助我的这些问题呢?不幸的是,我已经用Google搜索了很多次,但都没有成功。
要总结起来,我的问题有两个:
1.如何显示从Firefox子窗口
2.如何显示文件,编辑菜单。
更新
我发现了一些奇怪的测试火狐xev的明白了什么事件,以显示一个应用程序被解雇。我看到,在统一使用Firefox,而在另一个窗口管理器使用的是Firefox,触发的事件是完全不同的。在Unity我只有:
- ClientMessage
- UnmapNotify
,例如用XFCE4,产生的xevents更
- VisiblityNotify(不止一个)
- 揭露事件(不止一个)
但是,如果我尝试启用VisibilityChangeMask在我的WM,我收到以下事件:
- ConfigureNotify
- ClientMessage
- MapNotify
- 2 UnMapNotify
更新2
我试图读取ClientMessage窗口XWMhints属性(大概菜单窗口)和值是:
-
有关标志67 = InputHint,StateHint,WIndowGroupHint
-
有关初始状态NormalState
更新3
我想看看另一个窗口管理器是如何工作的,我一直在寻找calmwm源$ C $ C。这是我的理解是,当ClientMessage事件到达,具有_NET_WM_STATE消息时,它更新这些性能,并在_NET_WM_STATE_HIDDEN的情况下,它清除该属性,其结果将是,该属性将被删除。于是,我就更新我的code删除该财产,但它仍然没有工作。反正在client_message_handler相关更新code现在看起来是这样的:
的Atom *原子=(凌动*)local_event.xclient.data.l;
INT I = 0;
对于(i = 0; I< = 5;我++){
的printf(\\ t \\ TDATA%D:%S \\ n,我,XGetAtomName(显示,原子由[i]));
如果(ⅰ== 1){
的printf(\\ t删除属性:_NET_WM_STATE_HIDDEN \\ n);
XDeleteProperty(显示,cur_window,原子由[i]);
}
}
这只是一个测试,我敢肯定,我= 1在我的情况是_NET_WM_STATE_HIDDEN财产。
下面的链接calmwm源$ C $ C:https://github.com/chneukirchen/cwm/blob/linux/xevents.c
所以,我仍然停留在这一点上。
更新4
真的,我不知道是否有帮助,但我试图读取MapNotify事件的属性窗口,窗口map_state是IsViewable(2)。
更新5
我发现了一个类似的问题在这里SO就是使用Xlib与Python:
解决方案建议使用XSetInputFocus,我想这对我的XMapNotify处理程序:
XSetInputFocus(显示器,local_event.xmap.window,RevertToParent,CURRENTTIME);
但它仍然没有帮助,Firefox菜单仍然没有出现!
和我有右键同样的问题。
更新6
与xconfigurenotify事件和取消映射事件打我发现:
Xconfigure要求有2个窗口字段:窗口及以上,且当
该xconfigurerequest.window值相同xunmap.window价值。
和也认为xconfigurerequest.above总是在变,但xconfigurerequest.window总是在所有的事件一样。
看来,xconfigurerequest.above是关系到我想要开什么菜单。例如:
- 页面我得到一个ID(总是相同的,以后每点击)。如果右键单击
- 如果一个标签上我右clik,上述值是另外一个
- 和相同的发生,如果我离开,点击Firefox的主菜单
不过不知道是否有帮助。
真的不知道
任何人有什么想法?
使用的 - 一个易于使用的X协议跟踪程序的
这篇关于的Xlib和Firefox的行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!