#include <strsafe.h>
#include <atlbase.h>
#include <atlcom.h>
+#include <atlwin.h>
+
+#include <shellapi.h>
#include <wine/debug.h>
#include <wine/unicode.h>
+#include "resource.h"
+
extern const GUID CLSID_SysTray;
-#include "resource.h"
+extern HINSTANCE g_hInstance;
+
+#define ID_ICON_VOLUME 0x4CB
+
+/* --------------- CSysTray callbacks ------------------------------ */
+
+typedef CWinTraits <
+ WS_POPUP | WS_DLGFRAME | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
+ WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_PALETTEWINDOW
+> CMessageWndClass;
+
+class CSysTray :
+ public CComCoClass<CSysTray, &CLSID_SysTray>,
+ public CComObjectRootEx<CComMultiThreadModelNoCS>,
+ public CWindowImpl<CSysTray, CWindow, CMessageWndClass>,
+ public IOleCommandTarget
+{
+ // TODO: keep icon handlers here
+
+ HWND hwndSysTray;
+
+ static DWORD WINAPI s_SysTrayThreadProc(PVOID param);
+ HRESULT SysTrayMessageLoop();
+ HRESULT SysTrayThreadProc();
+ HRESULT CreateSysTrayThread();
+ HRESULT DestroySysTrayWindow();
+
+ HRESULT InitIcons();
+ HRESULT ShutdownIcons();
+ HRESULT UpdateIcons();
+ HRESULT ProcessIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+public:
+ HRESULT NotifyIcon(INT code, UINT uId, HICON hIcon, LPCWSTR szTip);
+
+ HWND GetHWnd() { return m_hWnd; }
+
+protected:
+ BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD dwMsgMapID = 0);
+
+public:
+ CSysTray();
+ virtual ~CSysTray();
+
+ // *** IOleCommandTarget methods ***
+ virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText);
+ virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
+
+ DECLARE_WND_CLASS_EX(_T("SystemTray_Main"), CS_GLOBALCLASS, COLOR_3DFACE)
+
+ DECLARE_REGISTRY_RESOURCEID(IDR_SYSTRAY)
+ DECLARE_NOT_AGGREGATABLE(CSysTray)
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ BEGIN_COM_MAP(CSysTray)
+ COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
+ END_COM_MAP()
+
+};
+
+/* --------------- Icon callbacks ------------------------------ */
+
+extern HRESULT STDMETHODCALLTYPE Volume_Init(_In_ CSysTray * pSysTray);
+extern HRESULT STDMETHODCALLTYPE Volume_Shutdown(_In_ CSysTray * pSysTray);
+extern HRESULT STDMETHODCALLTYPE Volume_Update(_In_ CSysTray * pSysTray);
+extern HRESULT STDMETHODCALLTYPE Volume_Message(_In_ CSysTray * pSysTray, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+/* --------------- Utils ------------------------------ */
static __inline ULONG
Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)