2013-12-16 56 views
1

我正在寫一個小窗口管理器,在窗口周圍添加一個基本的裝飾,但實際上我有幾個關於添加/刪除窗口裝飾的問題。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?但是,如果僅僅因爲窗戶將被關閉或出於其他原因而啓動活動,該如何解決?

感謝您的幫助:)

回答

1

閱讀EWMH規範,你會發現你所有的問題。

  1. Checkoverride redirect」 窗口標誌
  2. 您試圖 摧毀這已經破壞了窗口。而不是使用 event.xdestroywindow.event窗口ID只是刪除您的裝飾 窗口。
  3. 不要忘記add client window to save set如果你是 寫作reparenting WM。這樣,如果你殺死WM應用程序窗口 不被破壞,但重新回到根窗口
+0

#2:問題是,我不明白如何刪除裝飾窗口。由於如果子窗口被銷燬,我無法訪問父窗口。你可以解釋嗎? – Ivan

+0

在某處記住你的'new_win'(例如,在密鑰是主窗口ID的散列中) –

+0

好的,明白!謝謝。 – Ivan