window_update_motif_hints(): uint32_t for fields, fixes #2238

xcb_get_property_value() returns 32-bit property fields
This commit is contained in:
Marcin Szewczyk 2016-03-02 22:00:40 +01:00
parent 6fe8d30d65
commit ad36e32764
1 changed files with 19 additions and 8 deletions

View File

@ -320,6 +320,9 @@ void window_update_motif_hints(i3Window *win, xcb_get_property_reply_t *prop, bo
* https://people.gnome.org/~tthurman/docs/metacity/xprops_8h-source.html * https://people.gnome.org/~tthurman/docs/metacity/xprops_8h-source.html
* http://stackoverflow.com/questions/13787553/detect-if-a-x11-window-has-decorations * http://stackoverflow.com/questions/13787553/detect-if-a-x11-window-has-decorations
*/ */
#define MWM_HINTS_FLAGS_FIELD 0
#define MWM_HINTS_DECORATIONS_FIELD 2
#define MWM_HINTS_DECORATIONS (1 << 1) #define MWM_HINTS_DECORATIONS (1 << 1)
#define MWM_DECOR_ALL (1 << 0) #define MWM_DECOR_ALL (1 << 0)
#define MWM_DECOR_BORDER (1 << 1) #define MWM_DECOR_BORDER (1 << 1)
@ -333,17 +336,23 @@ void window_update_motif_hints(i3Window *win, xcb_get_property_reply_t *prop, bo
return; return;
} }
/* The property consists of an array of 5 uint64_t's. The first value is a bit /* The property consists of an array of 5 uint32_t's. The first value is a
* mask of what properties the hint will specify. We are only interested in * bit mask of what properties the hint will specify. We are only interested
* MWM_HINTS_DECORATIONS because it indicates that the second value of the * in MWM_HINTS_DECORATIONS because it indicates that the third value of the
* array tells us which decorations the window should have, each flag being * array tells us which decorations the window should have, each flag being
* a particular decoration. */ * a particular decoration. Notice that X11 (Xlib) often mentions 32-bit
uint64_t *motif_hints = (uint64_t *)xcb_get_property_value(prop); * fields which in reality are implemented using unsigned long variables
* (64-bits long on amd64 for example). On the other hand,
* xcb_get_property_value() behaves strictly according to documentation,
* i.e. returns 32-bit data fields. */
uint32_t *motif_hints = (uint32_t *)xcb_get_property_value(prop);
if (motif_border_style != NULL && motif_hints[0] & MWM_HINTS_DECORATIONS) { if (motif_border_style != NULL &&
if (motif_hints[1] & MWM_DECOR_ALL || motif_hints[1] & MWM_DECOR_TITLE) motif_hints[MWM_HINTS_FLAGS_FIELD] & MWM_HINTS_DECORATIONS) {
if (motif_hints[MWM_HINTS_DECORATIONS_FIELD] & MWM_DECOR_ALL ||
motif_hints[MWM_HINTS_DECORATIONS_FIELD] & MWM_DECOR_TITLE)
*motif_border_style = BS_NORMAL; *motif_border_style = BS_NORMAL;
else if (motif_hints[1] & MWM_DECOR_BORDER) else if (motif_hints[MWM_HINTS_DECORATIONS_FIELD] & MWM_DECOR_BORDER)
*motif_border_style = BS_PIXEL; *motif_border_style = BS_PIXEL;
else else
*motif_border_style = BS_NONE; *motif_border_style = BS_NONE;
@ -351,6 +360,8 @@ void window_update_motif_hints(i3Window *win, xcb_get_property_reply_t *prop, bo
FREE(prop); FREE(prop);
#undef MWM_HINTS_FLAGS_FIELD
#undef MWM_HINTS_DECORATIONS_FIELD
#undef MWM_HINTS_DECORATIONS #undef MWM_HINTS_DECORATIONS
#undef MWM_DECOR_ALL #undef MWM_DECOR_ALL
#undef MWM_DECOR_BORDER #undef MWM_DECOR_BORDER