代码之家  ›  专栏  ›  技术社区  ›  anon

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

x11
  •  4
  • anon  · 技术社区  · 16 年前

    上下文:

    我在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 );
    }
    

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

    谢谢!

    1 回复  |  直到 16 年前
        1
  •  3
  •   Havoc P    16 年前

    这在X11中是不可能的,但也不是工作所必需的。一定是某个地方有个虫子引起了你看到的症状。窗口标题只是窗口上的一个属性,只有在有窗口可供属性使用时,属性才能存在。

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

    说明书上说了什么( http://www.x.org/docs/ICCCM/icccm.pdf )是: “当窗口生成 从撤回状态转换,并在窗口处于图标或正常状态时监视某些属性的更改。”

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

    必修的

    顺便说一句,\u glfwPlatformSetWindowTitle只适用于拉丁语-1。现代的方法是使用XChangeProperty()设置\u NET\u WM\u NAME和\u NET\u WM\u ICON\u NAME(设置旧的拉丁语-1 WM\u NAME也可以,但只能作为备用)。

    推荐文章