Создать окно без заголовка

Я пытаюсь создать простую панель для Openbox в Arch Linux, используя C++, но я не могу понять, как удалить строку заголовка из окна.

Я создаю окно с XCreateWindow(...)и это дает окно с правильным размером, но оно содержит строку заголовка, и окно также открывается в верхнем левом углу экрана, независимо от того, какие координаты смещения я указываю.

Я прочитал здесь, что обе эти проблемы, вероятно, вызваны оконным менеджером (Openbox), который переопределяет атрибуты окна, которые я указал в XCreateWindow(..., &window_attributes), Это можно решить, добавив window_attributes.override_redirect = True;Хотя это, похоже, ничего не делает для меня. Когда я пытаюсь это сделать, я получаю то же самое окно, что и раньше. (Я скомпилировал файл после этого изменения.)

Также я прочитал код Tint2 ( ссылка), который является еще одной панелью для Openbox. Они создают окно, используя следующий код:

XSetWindowAttributes att = { .colormap=server.colormap, .background_pixel=0, .border_pixel=0 };
p->main_win = XCreateWindow(server.dsp, server.root_win, p->posx, p->posy, p->area.width, p->area.height, 0, server.depth, InputOutput, server.visual, mask, &att);

Я не вижу override_redirect где-нибудь в их коде, поэтому я не уверен, как они удаляют строку заголовка.

В качестве дополнительной информации я подумал, что стоит упомянуть, как я выполняю скрипт:

/* The c++ file is saved as 'panel.cpp' */
$ gcc panel.cpp -lX11 -o panel
$ ./panel

Кроме того, я запускаю Arch Linux через VirtualBox с Windows 8 в качестве хоста. Я не уверен, что это что-то изменит, но упоминать не повредит.

2 ответа

Поскольку я нашел решение, я решил опубликовать решение здесь, если кому-то еще это понадобится.

Как упомянул @JoachimPileborg, мне нужно было изменить настройки Openbox в ~/.config/openbox/rc.xml, Внутри <applications> тег, я добавил следующий код:

<application class="*">
  <decor>no</decor>
  <position force="no"></position>
</application>

class="*" означает, что все приложения будут следовать этим правилам, вместо этого вы можете указать имя класса приложения. <decor>no</decor> удаляет строку заголовка и <position force="no"></position> гарантирует, что мой собственный скрипт может обрабатывать позиционирование. Вы также можете добавить еще <application> Отметьте после этого, чтобы сделать исключения из этого правила.

Так же window_attributes.override_redirect = True; больше не нужен.

Более правильным способом является использование подсказок в расширенном диспетчере окон.

Идея состоит в том, что вы не говорите диспетчеру окон, как украшать или нет ваше окно, вы просто указываете тип окна с помощью_NET_WM_WINDOW_TYPE:

Atom window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
long value = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty(display, your_window, window_type,
   XA_ATOM, 32, PropModeReplace, (unsigned char *) &value,1 );

"Док" - это тип для панелей и панели задач. Обычно они не украшены и появляются на всех рабочих столах. Как написано в документации, ранее _MOTIF_WM_HINTS свойство было использовано для определения внешнего вида и оформления окна. Оконные менеджеры все еще поддерживают это, но _NET_WM_WINDOW_TYPE предпочтительнее, так как описывает функцию и позволяет оконному менеджеру (и пользователю) выбирать внешний вид и поведение окна этого типа.

Другим интересным свойством для панели является _NET_WM_STRUT_PARTIAL, чтобы "зарезервировать" пространство.

Другие вопросы по тегам