Как в X11 установить заголовок окна перед его созданием?

Контекст:

Я использую 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.Win был инициализирован, но для его инициализации мне нужно создать окно.

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

Спасибо!


x11
person anon    schedule 06.08.2010    source источник


Ответы (1)


Это невозможно в 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 тоже подойдет, но только как запасной вариант).

person Havoc P    schedule 07.08.2010