2015-07-11 189 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