https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3003471e64d09e838f24263e0d71e4ac4b2b391c
commit 3003471e64d09e838f24263e0d71e4ac4b2b391c Author: David Quintana <[email protected]> AuthorDate: Sat Feb 10 15:47:49 2018 +0100 Commit: David Quintana <[email protected]> CommitDate: Sat Feb 10 16:31:26 2018 +0100 [EXPLORER] Send balloon notifications to the callback message. TODO: Send NIN_BALLOONUSERCLICK when the user clicks on the balloon content (not the X button). --- base/shell/explorer/syspager.cpp | 97 +++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 41 deletions(-) diff --git a/base/shell/explorer/syspager.cpp b/base/shell/explorer/syspager.cpp index 32d4b45c6c..0fa8eae4e3 100644 --- a/base/shell/explorer/syspager.cpp +++ b/base/shell/explorer/syspager.cpp @@ -78,6 +78,8 @@ private: static UINT WINAPI WatcherThread(_In_opt_ LPVOID lpParam); }; +class CNotifyToolbar; + class CBalloonQueue { public: @@ -114,7 +116,7 @@ private: CAtlList<Info> m_queue; - CToolbar<InternalIconData> * m_toolbar; + CNotifyToolbar * m_toolbar; InternalIconData * m_current; bool m_currentClosed; @@ -124,7 +126,7 @@ private: public: CBalloonQueue(); - void Init(HWND hwndParent, CToolbar<InternalIconData> * toolbar, CTooltips * balloons); + void Init(HWND hwndParent, CNotifyToolbar * toolbar, CTooltips * balloons); void Deinit(); bool OnTimer(int timerId); @@ -137,7 +139,7 @@ private: int IndexOf(InternalIconData * pdata); void SetTimer(int length); void Show(Info& info); - void Close(IN OUT InternalIconData * notifyItem); + void Close(IN OUT InternalIconData * notifyItem, IN UINT uReason); }; class CNotifyToolbar : @@ -160,6 +162,7 @@ public: BOOL UpdateButton(IN CONST NOTIFYICONDATA *iconData); BOOL RemoveButton(IN CONST NOTIFYICONDATA *iconData); VOID ResizeImagelist(); + bool SendNotifyCallback(InternalIconData* notifyItem, UINT uMsg); private: VOID SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wParam); @@ -495,7 +498,7 @@ CBalloonQueue::CBalloonQueue() : { } -void CBalloonQueue::Init(HWND hwndParent, CToolbar<InternalIconData> * toolbar, CTooltips * balloons) +void CBalloonQueue::Init(HWND hwndParent, CNotifyToolbar * toolbar, CTooltips * balloons) { m_hwndParent = hwndParent; m_toolbar = toolbar; @@ -520,7 +523,7 @@ bool CBalloonQueue::OnTimer(int timerId) if (m_current && !m_currentClosed) { - Close(m_current); + Close(m_current, NIN_BALLOONTIMEOUT); } else { @@ -556,13 +559,13 @@ void CBalloonQueue::UpdateInfo(InternalIconData * notifyItem) } else { - Close(notifyItem); + Close(notifyItem, NIN_BALLOONHIDE); } } void CBalloonQueue::RemoveInfo(InternalIconData * notifyItem) { - Close(notifyItem); + Close(notifyItem, NIN_BALLOONHIDE); POSITION position = m_queue.GetHeadPosition(); while(position != NULL) @@ -578,7 +581,9 @@ void CBalloonQueue::RemoveInfo(InternalIconData * notifyItem) void CBalloonQueue::CloseCurrent() { if (m_current != NULL) - Close(m_current); + { + Close(m_current, NIN_BALLOONTIMEOUT); + } } int CBalloonQueue::IndexOf(InternalIconData * pdata) @@ -621,14 +626,18 @@ void CBalloonQueue::Show(Info& info) if (timeout > MaxTimeout) timeout = MaxTimeout; SetTimer(timeout); + + m_toolbar->SendNotifyCallback(m_current, NIN_BALLOONSHOW); } -void CBalloonQueue::Close(IN OUT InternalIconData * notifyItem) +void CBalloonQueue::Close(IN OUT InternalIconData * notifyItem, IN UINT uReason) { TRACE("HideBalloonTip called\n"); if (m_current == notifyItem && !m_currentClosed) { + m_toolbar->SendNotifyCallback(m_current, uReason); + // Prevent Re-entry m_currentClosed = true; m_tooltips->TrackDeactivate(); @@ -695,7 +704,7 @@ int CNotifyToolbar::FindExistingSharedIcon(HICON handle) BOOL CNotifyToolbar::AddButton(_In_ CONST NOTIFYICONDATA *iconData) { - TBBUTTON tbBtn; + TBBUTTON tbBtn = { 0 }; InternalIconData * notifyItem; WCHAR text[] = L""; @@ -1006,27 +1015,8 @@ VOID CNotifyToolbar::ResizeImagelist() SetButtonSize(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)); } -VOID CNotifyToolbar::SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wParam) +bool CNotifyToolbar::SendNotifyCallback(InternalIconData* notifyItem, UINT uMsg) { - static LPCWSTR eventNames [] = { - L"WM_MOUSEMOVE", - L"WM_LBUTTONDOWN", - L"WM_LBUTTONUP", - L"WM_LBUTTONDBLCLK", - L"WM_RBUTTONDOWN", - L"WM_RBUTTONUP", - L"WM_RBUTTONDBLCLK", - L"WM_MBUTTONDOWN", - L"WM_MBUTTONUP", - L"WM_MBUTTONDBLCLK", - L"WM_MOUSEWHEEL", - L"WM_XBUTTONDOWN", - L"WM_XBUTTONUP", - L"WM_XBUTTONDBLCLK" - }; - - InternalIconData * notifyItem = GetItemData(wIndex); - if (!::IsWindow(notifyItem->hWnd)) { // We detect and destroy icons with invalid handles only on mouse move over systray, same as MS does. @@ -1039,14 +1029,7 @@ VOID CNotifyToolbar::SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wPar NMHDR nmh = {GetParent(), 0, NTNWM_REALIGN}; GetParent().SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh); - return; - } - - if (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) - { - TRACE("Sending message %S from button %d to %p (msg=%x, w=%x, l=%x)...\n", - eventNames[uMsg - WM_MOUSEFIRST], wIndex, - notifyItem->hWnd, notifyItem->uCallbackMessage, notifyItem->uID, uMsg); + return true; } DWORD pid; @@ -1056,9 +1039,9 @@ VOID CNotifyToolbar::SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wPar (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST)) { ::PostMessage(notifyItem->hWnd, - notifyItem->uCallbackMessage, - notifyItem->uID, - uMsg); + notifyItem->uCallbackMessage, + notifyItem->uID, + uMsg); } else { @@ -1067,6 +1050,38 @@ VOID CNotifyToolbar::SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wPar notifyItem->uID, uMsg); } + return false; +} + +VOID CNotifyToolbar::SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wParam) +{ + static LPCWSTR eventNames [] = { + L"WM_MOUSEMOVE", + L"WM_LBUTTONDOWN", + L"WM_LBUTTONUP", + L"WM_LBUTTONDBLCLK", + L"WM_RBUTTONDOWN", + L"WM_RBUTTONUP", + L"WM_RBUTTONDBLCLK", + L"WM_MBUTTONDOWN", + L"WM_MBUTTONUP", + L"WM_MBUTTONDBLCLK", + L"WM_MOUSEWHEEL", + L"WM_XBUTTONDOWN", + L"WM_XBUTTONUP", + L"WM_XBUTTONDBLCLK" + }; + + InternalIconData * notifyItem = GetItemData(wIndex); + + if (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) + { + TRACE("Sending message %S from button %d to %p (msg=%x, w=%x, l=%x)...\n", + eventNames[uMsg - WM_MOUSEFIRST], wIndex, + notifyItem->hWnd, notifyItem->uCallbackMessage, notifyItem->uID, uMsg); + } + + SendNotifyCallback(notifyItem, uMsg); } LRESULT CNotifyToolbar::OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
