Технически вы ничего не можете предотвратить, поскольку 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
Я хочу создать окно без изменения размера. возможно, это возможно, менеджеры более высокого уровня достигнут этого. например, в java вы можете установить окно как не изменяемое по размеру и отключить кнопки максимизации/уменьшения. –
@james Но почему вы хотите окно без изменения размера. Будет ли что-то сломаться, если размер окна изменится, или вы просто навязываете свои идеи своему пользователю. Что делать, если пользователь меняет размер шрифта материала в окне? Что делать, если в окне есть какое-то сообщение, которое больше, чем вы ожидали. Если нет веских оснований, не удаляйте возможности от пользователя. – KeithB
просто потому, что нет «кнопок» ничего не значит. alt + leftmouse в большинстве оконных менеджеров и от вас. вы можете задать некоторые подсказки (man XSizeHints), а совместимый диспетчер окон будет соблюдать эти «подсказки». – akira