我正在寫一個小窗口管理器,在窗口周圍添加一個基本的裝飾,但實際上我有幾個關於添加/刪除窗口裝飾的問題。XLIB裝飾問題
首先問
其實在MapNotify事件裝飾加入,但它似乎不是一個好主意,因爲它也添加裝飾用的應用程序每次的mapnotify被觸發打開菜單用一個新窗口,但我只想添加裝飾到主窗口。也許我必須檢查當前窗口是否是另一個窗口的子窗口?其實我的代碼只是創建一個具有特定名稱的裝飾窗口,所以在每個MapNotify請求中,如果在裝飾窗口上啓動MapNotify事件,我會給裝飾窗口一個虛擬名稱(Parent),以此方式將它與所有其他窗口區分開來,至少它不會添加其他裝飾。 但我不明白,如果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);
}
但我收到以下錯誤:
Error occurred: BadWindow (invalid Window parameter)
我用的事件,而不是窗口,因爲它似乎包含父窗口(我讀了它從那裏:http://tronche.com/gui/x/xlib/events/window-state-change/destroy.html) 但即使我使用窗口我有同樣的問題。
或者,也許我必須在早些時候銷燬父窗口?也許在UnMapNotify?但是,如果僅僅因爲窗戶將被關閉或出於其他原因而啓動活動,該如何解決?
感謝您的幫助:)
#2:問題是,我不明白如何刪除裝飾窗口。由於如果子窗口被銷燬,我無法訪問父窗口。你可以解釋嗎? – Ivan
在某處記住你的'new_win'(例如,在密鑰是主窗口ID的散列中) –
好的,明白!謝謝。 – Ivan