Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Возможная ошибка в функции window_createпри задании атрибутов окну флагов #53

Open
Mingun opened this issue Dec 31, 2019 · 0 comments

Comments

@Mingun
Copy link
Contributor

Mingun commented Dec 31, 2019

В данном коде сразу 3 ошибки в одной строчке кода, а именно, последней:

// Set no border mode to flag window
MWMHints mwmhints;
bzero(&mwmhints, sizeof(mwmhints));
mwmhints.flags = MWM_HINTS_DECORATIONS;
mwmhints.decorations = 0;
Atom motif_prop = XInternAtom(display, "_MOTIF_WM_HINTS", False);
XChangeProperty(display, flag_window, motif_prop, motif_prop, 32, PropModeReplace, (unsigned char *) &mwmhints, PROP_MWM_HINTS_ELEMENTS);
XWMHints wmhints;
bzero(&wmhints, sizeof(wmhints));
wmhints.flags = InputHint;
wmhints.input = 0;
Atom win_prop = XInternAtom(display, "_WIN_HINTS", False);
XChangeProperty(display, flag_window, win_prop, win_prop, 32, PropModeReplace, (unsigned char *) &mwmhints, sizeof (XWMHints) / 4);

  1. Передается указатель на структуру MWMHints, а размер передается от структуры XWMHints.
  2. Следствие ошибки выше -- переменная wmhints заполняется, но не используется. Согласно https://tronche.com/gui/x/icccm/sec-4.html#WM_HINTS, атрибуты заполнены таким образом, что у должен настроится режим No Input - The client never expects keyboard input. An example would be xload or another output-only client. В принципе, логичное пожелание для окна флагов.
  3. Мало того, для задания свойства используется атом _WIN_HINTS, который требует лишь одно значение uint32_t. А передается ему туда совсем не то, что ожидается. Согласно статье http://www.dailytelefrag.ru/blog/read.php?id=67666, передача туда 0 должно отключить границу окна в GNOME окружении. На самом деле, для этого свойства используется только первое поле структуры MWMHints, а именно flags. Согласно статье по первой ссылке выше, допустимые значения там:
#define WIN_HINTS_SKIP_FOCUS      (1<<0) /*"alt-tab" skips this win*/
#define WIN_HINTS_SKIP_WINLIST    (1<<1) /*do not show in window list*/
#define WIN_HINTS_SKIP_TASKBAR    (1<<2) /*do not show on taskbar*/
#define WIN_HINTS_GROUP_TRANSIENT (1<<3) /*Reserved - definition is unclear*/
#define WIN_HINTS_FOCUS_ON_CLICK  (1<<4) /*app only accepts focus if clicked*/

Это значение устанавливается в 1L << 1, т.е. на самом деле окно получает атрибут WIN_HINTS_SKIP_WINLIST и становится неперечисляемым в списке окон. В принципе, это логично для окна флага, но точно ли это ожидалось сделать?

В итоге получается, что допустимы варианты 2 и 3 и какой из них должен быть правильным, непонятно. История Git-репозитория начинается с этой ошибки.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant