Zhiyi Zhang (@zhiyi) commented about dlls/winex11.drv/window.c:
- /* check whether we have a pending configure, either directly or because _MOTIF_WM_HINTS decoration changed */
- if (!data->configure_serial && !(!data->pending_state.mwm_hints.decorations != !data->current_state.mwm_hints.decorations)) return FALSE;
- /* delay any new _NET_WM_STATE change which might trigger a ConfigureNotify when a config/_MOTIF_WM_HINTS change is pending */
- return (data->desired_state.net_wm_state ^ data->pending_state.net_wm_state) & config_notify_mask;
+}
static BOOL window_needs_config_change_delay( struct x11drv_win_data *data ) {
- static const UINT fullscreen_mask = (1 << NET_WM_STATE_MAXIMIZED) | (1 << NET_WM_STATE_FULLSCREEN);
- if (data->pending_state.wm_state != NormalState) return FALSE;
- if (data->pending_state.wm_state == WithdrawnState) return FALSE; /* window is unmapped, should be safe to make any change */ if (data->configure_serial) return TRUE; /* another config update is pending, wait for it to complete */
- return data->net_wm_state_serial && !(data->pending_state.net_wm_state & fullscreen_mask) && (data->current_state.net_wm_state & fullscreen_mask);
- /* delay any config request when a _NET_WM_STATE or _MOTIF_WM_HINTS change which might trigger a ConfigureNotify is in flight */
- return (data->net_wm_state_serial && (data->pending_state.net_wm_state ^ data->current_state.net_wm_state) & config_notify_mask) ||
(data->mwm_hints_serial && (!data->pending_state.mwm_hints.decorations != !data->current_state.mwm_hints.decorations));
Regarding `!data->pending_state.mwm_hints.decorations != !data->current_state.mwm_hints.decorations`. So changing decorations only triggers ConfigureNotify when it's from no decorations to having decorations and vice versa, but not, for example, MWM_DECOR_MENU -> MWM_DECOR_BORDER?