2012-12-09 71 views
2

此C函數可用於在許多窗口管理器中禁用或啓用Windows裝飾。如果'模式'是'd',窗口將隱藏裝飾,否則如果'模式'是'D',窗口會顯示它們。檢測X11窗口是否有裝飾品

void window_tune_decorations(Display *disp, Window win, char mode) { 
    long hints[5] = { 2, 0, 0, 0, 0}; 
    Atom motif_hints = XInternAtom(disp, "_MOTIF_WM_HINTS", False); 

    switch (mode) { 
     case 'D': 
      hints[2] = 1; 
      /* fall through */ 
     case 'd': 
      XChangeProperty(disp, win, motif_hints, motif_hints, 32, PropModeReplace, (unsigned char *)hints, 5); 
      break; 
     default: 
      fputs("Invalid mode.\n", stderr); 
    } 
} 

我想實現一個「切換模式」。所以我的問題是,有一種方法可以檢測窗戶是否有裝飾物? 我試着用_MOTIF_WM_HINTS使用XGetWindowProperty,但我不知道如何解釋輸出。

回答

2

您解釋從XGetWindowProperty獲得的數據,這與解釋發送至XChangeProperty的數據的方式相同。

_MOTIF_WM_HINTS的情況下,它是一個5 long s的數組,或者可能是struct MwmHints(syn.MotifWmHints)。它是一個5 long字段的結構,外加幾個#define d位標誌。它是從Motif窗口管理器繼承而來的,但是我們通常不會在當今的Motif包含和庫中保留,所以結構被複制到不同的地方(壞習慣,但所有人都這樣做)。你可以在Gnome的其他地方的xprops.h找到它的定義。在網上查找並複製到您的代碼中,或者在您已經依賴的包含文件中找到它,或者查看定義並繼續使用您選擇的數組。

您需要檢查右側字段中的正確標誌。對於裝飾,請檢查窗口是否首先被覆蓋重定向。如果是,它是未修飾的(顯然),你不能添加任何裝飾。如果窗口管理器沒有運行,它也是未修飾的,在這種情況下也不能添加任何裝飾。否則,如果該窗口根本沒有該屬性(XGetWindowProperty集合typeNone),則可以認爲它已經過裝飾。

如果它具有該屬性,並且MWM_HINTS_DECORATIONS位設置在flags中,則它具有decorations字段中由MWM_DECOR_*位值指定的裝飾。如果該字段不爲零,則存在一些裝飾品。 AFAIK如果MWM_HINTS_DECORATIONS未設置,那麼窗口(令人驚訝地)裝飾。但是請自己測試一下,我不記得現在也沒有X11機器,所以我無法檢查它。

當然,有些窗口管理器不使用_MOTIF_WM_HINTS(例如Motif之前的版本)。如果您有其中之一,則無法使用此方法檢查或設置裝飾。

別忘了XFree(hints)