Module: wine Branch: master Commit: d0e14bf7092af65c1ff938d3c4fddd1259967f95 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d0e14bf7092af65c1ff938d3c4...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Mar 5 16:52:22 2008 +0100
winex11: Wait for a window to move out of withdrawn state before withdrawing it again.
---
dlls/winex11.drv/event.c | 37 +++++++++++++++++++++---------------- dlls/winex11.drv/winpos.c | 7 ++++--- dlls/winex11.drv/x11drv.h | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 3373cf7..cdd0853 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -654,35 +654,40 @@ static void EVENT_PropertyNotify( HWND hwnd, XEvent *xev ) /* event filter to wait for a WM_STATE change notification on a window */ static Bool is_wm_state_notify( Display *display, XEvent *event, XPointer arg ) { - return (event->type == PropertyNotify && - event->xproperty.window == (Window)arg && - event->xproperty.atom == x11drv_atom(WM_STATE)); + if (event->xany.window != (Window)arg) return 0; + return (event->type == DestroyNotify || + (event->type == PropertyNotify && event->xproperty.atom == x11drv_atom(WM_STATE))); }
/*********************************************************************** * wait_for_withdrawn_state */ -void wait_for_withdrawn_state( Display *display, struct x11drv_win_data *data ) +void wait_for_withdrawn_state( Display *display, struct x11drv_win_data *data, BOOL set ) { DWORD end = GetTickCount() + 2000;
- if (!data->whole_window || !data->managed) return; + if (!data->managed) return;
- while (data->wm_state != WithdrawnState && - !process_events( display, is_wm_state_notify, data->whole_window )) - { - struct pollfd pfd; - int timeout = end - GetTickCount(); + TRACE( "waiting for window %p/%lx to become %swithdrawn\n", + data->hwnd, data->whole_window, set ? "" : "not " );
- TRACE( "waiting for window %p/%lx to become withdrawn\n", data->hwnd, data->whole_window ); - pfd.fd = ConnectionNumber(display); - pfd.events = POLLIN; - if (timeout <= 0 || poll( &pfd, 1, timeout ) != 1) + while (data->whole_window && ((data->wm_state == WithdrawnState) == !set)) + { + if (!process_events( display, is_wm_state_notify, data->whole_window )) { - FIXME( "window %p/%lx wait timed out\n", data->hwnd, data->whole_window ); - return; + struct pollfd pfd; + int timeout = end - GetTickCount(); + + pfd.fd = ConnectionNumber(display); + pfd.events = POLLIN; + if (timeout <= 0 || poll( &pfd, 1, timeout ) != 1) + { + FIXME( "window %p/%lx wait timed out\n", data->hwnd, data->whole_window ); + break; + } } } + TRACE( "window %p/%lx state now %d\n", data->hwnd, data->whole_window, data->wm_state ); }
diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c index b2f7a3f..e1e36dc 100644 --- a/dlls/winex11.drv/winpos.c +++ b/dlls/winex11.drv/winpos.c @@ -151,8 +151,8 @@ void X11DRV_SetWindowStyle( HWND hwnd, DWORD old_style ) X11DRV_set_wm_hints( display, data ); if (!data->mapped) { - TRACE( "mapping win %p\n", hwnd ); - wait_for_withdrawn_state( display, data ); + TRACE( "mapping win %p/%lx\n", hwnd, data->whole_window ); + wait_for_withdrawn_state( display, data, TRUE ); X11DRV_sync_window_style( display, data ); wine_tsx11_lock(); XMapWindow( display, data->whole_window ); @@ -392,6 +392,7 @@ void X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, UINT swp_flags, if (data->mapped && (!(new_style & WS_VISIBLE) || !X11DRV_is_window_rect_mapped( rectWindow ))) { TRACE( "unmapping win %p/%lx\n", hwnd, data->whole_window ); + wait_for_withdrawn_state( display, data, FALSE ); wine_tsx11_lock(); if (data->managed) XWithdrawWindow( display, data->whole_window, DefaultScreen(display) ); else XUnmapWindow( display, data->whole_window ); @@ -413,7 +414,7 @@ void X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, UINT swp_flags, if (!data->mapped) { TRACE( "mapping win %p/%lx\n", hwnd, data->whole_window ); - wait_for_withdrawn_state( display, data ); + wait_for_withdrawn_state( display, data, TRUE ); X11DRV_sync_window_style( display, data ); wine_tsx11_lock(); XMapWindow( display, data->whole_window ); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 59685e9..2ef2f1f 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -697,7 +697,7 @@ extern Drawable create_glxpixmap( Display *display, XVisualInfo *vis, Pixmap par extern void flush_gl_drawable( X11DRV_PDEVICE *physDev );
extern int get_window_wm_state( Display *display, struct x11drv_win_data *data ); -extern void wait_for_withdrawn_state( Display *display, struct x11drv_win_data *data ); +extern void wait_for_withdrawn_state( Display *display, struct x11drv_win_data *data, BOOL set );
/* X context to associate a hwnd to an X window */ extern XContext winContext;