From: Jactry Zeng Subject: [PATCH 2/2] winex11.drv: Implement FlashWindow with UrgencyHint flag. Message-Id: <55F6922E.8050000@codeweavers.com> Date: Mon, 14 Sep 2015 17:23:58 +0800 This patch only set UrgencyHint flag when the window is minimized. Because X11 only define UrgencyHint, the specific UI effect is implemented by WM/DE. Different WM/DE may have different UI effect which is quite different from Windows. --- dlls/user32/driver.c | 16 ++++++++++++++-- dlls/user32/user_private.h | 1 + dlls/user32/win.c | 1 + dlls/winex11.drv/event.c | 13 ++++++++++++- dlls/winex11.drv/window.c | 20 ++++++++++++++++++++ dlls/winex11.drv/winex11.drv.spec | 1 + 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c index ced8836..5ae292e 100644 --- a/dlls/user32/driver.c +++ b/dlls/user32/driver.c @@ -153,6 +153,7 @@ static const USER_DRIVER *load_driver(void) GET_USER_FUNC(WindowPosChanging); GET_USER_FUNC(WindowPosChanged); GET_USER_FUNC(SystemParametersInfo); + GET_USER_FUNC(FlashWindow); #undef GET_USER_FUNC } @@ -506,6 +507,10 @@ static BOOL CDECL nulldrv_SystemParametersInfo( UINT action, UINT int_param, voi return FALSE; } +static void CDECL nulldrv_FlashWindow( HWND hWnd, BOOL bInvert ) +{ +} + static USER_DRIVER null_driver = { /* keyboard functions */ @@ -565,7 +570,8 @@ static USER_DRIVER null_driver = nulldrv_WindowPosChanging, nulldrv_WindowPosChanged, /* system parameters */ - nulldrv_SystemParametersInfo + nulldrv_SystemParametersInfo, + nulldrv_FlashWindow }; @@ -755,6 +761,11 @@ static BOOL CDECL loaderdrv_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDW return load_driver()->pUpdateLayeredWindow( hwnd, info, window_rect ); } +static void CDECL loaderdrv_FlashWindow( HWND hWnd, BOOL bInvert ) +{ + load_driver()->pFlashWindow( hWnd, bInvert ); +} + static USER_DRIVER lazy_load_driver = { /* keyboard functions */ @@ -814,5 +825,6 @@ static USER_DRIVER lazy_load_driver = nulldrv_WindowPosChanging, nulldrv_WindowPosChanged, /* system parameters */ - nulldrv_SystemParametersInfo + nulldrv_SystemParametersInfo, + loaderdrv_FlashWindow }; diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index d3affb0..1f9bf7c 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -116,6 +116,7 @@ typedef struct tagUSER_DRIVER { void (CDECL *pWindowPosChanged)(HWND,HWND,UINT,const RECT *,const RECT *,const RECT *,const RECT *,struct window_surface*); /* system parameters */ BOOL (CDECL *pSystemParametersInfo)(UINT,UINT,void*,UINT); + void (CDECL *pFlashWindow)(HWND, BOOL); } USER_DRIVER; extern const USER_DRIVER *USER_Driver DECLSPEC_HIDDEN; diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 523d640..d6446e2 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -3432,6 +3432,7 @@ BOOL WINAPI FlashWindow( HWND hWnd, BOOL bInvert ) wndPtr->flags &= ~WIN_NCACTIVATED; } WIN_ReleasePtr( wndPtr ); + USER_Driver->pFlashWindow( hWnd, bInvert ); return TRUE; } else diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index ee30259..44bc9f1 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -1366,7 +1366,7 @@ void wait_for_withdrawn_state( HWND hwnd, BOOL set ) void CDECL X11DRV_SetFocus( HWND hwnd ) { struct x11drv_win_data *data; - + XWMHints *wm_hints; HWND parent; for (;;) @@ -1379,6 +1379,17 @@ void CDECL X11DRV_SetFocus( HWND hwnd ) hwnd = parent; } if (!data->managed || data->embedder) set_input_focus( data ); + + if (!(wm_hints = XGetWMHints(data->display, data->whole_window))) + if(!(wm_hints = XAllocWMHints())) + { + release_win_data( data ); + return; + } + wm_hints->flags &= ~XUrgencyHint; + XSetWMHints( data->display, data->whole_window, wm_hints ); + XFree( wm_hints ); + release_win_data( data ); } diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index b7ec06e..d6a4bda 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2767,3 +2767,23 @@ failed: release_win_data( data ); return -1; } + +void X11DRV_FlashWindow( HWND hwnd, BOOL bInvert ) +{ + struct x11drv_win_data *data = get_win_data( hwnd ); + XWMHints *wm_hints; + + if (!data) + return; + if (!(wm_hints = XGetWMHints( data->display, data->whole_window ))) + if(!(wm_hints = XAllocWMHints())) + { + release_win_data( data ); + return; + } + + wm_hints->flags |= XUrgencyHint; + XSetWMHints( data->display, data->whole_window, wm_hints ); + XFree( wm_hints ); + release_win_data( data ); +} diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec index d9bbebc..f5d0f0d 100644 --- a/dlls/winex11.drv/winex11.drv.spec +++ b/dlls/winex11.drv/winex11.drv.spec @@ -52,6 +52,7 @@ @ cdecl WindowPosChanging(long long long ptr ptr ptr ptr) X11DRV_WindowPosChanging @ cdecl WindowPosChanged(long long long ptr ptr ptr ptr ptr) X11DRV_WindowPosChanged @ cdecl SystemParametersInfo(long long ptr long) X11DRV_SystemParametersInfo +@ cdecl FlashWindow(long long) X11DRV_FlashWindow # WinTab32 @ cdecl AttachEventQueueToTablet(long) X11DRV_AttachEventQueueToTablet