Alexandre Julliard : winex11: Reset the clipping when the desktop window loses focus.
Alexandre Julliard
julliard at winehq.org
Wed May 11 13:02:55 CDT 2011
Module: wine
Branch: master
Commit: a28722f5313c283ee89ad150e80bcca18720f1cd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a28722f5313c283ee89ad150e80bcca18720f1cd
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed May 11 12:07:37 2011 +0200
winex11: Reset the clipping when the desktop window loses focus.
---
dlls/winex11.drv/desktop.c | 2 +-
dlls/winex11.drv/event.c | 22 ++++++++++------------
dlls/winex11.drv/mouse.c | 11 +++++++++++
dlls/winex11.drv/x11drv.h | 1 +
4 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/dlls/winex11.drv/desktop.c b/dlls/winex11.drv/desktop.c
index fe4a040..b78306d 100644
--- a/dlls/winex11.drv/desktop.c
+++ b/dlls/winex11.drv/desktop.c
@@ -143,7 +143,7 @@ Window CDECL X11DRV_create_desktop( UINT width, UINT height )
/* Create window */
win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | EnterWindowMask |
- PointerMotionMask | ButtonPressMask | ButtonReleaseMask;
+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask;
win_attr.cursor = XCreateFontCursor( display, XC_top_left_arrow );
if (visual != DefaultVisual( display, DefaultScreen(display) ))
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 3af56f8..52d4b81 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -706,6 +706,7 @@ static void X11DRV_FocusIn( HWND hwnd, XEvent *xev )
TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] );
if (event->detail == NotifyPointer) return;
+ if (hwnd == GetDesktopWindow()) return;
if ((xic = X11DRV_get_ic( hwnd )))
{
@@ -740,20 +741,13 @@ static void X11DRV_FocusOut( HWND hwnd, XEvent *xev )
int revert;
XIC xic;
- if (!hwnd)
+ TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] );
+
+ if (event->detail == NotifyPointer)
{
- 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 */
- }
+ if (!hwnd && event->window == x11drv_thread_data()->clip_window) reset_clipping_window();
return;
}
-
- TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] );
-
- if (event->detail == NotifyPointer) return;
if (ximInComposeMode) return;
x11drv_thread_data()->last_focus = hwnd;
@@ -763,8 +757,12 @@ static void X11DRV_FocusOut( HWND hwnd, XEvent *xev )
XUnsetICFocus( xic );
wine_tsx11_unlock();
}
+ if (root_window != DefaultRootWindow(event->display))
+ {
+ if (hwnd == GetDesktopWindow()) reset_clipping_window();
+ return;
+ }
if (hwnd != GetForegroundWindow()) return;
- if (root_window != DefaultRootWindow(event->display)) return;
SendMessageW( hwnd, WM_CANCELMODE, 0, 0 );
/* don't reset the foreground window, if the window which is
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index fdc92ab..06805a7 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -449,6 +449,17 @@ void ungrab_clipping_window(void)
}
/***********************************************************************
+ * reset_clipping_window
+ *
+ * Forcibly reset the window clipping on external events.
+ */
+void reset_clipping_window(void)
+{
+ ungrab_clipping_window();
+ ClipCursor( NULL ); /* make sure the clip rectangle is reset too */
+}
+
+/***********************************************************************
* clip_cursor_notify
*
* Notification function called upon receiving a WM_X11DRV_CLIP_CURSOR.
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 7113a02..a924e06 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -831,6 +831,7 @@ 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 void ungrab_clipping_window(void);
+extern void reset_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 );
More information about the wine-cvs
mailing list