2015-07-11 215 views
2

大家下午好!我一直在研究一個需要沒有標題欄的基本窗口的項目。在網上瀏覽了一下之後,我碰到了這個帖子create window without titlebar,回覆中提到使用了「_NET_WM_WINDOW_TYPE_DOCK」原子。我嘗試使用下面的代碼來創建一個在我的項目:沒有標題欄的簡單窗口

Display* d = fl_display; 
XWindow w = XCreateSimpleWindow(d, RootWindow(d, fl_screen), 
    0, 0, 
    400, 100, 
    0, 
    0x000000, 0x000000); 

Atom window_type = XInternAtom(d, "_NET_WM_WINDOW_TYPE", False); 
long value = XInternAtom(d, "_NET_WM_WINDOW_TYPE_DOCK", False); 
XChangeProperty(d, w, window_type, XA_ATOM, 32, PropModeReplace, (uchar*) &value, 1); 

窗口沒有顯示,但它仍然有一個標題欄。我在網絡上發現了其他幾個資源,但我無法停止顯示標題欄。我意識到引用的文章是使用XCreateWindow,但不應該在XCreateSimpleWindow上也使用原子。任何幫助,將不勝感激!

感謝

+0

還有舊['_MOTIF_WM_HINTS'](http://stackoverflow.com/questions/5134297/xlib-how-does-this-removing-window-decoration-work)。你在使用哪個窗口管理器? – Leiaz

+0

該項目實際上是WM :)我試圖建立一個alt選項卡窗口來顯示正在運行的窗口。我認爲DOCK會更適合這項任務嗎? – user1646428

+0

所以......你在窗口上繪製標題欄?修改你的WM,以便它會尊重'_NET_WM_WINDOW_TYPE'提示,而不是繪製該標題欄? :) – Leiaz

回答

3

我已經延長你的例子有點能夠測試出來,它爲我工作 - 看是否有對代碼進行任何有意義的差異。

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

int main(int argc, char **argv) { 
    Display* d = XOpenDisplay(NULL); 
    int s = DefaultScreen(d); 
    Window w = XCreateSimpleWindow(d, RootWindow(d, s), 100, 100, 400, 100, 1, 
           BlackPixel(d, s), WhitePixel(d, s)); 
    Atom window_type = XInternAtom(d, "_NET_WM_WINDOW_TYPE", False); 
    long value = XInternAtom(d, "_NET_WM_WINDOW_TYPE_DOCK", False); 
    XEvent e; 
    XChangeProperty(d, w, window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *) &value, 1); 
    XMapWindow(d, w); 
    while (1) { 
    XNextEvent(d, &e); 
    if (e.type == Expose) { 
     XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); 
    } 
    if (e.type == KeyPress) 
     break; 
    } 
    XCloseDisplay(d); 
    return 0; 
} 
+0

感謝您的幫助vukung!我的演示還有另外兩個傳統的測試窗口(標題欄,按鈕等),如果我實現了你的代碼,所有的敷料都會從其他窗口中消失,並且看起來會鎖定它。額外的窗口似乎顯示雖然。我爲'd'和's'變量使用不同的值。思考? – user1646428