Окно установки XCB сверху не работает

Я пытаюсь настроить управляемое окно так, чтобы оно всегда было сверху. Однако этот код не работает:

Мой код js-ctypes, но это вопрос API XCB:

var rez_focus = xcb_get_input_focus_reply(c, xcb_get_input_focus(c), null);

var change_list = xcb_atom_t.array()([cachedXCBAtom('_NET_WM_STATE_ABOVE')]);
var req_change = xcb_change_property(c, XCB_PROP_MODE_REPLACE, rez_focus.focus, cachedXCBAtom('_NET_WM_STATE'), XCB_ATOM_ATOM, 32, change_list.length, change_list);

xcb_flush(c);

Я проверил, что у меня есть правильное окно, получив заголовок окна. Однако этот код выше не делает окно всегда сверху. Вы могли бы посоветовать.

У меня возникло ощущение, что окно, которое я получил, не было «окном владельца», что означает, что оно не отвечает за то, чтобы всегда быть наверху, поэтому я сделал запрос к дереву и попробовал каждое окно сверху (кроме корня), однако ни одно не работало.


xcb
person Noitidart    schedule 17.08.2016    source источник


Ответы (1)


Прежде всего, вы должны указать, с каким оконным менеджером вы это тестируете, и проверить с помощью _NET_SUPPORTED в корневом окне, что оконный менеджер поддерживает этот атом.

Во-вторых, вы нарушаете спецификацию. Непосредственная установка атома поддерживается оконным менеджером только тогда, когда окно забирается, а затем отображается. Если вы хотите сделать это для уже сопоставленного окна, вам нужно вместо этого использовать клиентское сообщение для корневого окна.

См. документацию:

Диспетчер окон ДОЛЖЕН учитывать _NET_WM_STATE всякий раз, когда отозванное окно запрашивает сопоставление. Клиент, желающий изменить состояние окна, ДОЛЖЕН отправить клиентское сообщение _NET_WM_STATE корневому окну (см. ниже). Диспетчер окон ДОЛЖЕН обновлять это свойство, чтобы отражать текущее состояние окна.

person Ingo Bürk    schedule 21.08.2016
comment
comment
Глядя на это, кажется, хорошо. Вы проверили ответ об ошибке? - person Ingo Bürk; 22.08.2016
comment
Спасибо, Инго, я не проверял ответ на ошибку, я сделаю это и сообщу :) - person Noitidart; 22.08.2016
comment
Оооо, Инго, я понял. Я получал текущее сфокусированное окно с помощью xcb_get_input_focus. Поэтому я бы отправил сообщение с этим идентификатором окна. Но когда я получил заголовок этого окна, это была пустая строка. Поэтому я опрашивал родителей с помощью xcb_query_tree, пока не нашел окно с непустым заголовком. Я отправил набор сверху в это окно (с заголовком), и он установил сверху. Есть ли способ узнать, ожидаю ли я установить это окно сверху? Я сделал xcb_send_event_checked после отправки в это окно с пустым заголовком, и при проверке не было ошибок, оно было нулевым. - person Noitidart; 22.08.2016
comment
О да. На самом деле это старая проблема. :-) Я предлагаю вам посмотреть исходный код xwininfo. У них есть функция, которая позаботится об этом (я забыл реальный алгоритм, который они используют). Учитывая, что это проверенный временем инструмент, их решение должно быть достаточно хорошим. - person Ingo Bürk; 22.08.2016
comment
Спасибо, сэр, я посмотрю прямо сейчас! :) Ваши ссылки мне очень помогли, вы кладезь знаний! - person Noitidart; 22.08.2016
comment
Привет, Инго, я проверял xwininfo здесь - opensource.apple.com/source/X11apps/X11apps-13/xwininfo/ - и я был немного сбит с толку, какая часть выбирала правильное окно для настройки. Я вижу в комментарии здесь find our window manager frame, if any, это то, что они называют window manager frame интересующим окном для установки сверху? - person Noitidart; 27.08.2016
comment
@Noitidart Вы ищете что-то вроде это, хотя Я думаю, что проверка на WM_CLASS опасна. _NET_WM_STATE было бы лучше и используется большинством других инструментов (но они ищут наоборот, сверху вниз). Однако вам действительно нужно окно с фокусом ввода? Вместо этого вам может понадобиться активное окно. Для этого требуется поддержка EWMH, но найти ее гораздо проще. Просто запросите _NET_ACTIVE_WINDOW из корневого окна. - person Ingo Bürk; 27.08.2016
comment
Просто для справки, код, который вы искали, Select_Window из здесь, который затем использует Find_Client из здесь. Однако, как я уже сказал, они выглядят наоборот. - person Ingo Bürk; 27.08.2016
comment
Большое спасибо @Ingo! Да, мне нужен сфокусированный :( Но это супер классный метод, который может пригодиться, спасибо! - person Noitidart; 27.08.2016
comment
@Noitidart Из любопытства, какой вариант использования для этого, когда активное окно не будет сфокусированным окном? :-) - person Ingo Bürk; 27.08.2016
comment
Теперь, когда я думаю об этом, я думаю, что вы правы, активное окно всегда сфокусировано. Моим личным примером использования было переопределение окна перенаправления, которое порождает диалоговое окно просмотра файлов. Теперь эта штука всплывает сзади. И я пытаюсь его продвигать. У него есть фокус, так как я могу нажать Enter, и он сохраняется. - person Noitidart; 27.08.2016
comment
Это также будет активное окно просто потому, что ваше окно переопределения перенаправления не может быть им, поскольку оно не управляется. Я бы посоветовал вам пойти с _NET_ACTIVE_WINDOW и приложить дополнительные усилия только в том случае, если по какой-то причине это не сработает. :-) - person Ingo Bürk; 27.08.2016
comment
Ох ты прав!!! Так должно быть! Супер умный! Черт, я попробую это, спасибо, сэр! - person Noitidart; 28.08.2016