我正在编写一个小窗口管理器,它在窗口周围添加了一个基本的装饰,但实际上我有几个关于添加/删除窗口装饰的问题。
第一个问题
实际上,装饰是在MapNotify事件期间添加的,但它似乎不是一个好主意,因为它还将装饰添加到应用程序每次使用新窗口触发映射通知时打开的菜单中,但我只想将装饰添加到主窗口。也许我必须检查一下当前的窗口是否是另一个窗口的子窗口?实际上,我的代码只是创建带有特定名称的装饰窗口,因此在每次MapNotify请求时,我都给装饰窗口一个虚拟名称(父),以便在装饰窗口上启动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);
}那么,除了主应用程序窗口(或者弹出窗口)之外,如何避免在每个窗口上添加装饰,有一种区分窗口类型的方法?我怎样才能弄清楚呢?)
第二个问题
WHen我退出一个程序被销毁的窗口只是应用程序窗口而不是父装饰,如何销毁当前窗口和装饰?
我试过以下几点:
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的时候?但是,如何理解这个事件是仅仅因为窗口将要关闭,还是因为其他原因而启动的呢?
谢谢你的帮助:)
发布于 2013-12-17 00:10:07
阅读EWMH规范,您将找到所有问题的答案。
https://stackoverflow.com/questions/20609347
复制相似问题