[3/3 v4 resend] winex11.drv: Implement FlashWindowEx.
Jactry Zeng
jzeng at codeweavers.com
Tue Oct 6 22:36:30 CDT 2015
Superseded patch 114768.
ChangeLog:
v4:
- Rename driver entry to FlashWindowEx;
- Put FlashWindowEx/pFlashWindowEx in right place;
- Add CDECL for X11DRV_FlashWindowEx.
v3:
- Use x11drv_atom instead of XInternAtom;
- Only do XSendEvent() when data->mapped is true.
v2:
- Use _NET_WM_STATE_DEMANDS_ATTENTION instead of Urgency.
Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
---
dlls/user32/driver.c | 12 ++++++++++++
dlls/user32/user_private.h | 1 +
dlls/user32/win.c | 2 ++
dlls/winex11.drv/window.c | 29 +++++++++++++++++++++++++++++
dlls/winex11.drv/winex11.drv.spec | 1 +
dlls/winex11.drv/x11drv.h | 1 +
dlls/winex11.drv/x11drv_main.c | 1 +
7 files changed, 47 insertions(+)
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index ced8836..e527213 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -134,6 +134,7 @@ static const USER_DRIVER *load_driver(void)
GET_USER_FUNC(CreateDesktopWindow);
GET_USER_FUNC(CreateWindow);
GET_USER_FUNC(DestroyWindow);
+ GET_USER_FUNC(FlashWindowEx);
GET_USER_FUNC(GetDC);
GET_USER_FUNC(MsgWaitForMultipleObjectsEx);
GET_USER_FUNC(ReleaseDC);
@@ -410,6 +411,10 @@ static void CDECL nulldrv_DestroyWindow( HWND hwnd )
{
}
+static void CDECL nulldrv_FlashWindowEx( PFLASHWINFO pfinfo )
+{
+}
+
static void CDECL nulldrv_GetDC( HDC hdc, HWND hwnd, HWND top_win,
const RECT *win_rect,
const RECT *top_rect, DWORD flags )
{
@@ -546,6 +551,7 @@ static USER_DRIVER null_driver =
nulldrv_CreateDesktopWindow,
nulldrv_CreateWindow,
nulldrv_DestroyWindow,
+ nulldrv_FlashWindowEx,
nulldrv_GetDC,
nulldrv_MsgWaitForMultipleObjectsEx,
nulldrv_ReleaseDC,
@@ -733,6 +739,11 @@ static BOOL CDECL loaderdrv_CreateWindow( HWND hwnd )
return load_driver()->pCreateWindow( hwnd );
}
+static void CDECL loaderdrv_FlashWindowEx( PFLASHWINFO pfinfo )
+{
+ load_driver()->pFlashWindowEx( pfinfo );
+}
+
static void CDECL loaderdrv_GetDC( HDC hdc, HWND hwnd, HWND top_win,
const RECT *win_rect,
const RECT *top_rect, DWORD flags )
{
@@ -795,6 +806,7 @@ static USER_DRIVER lazy_load_driver =
loaderdrv_CreateDesktopWindow,
loaderdrv_CreateWindow,
nulldrv_DestroyWindow,
+ loaderdrv_FlashWindowEx,
loaderdrv_GetDC,
nulldrv_MsgWaitForMultipleObjectsEx,
nulldrv_ReleaseDC,
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index d3affb0..273f303 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -96,6 +96,7 @@ typedef struct tagUSER_DRIVER {
BOOL (CDECL *pCreateDesktopWindow)(HWND);
BOOL (CDECL *pCreateWindow)(HWND);
void (CDECL *pDestroyWindow)(HWND);
+ void (CDECL *pFlashWindowEx)( PFLASHWINFO );
void (CDECL *pGetDC)(HDC,HWND,HWND,const RECT *,const RECT *,DWORD);
DWORD (CDECL *pMsgWaitForMultipleObjectsEx)(DWORD,const
HANDLE*,DWORD,DWORD,DWORD);
void (CDECL *pReleaseDC)(HWND,HDC);
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index fb320c7..66749e3 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -3460,6 +3460,7 @@ BOOL WINAPI FlashWindowEx( PFLASHWINFO pfinfo )
wndPtr->flags &= ~WIN_NCACTIVATED;
}
WIN_ReleasePtr( wndPtr );
+ USER_Driver->pFlashWindowEx( pfinfo );
return TRUE;
}
else
@@ -3476,6 +3477,7 @@ BOOL WINAPI FlashWindowEx( PFLASHWINFO pfinfo )
WIN_ReleasePtr( wndPtr );
SendMessageW( hwnd, WM_NCACTIVATE, wparam, 0 );
+ USER_Driver->pFlashWindowEx( pfinfo );
return wparam;
}
}
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index b7ec06e..b763677 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2767,3 +2767,32 @@ failed:
release_win_data( data );
return -1;
}
+
+void CDECL X11DRV_FlashWindowEx( PFLASHWINFO pfinfo )
+{
+ struct x11drv_win_data *data = get_win_data( pfinfo->hwnd );
+ XEvent xev;
+
+ if (!data)
+ return;
+
+ if (data->mapped)
+ {
+ xev.type = ClientMessage;
+ xev.xclient.window = data->whole_window;
+ xev.xclient.message_type = x11drv_atom( _NET_WM_STATE );
+ xev.xclient.serial = 0;
+ xev.xclient.display = data->display;
+ xev.xclient.send_event = True;
+ xev.xclient.format = 32;
+ xev.xclient.data.l[0] = pfinfo->dwFlags ? _NET_WM_STATE_ADD :
_NET_WM_STATE_REMOVE;
+ xev.xclient.data.l[1] = x11drv_atom(
_NET_WM_STATE_DEMANDS_ATTENTION );
+ xev.xclient.data.l[2] = 0;
+ xev.xclient.data.l[3] = 1;
+ xev.xclient.data.l[4] = 0;
+
+ XSendEvent( data->display, DefaultRootWindow( data->display ),
False,
+ SubstructureNotifyMask, &xev );
+ }
+ release_win_data( data );
+}
diff --git a/dlls/winex11.drv/winex11.drv.spec
b/dlls/winex11.drv/winex11.drv.spec
index d9bbebc..182b351 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -30,6 +30,7 @@
@ cdecl EmptyClipboard() X11DRV_EmptyClipboard
@ cdecl EndClipboardUpdate() X11DRV_EndClipboardUpdate
@ cdecl EnumClipboardFormats(long) X11DRV_EnumClipboardFormats
+@ cdecl FlashWindowEx(ptr) X11DRV_FlashWindowEx
@ cdecl GetClipboardData(long) X11DRV_GetClipboardData
@ cdecl GetDC(long long long ptr ptr long) X11DRV_GetDC
@ cdecl IsClipboardFormatAvailable(long) X11DRV_IsClipboardFormatAvailable
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index cb4b0bb..2694d23 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -421,6 +421,7 @@ enum x11drv_atoms
XATOM__NET_WM_PING,
XATOM__NET_WM_STATE,
XATOM__NET_WM_STATE_ABOVE,
+ XATOM__NET_WM_STATE_DEMANDS_ATTENTION,
XATOM__NET_WM_STATE_FULLSCREEN,
XATOM__NET_WM_STATE_MAXIMIZED_HORZ,
XATOM__NET_WM_STATE_MAXIMIZED_VERT,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 85c69bf..d4f5c84 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -138,6 +138,7 @@ static const char * const atom_names[NB_XATOMS -
FIRST_XATOM] =
"_NET_WM_PING",
"_NET_WM_STATE",
"_NET_WM_STATE_ABOVE",
+ "_NET_WM_STATE_DEMANDS_ATTENTION",
"_NET_WM_STATE_FULLSCREEN",
"_NET_WM_STATE_MAXIMIZED_HORZ",
"_NET_WM_STATE_MAXIMIZED_VERT",
--
2.1.0
More information about the wine-patches
mailing list