From f1f223d00161bb7b22af7d3383bb14c770adcad2 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 25 Apr 2011 10:49:49 +0200 Subject: [PATCH] winex11: Release the clip cursor grab when the clipping window loses focus. --- dlls/winex11.drv/desktop.c | 2 +- dlls/winex11.drv/event.c | 11 ++++++++++- dlls/winex11.drv/mouse.c | 2 +- dlls/winex11.drv/window.c | 2 +- dlls/winex11.drv/x11drv.h | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/dlls/winex11.drv/desktop.c b/dlls/winex11.drv/desktop.c index eefc74ccc23..fe4a040046d 100644 --- a/dlls/winex11.drv/desktop.c +++ b/dlls/winex11.drv/desktop.c @@ -258,7 +258,7 @@ void X11DRV_resize_desktop( unsigned int width, unsigned int height ) virtual_screen_rect.right - virtual_screen_rect.left, virtual_screen_rect.bottom - virtual_screen_rect.top, SWP_NOZORDER | SWP_NOACTIVATE | SWP_DEFERERASE ); - X11DRV_ClipCursor( NULL ); + ungrab_clipping_window(); SendMessageTimeoutW( HWND_BROADCAST, WM_DISPLAYCHANGE, screen_bpp, MAKELPARAM( width, height ), SMTO_ABORTIFHUNG, 2000, NULL ); } diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index b338236f99b..0233a61e210 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -672,7 +672,16 @@ static void X11DRV_FocusOut( HWND hwnd, XEvent *xev ) int revert; XIC xic; - if (!hwnd) return; + if (!hwnd) + { + if (event->detail == NotifyPointer && event->window == x11drv_thread_data()->clip_window) + { + TRACE( "clip window lost focus\n" ); + ungrab_clipping_window(); + ClipCursor( NULL ); /* make sure the clip rectangle is reset too */ + } + return; + } TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] ); diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index b447b7ec6b4..1e783d28ab9 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -447,7 +447,7 @@ static BOOL grab_clipping_window( const RECT *clip ) * * Release the pointer grab on the clip window. */ -static void ungrab_clipping_window(void) +void ungrab_clipping_window(void) { Display *display = thread_init_display(); Window clip_window = init_clip_window(); diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index ba544cdd87d..32a3f4c3fd5 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2002,7 +2002,7 @@ BOOL CDECL X11DRV_CreateWindow( HWND hwnd ) /* create the cursor clipping window */ attr.override_redirect = TRUE; - attr.event_mask = StructureNotifyMask; + attr.event_mask = StructureNotifyMask | FocusChangeMask; wine_tsx11_lock(); data->clip_window = XCreateWindow( data->display, root_window, 0, 0, 1, 1, 0, 0, InputOnly, visual, CWOverrideRedirect | CWEventMask, &attr ); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 48394aca7bc..cfe2509dd76 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -829,7 +829,7 @@ extern void CDECL X11DRV_SetFocus( HWND hwnd ); extern void set_window_cursor( Window window, HCURSOR handle ); extern void sync_window_cursor( Window window ); extern LRESULT clip_cursor_notify( HWND hwnd, HWND new_clip_hwnd ); -extern BOOL CDECL X11DRV_ClipCursor( LPCRECT clip ); +extern void ungrab_clipping_window(void); extern void X11DRV_InitKeyboard( Display *display ); extern DWORD CDECL X11DRV_MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags ); -- 2.11.4.GIT