Как предоставить подсказку _NET_WM_STATE_FULLSCREEN с помощью xcb?

Я пытаюсь написать полноэкранное приложение с xcb для собственного назидания, и у меня возникли проблемы с вышесказанным. Я нашел пару фрагментов кода, которые делают это с использованием Xlib, но ни одного с помощью xcb. Я нашел xcb_ewmh_connection_t структура, и я ориентировочно использую это так:

xcb_connection_t *Connection = xcb_connect(NULL, NULL);
xcb_ewmh_connection_t EWMH;
xcb_intern_atom_cookie_t *EWMHCookie = xcb_ewmh_init_atoms(Connection, &EWMH);

а затем с помощью атомов внутри структуры с EWMH._NET_WM_STATE, так далее.

Учитывая этот небольшой фон, как я могу намекнуть диспетчеру окон, что окно должно быть полноэкранным?

2 ответа

Решение

Изучение xcb_ewmh.h, мне кажется, тебе тоже нужно позвонить

if(!xcb_ewmh_init_atoms_replies(&EWMH, EWMHCookie, NULL))
    /* handle errors */;

Как только вы это сделаете, _NET_WM_STATE документация должна помочь в использовании этого конкретного свойства.

См. Раздел ICCCM " Свойства клиента" для ознакомления с этой техникой использования свойств для связи с оконным менеджером.

Посмотрите запрос ChangeProperty для того, чтобы установить свойства вообще. Это соответствует xcb_change_property функция по обычным правилам заглушки протокола.

Я надеюсь, что достаточно ссылок, чтобы вы пошли!

Я не уверен, правильный ли путь, как указано в спецификации:

Клиент, желающий изменить состояние окна, ДОЛЖЕН отправить клиентское сообщение _NET_WM_STATE в корневое окно.

До сих пор я не встречал WM, который игнорировал бы, если бы вы установили его с помощью xcb_change_property, хоть. Тем не менее, это может не работать на других WM.


[...] ДОЛЖЕН отправить [...] сообщение клиента

переведет на следующий код:

      xcb_client_message_event_t  payload = 
{
    .response_type  = XCB_CLIENT_MESSAGE,
    .type           = atoms._NET_WM_STATE,
    .format         = 32,
    .window         = window_handle,
    .data           =
    {
        .data32[0]  = fullscreen
            ? atoms._NET_WM_STATE_ADD
            : atoms._NET_WM_STATE_REMOVE,
        .data32[1]  = atoms._NET_WM_STATE_FULLSCREEN,
        .data32[2]  = XCB_ATOM_NONE
    }
};

xcb_send_event(
    conn,
    1,
    window_handle,
    XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT
    | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY,
    (const char*) &payload
);

xcb_flush(conn);

atoms это просто структура, в которой я сохраняю атомы после запроса их значения.

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