предотвращение максимизации / минимизации окна в системе x window - PullRequest
2 голосов
/ 22 июля 2010

Я пишу некоторый низкоуровневый код окна для окна в x (на c ++), и я хочу, чтобы пользователь не увеличивал или не уменьшал окно.Я не против, если это делается путем отклонения запроса на изменение размера или удаления самих кнопок.однако я привязан к x и не могу использовать qt или другие библиотеки более высокого уровня, которые, как я знаю, предоставляют эту функциональность.

на данный момент все, что мне удалось сделать, - это перехватить событие ResizeRequest и затем установитьобратно размер окна с использованием XResizeWindow ... но это заставляет окно на мгновение развернуться и затем вернуться в исходное состояние.Есть ли способ напрямую отклонить ResizeRequest, который, по-видимому, является правильным способом справиться с этим, но изрядное количество поиска в Google и траления документов не придумало решения.

спасибо, james

Ответы [ 3 ]

3 голосов
/ 22 июля 2010

вы не можете.

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

, который сказал: вы можете попытаться дать оконному менеджеру несколько подсказок о том, что вы считаете подходящим для окна.см. http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html#id2523223:

_NET_WM_ALLOWED_ACTIONS

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

_NET_WM_ACTION_RESIZE indicates that the window may be resized. 
(Implementation note: Window Managers can identify a non-resizable
window because its minimum and maximum size in WM_NORMAL_HINTS will 
be the same.)

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

Чего вы действительно хотите достичь?какой-то режим киоска?какой-то режим честной торговли, в котором проходящие мимо люди не могут "выключить", закрыть, изменить размер, поиграть с приложением, которое вы представляете?

если так: рассмотрите возможность запуска xsession без какого-либо оконного менеджера вообще,просто запустите свое приложение настолько большим, насколько вам нужно, и все готово.

2 голосов
/ 23 июля 2010

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

Предпочтительный современный способ сделать это - установить семантический тип _NET_WM_WINDOW_TYPE, если любой из них применим. Например, во многих WM тип диалога может подразумевать не максимизируемый. http://standards.freedesktop.org/wm-spec/1.3/

Похоже, что ни один из них не применим к вашему приложению, хотя, вероятно, вам придется установить конкретные подсказки.

Чтобы избежать максимизации, вы просто хотите, чтобы окно не изменяло размеры. Как вы обнаружили, «борьба» с изменением размера путем изменения размера назад - плохая идея. Среди прочего, он имеет потенциал бесконечного цикла.

XSetWMSizeHints () - правильный способ избежать максимизации. Установите минимальный размер = максимальный размер. вуаля, не изменяемого размера.

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

Я только что гуглил MWM, намекает на документы, и один из результатов - это то, что я предложил их документировать, 9 лет назад ;-) http://mail.gnome.org/archives/wm-spec-list/2001-December/msg00044.html К сожалению, ни один из результатов не является действительным документом.

Вы, вероятно, можете понять это из http://git.gnome.org/browse/gtk+/tree/gdk/x11/MwmUtil.h и gdk_window_set_mwm_hints () http://git.gnome.org/browse/gtk+/tree/gdk/x11/gdkwindow-x11.c#n4389

MwmUtil.h - это структура, которая вырезана и вставлена ​​везде (в большинство WM и наборов инструментов).

Подсказка _NET_WM_ALLOWED_ACTIONS устанавливается в вашем окне с помощью WM , указывая, какие функции WM решил добавить в окно. Основная цель этой подсказки заключается в том, что пейджеры, списки задач и другие компоненты рабочего стола могут затем предложить соответствующие действия для окна.

Спецификациями, которые охватывают все это, являются ICCCM (старая спецификация, все еще в основном действующая) и EMWH (новые расширения и уточнения, так как ICCCM оставил множество вещей без внимания).

Для подробностей, попробуйте исходный код ... например, recalc_window_features () в файле metacity's window.c, в настоящее время в строке 6185 http://git.gnome.org/browse/metacity/tree/src/core/window.c#n6185

Философская корректировка при кодировании X: пробег зависит от оконного менеджера. «Основные», которые обычно используют многие люди, будут следовать спецификациям и работать так, как вы и ожидаете. Тем не менее, есть все виды WM, некоторые сломаны, другие намеренно причудливы. Худшее, что вы можете сделать, это попытаться «бороться» или работать вокруг WM, потому что в основном все способы, которые это делают, могут привести к поломке приложения при работе с нормальным WM. Лучше всего сделать так, чтобы все соответствовало спецификациям, работало с обычными WM, и если вы расстроили пользователей тем, что они могут изменить размер вашего не изменяемого размера окна, потому что это позволяет их WM, вы просто должны сказать им, чтобы они жаловались тому, кто предоставляет эту WM. , Весь смысл подключаемого дизайна WM заключается в том, что WM определяет некоторые из этих действий, а не приложение.

Удачи. Современный X довольно сложен, и кодирование Xlib без инструментария вроде бы требует, чтобы все было ... не совсем правильно. Но вы, вероятно, можете сделать это достаточно хорошо. : -Р

0 голосов
/ 04 июля 2016

Это старый вопрос, но существует неофициальный, но поддерживаемый большинством оконных менеджеров способ сделать такие вещи - _MOTIF_WM_HINTS.

Смотрите здесь: Отключите действия, переместите, измените размер, сверните и т. Д., Используя python-xlib для примера кода.

...