XLIB 装修问题

标签 xlib window-managers

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

第一个问题

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

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);
}

但我收到以下错误:

Error occurred: BadWindow (invalid Window parameter)

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

或者也许我必须提前销毁父窗口?也许在 UnMapNotify 期间?但是如何理解事件的启动是因为窗口即将关闭还是其他原因呢?

感谢您的帮助:)

最佳答案

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

  1. Check "override redirect "窗口标志
  2. 你正在努力 销毁已经被销毁的窗口。而不是使用 event.xdestroywindow.event窗口id只是删除你的装饰 window 。
  3. 别忘了add client window to save set如果你是 写作重新养育WM。这样如果你杀死 wm 应用程序窗口 不会被破坏,而是重新定位回根窗口

关于XLIB 装修问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20609347/

相关文章:

window-managers - Windows 的窗口管理器的名称

c - xlib 是否有事件窗口事件?

ruby - 当前稳定的 ruby​​ xlib 包装器?

apache-flex - 由于没有可用的图形环境而发生错误

c++ - X11 中每个窗口的 Display 都是唯一的吗?

performance - 轻量级 X 窗口管理器/环境

c++ - X11/Xlib : Create "GlassPane"-Window

lua - 每个标签列表项都有不同的背景颜色 AwesomeWM

java - 创建覆盖 Activity

cocoa - 如何在屏幕上的特定点找到窗口以进行屏幕截图/屏幕录制?