Alexandre Julliard : winex11: Add separate helper functions for pointer grabbing and ungrabbing.
Alexandre Julliard
julliard at winehq.org
Fri Apr 22 12:27:43 CDT 2011
Module: wine
Branch: master
Commit: a292220e1d3b856a30af84aa8c7a5af4701bb275
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a292220e1d3b856a30af84aa8c7a5af4701bb275
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Apr 22 16:28:25 2011 +0200
winex11: Add separate helper functions for pointer grabbing and ungrabbing.
---
dlls/winex11.drv/mouse.c | 102 ++++++++++++++++++++++++++++------------------
1 files changed, 62 insertions(+), 40 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 4e622d7..1b3c15f 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -394,6 +394,66 @@ LRESULT clip_cursor_notify( HWND hwnd, HWND new_clip_hwnd )
}
/***********************************************************************
+ * grab_clipping_window
+ *
+ * Start a pointer grab on the clip window.
+ */
+static BOOL grab_clipping_window( const RECT *clip )
+{
+ struct x11drv_thread_data *data = x11drv_init_thread_data();
+ Window clip_window = init_clip_window();
+ HWND msg_hwnd;
+
+ if (!clip_window) return TRUE;
+
+ if (!(msg_hwnd = create_clipping_msg_window())) return TRUE;
+
+ TRACE( "clipping to %s\n", wine_dbgstr_rect(clip) );
+ wine_tsx11_lock();
+ XUnmapWindow( data->display, clip_window );
+ XMoveResizeWindow( data->display, clip_window,
+ clip->left - virtual_screen_rect.left, clip->top - virtual_screen_rect.top,
+ clip->right - clip->left, clip->bottom - clip->top );
+ XMapWindow( data->display, clip_window );
+ if (!XGrabPointer( data->display, clip_window, False,
+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
+ GrabModeAsync, GrabModeAsync, clip_window, None, CurrentTime ))
+ clipping_cursor = 1;
+ wine_tsx11_unlock();
+
+ if (!clipping_cursor)
+ {
+ DestroyWindow( msg_hwnd );
+ return FALSE;
+ }
+ enable_xinput2();
+ sync_window_cursor( clip_window );
+ clip_rect = *clip;
+ SendMessageW( GetDesktopWindow(), WM_X11DRV_CLIP_CURSOR, 0, (LPARAM)msg_hwnd );
+ return TRUE;
+}
+
+/***********************************************************************
+ * ungrab_clipping_window
+ *
+ * Release the pointer grab on the clip window.
+ */
+static void ungrab_clipping_window(void)
+{
+ Display *display = thread_init_display();
+ Window clip_window = init_clip_window();
+
+ if (!clip_window) return;
+
+ TRACE( "no longer clipping\n" );
+ wine_tsx11_lock();
+ XUnmapWindow( display, clip_window );
+ wine_tsx11_unlock();
+ clipping_cursor = 0;
+ SendMessageW( GetDesktopWindow(), WM_X11DRV_CLIP_CURSOR, 0, 0 );
+}
+
+/***********************************************************************
* send_mouse_input
*
* Update the various window states on a mouse event.
@@ -1110,11 +1170,6 @@ BOOL CDECL X11DRV_GetCursorPos(LPPOINT pos)
*/
BOOL CDECL X11DRV_ClipCursor( LPCRECT clip )
{
- Display *display = thread_init_display();
- Window clip_window = init_clip_window();
-
- if (!clip_window) return TRUE;
-
/* we are clipping if the clip rectangle is smaller than the screen */
if (clip && (clip->left > virtual_screen_rect.left ||
clip->right < virtual_screen_rect.right ||
@@ -1124,43 +1179,10 @@ BOOL CDECL X11DRV_ClipCursor( LPCRECT clip )
if (GetWindowThreadProcessId( GetDesktopWindow(), NULL ) == GetCurrentThreadId())
return TRUE; /* don't clip in the desktop process */
- if (grab_pointer)
- {
- HWND msg_hwnd = create_clipping_msg_window();
-
- if (!msg_hwnd) return TRUE;
- TRACE( "clipping to %s\n", wine_dbgstr_rect(clip) );
- wine_tsx11_lock();
- XUnmapWindow( display, clip_window );
- XMoveResizeWindow( display, clip_window,
- clip->left - virtual_screen_rect.left, clip->top - virtual_screen_rect.top,
- clip->right - clip->left, clip->bottom - clip->top );
- XMapWindow( display, clip_window );
- if (!XGrabPointer( display, clip_window, False,
- PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
- GrabModeAsync, GrabModeAsync, clip_window, None, CurrentTime ))
- clipping_cursor = 1;
- wine_tsx11_unlock();
-
- if (clipping_cursor)
- {
- enable_xinput2();
- sync_window_cursor( clip_window );
- clip_rect = *clip;
- SendMessageW( GetDesktopWindow(), WM_X11DRV_CLIP_CURSOR, 0, (LPARAM)msg_hwnd );
- return TRUE;
- }
- DestroyWindow( msg_hwnd );
- }
+ if (grab_pointer && grab_clipping_window( clip )) return TRUE;
}
- /* release the grab if any */
- TRACE( "no longer clipping\n" );
- wine_tsx11_lock();
- XUnmapWindow( display, clip_window );
- wine_tsx11_unlock();
- clipping_cursor = 0;
- SendMessageW( GetDesktopWindow(), WM_X11DRV_CLIP_CURSOR, 0, 0 );
+ ungrab_clipping_window();
return TRUE;
}
More information about the wine-cvs
mailing list