Xlib Как это работает (удаление оформления окна)? - PullRequest
9 голосов
/ 27 февраля 2011

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

//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);

Пока что я понял, что Atom - это своего рода идентификатор, похожий на Window и Display, но я не могу понять, откуда взялись структура Hints или "_MOTIF_WM_HINTS". Может кто-нибудь объяснить мне весь этот код? Заранее спасибо, эл.

1 Ответ

9 голосов
/ 03 марта 2011

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

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

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

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

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

Итак, ваш код работает нормально, пока ваш оконный менеджер знает о свойстве _MOTIF_WM_HINTS.

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

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

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

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

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

...