В X11 как установить заголовок окна перед его созданием? - PullRequest
4 голосов
/ 06 августа 2010

Контекст:

Я использую glfw под xmonad.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 );
}

Теперь, если я попытаюсь переместить вызов glfwPlatformSetWindowTitleперед вызовом CreateWindow я получаю segfault - как я должен, так как _glfwWin.win не будет определен.

Я не знаю, как решить эту проблему, так как для установки заголовка окна мне нужен _glfwWin. Для инициализации, но для ее инициализации мне нужно создать окно.

Таким образом, я спрашиваю: в X11, как правильно установить заголовок окна перед созданием окна?

Спасибо!

1 Ответ

3 голосов
/ 07 августа 2010

Это не возможно в X11, но также не обязательно для работы вещей. Где-то должна быть ошибка, вызывающая симптомы, которые вы видите. Заголовок окна - это просто свойство окна, и свойства не могут существовать до тех пор, пока не появится окно для их включения.

Вы говорите "не позволяете xmonad правильно обрабатывать его", что означает, что он не справляется с изменениями имени; оконные менеджеры обязательно должны обрабатывать установку заголовка в любое время, включая изменение заголовка спустя много времени после создания окна.

Что говорит спецификация (http://www.x.org/docs/ICCCM/icccm.pdf): «Менеджер окон проверит содержимое этих свойств, когда окно сделает переходить из состояния снятия и будет отслеживать некоторые свойства на предмет изменений, пока окно находится в состоянии «иконическое» или «нормальное». "

«Переход из состояния снятия» - это точка, в которой glfw вызывает XMapWindow (). В этот момент окно не будет отображаться, но WM получит MapRequest. Затем WM считывает свойства и тому подобное, а затем отображает окно. Все оконные менеджеры, которые я когда-либо видел, также обрабатывают более поздние изменения в свойстве, потому что изменение заголовка окна довольно нормально. Например, веб-браузеры заголовок страницы на каждом URL.

Если xmonad не обрабатывает изменения, возможно, он по крайней мере ждет карту, поэтому, возможно, вам просто нужно установить заголовок перед XMapWindow (). На самом деле все настройки должны быть выполнены до MapWindow, хотя только несколько свойств требуют , которые должны быть перед спецификациями. Реквизит, который должен быть до того, как он, как правило, не может быть изменен без снятия карты.

Кстати, _glfwPlatformSetWindowTitle не будет работать ни для чего, кроме Latin-1. Современный способ сделать это - установить _NET_WM_NAME и _NET_WM_ICON_NAME с помощью XChangeProperty () (установка старого Latin-1 WM_NAME тоже подойдет, но только как запасной вариант).

...