2015-11-07 94 views
0

我正在使用第一個應用程序使用c和xlib進行製作,到目前爲止它很棒,正在做我想做的!這是一個無邊界窗口,當應用程序啓動時會自動完全屏蔽。xlib將窗口推到其他窗口的背面

我的應用程序將有一些實用程序,如桌面上的時鐘和當前天氣。

所以要做到這一點,我需要能夠把我的窗口推到所有其他窗口的後面,並保持在那裏。

我的問題是,我如何將窗口推到所有其他打開的窗口後面(並且理想情況下在cairo-dock後面,但不是必需的),並將其保留在那裏?

+0

如果有*兩個*程序想要將它們各自的窗口推到所有其他窗口的背面*並將它們保留在那裏*?鬥爭!話雖如此,您可能需要嘗試在開始時調用XLowerWindow,並且每次獲得由StructureNotifyMask選擇的事件時。 –

+0

謝謝,這給了我一個工作的起點。關於與對方打架的窗口,我想我會在出現問題時找出解決辦法 –

回答

1

創建一個類型爲_NET_WM_WINDOW_TYPE_DESKTOP的窗口。

怎麼樣?嗯,這需要一些編碼,但下面做我的系統上的伎倆:

#include <X11/StringDefs.h> 
#include <X11/Xatom.h> 
#include <X11/Xlib.h> 

int main(int argc, char *argv[]) 
{ 
    Display *display = XOpenDisplay(""); 
    Window win = XCreateSimpleWindow(display, XDefaultRootWindow(display), 0, 0, 1920, 1080, 0, 0, WhitePixel(display, DefaultScreen(display))); 

    Atom window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False); 
    Atom desktop = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DESKTOP", False); 
    XChangeProperty (display, win, window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *) &desktop, 1); 

    XClearWindow(display, win); 
    XMapWindow(display, win); 

    while (1) 
    { 
    XEvent event; 

    XNextEvent(display, &event); 
    } 

    XUnmapWindow(display, win); 
    XCloseDisplay(display); 
} 

這表明重疊我現有的桌面,但被放置在程序窗口下方的白色窗口;我的KDE任務欄也仍然可見。

的幾個注意事項:

  • 你必須做XMapWindow
  • 窗口的大小應該與屏幕的大小之前設置該屬性(我存我的價值觀),或者你會得到一個錯誤請求錯誤。

當我殺死程序時,我的舊桌面返回,但這可能不適用於其他窗口管理器。試試看。

+0

這看起來可能是我需要的!我會在今晚開始的時候嘗試一下:) –

+0

這樣做!非常感謝! :) –