在X11中,如何在创建窗口标题之前设置窗口标题?

时间:2010-08-06 02:00:02

标签: x11

上下文:

我在xmonad下使用glfw。在创建窗口之后,Glfw显然设置了窗口标题,因此不允许xmonad正确处理它。我想修改glfw源代码,以便在创建窗口之前设置窗口标题。

问题:

所以我下载glfw-2.6,然后查看lib / x11 / x11_window.c;引起麻烦的线是:

// Create a window
_glfwWin.Win = XCreateWindow(
    _glfwLibrary.Dpy,
    RootWindow( _glfwLibrary.Dpy, _glfwWin.VI->screen ),
    0, 0,                            // Upper left corner
    _glfwWin.Width, _glfwWin.Height, // Width, height
    0,                               // Borderwidth
    _glfwWin.VI->depth,              // Depth
    InputOutput,
    _glfwWin.VI->visual,
    CWBorderPixel | CWColormap | CWEventMask,
    &wa
);

稍后关注:

_glfwPlatformSetWindowTitle( "GLFW Window" );

,其中

void _glfwPlatformSetWindowTitle( const char *title )
{
    // Set window & icon title
    XStoreName( _glfwLibrary.Dpy, _glfwWin.Win, title );
    XSetIconName( _glfwLibrary.Dpy, _glfwWin.Win, title );
}

现在,如果我在CreateWindow调用之前移动glfwPlatformSetWindowTitle调用,我会得到一个段错误 - 因为我应该这样做,因为_glfwWin.win不会被定义。

我不知道如何解决这个问题,因为设置窗口标题,我需要初始化_glfwWin.Win,但要初始化它,我需要创建窗口。

因此,我问:在X11中,在创建窗口之前设置窗口标题的正确方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

这在X11中是不可能的,但对于工作来说也不是必需的。必须有一个错误导致你所看到的症状。窗口标题只是窗口上的一个属性,属性不能存在,直到有一个窗口可以打开它们。

你说“不允许xmonad正确处理它”,这意味着它没有应对名称的更改;窗口管理器绝对必须随时处理设置标题,包括在创建窗口后很长时间更改标题。

规范(http://www.x.org/docs/ICCCM/icccm.pdf)的含义是: “当窗口生成时,窗口管理器将检查这些属性的内容 从Withdrawn状态转换,并在窗口处于Iconic或Normal状态时监视某些属性以进行更改。“

“从Withdrawn状态转换”是glfw调用XMapWindow()的点。此时,窗口将保持未映射,但WM将收到MapRequest。然后,WM将读取属性等,然后映射窗口。我见过的所有窗口管理器也会处理以后对属性的更改,因为更改窗口标题是很正常的。例如,网页浏览器每个网址上的页面标题。

如果xmonad没有处理更改,可能至少等待地图,所以也许你只需要在XMapWindow()之前设置标题。实际上所有的设置都应该在MapWindow之前完成,尽管规格之前只需要所需的几个属性。必须在它之前的道具通常不能在不取消映射的情况下进行更改。

顺便说一句,_glfwPlatformSetWindowTitle不适用于Latin-1。现代的方法是使用XChangeProperty()设置_NET_WM_NAME和_NET_WM_ICON_NAME(设置旧的Latin-1 WM_NAME也可以,但仅作为后备)。