的Xlib和Firefox的行为

的Xlib和Firefox的行为

本文介绍了的Xlib和Firefox的行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建一个小的窗口管理器(只是为了好玩),但我有在处理由火狐(只与应用,其他应用程序正常工作)创建的窗口的问题。

问题是,我启动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,l​​ocal_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我只有:


  1. ClientMessage

  2. UnmapNotify

代替使用火狐

,例如用XFCE4,产生的xevents更


  1. VisiblityNotify(不止一个)

  2. 揭露事件(不止一个)

但是,如果我尝试启用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的行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 12:13