From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/event.c | 36 ++++++++++++++++++++++++++++++++++++ dlls/winex11.drv/window.c | 22 +++++++++------------- 2 files changed, 45 insertions(+), 13 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 589da2d723e..dc7030ea04a 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -1184,6 +1184,31 @@ static int get_window_wm_state( Display *display, Window window ) return ret; }
+/*********************************************************************** + * get_window_xembed_info + */ +static int get_window_xembed_info( Display *display, Window window ) +{ + struct + { + unsigned long version; + unsigned long flags; + } *state; + Atom type; + int format, ret = -1; + unsigned long count, remaining; + + if (!XGetWindowProperty( display, window, x11drv_atom(_XEMBED_INFO), 0, 65535, False, x11drv_atom(_XEMBED_INFO), + &type, &format, &count, &remaining, (unsigned char **)&state )) + { + if (type == x11drv_atom(_XEMBED_INFO) && get_property_size( format, count ) >= sizeof(*state)) + ret = state->flags; + XFree( state ); + } + + return ret; +} +
/*********************************************************************** * handle_wm_state_notify @@ -1271,6 +1296,16 @@ done: release_win_data( data ); }
+static void handle_xembed_info_notify( HWND hwnd, XPropertyEvent *event ) +{ + struct x11drv_win_data *data; + UINT value = 0; + + if (!(data = get_win_data( hwnd ))) return; + if (event->state == PropertyNewValue) value = get_window_xembed_info( event->display, event->window ); + window_wm_state_notify( data, event->serial, value ? NormalState : WithdrawnState ); + release_win_data( data ); +}
/*********************************************************************** * X11DRV_PropertyNotify @@ -1281,6 +1316,7 @@ static BOOL X11DRV_PropertyNotify( HWND hwnd, XEvent *xev )
if (!hwnd) return FALSE; if (event->atom == x11drv_atom(WM_STATE)) handle_wm_state_notify( hwnd, event, TRUE ); + if (event->atom == x11drv_atom(_XEMBED_INFO)) handle_xembed_info_notify( hwnd, event ); return TRUE; }
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 0d7f8536372..eb93a2a2e51 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1374,13 +1374,10 @@ static void map_window( HWND hwnd, DWORD new_style ) update_net_wm_states( data ); sync_window_style( data );
+ data->pending_state.wm_state = data->iconic ? IconicState : NormalState; + data->wm_state_serial = NextRequest( data->display ); if (data->embedded) set_xembed_flags( data, XEMBED_MAPPED ); - else - { - data->pending_state.wm_state = data->iconic ? IconicState : NormalState; - data->wm_state_serial = NextRequest( data->display ); - XMapWindow( data->display, data->whole_window ); - } + else XMapWindow( data->display, data->whole_window ); XFlush( data->display );
data->mapped = TRUE; @@ -1406,14 +1403,11 @@ static void unmap_window( HWND hwnd ) { TRACE( "win %p/%lx\n", data->hwnd, data->whole_window );
+ data->pending_state.wm_state = WithdrawnState; + data->wm_state_serial = NextRequest( data->display ); if (data->embedded) set_xembed_flags( data, 0 ); - else - { - data->pending_state.wm_state = WithdrawnState; - data->wm_state_serial = NextRequest( data->display ); - if (!data->managed) XUnmapWindow( data->display, data->whole_window ); - else XWithdrawWindow( data->display, data->whole_window, data->vis.screen ); - } + else if (!data->managed) XUnmapWindow( data->display, data->whole_window ); + else XWithdrawWindow( data->display, data->whole_window, data->vis.screen );
data->mapped = FALSE; data->net_wm_state = 0; @@ -1472,6 +1466,8 @@ void make_window_embedded( struct x11drv_win_data *data ) data->embedded = TRUE; data->managed = TRUE; sync_window_style( data ); + data->pending_state.wm_state = NormalState; + data->wm_state_serial = NextRequest( data->display ); set_xembed_flags( data, (data->mapped || data->embedder) ? XEMBED_MAPPED : 0 ); }