Xlib Как Это (Удаление Оформления Окна) Работает?

Как следующий код удаляет границы окна?

//note the struct is declared elsewhere, is here just for clarity.
//code is from [http://tonyobryan.com/index.php?article=9][1]
typedef struct Hints
{
    unsigned long   flags;
    unsigned long   functions;
    unsigned long   decorations;
    long            inputMode;
    unsigned long   status;
} Hints;

//code to remove decoration
Hints hints;
Atom property;
hints.flags = 2;
hints.decorations = 0;
property = XInternAtom(display, "_MOTIF_WM_HINTS", true);
XChangeProperty(display,window,property,property,32,PropModeReplace,(unsigned char *)&hints,5);
XMapWindow(display, window);

до сих пор я понял, что атом-это своего рода идентификатор, подобный окну и дисплею, но я не могу понять, откуда взялась структура подсказок или "_MOTIF_WM_HINTS". Кто-нибудь может объяснить мне весь этот код? Заранее спасибо, Элл.

1 ответов


трудно прийти к какому-либо"официальному" стандарту или такому, но Свойство _MOTIF_WM_HINTS, похоже, происходит от... Motif toolkit (ок, вы догадался :-) ). См.сайт MotifZone.

предупреждение: то, что следует ниже, является неполным, но должно пролить свет, я надеюсь.

документация для XmNmwmDecorations, XmNmwmFunctions и XmNmwmInputMode функции инструментария указывают, что это свойство является битовой маской различных значения, используемые для управления внешним видом, функциями (изменение размера, перемещение, ...) и ввод режим, который диспетчер окон должен предоставить / предоставить окну. См.человек vendorshell или Oreilly мотив справочники, Vol6a Глава 16.

свойства являются частью всей вещи X11. В окне может быть любое количество свойства, определенные на нем. Свойства имеют имя, но настройка / получение свойства выполняются через "атом" (идентификатор видов), чтобы избежать отправки вся строка на провод для каждого вызова get / set. См.свойства и атомы

текущий оконный менеджер (если есть) может реагировать на свойство window изменения путем установки соответствующего фильтра событий и действия на PropertyNotify события или просто проверка свойств окна, когда оно сопоставляется (или перемещается, или что-то еще). Если оконный менеджер знает свойство _MOTIF_WM_HINT, он будет интерпретируйте их и (надеюсь) делайте то, что хотите. (Примечание: Я не совсем уверен, что это привилегии передаются окну менеджер, или если другие окна могут слушать эти события "PropertyNotify". Не конечно, это имеет отношение к вашему вопросу.)

поэтому код у вас работает просто отлично, пока ваш оконный менеджер знает о свойстве _MOTIF_WM_HINTS.

вы начинаете с получения атома (идентификатор / ярлык) для него с XInternAtom и установка его значения через XChangeProperty() перед тем, как окно будет фактически нарисовано через MapWindow () (не уверен, что это бы работа, если вы делаете это после MapWindow (), это может зависеть от вашего окна менеджер.)

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

Я не могу придумать где-то" Официальный " с определением этой структуры. Он определен в lib/X11 / MwmUtils.h распределения openmotif-2.3.3. Не уверен, как это .используется запись flags (не удается найти код для жизни меня: -/) но я подозреваю, что он используется, чтобы указать, на какой из {decoration, function, inputMode} "под-свойств" вы действуете. (Не верьте мне на слово.)

в качестве примечания, использование _MOTIF_WM_HINTS может быть не лучшим вариантом сейчас. Вы смотрели на расширенные подсказки оконного менеджера спецификация и другая информация/стандарты/проекты на freedesktop? Держу пари, что большинство" современных " оконных менеджеров / настольных сред/кухонных раковин будет стремиться придерживаться этого, а не сохранять обратную совместимость с мотивом. Все зависит от того, для чего вы кодируете.

Спасибо за чтение :-)