Roman Pisl : explorer: Implement NIM_SETVERSION.

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


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

Author: Roman Pisl <rpisl at seznam.cz>
Date:   Mon Oct 10 16:35:40 2016 +0200

explorer: Implement NIM_SETVERSION.

Signed-off-by: Roman Pisl <rpisl at seznam.cz>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/explorer/systray.c | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c
index 97cffbc..a08685b 100644
--- a/programs/explorer/systray.c
+++ b/programs/explorer/systray.c
@@ -77,6 +77,7 @@ struct icon
     UINT           info_flags;      /* flags for info balloon */
     UINT           info_timeout;    /* timeout for info balloon */
     HICON          info_icon;       /* info balloon icon */
+    UINT           version;         /* notify icon api version */
 };
 
 static struct list icon_list = LIST_INIT( icon_list );
@@ -586,6 +587,10 @@ static BOOL handle_incoming(HWND hwndSource, COPYDATASTRUCT *cds)
     case NIM_MODIFY:
         if (icon) ret = modify_icon( icon, &nid );
         break;
+    case NIM_SETVERSION:
+        icon->version = nid.u.uVersion;
+        ret = TRUE;
+        break;
     default:
         WINE_FIXME("unhandled tray message: %ld\n", cds->dwData);
         break;
@@ -790,6 +795,9 @@ static LRESULT WINAPI tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l
     case WM_RBUTTONDBLCLK:
     case WM_MBUTTONDBLCLK:
         {
+            WPARAM wpar;
+            BOOL oldver;
+            BOOL ret;
             MSG message;
             struct icon *icon = icon_from_point( (short)LOWORD(lparam), (short)HIWORD(lparam) );
             if (!icon) break;
@@ -803,8 +811,26 @@ static LRESULT WINAPI tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l
             message.lParam = lparam;
             SendMessageW( icon->tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message );
 
-            if (!PostMessageW( icon->owner, icon->callback_message, (WPARAM) icon->id, (LPARAM) msg ) &&
-                GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
+            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;
+
+                rect = get_icon_rect( icon );
+                MapWindowPoints( tray_window, 0, (POINT *)&rect, 2 );
+                x = rect.left + LOWORD(lparam);
+                y = rect.top + HIWORD(lparam);
+                wpar = MAKEWPARAM(x, y);
+            }
+
+            ret = PostMessageW(icon->owner, icon->callback_message, wpar,
+                               oldver ? msg : MAKELPARAM(msg, icon->id));
+
+            if (!ret && (GetLastError() == ERROR_INVALID_WINDOW_HANDLE))
             {
                 WINE_WARN("application window was destroyed without removing "
                           "notification icon, removing automatically\n");




More information about the wine-cvs mailing list