Невозможно зарезервировать место для окна с помощью xcb

Я пытаюсь создать строку состояния в ржавчине, используя xcb. Я уже написал один на C++, уже используя смесь xcb и xlib, поэтому я буду использовать его в качестве точки сравнения. Я также тестирую это на openbox, который является оконным менеджером, написанным на xlib, если это имеет значение.

В настоящее время я не могу зарезервировать место для своего бара в ржавой версии. Ниже приведен полный вывод xprop

WM_CLASS(STRING) = "onyxbar"
WM_NAME(STRING) = "bar"
_NET_WM_STRUT(CARDINAL) = 0, 0, 20, 0
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 20, 0, 0, 0, 0, 0, 1920, 3840, 0, 0
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_ABOVE
_NET_WM_WINDOW_TYPE(CARDINAL) = _NET_WM_WINDOW_TYPE_DOCK

вы можете видеть, что соответствующие _NET_WM_STRUT и _NET_WM_STRUT_PARTIAL одинаковы между этим и выводом xprop для моей рабочей панели в С++:

WM_STATE(WM_STATE):
                window state: Normal
                icon window: 0x0
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_BELOW
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 0, 0, 0, 0
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
_NET_WM_ICON(CARDINAL) =        Icon (48 x 48):  (some big ascii icon)
_OB_APP_TYPE(UTF8_STRING) = "dock"
_OB_APP_TITLE(UTF8_STRING) = "bar"
_OB_APP_GROUP_CLASS(UTF8_STRING) =
_OB_APP_GROUP_NAME(UTF8_STRING) =
_OB_APP_CLASS(UTF8_STRING) =
_OB_APP_NAME(UTF8_STRING) = "limebar"
_OB_APP_ROLE(UTF8_STRING) =
_NET_WM_VISIBLE_ICON_NAME(UTF8_STRING) = "bar"
_NET_WM_VISIBLE_NAME(UTF8_STRING) = "bar"
WM_CLASS(STRING) = "limebar", "", "", "", "", ""
WM_NAME(STRING) = "bar"
_NET_WM_STRUT(CARDINAL) = 0, 0, 20, 0
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 20, 0, 0, 0, 0, 0, 1920, 3840, 0, 0
_NET_WM_DESKTOP(CARDINAL) = 4294967295
_NET_WM_STATE(ATOM) = _NET_WM_STATE_ABOVE
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK

Теперь, конечно, в выходных данных версии C++ есть дополнительная информация, но, насколько я понимаю, только _NET_WM_STRUT и _NET_WM_STRUT_PARTIAL имеют значение, когда речь идет о резервировании места. Что мне здесь не хватает?


person Keltek    schedule 28.02.2021    source источник


Ответы (1)


В вашем рабочем примере есть свойство WM_STATE. Нерабочий нет.

Это свойство устанавливается оконным менеджером, когда он управляет окном. Возможно, вы создаете окно переопределения-перенаправления в версии Rust, но не в версии C++?

person Uli Schlachter    schedule 28.02.2021
comment
Я не могу сказать наверняка, потому что мои знания обо всем, что связано с X11, ограничены, но я в основном воспроизвел вызовы xcb_change_property в ржавчине, как они есть в моей версии C++. Не знаю, что бы я делал по-другому. Я могу опубликовать точный код, если это поможет. - person Keltek; 01.03.2021
comment
При вызове xcb_create_window вы, скорее всего, не устанавливаете XCB_CW_OVERRIDE_REDIRECT в 1. В версии Rust вы каким-то образом устанавливаете этот флаг переопределения перенаправления. Это мое предположение. Если вы не видите такой разницы, то да, мне нужно увидеть код. - person Uli Schlachter; 01.03.2021
comment
Итак, я идиот, и на самом деле я устанавливал переопределение перенаправления на 1. Мне кажется странным, что этот проект, кажется, делает то же самое, но работает: github.com/drscream/lemonbar-xft/blob/xft-port/lemonbar.c#L922 - person Keltek; 02.03.2021
comment
Они устанавливают XCB_CW_OVERRIDE_REDIRECT в значение dock, которое по умолчанию равно false (строка 115). Эта переменная задается аргументом командной строки -d, который задокументирован как принудительная стыковка (используйте его, если ваш WM не совместим с EWMH). Итак, я предполагаю, что если вы запустите lemnobar-xft с -d, он также не будет резервировать место на краю экрана. - person Uli Schlachter; 02.03.2021
comment
(OverrideRedirect по умолчанию имеет значение 0/false, если не установлено явно, а код, на который вы ссылаетесь, просто явно устанавливает это неявное значение по умолчанию.) - person Uli Schlachter; 02.03.2021
comment
Спасибо за вашу помощь! Имеет смысл. - person Keltek; 02.03.2021