为什么没有边框的窗口始终位于顶部

时间:2015-01-09 21:37:55

标签: c window x11 xlib

我试图在xlib中创建没有边框的窗口(弹出窗口?)。我使用此代码:

#include <stdio.h>
#include <X11/Xlib.h>

int main( int argc, char **argv )
{
    Display *display = NULL;
    Window window;
    XSetWindowAttributes attribs;

    display = XOpenDisplay( NULL );
    if( !display )
    {
        printf( "Cannot to open display." );
        return 1;
    }

    attribs.override_redirect = 1;

    window = XCreateWindow( display, RootWindow(display, 0), 20, 20, 400, 300, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect, &attribs );
    XSetWindowBackground( display, window, 0x00F0FF );
    XClearWindow( display, window );

    XMapWindow( display, window );
    XFlush( display );

    getchar( );
    return 0;
}

它创建没有边框的窗口,但此窗口始终位于顶部。 问题是:为什么以及如何在xlib中将其显示为普通窗口。

1 个答案:

答案 0 :(得分:3)

这就是覆盖重定向窗口的行为方式。它们设计用于实现弹出菜单和类似的窗口,这些窗口是瞬态的并且保持在其他窗口之上。

如果这不是您想要的,请不要使用override-redirect标志。相反,使用WM提示。有关提示的完整列表,请参阅here。你想告诉你WM你有哪种窗口类型(_NET_WM_WINDOW_TYPE_TOOLBAR等),而不是它的装饰方式。有关使用示例,请参阅here

如果仍然不是你想要的,请使用(有点过时的)Motif WM提示。请参阅示例here