相关疑难解决方法(0)

Xlib和Firefox的行为

我正在尝试创建一个小窗口管理器(只是为了好玩),但我在处理由Firefox创建的窗口时遇到问题(只有该应用程序,其他应用程序工作正常)

问题是,在我启动Firefox后,添加我的装饰,它似乎工作正常,但如果我尝试单击菜单按钮,则不会出现(子)窗口.

似乎发生的是,在单击之后,会使用以下值触发ClientMessage事件:

Data: (null)
Data: _NET_WM_STATE_HIDDEN
Data: (null)
Data: (null)
Data: (null)
Run Code Online (Sandbox Code Playgroud)

现在的问题是我不知道如何显示窗口,哪个窗口.我尝试过:

  • XRaiseWindow
  • XMapWindow
  • 我试图获得瞬态窗口并显示它

但没有成功.我不明白的是,如果此客户端消息是由菜单子窗口生成的.

我应该如何显示_NET_WM_STATE_HIDDEN中的窗口?

另一个奇怪的问题是,在收到ClientMessage后,我总是收到2个UnMapNotify事件.

我还有另一个问题,如果我想显示"文件,编辑"菜单(在Firefox中显示,如果我没记错,当你按下Alt键时).

也许Firefox创建了一个窗口树?

这是我处理事件的循环:

while(1){
    XNextEvent(display, &local_event);
    switch(local_event.type){
        case ConfigureNotify:
            configure_notify_handler(local_event, display);
        break;
        case MotionNotify:
            motion_handler(local_event, display);
        break;
        case CreateNotify:
            cur_win = local_event.xcreatewindow.window;
            char *window_name;
            XFetchName(display, cur_win, &window_name);
            printf("Window name: %s\n", window_name);
            if(window_name!=NULL){
                if(!strcmp(window_name, "Parent")){
                    printf("Adding borders\n");
                    XSetWindowBorderWidth(display, cur_win, BORDER_WIDTH);
                }
                XFree(window_name);
            }
        break;
        case MapNotify:
            map_notify_handler(local_event,display, infos);
        break;
        case UnmapNotify: 
            printf("UnMapNotify\n");
        break;
        case DestroyNotify:
            printf("Destroy Event\n");
            destroy_notify_handler(local_event,display);
        break;
        case ButtonPress: …
Run Code Online (Sandbox Code Playgroud)

c x11 xlib

61
推荐指数
1
解决办法
1360
查看次数

标签 统计

c ×1

x11 ×1

xlib ×1