как определить порядок наложения окон?

Пытаюсь написать свой оконный менеджер. Одна проблема, с которой я столкнулся, заключается в том, что я не понимаю, как определить, в каком порядке должны отображаться окна. Единственное средство, которое я нашел, - использовать xcb_configure_window. Но мне он кажется очень ограниченным: он позволяет либо поднять окно поверх всего, либо поместить его в самый низ (без понятия слоев или чего-то еще). Какой ограниченный функционал :(.

Что мне действительно хотелось бы сделать, так это определить порядок окон и рассказать об этом X. Или определить несколько слоев окон (например, нормальный, прежде всего, ниже всех). Так что я мог поднять (или опустить) окно по отношению к его слою. Таким образом, окна нижних слоев никогда не будут закрывать окна верхних слоев.

Итак, есть ли какая-либо другая библиотечная функция для определения порядка окон, кроме xcb_configure_window? Или мне нужно с этим жить? Это означало бы, что мне нужно отслеживать порядок окон в моем оконном менеджере.

Ссылка на соответствующую документацию XCB: https://www.x.org/releases/X11R7.6/doc/libxcb/tutorial/index.html#winstack.


person Alexandre Kandalintsev    schedule 26.10.2016    source источник


Ответы (2)


X11 дает вам только абсолютный минимум. Нет слоев или окон всегда над или всегда под ними. Вы сами реализуете все причудливые вещи, обычно в оконном менеджере, о чем вы пишете.

Нет необработанного запроса протокола на изменение порядка расположения окон сразу. Xlib имеет функцию XRestackWindows, которая делает это, но использует один запрос конфигурации для каждого окна. Псевдокод просто

 for each window in the list except the first
      change the stacking order to be under the previous window

Вот и все. Нет ничего более фантастического, чем это.

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

Другой возможный способ реализации слоев - иметь несколько прозрачных полноэкранных окон и переставлять родительские окна верхнего уровня пользователей на них, а не на корневое окно. Я не совсем уверен, что это всегда будет работать, и вам нужно так или иначе иметь дело с прозрачностью, для чего требуется оборудование, поддерживающее прозрачность, или составное расширение, или, возможно, и то, и другое.

person n. 1.8e9-where's-my-share m.    schedule 26.10.2016

Порядок окон является обязанностью менеджера окон. Окно дает подсказки о том, какого оно типа (всплывающее диалоговое окно, окно меню, экран-заставка, панель инструментов и т. Д.), После чего диспетчер окон решает, как отобразить это на экране. Это включает в себя отслеживание порядка и определение приоритета.

Есть вызов X11 для изменения порядка (XRestackWindows), но я не знаю эквивалента Xcb.

person JvO    schedule 26.10.2016
comment
XRestackWindows - это удобная функция Xlib. Нет соответствующего запроса протокола X11 и, следовательно, API XCB. - person n. 1.8e9-where's-my-share m.; 26.10.2016