Есть ли надежный способ программно определить, что оконный менеджер полностью инициализирован?

Я хочу запустить минимальный X-сеанс только с оконным менеджером и одной полноэкранной программой. Очевидный способ сделать это — поместить что-то вроде этого в .xinitrc:

metacity & # this could be any window manager
exec my-fullscreen-app

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

Лучшее, что я придумал, это что-то вроде этого:

metacity &
while ! xprop -root | grep -q _NET_SUPPORTING_WM_CHECK
do
    sleep 0.1
done
sleep 0.3
exec my-fullscreen-app

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

Итак, есть ли лучший способ надежно определить, что оконный менеджер полностью инициализирован?


person mackstann    schedule 17.01.2011    source источник
comment
Я мог бы что-то упустить, но разве это не тот случай, когда вам вообще не нужен оконный менеджер?   -  person Karl Bielefeldt    schedule 17.01.2011
comment
Карл, вам нужен оконный менеджер, чтобы правильно отображать окно в полноэкранном режиме. Кроме того, во время работы приложение может запускать другие приложения, для правильной работы которых также требуется работающий оконный менеджер. (Кажется, я не упомянул эту часть)   -  person mackstann    schedule 17.01.2011


Ответы (1)


Короткий ответ - нет, нет никакого способа.

В частности, у metacity еще есть что сделать после установки свойства _NET_SUPPORTING_WM_CHECK.

Я думаю, что ваш подход - лучшее, что вы можете сделать.

С положительной стороны, если нет багов, гонка не должна иметь никаких эффектов, кроме косметических. (т.е. показаны вещи, которые не находятся в своем конечном состоянии)

Чтобы смягчить ситуацию, вы можете вручную установить полноэкранный размер окна, прежде чем отображать его. Затем пусть WM установит размер после этого.

person Havoc P    schedule 17.01.2011
comment
Это хороший момент в том, чтобы установить размер экрана вручную, а также использовать свойство полноэкранного режима - я думаю, что это избавит меня от большей части моего беспокойства по поводу мимолетного взгляда на окно меньшего размера. - person mackstann; 18.01.2011
comment
Вот еще одна идея: я мог бы запускать приложение с иконкой окна, а затем деиконировать окно (через EWMH, поэтому оно будет работать только после того, как WM ответит) в цикле, пока я не обнаружу, что оно действительно работает . Я предполагаю, что технически это может привести к состоянию гонки, если пользователь (или какая-либо другая программа) вручную повторно иконирует окно очень быстро, но предполагая, что угловой случай очень маловероятен, я думаю, что это сработает... - person mackstann; 18.01.2011
comment
это, вероятно, сработает, вам нужно будет правильно установить WM_STATE и другие свойства перед начальной картой. - person Havoc P; 18.01.2011
comment
Я решил не использовать иконификацию. Просто кажется, что дополнительная сложность не стоит. Кроме того, подход с установкой размера экрана не помогает, потому что Metacity отвечает Обработкой запроса на изменение размера устаревшего приложения X как полноэкранного запроса, и впоследствии невозможно выйти из полноэкранного режима без изменения размера окна... еще раз, это просто спирали в больше взломов и сложности оттуда. Поэтому я просто буду придерживаться простого/наивного подхода и не буду об этом беспокоиться. - person mackstann; 21.01.2011