首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XLIB装饰问题

XLIB装饰问题
EN

Stack Overflow用户
提问于 2013-12-16 11:04:49
回答 1查看 746关注 0票数 2

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

第一个问题

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

代码语言:javascript
复制
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);
}

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

第二个问题

WHen我退出一个程序被销毁的窗口只是应用程序窗口而不是父装饰,如何销毁当前窗口和装饰?

我试过以下几点:

代码语言:javascript
复制
void destroy_notify_handler(XEvent local_event, Display *display){
    Window window = local_event.xdestroywindow.event;
    XDestroyWindow(display, window);
}

但我收到以下错误:

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

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

还是我得早点毁掉父母的窗户?也许在UnMapNotify的时候?但是,如何理解这个事件是仅仅因为窗口将要关闭,还是因为其他原因而启动的呢?

谢谢你的帮助:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-17 00:10:07

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

  1. 检查 "重写重定向“窗口标志
  2. 你在试图摧毁已经被摧毁的窗口。不要使用event.xdestroywindow.event窗口id,只需删除装饰窗口即可。
  3. 如果您正在编写修复WM,请不要忘记使用添加客户端窗口以保存集。这样,如果您杀死wm应用程序,窗口就不会被破坏,而是恢复到根窗口。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20609347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档