Как предоставить подсказку _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
это просто структура, в которой я сохраняю атомы после запроса их значения.