Module: wine Branch: master Commit: b8edf184ee33acce8b102d968e4bd5063ab97dc9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b8edf184ee33acce8b102d968e...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Sep 18 11:20:07 2012 +0200
winex11: Add a helper function to set input focus for non-managed windows.
---
dlls/winex11.drv/event.c | 44 +++++++++++++++++++++++++++++++++++++++++++- dlls/winex11.drv/window.c | 30 ------------------------------ 2 files changed, 43 insertions(+), 31 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 0e8ba04..1c0cec3 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -530,6 +530,31 @@ static inline BOOL can_activate_window( HWND hwnd )
/********************************************************************** + * set_input_focus + * + * Try to force focus for non-managed windows. + */ +static void set_input_focus( Display *display, Window window ) +{ + XWindowChanges changes; + DWORD timestamp; + + if (!window) return; + + if (EVENT_x11_time_to_win32_time(0)) + /* ICCCM says don't use CurrentTime, so try to use last message time if possible */ + /* FIXME: this is not entirely correct */ + timestamp = GetMessageTime() - EVENT_x11_time_to_win32_time(0); + else + timestamp = CurrentTime; + + /* Set X focus and install colormap */ + changes.stack_mode = Above; + XConfigureWindow( display, window, CWStackMode, &changes ); + XSetInputFocus( display, window, RevertToParent, timestamp ); +} + +/********************************************************************** * set_focus */ static void set_focus( Display *display, HWND hwnd, Time time ) @@ -855,7 +880,8 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event ) if (!data->managed) { HWND hwndFocus = GetFocus(); - if (hwndFocus && IsChild( hwnd, hwndFocus )) X11DRV_SetFocus(hwndFocus); /* FIXME */ + if (hwndFocus && IsChild( hwnd, hwndFocus )) + set_input_focus( thread_display(), data->whole_window ); } }
@@ -1240,6 +1266,22 @@ void wait_for_withdrawn_state( HWND hwnd, BOOL set ) }
+/***************************************************************** + * SetFocus (X11DRV.@) + * + * Set the X focus. + */ +void CDECL X11DRV_SetFocus( HWND hwnd ) +{ + Display *display = thread_display(); + struct x11drv_win_data *data; + + if (!(hwnd = GetAncestor( hwnd, GA_ROOT ))) return; + if (!(data = X11DRV_get_win_data( hwnd ))) return; + if (!data->managed) set_input_focus( display, data->whole_window ); +} + + static HWND find_drop_window( HWND hQueryWnd, LPPOINT lpPt ) { RECT tempRect; diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 421d67d..94edb81 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1989,36 +1989,6 @@ void CDECL X11DRV_SetParent( HWND hwnd, HWND parent, HWND old_parent ) }
-/***************************************************************** - * SetFocus (X11DRV.@) - * - * Set the X focus. - */ -void CDECL X11DRV_SetFocus( HWND hwnd ) -{ - Display *display = thread_display(); - struct x11drv_win_data *data; - XWindowChanges changes; - DWORD timestamp; - - if (!(hwnd = GetAncestor( hwnd, GA_ROOT ))) return; - if (!(data = X11DRV_get_win_data( hwnd ))) return; - if (data->managed || !data->whole_window) return; - - if (EVENT_x11_time_to_win32_time(0)) - /* ICCCM says don't use CurrentTime, so try to use last message time if possible */ - /* FIXME: this is not entirely correct */ - timestamp = GetMessageTime() - EVENT_x11_time_to_win32_time(0); - else - timestamp = CurrentTime; - - /* Set X focus and install colormap */ - changes.stack_mode = Above; - XConfigureWindow( display, data->whole_window, CWStackMode, &changes ); - XSetInputFocus( display, data->whole_window, RevertToParent, timestamp ); -} - - static inline RECT get_surface_rect( const RECT *visible_rect ) { RECT rect;