This is an automated email from the git hooks/post-receive script. olivier pushed a commit to branch master in repository xfce/xfwm4.
commit a64b74377d7e472cd40b227349308cb3853e1d6b Author: Olivier Fourdan <four...@xfce.org> Date: Thu Nov 26 09:22:54 2015 +0100 netwm: reset decoration on netwm type change Bug: 10413 Some applications may temporarily set a transient relationship betwen their toplevel windows to maintain a stacking order, in which case we would change the decorations (as transients may not have all buttons available). However, we ought to restore the controls when this transient relationship is removed by the application, otherwise we leave the toplevels with reduced controls. Signed-off-by: Olivier Fourdan <four...@xfce.org> --- src/client.c | 57 +++++++++++++++++++++++++++++++++++++++------------------ src/client.h | 4 +++- src/events.c | 9 ++++++--- src/netwm.c | 2 ++ 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/client.c b/src/client.c index 2d13f4a..652a75e 100644 --- a/src/client.c +++ b/src/client.c @@ -952,7 +952,27 @@ clientMoveResizeWindow (Client *c, XWindowChanges * wc, unsigned long mask) } void -clientGetMWMHints (Client *c, gboolean update) +clientGetMWMHints (Client *c) +{ + ScreenInfo *screen_info; + DisplayInfo *display_info; + + g_return_if_fail (c != NULL); + g_return_if_fail (c->window != None); + + TRACE ("entering clientGetMWMHints client \"%s\" (0x%lx)", c->name, c->window); + screen_info = c->screen_info; + display_info = screen_info->display_info; + + if (c->mwm_hints) + { + g_free (c->mwm_hints); + } + c->mwm_hints = getMotifHints (display_info, c->window); +} + +void +clientApplyMWMHints (Client *c, gboolean update) { ScreenInfo *screen_info; DisplayInfo *display_info; @@ -962,29 +982,28 @@ clientGetMWMHints (Client *c, gboolean update) g_return_if_fail (c != NULL); g_return_if_fail (c->window != None); - TRACE ("entering clientGetMWMHints client \"%s\" (0x%lx)", c->name, + TRACE ("entering clientApplyMWMHints client \"%s\" (0x%lx)", c->name, c->window); screen_info = c->screen_info; display_info = screen_info->display_info; - mwm_hints = getMotifHints (display_info, c->window); - if (mwm_hints) + if (c->mwm_hints) { - if ((mwm_hints->flags & MWM_HINTS_DECORATIONS)) + if ((c->mwm_hints->flags & MWM_HINTS_DECORATIONS)) { if (!FLAG_TEST (c->flags, CLIENT_FLAG_HAS_SHAPE)) { - if (mwm_hints->decorations & MWM_DECOR_ALL) + if (c->mwm_hints->decorations & MWM_DECOR_ALL) { FLAG_SET (c->xfwm_flags, XFWM_FLAG_HAS_BORDER | XFWM_FLAG_HAS_MENU); } else { FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_HAS_BORDER | XFWM_FLAG_HAS_MENU); - FLAG_SET (c->xfwm_flags, (mwm_hints-> decorations & (MWM_DECOR_TITLE | MWM_DECOR_BORDER)) + FLAG_SET (c->xfwm_flags, (c->mwm_hints-> decorations & (MWM_DECOR_TITLE | MWM_DECOR_BORDER)) ? XFWM_FLAG_HAS_BORDER : 0); - FLAG_SET (c->xfwm_flags, (mwm_hints->decorations & (MWM_DECOR_MENU)) + FLAG_SET (c->xfwm_flags, (c->mwm_hints->decorations & (MWM_DECOR_MENU)) ? XFWM_FLAG_HAS_MENU : 0); /* FLAG_UNSET(c->xfwm_flags, XFWM_FLAG_HAS_HIDE); @@ -996,9 +1015,9 @@ clientGetMWMHints (Client *c, gboolean update) } } /* The following is from Metacity : */ - if (mwm_hints->flags & MWM_HINTS_FUNCTIONS) + if (c->mwm_hints->flags & MWM_HINTS_FUNCTIONS) { - if (!(mwm_hints->functions & MWM_FUNC_ALL)) + if (!(c->mwm_hints->functions & MWM_FUNC_ALL)) { FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_HAS_CLOSE | XFWM_FLAG_HAS_HIDE | @@ -1013,28 +1032,27 @@ clientGetMWMHints (Client *c, gboolean update) XFWM_FLAG_HAS_RESIZE); } - if (mwm_hints->functions & MWM_FUNC_CLOSE) + if (c->mwm_hints->functions & MWM_FUNC_CLOSE) { FLAG_TOGGLE (c->xfwm_flags, XFWM_FLAG_HAS_CLOSE); } - if (mwm_hints->functions & MWM_FUNC_MINIMIZE) + if (c->mwm_hints->functions & MWM_FUNC_MINIMIZE) { FLAG_TOGGLE (c->xfwm_flags, XFWM_FLAG_HAS_HIDE); } - if (mwm_hints->functions & MWM_FUNC_MAXIMIZE) + if (c->mwm_hints->functions & MWM_FUNC_MAXIMIZE) { FLAG_TOGGLE (c->xfwm_flags, XFWM_FLAG_HAS_MAXIMIZE); } - if (mwm_hints->functions & MWM_FUNC_RESIZE) + if (c->mwm_hints->functions & MWM_FUNC_RESIZE) { FLAG_TOGGLE (c->xfwm_flags, XFWM_FLAG_HAS_RESIZE); } - if (mwm_hints->functions & MWM_FUNC_MOVE) + if (c->mwm_hints->functions & MWM_FUNC_MOVE) { FLAG_TOGGLE (c->xfwm_flags, XFWM_FLAG_HAS_MOVE); } } - g_free (mwm_hints); } if (update) @@ -1337,6 +1355,10 @@ clientFree (Client *c) { XFree (c->wmhints); } + if (c->mwm_hints) + { + g_free (c->mwm_hints); + } if ((c->ncmap > 0) && (c->cmap_windows)) { XFree (c->cmap_windows); @@ -1659,7 +1681,7 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture) #endif /* HAVE_LIBSTARTUP_NOTIFICATION */ clientGetWMNormalHints (c, FALSE); - + clientGetMWMHints (c); c->size->x = c->x; c->size->y = c->y; c->size->width = c->width; @@ -1761,7 +1783,6 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture) FLAG_SET (c->wm_flags, HINTS_ACCEPT_INPUT (c->wmhints) ? WM_FLAG_INPUT : 0); clientGetWMProtocols (c); - clientGetMWMHints (c, FALSE); c->win_layer = WIN_LAYER_NORMAL; c->fullscreen_old_layer = c->win_layer; diff --git a/src/client.h b/src/client.h index 8b2080e..fd8b730 100644 --- a/src/client.h +++ b/src/client.h @@ -300,6 +300,7 @@ struct _Client XClassHint class; Client *next; Client *prev; + PropMwmHints *mwm_hints; netWindowType type; gint x; gint y; @@ -395,7 +396,8 @@ void clientReconfigure (Client *, void clientMoveResizeWindow (Client *, XWindowChanges *, unsigned long); -void clientGetMWMHints (Client *, +void clientGetMWMHints (Client *); +void clientApplyMWMHints (Client *, gboolean); void clientGetWMNormalHints (Client *, gboolean); diff --git a/src/events.c b/src/events.c index 50303b0..8aa0f0a 100644 --- a/src/events.c +++ b/src/events.c @@ -1704,7 +1704,8 @@ handlePropertyNotify (DisplayInfo *display_info, XPropertyEvent * ev) else if (ev->atom == display_info->atoms[MOTIF_WM_HINTS]) { TRACE ("client \"%s\" (0x%lx) has received a MOTIF_WM_HINTS notify", c->name, c->window); - clientGetMWMHints (c, TRUE); + clientGetMWMHints (c); + clientApplyMWMHints (c, TRUE); } else if (ev->atom == XA_WM_HINTS) { @@ -2112,13 +2113,15 @@ handleShape (DisplayInfo *display_info, XShapeEvent * ev) { update = TRUE; FLAG_SET (c->flags, CLIENT_FLAG_HAS_SHAPE); - clientGetMWMHints (c, update); + clientGetMWMHints (c); + clientApplyMWMHints (c, TRUE); } else if (!(ev->shaped) && FLAG_TEST (c->flags, CLIENT_FLAG_HAS_SHAPE)) { update = TRUE; FLAG_UNSET (c->flags, CLIENT_FLAG_HAS_SHAPE); - clientGetMWMHints (c, update); + clientGetMWMHints (c); + clientApplyMWMHints (c, TRUE); } } if (!update) diff --git a/src/netwm.c b/src/netwm.c index 51490e5..f779bc8 100644 --- a/src/netwm.c +++ b/src/netwm.c @@ -1195,6 +1195,8 @@ clientWindowType (Client * c) old_type = c->type; c->initial_layer = c->win_layer; + clientApplyMWMHints (c, FALSE); + if (c->type_atom != None) { if (c->type_atom == display_info->atoms[NET_WM_WINDOW_TYPE_DESKTOP]) -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits