From: Sergei Chernyadyev serg.cherniadjev@gmail.com
--- dlls/win32u/systray.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/systray.c b/dlls/win32u/systray.c index 1df2b97da9a..33c39e609ed 100644 --- a/dlls/win32u/systray.c +++ b/dlls/win32u/systray.c @@ -21,18 +21,54 @@ #endif
#include "config.h" - #include "ntstatus.h" #define WIN32_NO_STATUS #include "win32u_private.h" #include "ntuser_private.h" +#ifdef SONAME_LIBDBUS_1 +#include "snidrv/snidrv.h" +#endif #include "shellapi.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(systray);
+#ifdef SONAME_LIBDBUS_1 +static volatile LONG sni_initialized = (LONG)FALSE; +#endif + LRESULT system_tray_call( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, void *data ) { +#ifdef SONAME_LIBDBUS_1 + LONG l_sni_initialized = InterlockedCompareExchange(&sni_initialized, (LONG)FALSE, (LONG)FALSE); + if (!l_sni_initialized && snidrv_init()) + { + InterlockedCompareExchange(&sni_initialized, TRUE, FALSE); + l_sni_initialized = TRUE; + } + if (l_sni_initialized) + { + // SNI + switch (msg) + { + case WINE_SYSTRAY_ADD_NOTIFY_ICON: + return snidrv_add_notify_icon( data ); + case WINE_SYSTRAY_MODIFY_NOTIFY_ICON: + return snidrv_modify_notify_icon( data ); + case WINE_SYSTRAY_DELETE_NOTIFY_ICON: + return snidrv_delete_notify_icon( hwnd, wparam ); + case WINE_SYSTRAY_SET_NOTIFY_ICON_VERSION: + return snidrv_set_notify_icon_version( hwnd, wparam, lparam ); + case WINE_SYSTRAY_CLEANUP_ICONS: + return snidrv_cleanup_notify_icons( hwnd ); + case WINE_SYSTRAY_RUN_LOOP: + return snidrv_run_loop(); + default: + break; + } + } +#endif + switch (msg) { case WINE_SYSTRAY_ADD_NOTIFY_ICON: