2010-08-06 181 views
4

上下文:在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); 
} 

現在,如果我TR音速的CreateWindow的調用之前移動glfwPlatformSetWindowTitle電話,我得到一個段錯誤 - 因爲我應該,因爲_glfwWin.win不會被定義。

我不知道如何解決這個問題,因爲要設置窗口標題,我需要_glfwWin.Win來初始化,但要初始化它,我需要創建窗口。

因此,我問:在X11中,在創建窗口之前設置窗口標題的正確方法是什麼?

謝謝!

回答

4

這在X11中是不可能的,但也不是必須的。必須有一個導致你看到的症狀的地方的錯誤。窗口標題只是窗口上的一個屬性,只有有窗口打開時,屬性才能存在。

你說「不允許xmonad正確處理它」,這意味着它不能應對名稱的更改;窗口管理員必須隨時處理設置標題,包括在創建窗口後很長時間更改標題。

的規範說什麼(http://www.x.org/docs/ICCCM/icccm.pdf)是:當窗口使得從收回狀態 過渡 「窗口管理器會檢查這些屬性的內容,雖然窗外是標誌性的將監控更改某些屬性或正常狀態。「

「從撤消狀態轉換」是glfw調用XMapWindow()的點。此時,窗口將保持未映射狀態,但WM將收到MapRequest。 WM會讀取屬性等,然後映射窗口。我見過的所有窗口管理器也處理對屬性的更改,因爲更改窗口標題非常正常。例如網頁瀏覽器的每個網址的頁面標題。

如果xmonad沒有處理更改,也許它至少等待地圖,所以也許你只需要在XMapWindow()之前設置標題。真的所有的設置都應該在MapWindow之前完成,儘管只有幾個屬性需要以前的規格。必須在它之前的道具通常不能在沒有放映的情況下進行更改。

順便提一句,_glfwPlatformSetWindowTitle不適用於除Latin-1之外的任何其他功能。現代的方法是使用XChangeProperty()設置_NET_WM_NAME和_NET_WM_ICON_NAME(設置舊的Latin-1 WM_NAME也不錯,但只能作爲後備)。