[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