* TrayNotifyWnd
*/
-static const WCHAR szTrayNotifyWndClass [] = TEXT("TrayNotifyWnd");
+static const WCHAR szTrayNotifyWndClass[] = L"TrayNotifyWnd";
#define TRAY_NOTIFY_WND_SPACING_X 1
#define TRAY_NOTIFY_WND_SPACING_Y 1
class CTrayNotifyWnd :
+ public CComCoClass<CTrayNotifyWnd>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
- public CWindowImpl < CTrayNotifyWnd, CWindow, CControlWinTraits >
+ public CWindowImpl < CTrayNotifyWnd, CWindow, CControlWinTraits >,
+ public IOleWindow
{
- HWND hWndNotify;
+ CComPtr<IUnknown> m_clock;
+ CComPtr<IUnknown> m_pager;
- CSysPagerWnd * m_pager;
- CTrayClockWnd * m_clock;
-
- CComPtr<ITrayWindow> TrayWindow;
+ HWND m_hwndClock;
+ HWND m_hwndPager;
HTHEME TrayTheme;
SIZE szTrayClockMin;
public:
CTrayNotifyWnd() :
- hWndNotify(NULL),
- m_pager(NULL),
- m_clock(NULL),
+ m_hwndClock(NULL),
+ m_hwndPager(NULL),
TrayTheme(NULL),
IsHorizontal(FALSE)
{
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
- m_clock = new CTrayClockWnd();
- m_clock->_Init(m_hWnd, !g_TaskbarSettings.sr.HideClock);
+ HRESULT hr;
+
+ hr = CTrayClockWnd_CreateInstance(m_hWnd, IID_PPV_ARG(IUnknown, &m_clock));
+ if (FAILED_UNEXPECTEDLY(hr))
+ return FALSE;
- m_pager = new CSysPagerWnd();
- m_pager->_Init(m_hWnd, !g_TaskbarSettings.sr.HideClock);
+ hr = IUnknown_GetWindow(m_clock, &m_hwndClock);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return FALSE;
+
+ hr = CSysPagerWnd_CreateInstance(m_hWnd, IID_PPV_ARG(IUnknown, &m_pager));
+ if (FAILED_UNEXPECTEDLY(hr))
+ return FALSE;
+
+ hr = IUnknown_GetWindow(m_pager, &m_hwndPager);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return FALSE;
return TRUE;
}
goto NoClock;
}
- m_clock->SendMessage(TCWM_GETMINIMUMSIZE, (WPARAM) IsHorizontal, (LPARAM) &szClock);
+ ::SendMessage(m_hwndClock, TNWM_GETMINIMUMSIZE, (WPARAM) IsHorizontal, (LPARAM) &szClock);
szTrayClockMin = szClock;
}
szTray.cx = pSize->cx - 2 * TRAY_NOTIFY_WND_SPACING_X;
}
- m_pager->GetSize(IsHorizontal, &szTray);
+ ::SendMessage(m_hwndPager, TNWM_GETMINIMUMSIZE, (WPARAM) IsHorizontal, (LPARAM) &szTray);
szTrayNotify = szTray;
pSize->cx += TRAY_NOTIFY_WND_SPACING_X + szTrayClockMin.cx;
pSize->cx += szTray.cx;
+ pSize->cx += ContentMargin.cxLeftWidth + ContentMargin.cxRightWidth;
}
else
{
pSize->cy += TRAY_NOTIFY_WND_SPACING_Y + szTrayClockMin.cy;
pSize->cy += szTray.cy;
+ pSize->cy += ContentMargin.cyTopHeight + ContentMargin.cyBottomHeight;
}
- pSize->cy += ContentMargin.cyTopHeight + ContentMargin.cyBottomHeight;
- pSize->cx += ContentMargin.cxLeftWidth + ContentMargin.cxRightWidth;
-
return TRUE;
}
szClock.cy = szTrayClockMin.cy;
}
- m_clock->SetWindowPos(
+ ::SetWindowPos(m_hwndClock,
NULL,
ptClock.x,
ptClock.y,
szClock.cx,
szClock.cy,
SWP_NOZORDER);
-
- POINT ptPager;
-
- if (IsHorizontal)
- {
- ptPager.x = ContentMargin.cxLeftWidth;
- ptPager.y = (pszClient->cy - szTrayNotify.cy)/2;
- }
- else
- {
- ptPager.x = (pszClient->cx - szTrayNotify.cx)/2;
- ptPager.y = ContentMargin.cyTopHeight;
- }
-
- m_pager->SetWindowPos(
- NULL,
- ptPager.x,
- ptPager.y,
- szTrayNotify.cx,
- szTrayNotify.cy,
- SWP_NOZORDER);
}
- }
-
- LRESULT DrawBackground(HDC hdc)
- {
- HRESULT res;
- RECT rect;
- GetClientRect(&rect);
+ POINT ptPager;
- if (TrayTheme)
+ if (IsHorizontal)
{
- if (IsThemeBackgroundPartiallyTransparent(TrayTheme, TNP_BACKGROUND, 0))
- {
- DrawThemeParentBackground(m_hWnd, hdc, &rect);
- }
-
- res = DrawThemeBackground(TrayTheme, hdc, TNP_BACKGROUND, 0, &rect, 0);
+ ptPager.x = ContentMargin.cxLeftWidth;
+ ptPager.y = (pszClient->cy - szTrayNotify.cy)/2;
+ }
+ else
+ {
+ ptPager.x = (pszClient->cx - szTrayNotify.cx)/2;
+ ptPager.y = ContentMargin.cyTopHeight;
}
- return res;
+ ::SetWindowPos(m_hwndPager,
+ NULL,
+ ptPager.x,
+ ptPager.y,
+ szTrayNotify.cx,
+ szTrayNotify.cy,
+ SWP_NOZORDER);
}
LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
return 0;
}
- return DrawBackground(hdc);
- }
+ RECT rect;
+ GetClientRect(&rect);
+ if (IsThemeBackgroundPartiallyTransparent(TrayTheme, TNP_BACKGROUND, 0))
+ DrawThemeParentBackground(m_hWnd, hdc, &rect);
- BOOL NotifyIconCmd(WPARAM wParam, LPARAM lParam)
- {
- if (m_pager)
- {
- return m_pager->NotifyIconCmd(wParam, lParam);
- }
+ DrawThemeBackground(TrayTheme, hdc, TNP_BACKGROUND, 0, &rect, 0);
return TRUE;
}
- BOOL GetClockRect(OUT PRECT rcClock)
- {
- if (!m_clock->IsWindowVisible())
- return FALSE;
-
- return m_clock->GetWindowRect(rcClock);
- }
-
LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
BOOL Horizontal = (BOOL) wParam;
return (LRESULT) GetMinimumSize((PSIZE) lParam);
}
- LRESULT OnUpdateTime(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- if (m_clock != NULL)
- {
- /* Forward the message to the tray clock window procedure */
- return m_clock->OnUpdateTime(uMsg, wParam, lParam, bHandled);
- }
- return FALSE;
- }
-
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SIZE szClient;
return HTTRANSPARENT;
}
- LRESULT OnShowClock(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+ LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
- BOOL PrevHidden = g_TaskbarSettings.sr.HideClock;
- g_TaskbarSettings.sr.HideClock = (wParam == 0);
-
- if (m_clock != NULL && PrevHidden != g_TaskbarSettings.sr.HideClock)
- {
- m_clock->ShowWindow(g_TaskbarSettings.sr.HideClock ? SW_HIDE : SW_SHOW);
- }
-
- return (LRESULT) (!PrevHidden);
+ bHandled = TRUE;
+ return 0;
}
- LRESULT OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+ LRESULT OnClockMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
- TaskbarSettings* newSettings = (TaskbarSettings*)lParam;
- if (newSettings->bShowSeconds != g_TaskbarSettings.bShowSeconds)
- {
- g_TaskbarSettings.bShowSeconds = newSettings->bShowSeconds;
- /* TODO: Toggle showing seconds */
- }
-
- if (newSettings->sr.HideClock != g_TaskbarSettings.sr.HideClock)
- {
- g_TaskbarSettings.sr.HideClock = newSettings->sr.HideClock;
- /* TODO: Toggle hiding the clock */
- }
-
- return 0;
+ return SendMessageW(m_hwndClock, uMsg, wParam, lParam);
}
- LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+ LRESULT OnPagerMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
- const NMHDR *nmh = (const NMHDR *) lParam;
-
- if (nmh->hwndFrom == m_clock->m_hWnd)
- {
- /* Pass down notifications */
- return m_clock->SendMessage(WM_NOTIFY, wParam, lParam);
- }
-
- return FALSE;
+ return SendMessageW(m_hwndPager, uMsg, wParam, lParam);
}
- LRESULT OnSetFont(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+ LRESULT OnRealign(INT uCode, LPNMHDR hdr, BOOL& bHandled)
{
- if (m_clock != NULL)
- {
- m_clock->SendMessageW(WM_SETFONT, wParam, lParam);
- }
-
- bHandled = FALSE;
- return FALSE;
+ hdr->hwndFrom = m_hWnd;
+ return GetParent().SendMessage(WM_NOTIFY, 0, (LPARAM)hdr);
}
- LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+ HRESULT WINAPI GetWindow(HWND* phwnd)
{
- bHandled = TRUE;
- return 0;
+ if (!phwnd)
+ return E_INVALIDARG;
+ *phwnd = m_hWnd;
+ return S_OK;
}
- LRESULT OnSettingChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+ HRESULT WINAPI ContextSensitiveHelp(BOOL fEnterMode)
{
- if (wParam == SPI_SETNONCLIENTMETRICS)
- {
- m_pager->ResizeImagelist();
- }
- return 0;
+ return E_NOTIMPL;
}
+ DECLARE_NOT_AGGREGATABLE(CTrayNotifyWnd)
+
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+ BEGIN_COM_MAP(CTrayNotifyWnd)
+ COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
+ END_COM_MAP()
+
DECLARE_WND_CLASS_EX(szTrayNotifyWndClass, CS_DBLCLKS, COLOR_3DFACE)
BEGIN_MSG_MAP(CTrayNotifyWnd)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
- MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChanged)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest)
- MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
- MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnCtxMenu) // FIXME: This handler is not necessary in Windows
+ MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnClockMessage)
+ MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnClockMessage)
+ MESSAGE_HANDLER(WM_SETFONT, OnClockMessage)
+ MESSAGE_HANDLER(WM_SETTINGCHANGE, OnPagerMessage)
+ MESSAGE_HANDLER(WM_COPYDATA, OnPagerMessage)
+ NOTIFY_CODE_HANDLER(NTNWM_REALIGN, OnRealign)
MESSAGE_HANDLER(TNWM_GETMINIMUMSIZE, OnGetMinimumSize)
- MESSAGE_HANDLER(TNWM_UPDATETIME, OnUpdateTime)
- MESSAGE_HANDLER(TNWM_SHOWCLOCK, OnShowClock)
- MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnTaskbarSettingsChanged)
END_MSG_MAP()
- HWND _Init(IN OUT ITrayWindow *TrayWindow)
+ HRESULT Initialize(IN HWND hwndParent)
{
- HWND hWndTrayWindow;
-
- hWndTrayWindow = TrayWindow->GetHWND();
- if (hWndTrayWindow == NULL)
- return NULL;
-
- this->TrayWindow = TrayWindow;
- this->hWndNotify = hWndTrayWindow;
-
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
- return Create(hWndTrayWindow, 0, NULL, dwStyle, WS_EX_STATICEDGE);
+ Create(hwndParent, 0, NULL, dwStyle, WS_EX_STATICEDGE);
+ if (!m_hWnd)
+ return E_FAIL;
+ return S_OK;
}
};
-HWND CreateTrayNotifyWnd(IN OUT ITrayWindow *Tray, CTrayNotifyWnd** ppinstance)
-{
- CTrayNotifyWnd * pTrayNotify = new CTrayNotifyWnd();
- // TODO: Destroy after the window is destroyed
- *ppinstance = pTrayNotify;
-
- return pTrayNotify->_Init(Tray);
-}
-
-BOOL
-TrayNotify_NotifyIconCmd(CTrayNotifyWnd* pTrayNotify, WPARAM wParam, LPARAM lParam)
-{
- return pTrayNotify->NotifyIconCmd(wParam, lParam);
-}
-
-BOOL
-TrayNotify_GetClockRect(CTrayNotifyWnd* pTrayNotify, OUT PRECT rcClock)
+HRESULT CTrayNotifyWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
{
- return pTrayNotify->GetClockRect(rcClock);
+ return ShellObjectCreatorInit<CTrayNotifyWnd>(hwndParent, riid, ppv);
}