XLIB装饰问题

时间:2013-12-16 11:04:50

标签: xlib window-managers

我正在写一个小窗口管理器,在窗口周围添加一个基本装饰,但实际上我有几个关于添加/删除窗口装饰的问题。

第一个问题

实际上装饰是在 MapNotify 事件期间添加的,但似乎不是一个好主意,因为每次使用新窗口触发mapnotify时,它也会对应用程序打开的菜单添加装饰,但我只想在主窗口添加装饰。也许我必须检查当前窗口是否是另一个窗口的孩子?实际上我的代码只是创建了一个具有特定名称的装饰窗口,所以在每个MapNotify请求中,我给装饰窗口一个虚拟名称(Parent),以便在装饰窗口上启动MapNotify事件时将其与所有其他窗口区分开来,至少它不会增加另一种装饰。 但我不明白MapNotify是否不仅针对父窗口而且针对childrend推出,可能风险是我添加了多个装饰窗口。 实际代码如下:

void map_notify_handler(XEvent local_event, Display* display, ScreenInfos infos){
    printf("Map Notify\n");
    XWindowAttributes win_attr;
    char *child_name;
    XGetWindowAttributes(display, local_event.xmap.window, &win_attr);
    XFetchName(display, local_event.xmap.window, &child_name);
    printf("Attributes: W: %d - H: %d - Name: %s\n", win_attr.width, win_attr.height, child_name);
    if(child_name!=NULL){
      if(strcmp(child_name, "Parent")){
        Window new_win = draw_window_with_name(display, RootWindow(display, infos.screen_num), "Parent", infos.screen_num, 
                           win_attr.x, win_attr.y, win_attr.width, win_attr.height+DECORATION_HEIGHT, 0, 
                           BlackPixel(display, infos.screen_num));
        XMapWindow(display, new_win);
        XReparentWindow(display,local_event.xmap.window, new_win,0, DECORATION_HEIGHT);
        XSelectInput(display, local_event.xmap.window, SubstructureNotifyMask);
        put_text(display, new_win, child_name, "9x15", 10, 10, BlackPixel(display,infos.screen_num), WhitePixel(display, infos.screen_num));
      }
    }
    XFree(child_name);
}

那么如何避免在除主应用程序窗口之外的每个窗口上添加装饰(或者弹出窗口,有一种方法可以区分窗口的类型?我怎么能搞清楚?)

第二个问题

当我退出一个程序时,被破坏的窗口只是应用程序窗口而不是父装饰,如何破坏当前窗口以及装饰?

我尝试了以下内容:

void destroy_notify_handler(XEvent local_event, Display *display){
    Window window = local_event.xdestroywindow.event;
    XDestroyWindow(display, window);
}

但我收到以下错误:

  

发生错误:BadWindow(Window参数无效)

我使用event而不是window,因为它似乎包含父窗口(我从那里读取它:http://tronche.com/gui/x/xlib/events/window-state-change/destroy.html) 但即使我使用窗口我也有同样的问题。

或许我必须先破坏父窗口?也许在UnMapNotify期间?但是如何理解事件是否因为窗口将要关闭或出于其他原因而启动?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

阅读EWMH规范,您将找到所有问题的答案。

  1. Checkoverride redirect”窗口标志
  2. 你正在努力 摧毁已被摧毁的窗户。而不是使用 event.xdestroywindow.event窗口id只是删除你的装饰 窗口。
  3. 如果你是,请不要忘记add client window to save set 写重新写的WM。这样,如果你杀了wm应用程序窗口 没有被销毁,但被重新归还到根窗口