Module: wine Branch: master Commit: 70cb31e4e6e6ab6e37dabc54b23d6ae4d31c0be3 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=70cb31e4e6e6ab6e37dabc54...
Author: James Liggett jrliggett@cox.net Date: Wed Aug 30 18:42:49 2006 -0700
explorer: Add support for tooltips for system tray icons.
Based on the original systray implementation by Kai Morich kai.morich@bigfoot.de.
---
programs/explorer/Makefile.in | 3 +- programs/explorer/systray.c | 55 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/programs/explorer/Makefile.in b/programs/explorer/Makefile.in index 740611a..e386c2e 100644 --- a/programs/explorer/Makefile.in +++ b/programs/explorer/Makefile.in @@ -4,7 +4,8 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = explorer.exe APPMODE = -mwindows -IMPORTS = user32 gdi32 advapi32 kernel32 ntdll +IMPORTS = user32 gdi32 advapi32 kernel32 ntdll +DELAYIMPORTS = comctl32 EXTRADEFS = @HALINCL@
C_SRCS = \ diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c index 70d29bf..7fc66fd 100644 --- a/programs/explorer/systray.c +++ b/programs/explorer/systray.c @@ -33,6 +33,7 @@ #include <assert.h> #define UNICODE #define _WIN32_IE 0x500 #include <windows.h> +#include <commctrl.h>
#include <wine/debug.h> #include <wine/list.h> @@ -60,6 +61,7 @@ struct icon HICON image; /* the image to render */ HWND owner; /* the HWND passed in to the Shell_NotifyIcon call */ HWND window; /* the adaptor window */ + HWND tooltip; /* Icon tooltip */ UINT id; /* the unique id given by the app */ UINT callback_message; }; @@ -160,7 +162,26 @@ static struct icon *get_icon(HWND owner, return NULL; }
-static void modify_icon(const NOTIFYICONDATAW *nid) +static void set_tooltip(struct icon *icon, WCHAR *szTip, BOOL modify) +{ + TTTOOLINFOW ti; + + ti.cbSize = sizeof(TTTOOLINFOW); + ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND; + ti.hwnd = icon->window; + ti.hinst = 0; + ti.uId = (UINT_PTR)icon->window; + ti.lpszText = szTip; + ti.lParam = 0; + ti.lpReserved = NULL; + + if (modify) + SendMessageW(icon->tooltip, TTM_UPDATETIPTEXTW, 0, (LPARAM)&ti); + else + SendMessageW(icon->tooltip, TTM_ADDTOOLW, 0, (LPARAM)&ti); +} + +static void modify_icon(NOTIFYICONDATAW *nid, BOOL modify_tooltip) { struct icon *icon;
@@ -186,13 +207,18 @@ static void modify_icon(const NOTIFYICON { icon->callback_message = nid->uCallbackMessage; } + if (nid->uFlags & NIF_TIP) + { + set_tooltip(icon, nid->szTip, modify_tooltip); + } }
-static void add_icon(const NOTIFYICONDATAW *nid) +static void add_icon(NOTIFYICONDATAW *nid) { RECT rect; struct icon *icon; static const WCHAR adaptor_windowname[] = /* Wine System Tray Adaptor */ {'W','i','n','e',' ','S','y','s','t','e','m',' ','T','r','a','y',' ','A','d','a','p','t','o','r',0}; + static BOOL tooltps_initialized = FALSE;
WINE_TRACE("id=0x%x, hwnd=%p\n", nid->uID, nid->hWnd);
@@ -230,9 +256,29 @@ static void add_icon(const NOTIFYICONDAT if (!hide_systray) ShowWindow(icon->window, SW_SHOWNA);
+ /* create icon tooltip */ + + /* Register tooltip classes if this is the first icon */ + if (!tooltps_initialized) + { + INITCOMMONCONTROLSEX init_tooltip; + + init_tooltip.dwSize = sizeof(INITCOMMONCONTROLSEX); + init_tooltip.dwICC = ICC_TAB_CLASSES; + + InitCommonControlsEx(&init_tooltip); + tooltps_initialized = TRUE; + } + + icon->tooltip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, + WS_POPUP | TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + icon->window, NULL, NULL, NULL); + list_add_tail(&tray.icons, &icon->entry);
- modify_icon(nid); + modify_icon(nid, FALSE); }
static void delete_icon(const NOTIFYICONDATAW *nid) @@ -247,6 +293,7 @@ static void delete_icon(const NOTIFYICON return; }
+ DestroyWindow(icon->tooltip); DestroyWindow(icon->window); }
@@ -304,7 +351,7 @@ static void handle_incoming(HWND hwndSou delete_icon(&nid); break; case NIM_MODIFY: - modify_icon(&nid); + modify_icon(&nid, TRUE); break; default: WINE_FIXME("unhandled tray message: %ld\n", cds->dwData);