2 * PROJECT: ReactOS system libraries
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll\win32\stobject\csystray.cpp
5 * PURPOSE: Systray shell service object implementation
6 * PROGRAMMERS: David Quintana <gigaherz@gmail.com>
11 WINE_DEFAULT_DEBUG_CHANNEL(stobject
);
13 const GUID CLSID_SysTray
= { 0x35CEC8A3, 0x2BE6, 0x11D2, { 0x87, 0x73, 0x92, 0xE2, 0x20, 0x52, 0x41, 0x53 } };
15 CSysTray::CSysTray() {}
16 CSysTray::~CSysTray() {}
18 HRESULT
CSysTray::InitIcons()
20 for (int i
= 0; i
< g_NumIcons
; i
++)
22 HRESULT hr
= g_IconHandlers
[i
].pfnInit(this);
30 HRESULT
CSysTray::ShutdownIcons()
32 for (int i
= 0; i
< g_NumIcons
; i
++)
34 HRESULT hr
= g_IconHandlers
[i
].pfnShutdown(this);
42 HRESULT
CSysTray::UpdateIcons()
44 for (int i
= 0; i
< g_NumIcons
; i
++)
46 HRESULT hr
= g_IconHandlers
[i
].pfnUpdate(this);
54 HRESULT
CSysTray::ProcessIconMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
56 for (int i
= 0; i
< g_NumIcons
; i
++)
58 HRESULT hr
= g_IconHandlers
[i
].pfnMessage(this, uMsg
, wParam
, lParam
);
69 HRESULT
CSysTray::NotifyIcon(INT code
, UINT uId
, HICON hIcon
, LPCWSTR szTip
)
72 nim
.cbSize
= sizeof(NOTIFYICONDATA
);
73 nim
.uFlags
= NIF_ICON
| NIF_STATE
| NIF_TIP
;
76 nim
.uCallbackMessage
= uId
;
80 nim
.uVersion
= NOTIFYICON_VERSION
;
82 StringCchCopy(nim
.szTip
, _countof(nim
.szTip
), szTip
);
85 BOOL ret
= Shell_NotifyIcon(code
, &nim
);
86 return ret
? S_OK
: E_FAIL
;
89 DWORD WINAPI
CSysTray::s_SysTrayThreadProc(PVOID param
)
91 CSysTray
* st
= (CSysTray
*) param
;
92 return st
->SysTrayThreadProc();
95 HRESULT
CSysTray::SysTrayMessageLoop()
100 while ((ret
= GetMessage(&msg
, NULL
, 0, 0)) != 0)
105 TranslateMessage(&msg
);
106 DispatchMessage(&msg
);
112 HRESULT
CSysTray::SysTrayThreadProc()
114 WCHAR strFileName
[MAX_PATH
];
115 GetModuleFileNameW(g_hInstance
, strFileName
, MAX_PATH
);
116 HMODULE hLib
= LoadLibraryW(strFileName
);
118 CoInitializeEx(NULL
, COINIT_DISABLE_OLE1DDE
| COINIT_APARTMENTTHREADED
);
122 HRESULT ret
= SysTrayMessageLoop();
126 FreeLibraryAndExitThread(hLib
, ret
);
129 HRESULT
CSysTray::CreateSysTrayThread()
131 DbgPrint("CSysTray Init TODO: Initialize tray icon handlers.\n");
133 HANDLE hThread
= CreateThread(NULL
, 0, s_SysTrayThreadProc
, this, 0, NULL
);
135 CloseHandle(hThread
);
140 HRESULT
CSysTray::DestroySysTrayWindow()
147 // *** IOleCommandTarget methods ***
148 HRESULT STDMETHODCALLTYPE
CSysTray::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
154 HRESULT STDMETHODCALLTYPE
CSysTray::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
156 if (!IsEqualGUID(*pguidCmdGroup
, CGID_ShellServiceObject
))
161 case OLECMDID_NEW
: // init
162 return CreateSysTrayThread();
163 case OLECMDID_SAVE
: // shutdown
164 return DestroySysTrayWindow();
169 BOOL
CSysTray::ProcessWindowMessage(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
&lResult
, DWORD dwMsgMapID
)
180 SetTimer(1, 2000, NULL
);
190 DbgPrint("SysTray message received %u (%08p %08p)\n", uMsg
, wParam
, lParam
);
192 hr
= ProcessIconMessage(uMsg
, wParam
, lParam
);