Alexandre Julliard : winex11: Add a helper function to send systray notifications.

Alexandre Julliard julliard at winehq.org
Wed Oct 12 16:06:15 CDT 2016


Module: wine
Branch: master
Commit: 2e3aa622641238bf5a416ad350779c33a7be4ada
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2e3aa622641238bf5a416ad350779c33a7be4ada

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Oct 12 10:57:34 2016 +0200

winex11: Add a helper function to send systray notifications.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winex11.drv/systray.c | 86 +++++++++++++++++++---------------------------
 1 file changed, 35 insertions(+), 51 deletions(-)

diff --git a/dlls/winex11.drv/systray.c b/dlls/winex11.drv/systray.c
index fab10c6..815e554 100644
--- a/dlls/winex11.drv/systray.c
+++ b/dlls/winex11.drv/systray.c
@@ -436,11 +436,35 @@ done:
     if (dib) DeleteObject( dib );
 }
 
+static BOOL notify_owner( struct tray_icon *icon, UINT msg, LPARAM lparam )
+{
+    WPARAM wp = icon->id;
+    LPARAM lp = msg;
+
+    if (icon->version >= NOTIFY_VERSION_4)
+    {
+        POINT pt = { (short)LOWORD(lparam), (short)HIWORD(lparam) };
+
+        ClientToScreen( icon->window, &pt );
+        wp = MAKEWPARAM( pt.x, pt.y );
+        lp = MAKELPARAM( msg, icon->id );
+    }
+
+    TRACE( "relaying 0x%x\n", msg );
+    if (!PostMessageW( icon->owner, icon->callback_message, wp, lp ) &&
+        (GetLastError() == ERROR_INVALID_WINDOW_HANDLE))
+    {
+        WARN( "application window was destroyed, removing icon %u\n", icon->id );
+        delete_icon( icon );
+        return FALSE;
+    }
+    return TRUE;
+}
+
 /* window procedure for the individual tray icon window */
 static LRESULT WINAPI tray_icon_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
 {
     struct tray_icon *icon = NULL;
-    BOOL ret;
 
     TRACE("hwnd=%p, msg=0x%x\n", hwnd, msg);
 
@@ -477,64 +501,24 @@ static LRESULT WINAPI tray_icon_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPAR
 
     case WM_MOUSEMOVE:
     case WM_LBUTTONDOWN:
-    case WM_LBUTTONUP:
     case WM_RBUTTONDOWN:
-    case WM_RBUTTONUP:
     case WM_MBUTTONDOWN:
     case WM_MBUTTONUP:
     case WM_LBUTTONDBLCLK:
     case WM_RBUTTONDBLCLK:
     case WM_MBUTTONDBLCLK:
-        {
-            WPARAM wpar;
-            BOOL oldver;
-
-            oldver = icon->version <= NOTIFY_VERSION;
-            if (oldver) {
-                /* 0 up to NOTIFYICON_VERSION (=3) */
-                wpar = icon->id;
-            } else {
-                /* NOTIFYICON_VERSION_4 */
-                RECT rect;
-                WORD x, y;
-
-                GetWindowRect( icon->window, &rect );
-                x = rect.left + LOWORD(lparam);
-                y = rect.top + HIWORD(lparam);
-                wpar = MAKEWPARAM(x, y);
-            }
+        notify_owner( icon, msg, lparam );
+        break;
 
-            /* notify the owner hwnd of the message */
-            TRACE("relaying 0x%x\n", msg);
-            ret = PostMessageW(icon->owner, icon->callback_message, wpar,
-                               oldver ? msg : MAKELPARAM(msg, icon->id));
-
-            if (ret && icon->version > 0) {
-                switch (msg) {
-                    case WM_RBUTTONUP:
-                        /* notify the owner hwnd of the message */
-                        TRACE("relaying 0x%x\n", WM_CONTEXTMENU);
-                        ret = PostMessageW(icon->owner, icon->callback_message, wpar,
-                                           oldver ? WM_CONTEXTMENU : MAKELPARAM(WM_CONTEXTMENU, icon->id));
-                        break;
-                    case WM_LBUTTONUP:
-                        /* notify the owner hwnd of the message */
-                        TRACE("relaying 0x%x\n", NIN_SELECT);
-                        ret = PostMessageW(icon->owner, icon->callback_message, wpar,
-                                           oldver ? NIN_SELECT : MAKELPARAM(NIN_SELECT, icon->id));
-                        break;
-                    default:
-                        break;
-                }
-            }
+    case WM_LBUTTONUP:
+        if (!notify_owner( icon, msg, lparam )) break;
+        if (icon->version > 0) notify_owner( icon, NIN_SELECT, lparam );
+        break;
 
-            if (!ret && (GetLastError() == ERROR_INVALID_WINDOW_HANDLE))
-            {
-                WARN( "application window was destroyed, removing icon %u\n", icon->id );
-                delete_icon( icon );
-            }
-            return 0;
-        }
+    case WM_RBUTTONUP:
+        if (!notify_owner( icon, msg, lparam )) break;
+        if (icon->version > 0) notify_owner( icon, WM_CONTEXTMENU, lparam );
+        break;
 
     case WM_WINDOWPOSCHANGED:
         update_systray_balloon_position();




More information about the wine-cvs mailing list