2010-07-22 2 views
2

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

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

спасибо, Джеймсе

ответ

3

вы не можете.

По существу, вы сражались бы как ад против оконного менеджера (и против пользователя в конце). Например, вы могли бы наблюдать события 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 без участия любого менеджера окон. просто запустите приложение настолько, насколько оно вам нужно, и сделайте это.

+0

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

+0

@james Но почему вы хотите окно без изменения размера. Будет ли что-то сломаться, если размер окна изменится, или вы просто навязываете свои идеи своему пользователю. Что делать, если пользователь меняет размер шрифта материала в окне? Что делать, если в окне есть какое-то сообщение, которое больше, чем вы ожидали. Если нет веских оснований, не удаляйте возможности от пользователя. – KeithB

+0

просто потому, что нет «кнопок» ничего не значит. alt + leftmouse в большинстве оконных менеджеров и от вас. вы можете задать некоторые подсказки (man XSizeHints), а совместимый диспетчер окон будет соблюдать эти «подсказки». – akira

2

Технически вы ничего не можете предотвратить, поскольку 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 является структура, которая вырезать и вставить везде (в большинстве оконных менеджеров и инструментальных средств).

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

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

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

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

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

0

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

Оставить заявку: Disable actions, move, resize, minimize, etc using python-xlib для примера кода.

Смежные вопросы