ReactOS  0.4.13-dev-464-g6b95727
syspager.cpp
Go to the documentation of this file.
1 /*
2  * ReactOS Explorer
3  *
4  * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
5  * Copyright 2018 Ged Murphy <gedmurphy@reactos.org>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "precomp.h"
23 
25 {
26  // Must keep a separate copy since the original is unioned with uTimeout.
28 };
29 
31 {
35 
38  {
39  IconData.cbSize = sizeof(NOTIFYICONDATA);
40  IconData.hWnd = iconData->hWnd;
41  IconData.uID = iconData->uID;
42  IconData.guidItem = iconData->guidItem;
43  }
44 
46  {
47  if (hProcess)
48  {
50  }
51  }
52 };
53 
55 {
61  bool m_Loop;
62 
63 public:
64  CIconWatcher();
65 
66  virtual ~CIconWatcher();
67 
69  void Uninitialize();
70 
71  bool AddIconToWatcher(_In_ CONST NOTIFYICONDATA *iconData);
73 
75 
76 private:
77 
78  static UINT WINAPI WatcherThread(_In_opt_ LPVOID lpParam);
79 };
80 
81 class CNotifyToolbar;
82 
84 {
85 public:
86  static const int TimerInterval = 2000;
87  static const int BalloonsTimerId = 1;
88  static const int MinTimeout = 10000;
89  static const int MaxTimeout = 30000;
90  static const int CooldownBetweenBalloons = 2000;
91 
92 private:
93  struct Info
94  {
96  WCHAR szInfo[256];
100 
102  {
103  pSource = source;
106  uIcon = source->dwInfoFlags & NIIF_ICON_MASK;
107  if (source->dwInfoFlags == NIIF_USER)
108  uIcon = reinterpret_cast<WPARAM>(source->hIcon);
109  uTimeout = source->uTimeout;
110  }
111  };
112 
114 
116 
118 
120 
123 
124  int m_timer;
125 
126 public:
127  CBalloonQueue();
128 
129  void Init(HWND hwndParent, CNotifyToolbar * toolbar, CTooltips * balloons);
130  void Deinit();
131 
132  bool OnTimer(int timerId);
133  void UpdateInfo(InternalIconData * notifyItem);
134  void RemoveInfo(InternalIconData * notifyItem);
135  void CloseCurrent();
136 
137 private:
138 
140  void SetTimer(int length);
141  void Show(Info& info);
142  void Close(IN OUT InternalIconData * notifyItem, IN UINT uReason);
143 };
144 
146  public CWindowImplBaseT< CToolbar<InternalIconData>, CControlWinTraits >
147 {
150 
152 
153 public:
154  CNotifyToolbar();
155  virtual ~CNotifyToolbar();
156 
157  int GetVisibleButtonCount();
160  BOOL AddButton(IN CONST NOTIFYICONDATA *iconData);
165  bool SendNotifyCallback(InternalIconData* notifyItem, UINT uMsg);
166 
167 private:
168  LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
169  VOID SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wParam);
170  LRESULT OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
171  LRESULT OnTooltipShow(INT uCode, LPNMHDR hdr, BOOL& bHandled);
172 
173 public:
178  END_MSG_MAP()
179 
181 };
182 
183 
184 static const WCHAR szSysPagerWndClass[] = L"SysPager";
185 
187  public CComCoClass<CSysPagerWnd>,
190  public IOleWindow,
191  public CIconWatcher
192 {
196 
197 public:
198  CSysPagerWnd();
199  virtual ~CSysPagerWnd();
200 
201  LRESULT DrawBackground(HDC hdc);
202  LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
203  LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
204  LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
205  LRESULT OnGetInfoTip(INT uCode, LPNMHDR hdr, BOOL& bHandled);
206  LRESULT OnCustomDraw(INT uCode, LPNMHDR hdr, BOOL& bHandled);
207  LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
208  LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
209  LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
210  LRESULT OnBalloonPop(UINT uCode, LPNMHDR hdr, BOOL& bHandled);
211  LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
212  LRESULT OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
213  LRESULT OnSettingChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
214  LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
215 
216 public:
217 
219  {
220  if (!phwnd)
221  return E_INVALIDARG;
222  *phwnd = m_hWnd;
223  return S_OK;
224  }
225 
227  {
228  return E_NOTIMPL;
229  }
230 
232 
236  END_COM_MAP()
237 
238  BOOL NotifyIcon(DWORD dwMessage, _In_ CONST NOTIFYICONDATA *iconData);
239  void GetSize(IN BOOL IsHorizontal, IN PSIZE size);
240 
242 
246  MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
251  MESSAGE_HANDLER(WM_COPYDATA, OnCopyData)
252  MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChanged)
253  MESSAGE_HANDLER(TNWM_GETMINIMUMSIZE, OnGetMinimumSize)
254  NOTIFY_CODE_HANDLER(TTN_POP, OnBalloonPop)
255  NOTIFY_CODE_HANDLER(TBN_GETINFOTIPW, OnGetInfoTip)
256  NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
257  END_MSG_MAP()
258 
260 };
261 
262 /*
263  * IconWatcher
264  */
265 
267  m_hWatcherThread(NULL),
268  m_WakeUpEvent(NULL),
269  m_hwndSysTray(NULL),
270  m_Loop(false)
271 {
272 }
273 
275 {
276  Uninitialize();
277  DeleteCriticalSection(&m_ListLock);
278 
279  if (m_WakeUpEvent)
280  CloseHandle(m_WakeUpEvent);
281  if (m_hWatcherThread)
282  CloseHandle(m_hWatcherThread);
283 }
284 
286 {
287  m_hwndSysTray = hWndParent;
288 
289  InitializeCriticalSection(&m_ListLock);
290  m_WakeUpEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
291  if (m_WakeUpEvent == NULL)
292  return false;
293 
294  m_hWatcherThread = (HANDLE)_beginthreadex(NULL,
295  0,
296  WatcherThread,
297  (LPVOID)this,
298  0,
299  NULL);
300  if (m_hWatcherThread == NULL)
301  return false;
302 
303  return true;
304 }
305 
307 {
308  m_Loop = false;
309  if (m_WakeUpEvent)
310  SetEvent(m_WakeUpEvent);
311 
312  EnterCriticalSection(&m_ListLock);
313 
314  POSITION Pos;
315  for (size_t i = 0; i < m_WatcherList.GetCount(); i++)
316  {
317  Pos = m_WatcherList.FindIndex(i);
318  if (Pos)
319  {
321  Icon = m_WatcherList.GetAt(Pos);
322  delete Icon;
323  }
324  }
325  m_WatcherList.RemoveAll();
326 
327  LeaveCriticalSection(&m_ListLock);
328 }
329 
331 {
333  (void)GetWindowThreadProcessId(iconData->hWnd, &ProcessId);
334 
337  if (hProcess == NULL)
338  {
339  return false;
340  }
341 
342  IconWatcherData *Icon = new IconWatcherData(iconData);
343  Icon->hProcess = hProcess;
344  Icon->ProcessId = ProcessId;
345 
346  bool Added = false;
347  EnterCriticalSection(&m_ListLock);
348 
349  // The likelyhood of someone having more than 64 icons in their tray is
350  // pretty slim. We could spin up a new thread for each multiple of 64, but
351  // it's not worth the effort, so we just won't bother watching those icons
352  if (m_WatcherList.GetCount() < MAXIMUM_WAIT_OBJECTS)
353  {
354  m_WatcherList.AddTail(Icon);
355  SetEvent(m_WakeUpEvent);
356  Added = true;
357  }
358 
359  LeaveCriticalSection(&m_ListLock);
360 
361  if (!Added)
362  {
363  delete Icon;
364  }
365 
366  return Added;
367 }
368 
370 {
371  EnterCriticalSection(&m_ListLock);
372 
374  Icon = GetListEntry(iconData, NULL, true);
375 
376  SetEvent(m_WakeUpEvent);
377  LeaveCriticalSection(&m_ListLock);
378 
379  delete Icon;
380  return true;
381 }
382 
384 {
386  POSITION NextPosition = m_WatcherList.GetHeadPosition();
388  do
389  {
390  Position = NextPosition;
391 
392  Entry = m_WatcherList.GetNext(NextPosition);
393  if (Entry)
394  {
395  if ((iconData && ((Entry->IconData.hWnd == iconData->hWnd) && (Entry->IconData.uID == iconData->uID))) ||
396  (hProcess && (Entry->hProcess == hProcess)))
397  {
398  if (Remove)
399  m_WatcherList.RemoveAt(Position);
400  break;
401  }
402  }
403  Entry = NULL;
404 
405  } while (NextPosition != NULL);
406 
407  return Entry;
408 }
409 
411 {
412  CIconWatcher* This = reinterpret_cast<CIconWatcher *>(lpParam);
413  HANDLE *WatchList = NULL;
414 
415  This->m_Loop = true;
416  while (This->m_Loop)
417  {
418  EnterCriticalSection(&This->m_ListLock);
419 
420  DWORD Size;
421  Size = This->m_WatcherList.GetCount() + 1;
423 
424  if (WatchList)
425  delete[] WatchList;
426  WatchList = new HANDLE[Size];
427  WatchList[0] = This->m_WakeUpEvent;
428 
429  POSITION Pos;
430  for (size_t i = 0; i < This->m_WatcherList.GetCount(); i++)
431  {
432  Pos = This->m_WatcherList.FindIndex(i);
433  if (Pos)
434  {
436  Icon = This->m_WatcherList.GetAt(Pos);
437  WatchList[i + 1] = Icon->hProcess;
438  }
439  }
440 
441  LeaveCriticalSection(&This->m_ListLock);
442 
443  DWORD Status;
445  WatchList,
446  FALSE,
447  INFINITE);
448  if (Status == WAIT_OBJECT_0)
449  {
450  // We've been kicked, we have updates to our list (or we're exiting the thread)
451  if (This->m_Loop)
452  TRACE("Updating watched icon list");
453  }
454  else if ((Status >= WAIT_OBJECT_0 + 1) && (Status < Size))
455  {
457  Icon = This->GetListEntry(NULL, WatchList[Status], false);
458 
459  TRACE("Pid %lu owns a notification icon and has stopped without deleting it. We'll cleanup on its behalf", Icon->ProcessId);
460 
461  TRAYNOTIFYDATAW tnid = {0};
462  tnid.dwSignature = NI_NOTIFY_SIG;
463  tnid.dwMessage = NIM_DELETE;
464  CopyMemory(&tnid.nid, &Icon->IconData, Icon->IconData.cbSize);
465 
467  data.dwData = 1;
468  data.cbData = sizeof(tnid);
469  data.lpData = &tnid;
470 
471  BOOL Success = ::SendMessage(This->m_hwndSysTray, WM_COPYDATA,
472  (WPARAM)&Icon->IconData, (LPARAM)&data);
473  if (!Success)
474  {
475  // If we failed to handle the delete message, forcibly remove it
476  This->RemoveIconFromWatcher(&Icon->IconData);
477  }
478  }
479  else
480  {
481  if (Status == WAIT_FAILED)
482  {
483  Status = GetLastError();
484  }
485  ERR("Failed to wait on process handles : %lu\n", Status);
486  This->Uninitialize();
487  }
488  }
489 
490  if (WatchList)
491  delete[] WatchList;
492 
493  return 0;
494 }
495 
496 /*
497  * BalloonQueue
498  */
499 
501  m_hwndParent(NULL),
502  m_tooltips(NULL),
503  m_toolbar(NULL),
504  m_current(NULL),
505  m_currentClosed(false),
506  m_timer(-1)
507 {
508 }
509 
511 {
513  m_toolbar = toolbar;
514  m_tooltips = balloons;
515 }
516 
518 {
519  if (m_timer >= 0)
520  {
522  }
523 }
524 
525 bool CBalloonQueue::OnTimer(int timerId)
526 {
527  if (timerId != m_timer)
528  return false;
529 
531  m_timer = -1;
532 
533  if (m_current && !m_currentClosed)
534  {
535  Close(m_current, NIN_BALLOONTIMEOUT);
536  }
537  else
538  {
539  m_current = NULL;
540  m_currentClosed = false;
541  if (!m_queue.IsEmpty())
542  {
543  Info info = m_queue.RemoveHead();
544  Show(info);
545  }
546  }
547 
548  return true;
549 }
550 
552 {
553  size_t len = 0;
554  HRESULT hr = StringCchLength(notifyItem->szInfo, _countof(notifyItem->szInfo), &len);
555  if (SUCCEEDED(hr) && len > 0)
556  {
557  Info info(notifyItem);
558 
559  // If m_current == notifyItem, we want to replace the previous balloon even if there is a queue.
560  if (m_current != notifyItem && (m_current != NULL || !m_queue.IsEmpty()))
561  {
562  m_queue.AddTail(info);
563  }
564  else
565  {
566  Show(info);
567  }
568  }
569  else
570  {
571  Close(notifyItem, NIN_BALLOONHIDE);
572  }
573 }
574 
576 {
577  Close(notifyItem, NIN_BALLOONHIDE);
578 
579  POSITION position = m_queue.GetHeadPosition();
580  while(position != NULL)
581  {
582  Info& info = m_queue.GetNext(position);
583  if (info.pSource == notifyItem)
584  {
585  m_queue.RemoveAt(position);
586  }
587  }
588 }
589 
591 {
592  if (m_current != NULL)
593  {
594  Close(m_current, NIN_BALLOONTIMEOUT);
595  }
596 }
597 
599 {
600  int count = m_toolbar->GetButtonCount();
601  for (int i = 0; i < count; i++)
602  {
603  if (m_toolbar->GetItemData(i) == pdata)
604  return i;
605  }
606  return -1;
607 }
608 
610 {
612 }
613 
615 {
616  TRACE("ShowBalloonTip called for flags=%x text=%ws; title=%ws\n", info.uIcon, info.szInfo, info.szInfoTitle);
617 
618  // TODO: NIF_REALTIME, NIIF_NOSOUND, other Vista+ flags
619 
620  const int index = IndexOf(info.pSource);
621  RECT rc;
622  m_toolbar->GetItemRect(index, &rc);
623  m_toolbar->ClientToScreen(&rc);
624  const WORD x = (rc.left + rc.right) / 2;
625  const WORD y = (rc.top + rc.bottom) / 2;
626 
627  m_tooltips->SetTitle(info.szInfoTitle, info.uIcon);
629  m_tooltips->UpdateTipText(m_hwndParent, reinterpret_cast<LPARAM>(m_toolbar->m_hWnd), info.szInfo);
630  m_tooltips->TrackActivate(m_hwndParent, reinterpret_cast<LPARAM>(m_toolbar->m_hWnd));
631 
632  m_current = info.pSource;
633  int timeout = info.uTimeout;
636 
637  SetTimer(timeout);
638 
639  m_toolbar->SendNotifyCallback(m_current, NIN_BALLOONSHOW);
640 }
641 
642 void CBalloonQueue::Close(IN OUT InternalIconData * notifyItem, IN UINT uReason)
643 {
644  TRACE("HideBalloonTip called\n");
645 
646  if (m_current == notifyItem && !m_currentClosed)
647  {
649 
650  // Prevent Re-entry
651  m_currentClosed = true;
654  }
655 }
656 
657 /*
658  * NotifyToolbar
659  */
660 
662  m_ImageList(NULL),
663  m_VisibleButtonCount(0),
664  m_BalloonQueue(NULL)
665 {
666 }
667 
669 {
670 }
671 
673 {
674  return m_VisibleButtonCount;
675 }
676 
678 {
679  int count = GetButtonCount();
680 
681  for (int i = 0; i < count; i++)
682  {
684 
685  if (data->hWnd == hWnd &&
686  data->uID == uID)
687  {
688  if (pdata)
689  *pdata = data;
690  return i;
691  }
692  }
693 
694  return -1;
695 }
696 
698 {
699  int count = GetButtonCount();
700  for (int i = 0; i < count; i++)
701  {
703  if (data->hIcon == handle)
704  {
705  TBBUTTON btn;
706  GetButton(i, &btn);
707  return btn.iBitmap;
708  }
709  }
710 
711  return -1;
712 }
713 
715 {
716  TBBUTTON tbBtn = { 0 };
717  InternalIconData * notifyItem;
718  WCHAR text[] = L"";
719 
720  TRACE("Adding icon %d from hWnd %08x flags%s%s state%s%s",
721  iconData->uID, iconData->hWnd,
722  (iconData->uFlags & NIF_ICON) ? " ICON" : "",
723  (iconData->uFlags & NIF_STATE) ? " STATE" : "",
724  (iconData->dwState & NIS_HIDDEN) ? " HIDDEN" : "",
725  (iconData->dwState & NIS_SHAREDICON) ? " SHARED" : "");
726 
727  int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
728  if (index >= 0)
729  {
730  TRACE("Icon %d from hWnd %08x ALREADY EXISTS!", iconData->uID, iconData->hWnd);
731  return FALSE;
732  }
733 
734  notifyItem = new InternalIconData();
735  ZeroMemory(notifyItem, sizeof(*notifyItem));
736 
737  notifyItem->hWnd = iconData->hWnd;
738  notifyItem->uID = iconData->uID;
739 
740  tbBtn.fsState = TBSTATE_ENABLED;
741  tbBtn.fsStyle = BTNS_NOPREFIX;
742  tbBtn.dwData = (DWORD_PTR)notifyItem;
743  tbBtn.iString = (INT_PTR) text;
744  tbBtn.idCommand = GetButtonCount();
745 
746  if (iconData->uFlags & NIF_STATE)
747  {
748  notifyItem->dwState = iconData->dwState & iconData->dwStateMask;
749  }
750 
751  if (iconData->uFlags & NIF_MESSAGE)
752  {
753  notifyItem->uCallbackMessage = iconData->uCallbackMessage;
754  }
755 
756  if (iconData->uFlags & NIF_ICON)
757  {
758  notifyItem->hIcon = iconData->hIcon;
759  BOOL hasSharedIcon = notifyItem->dwState & NIS_SHAREDICON;
760  if (hasSharedIcon)
761  {
762  INT iIcon = FindExistingSharedIcon(notifyItem->hIcon);
763  if (iIcon < 0)
764  {
765  notifyItem->hIcon = NULL;
766  TRACE("Shared icon requested, but HICON not found!!!");
767  }
768  tbBtn.iBitmap = iIcon;
769  }
770  else
771  {
772  tbBtn.iBitmap = ImageList_AddIcon(m_ImageList, notifyItem->hIcon);
773  }
774  }
775 
776  if (iconData->uFlags & NIF_TIP)
777  {
778  StringCchCopy(notifyItem->szTip, _countof(notifyItem->szTip), iconData->szTip);
779  }
780 
781  if (iconData->uFlags & NIF_INFO)
782  {
783  // NOTE: In Vista+, the uTimeout value is disregarded, and the accessibility settings are used always.
784  StringCchCopy(notifyItem->szInfo, _countof(notifyItem->szInfo), iconData->szInfo);
785  StringCchCopy(notifyItem->szInfoTitle, _countof(notifyItem->szInfoTitle), iconData->szInfoTitle);
786  notifyItem->dwInfoFlags = iconData->dwInfoFlags;
787  notifyItem->uTimeout = iconData->uTimeout;
788  }
789 
790  if (notifyItem->dwState & NIS_HIDDEN)
791  {
792  tbBtn.fsState |= TBSTATE_HIDDEN;
793  }
794  else
795  {
797  }
798 
799  /* TODO: support VERSION_4 (NIF_GUID, NIF_REALTIME, NIF_SHOWTIP) */
800 
801  CToolbar::AddButton(&tbBtn);
803 
804  if (iconData->uFlags & NIF_INFO)
805  {
806  m_BalloonQueue->UpdateInfo(notifyItem);
807  }
808 
809  return TRUE;
810 }
811 
813 {
814  InternalIconData * notifyItem;
815  int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
816  if (index < 0)
817  {
818  WARN("Icon %d from hWnd %08x DOES NOT EXIST!", iconData->uID, iconData->hWnd);
819  return FALSE;
820  }
821 
822  if (iconData->uVersion != 0 && iconData->uVersion != NOTIFYICON_VERSION)
823  {
824  WARN("Tried to set the version of icon %d from hWnd %08x, to an unknown value %d. Vista+ program?", iconData->uID, iconData->hWnd, iconData->uVersion);
825  return FALSE;
826  }
827 
828  // We can not store the version in the uVersion field, because it's union'd with uTimeout,
829  // which we also need to keep track of.
830  notifyItem->uVersionCopy = iconData->uVersion;
831 
832  return TRUE;
833 }
834 
836 {
837  InternalIconData * notifyItem;
838  TBBUTTONINFO tbbi = { 0 };
839 
840  TRACE("Updating icon %d from hWnd %08x flags%s%s state%s%s",
841  iconData->uID, iconData->hWnd,
842  (iconData->uFlags & NIF_ICON) ? " ICON" : "",
843  (iconData->uFlags & NIF_STATE) ? " STATE" : "",
844  (iconData->dwState & NIS_HIDDEN) ? " HIDDEN" : "",
845  (iconData->dwState & NIS_SHAREDICON) ? " SHARED" : "");
846 
847  int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
848  if (index < 0)
849  {
850  WARN("Icon %d from hWnd %08x DOES NOT EXIST!", iconData->uID, iconData->hWnd);
851  return AddButton(iconData);
852  }
853 
854  TBBUTTON btn;
855  GetButton(index, &btn);
856  int oldIconIndex = btn.iBitmap;
857 
858  tbbi.cbSize = sizeof(tbbi);
859  tbbi.dwMask = TBIF_BYINDEX | TBIF_COMMAND;
860  tbbi.idCommand = index;
861 
862  if (iconData->uFlags & NIF_STATE)
863  {
864  if (iconData->dwStateMask & NIS_HIDDEN &&
865  (notifyItem->dwState & NIS_HIDDEN) != (iconData->dwState & NIS_HIDDEN))
866  {
867  tbbi.dwMask |= TBIF_STATE;
868  if (iconData->dwState & NIS_HIDDEN)
869  {
870  tbbi.fsState |= TBSTATE_HIDDEN;
872  }
873  else
874  {
875  tbbi.fsState &= ~TBSTATE_HIDDEN;
877  }
878  }
879 
880  notifyItem->dwState &= ~iconData->dwStateMask;
881  notifyItem->dwState |= (iconData->dwState & iconData->dwStateMask);
882  }
883 
884  if (iconData->uFlags & NIF_MESSAGE)
885  {
886  notifyItem->uCallbackMessage = iconData->uCallbackMessage;
887  }
888 
889  if (iconData->uFlags & NIF_ICON)
890  {
891  BOOL hasSharedIcon = notifyItem->dwState & NIS_SHAREDICON;
892  if (hasSharedIcon)
893  {
894  INT iIcon = FindExistingSharedIcon(iconData->hIcon);
895  if (iIcon >= 0)
896  {
897  notifyItem->hIcon = iconData->hIcon;
898  tbbi.dwMask |= TBIF_IMAGE;
899  tbbi.iImage = iIcon;
900  }
901  else
902  {
903  TRACE("Shared icon requested, but HICON not found!!! IGNORING!");
904  }
905  }
906  else
907  {
908  notifyItem->hIcon = iconData->hIcon;
909  tbbi.dwMask |= TBIF_IMAGE;
910  tbbi.iImage = ImageList_ReplaceIcon(m_ImageList, oldIconIndex, notifyItem->hIcon);
911  }
912  }
913 
914  if (iconData->uFlags & NIF_TIP)
915  {
916  StringCchCopy(notifyItem->szTip, _countof(notifyItem->szTip), iconData->szTip);
917  }
918 
919  if (iconData->uFlags & NIF_INFO)
920  {
921  // NOTE: In Vista+, the uTimeout value is disregarded, and the accessibility settings are used always.
922  StringCchCopy(notifyItem->szInfo, _countof(notifyItem->szInfo), iconData->szInfo);
923  StringCchCopy(notifyItem->szInfoTitle, _countof(notifyItem->szInfoTitle), iconData->szInfoTitle);
924  notifyItem->dwInfoFlags = iconData->dwInfoFlags;
925  notifyItem->uTimeout = iconData->uTimeout;
926  }
927 
928  /* TODO: support VERSION_4 (NIF_GUID, NIF_REALTIME, NIF_SHOWTIP) */
929 
930  SetButtonInfo(index, &tbbi);
931 
932  if (iconData->uFlags & NIF_INFO)
933  {
934  m_BalloonQueue->UpdateInfo(notifyItem);
935  }
936 
937  return TRUE;
938 }
939 
941 {
942  InternalIconData * notifyItem;
943 
944  TRACE("Removing icon %d from hWnd %08x", iconData->uID, iconData->hWnd);
945 
946  int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
947  if (index < 0)
948  {
949  TRACE("Icon %d from hWnd %08x ALREADY MISSING!", iconData->uID, iconData->hWnd);
950 
951  return FALSE;
952  }
953 
954  if (!(notifyItem->dwState & NIS_HIDDEN))
955  {
957  }
958 
959  if (!(notifyItem->dwState & NIS_SHAREDICON))
960  {
961  TBBUTTON btn;
962  GetButton(index, &btn);
963  int oldIconIndex = btn.iBitmap;
964  ImageList_Remove(m_ImageList, oldIconIndex);
965 
966  // Update other icons!
967  int count = GetButtonCount();
968  for (int i = 0; i < count; i++)
969  {
970  TBBUTTON btn;
971  GetButton(i, &btn);
972 
973  if (btn.iBitmap > oldIconIndex)
974  {
975  TBBUTTONINFO tbbi2 = { 0 };
976  tbbi2.cbSize = sizeof(tbbi2);
977  tbbi2.dwMask = TBIF_BYINDEX | TBIF_IMAGE;
978  tbbi2.iImage = btn.iBitmap-1;
979  SetButtonInfo(i, &tbbi2);
980  }
981  }
982  }
983 
984  m_BalloonQueue->RemoveInfo(notifyItem);
985 
987 
988  delete notifyItem;
989 
990  return TRUE;
991 }
992 
994 {
995  int cx, cy;
996  HIMAGELIST iml;
997 
999  return;
1000 
1002  return;
1003 
1005  if (!iml)
1006  return;
1007 
1009  m_ImageList = iml;
1011 
1012  int count = GetButtonCount();
1013  for (int i = 0; i < count; i++)
1014  {
1016  BOOL hasSharedIcon = data->dwState & NIS_SHAREDICON;
1017  INT iIcon = hasSharedIcon ? FindExistingSharedIcon(data->hIcon) : -1;
1018  if (iIcon < 0)
1019  iIcon = ImageList_AddIcon(iml, data->hIcon);
1020  TBBUTTONINFO tbbi = { sizeof(tbbi), TBIF_BYINDEX | TBIF_IMAGE, 0, iIcon};
1021  SetButtonInfo(i, &tbbi);
1022  }
1023 
1025 }
1026 
1028 {
1029  bHandled = FALSE;
1030 
1031  /*
1032  * WM_CONTEXTMENU message can be generated either by the mouse,
1033  * in which case lParam encodes the mouse coordinates where the
1034  * user right-clicked the mouse, or can be generated by (Shift-)F10
1035  * keyboard press, in which case lParam equals -1.
1036  */
1037  INT iBtn = GetHotItem();
1038  if (iBtn < 0)
1039  return 0;
1040 
1041  InternalIconData* notifyItem = GetItemData(iBtn);
1042 
1043  if (!::IsWindow(notifyItem->hWnd))
1044  return 0;
1045 
1046  if (notifyItem->uVersionCopy >= NOTIFYICON_VERSION)
1047  {
1048  /* Transmit the WM_CONTEXTMENU message if the notification icon supports it */
1049  ::SendNotifyMessage(notifyItem->hWnd,
1050  notifyItem->uCallbackMessage,
1051  notifyItem->uID,
1052  WM_CONTEXTMENU);
1053  }
1054  else if (lParam == -1)
1055  {
1056  /*
1057  * Otherwise, and only if the WM_CONTEXTMENU message was generated
1058  * from the keyboard, simulate right-click mouse messages. This is
1059  * not needed if the message came from the mouse because in this
1060  * case the right-click mouse messages were already sent together.
1061  */
1062  ::SendNotifyMessage(notifyItem->hWnd,
1063  notifyItem->uCallbackMessage,
1064  notifyItem->uID,
1065  WM_RBUTTONDOWN);
1066  ::SendNotifyMessage(notifyItem->hWnd,
1067  notifyItem->uCallbackMessage,
1068  notifyItem->uID,
1069  WM_RBUTTONUP);
1070  }
1071 
1072  return 0;
1073 }
1074 
1076 {
1077  if (!::IsWindow(notifyItem->hWnd))
1078  {
1079  // We detect and destroy icons with invalid handles only on mouse move over systray, same as MS does.
1080  // Alternatively we could search for them periodically (would waste more resources).
1081  TRACE("Destroying icon %d with invalid handle hWnd=%08x\n", notifyItem->uID, notifyItem->hWnd);
1082 
1083  RemoveButton(notifyItem);
1084 
1085  /* Ask the parent to resize */
1086  NMHDR nmh = {GetParent(), 0, NTNWM_REALIGN};
1087  GetParent().SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh);
1088 
1089  return true;
1090  }
1091 
1092  DWORD pid;
1093  GetWindowThreadProcessId(notifyItem->hWnd, &pid);
1094 
1095  if (pid == GetCurrentProcessId() ||
1096  (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST))
1097  {
1098  ::PostMessage(notifyItem->hWnd,
1099  notifyItem->uCallbackMessage,
1100  notifyItem->uID,
1101  uMsg);
1102  }
1103  else
1104  {
1105  ::SendMessage(notifyItem->hWnd,
1106  notifyItem->uCallbackMessage,
1107  notifyItem->uID,
1108  uMsg);
1109  }
1110  return false;
1111 }
1112 
1114 {
1115  static LPCWSTR eventNames [] = {
1116  L"WM_MOUSEMOVE",
1117  L"WM_LBUTTONDOWN",
1118  L"WM_LBUTTONUP",
1119  L"WM_LBUTTONDBLCLK",
1120  L"WM_RBUTTONDOWN",
1121  L"WM_RBUTTONUP",
1122  L"WM_RBUTTONDBLCLK",
1123  L"WM_MBUTTONDOWN",
1124  L"WM_MBUTTONUP",
1125  L"WM_MBUTTONDBLCLK",
1126  L"WM_MOUSEWHEEL",
1127  L"WM_XBUTTONDOWN",
1128  L"WM_XBUTTONUP",
1129  L"WM_XBUTTONDBLCLK"
1130  };
1131 
1132  InternalIconData * notifyItem = GetItemData(wIndex);
1133 
1134  if (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST)
1135  {
1136  TRACE("Sending message %S from button %d to %p (msg=%x, w=%x, l=%x)...\n",
1137  eventNames[uMsg - WM_MOUSEFIRST], wIndex,
1138  notifyItem->hWnd, notifyItem->uCallbackMessage, notifyItem->uID, uMsg);
1139  }
1140 
1141  SendNotifyCallback(notifyItem, uMsg);
1142 }
1143 
1145 {
1147  INT iBtn = HitTest(&pt);
1148 
1149  if (iBtn >= 0)
1150  {
1151  SendMouseEvent(iBtn, uMsg, wParam);
1152  }
1153 
1154  bHandled = FALSE;
1155  return FALSE;
1156 }
1157 
1158 static VOID GetTooltipText(LPARAM data, LPTSTR szTip, DWORD cchTip)
1159 {
1160  InternalIconData * notifyItem = reinterpret_cast<InternalIconData *>(data);
1161  if (notifyItem)
1162  {
1163  StringCchCopy(szTip, cchTip, notifyItem->szTip);
1164  }
1165  else
1166  {
1167  StringCchCopy(szTip, cchTip, L"");
1168  }
1169 }
1170 
1172 {
1173  RECT rcTip, rcItem;
1174  ::GetWindowRect(hdr->hwndFrom, &rcTip);
1175 
1176  SIZE szTip = { rcTip.right - rcTip.left, rcTip.bottom - rcTip.top };
1177 
1178  INT iBtn = GetHotItem();
1179 
1180  if (iBtn >= 0)
1181  {
1182  MONITORINFO monInfo = { 0 };
1183  HMONITOR hMon = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
1184 
1185  monInfo.cbSize = sizeof(monInfo);
1186 
1187  if (hMon)
1188  GetMonitorInfo(hMon, &monInfo);
1189  else
1191 
1192  GetItemRect(iBtn, &rcItem);
1193 
1194  POINT ptItem = { rcItem.left, rcItem.top };
1195  SIZE szItem = { rcItem.right - rcItem.left, rcItem.bottom - rcItem.top };
1196  ClientToScreen(&ptItem);
1197 
1198  ptItem.x += szItem.cx / 2;
1199  ptItem.y -= szTip.cy;
1200 
1201  if (ptItem.x + szTip.cx > monInfo.rcMonitor.right)
1202  ptItem.x = monInfo.rcMonitor.right - szTip.cx;
1203 
1204  if (ptItem.y + szTip.cy > monInfo.rcMonitor.bottom)
1205  ptItem.y = monInfo.rcMonitor.bottom - szTip.cy;
1206 
1207  if (ptItem.x < monInfo.rcMonitor.left)
1208  ptItem.x = monInfo.rcMonitor.left;
1209 
1210  if (ptItem.y < monInfo.rcMonitor.top)
1211  ptItem.y = monInfo.rcMonitor.top;
1212 
1213  TRACE("ptItem { %d, %d }\n", ptItem.x, ptItem.y);
1214 
1215  ::SetWindowPos(hdr->hwndFrom, NULL, ptItem.x, ptItem.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
1216 
1217  return TRUE;
1218  }
1219 
1220  bHandled = FALSE;
1221  return 0;
1222 }
1223 
1225 {
1227 
1228  DWORD styles =
1232 
1234 
1235  // Force the toolbar tooltips window to always show tooltips even if not foreground
1236  HWND tooltipsWnd = (HWND)SendMessageW(TB_GETTOOLTIPS);
1237  if (tooltipsWnd)
1238  {
1239  ::SetWindowLong(tooltipsWnd, GWL_STYLE, ::GetWindowLong(tooltipsWnd, GWL_STYLE) | TTS_ALWAYSTIP);
1240  }
1241 
1242  SetWindowTheme(m_hWnd, L"TrayNotify", NULL);
1243 
1246 
1247  TBMETRICS tbm = {sizeof(tbm)};
1249  tbm.cxPad = 1;
1250  tbm.cyPad = 1;
1251  tbm.cxBarPad = 1;
1252  tbm.cyBarPad = 1;
1253  tbm.cxButtonSpacing = 1;
1254  tbm.cyButtonSpacing = 1;
1255  SetMetrics(&tbm);
1256 
1258 }
1259 
1260 /*
1261  * SysPagerWnd
1262  */
1263 
1265 
1267 
1269 {
1270  HDC hdc = (HDC) wParam;
1271 
1272  if (!IsAppThemed())
1273  {
1274  bHandled = FALSE;
1275  return 0;
1276  }
1277 
1278  RECT rect;
1279  GetClientRect(&rect);
1281 
1282  return TRUE;
1283 }
1284 
1286 {
1289 
1290  HWND hWndTop = GetAncestor(m_hWnd, GA_ROOT);
1291 
1293 
1294  TOOLINFOW ti = { 0 };
1295  ti.cbSize = TTTOOLINFOW_V1_SIZE;
1296  ti.uFlags = TTF_TRACK | TTF_IDISHWND;
1297  ti.uId = reinterpret_cast<UINT_PTR>(Toolbar.m_hWnd);
1298  ti.hwnd = m_hWnd;
1299  ti.lpszText = NULL;
1300  ti.lParam = NULL;
1301 
1302  BOOL ret = m_Balloons.AddTool(&ti);
1303  if (!ret)
1304  {
1305  WARN("AddTool failed, LastError=%d (probably meaningless unless non-zero)\n", GetLastError());
1306  }
1307 
1309 
1310  // Explicitly request running applications to re-register their systray icons
1312  RegisterWindowMessageW(L"TaskbarCreated"),
1313  0, 0);
1314 
1315  return TRUE;
1316 }
1317 
1319 {
1322  return TRUE;
1323 }
1324 
1326 {
1327  BOOL ret = FALSE;
1328 
1329  int VisibleButtonCount = Toolbar.GetVisibleButtonCount();
1330 
1331  TRACE("NotifyIcon received. Code=%d\n", dwMessage);
1332  switch (dwMessage)
1333  {
1334  case NIM_ADD:
1335  ret = Toolbar.AddButton(iconData);
1336  if (ret == TRUE)
1337  {
1338  (void)AddIconToWatcher(iconData);
1339  }
1340  break;
1341 
1342  case NIM_MODIFY:
1343  ret = Toolbar.UpdateButton(iconData);
1344  break;
1345 
1346  case NIM_DELETE:
1347  ret = Toolbar.RemoveButton(iconData);
1348  if (ret == TRUE)
1349  {
1350  (void)RemoveIconFromWatcher(iconData);
1351  }
1352  break;
1353 
1354  case NIM_SETFOCUS:
1355  Toolbar.SetFocus();
1356  ret = TRUE;
1357  break;
1358 
1359  case NIM_SETVERSION:
1360  ret = Toolbar.SwitchVersion(iconData);
1361  break;
1362 
1363  default:
1364  TRACE("NotifyIcon received with unknown code %d.\n", dwMessage);
1365  return FALSE;
1366  }
1367 
1368  if (VisibleButtonCount != Toolbar.GetVisibleButtonCount())
1369  {
1370  /* Ask the parent to resize */
1371  NMHDR nmh = {GetParent(), 0, NTNWM_REALIGN};
1372  GetParent().SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh);
1373  }
1374 
1375  return ret;
1376 }
1377 
1379 {
1380  /* Get the ideal height or width */
1381 #if 0
1382  /* Unfortunately this doens't work correctly in ros */
1383  Toolbar.GetIdealSize(!IsHorizontal, size);
1384 
1385  /* Make the reference dimension an exact multiple of the icon size */
1386  if (IsHorizontal)
1387  size->cy -= size->cy % GetSystemMetrics(SM_CYSMICON);
1388  else
1389  size->cx -= size->cx % GetSystemMetrics(SM_CXSMICON);
1390 
1391 #else
1392  INT rows = 0;
1393  INT columns = 0;
1394  INT cyButton = GetSystemMetrics(SM_CYSMICON) + 2;
1395  INT cxButton = GetSystemMetrics(SM_CXSMICON) + 2;
1396  int VisibleButtonCount = Toolbar.GetVisibleButtonCount();
1397 
1398  if (IsHorizontal)
1399  {
1400  rows = max(size->cy / cyButton, 1);
1401  columns = (VisibleButtonCount + rows - 1) / rows;
1402  }
1403  else
1404  {
1405  columns = max(size->cx / cxButton, 1);
1406  rows = (VisibleButtonCount + columns - 1) / columns;
1407  }
1408  size->cx = columns * cxButton;
1409  size->cy = rows * cyButton;
1410 #endif
1411 }
1412 
1414 {
1415  NMTBGETINFOTIPW * nmtip = (NMTBGETINFOTIPW *) hdr;
1416  GetTooltipText(nmtip->lParam, nmtip->pszText, nmtip->cchTextMax);
1417  return TRUE;
1418 }
1419 
1421 {
1422  NMCUSTOMDRAW * cdraw = (NMCUSTOMDRAW *) hdr;
1423  switch (cdraw->dwDrawStage)
1424  {
1425  case CDDS_PREPAINT:
1426  return CDRF_NOTIFYITEMDRAW;
1427 
1428  case CDDS_ITEMPREPAINT:
1430  }
1431  return TRUE;
1432 }
1433 
1435 {
1436  bHandled = FALSE;
1437 
1438  /* Handles the BN_CLICKED notifications sent by the CNotifyToolbar member */
1439  if (HIWORD(wParam) != BN_CLICKED)
1440  return 0;
1441 
1442  INT iBtn = LOWORD(wParam);
1443  if (iBtn < 0)
1444  return 0;
1445 
1446  InternalIconData* notifyItem = Toolbar.GetItemData(iBtn);
1447 
1448  if (!::IsWindow(notifyItem->hWnd))
1449  return 0;
1450 
1451  // TODO: Improve keyboard handling by looking whether one presses
1452  // on ENTER, etc..., which roughly translates into "double-clicking".
1453 
1454  if (notifyItem->uVersionCopy >= NOTIFYICON_VERSION)
1455  {
1456  /* Use new-style notifications if the notification icon supports them */
1457  ::SendNotifyMessage(notifyItem->hWnd,
1458  notifyItem->uCallbackMessage,
1459  notifyItem->uID,
1460  NIN_SELECT); // TODO: Distinguish with NIN_KEYSELECT
1461  }
1462  else if (lParam == -1)
1463  {
1464  /*
1465  * Otherwise, and only if the icon was selected via the keyboard,
1466  * simulate right-click mouse messages. This is not needed if the
1467  * selection was done by mouse because in this case the mouse
1468  * messages were already sent.
1469  */
1470  ::SendNotifyMessage(notifyItem->hWnd,
1471  notifyItem->uCallbackMessage,
1472  notifyItem->uID,
1473  WM_LBUTTONDOWN); // TODO: Distinguish with double-click WM_LBUTTONDBLCLK
1474  ::SendNotifyMessage(notifyItem->hWnd,
1475  notifyItem->uCallbackMessage,
1476  notifyItem->uID,
1477  WM_LBUTTONUP);
1478  }
1479 
1480  return 0;
1481 }
1482 
1484 {
1485  LRESULT Ret = TRUE;
1486  SIZE szClient;
1487  szClient.cx = LOWORD(lParam);
1488  szClient.cy = HIWORD(lParam);
1489 
1490  Ret = DefWindowProc(uMsg, wParam, lParam);
1491 
1492  if (Toolbar)
1493  {
1494  Toolbar.SetWindowPos(NULL, 0, 0, szClient.cx, szClient.cy, SWP_NOZORDER);
1495  Toolbar.AutoSize();
1496 
1497  RECT rc;
1498  Toolbar.GetClientRect(&rc);
1499 
1500  SIZE szBar = { rc.right - rc.left, rc.bottom - rc.top };
1501 
1502  INT xOff = (szClient.cx - szBar.cx) / 2;
1503  INT yOff = (szClient.cy - szBar.cy) / 2;
1504 
1505  Toolbar.SetWindowPos(NULL, xOff, yOff, szBar.cx, szBar.cy, SWP_NOZORDER);
1506  }
1507  return Ret;
1508 }
1509 
1511 {
1512  bHandled = TRUE;
1513  return 0;
1514 }
1515 
1517 {
1519  bHandled = TRUE;
1520  return 0;
1521 }
1522 
1524 {
1526  {
1527  bHandled = TRUE;
1528  }
1529 
1530  return 0;
1531 }
1532 
1534 {
1536  if (cpData->dwData == 1)
1537  {
1538  /* A taskbar NotifyIcon notification */
1539  PTRAYNOTIFYDATAW pData = (PTRAYNOTIFYDATAW)cpData->lpData;
1540  if (pData->dwSignature == NI_NOTIFY_SIG)
1541  return NotifyIcon(pData->dwMessage, &pData->nid);
1542  }
1543  // TODO: Handle other types of taskbar notifications
1544 
1545  return FALSE;
1546 }
1547 
1549 {
1550  if (wParam == SPI_SETNONCLIENTMETRICS)
1551  {
1553  }
1554  return 0;
1555 }
1556 
1558 {
1560  return 0;
1561 }
1562 
1564 {
1565  /* Create the window. The tray window is going to move it to the correct
1566  position and resize it as needed. */
1567  DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE;
1568  Create(hWndParent, 0, NULL, dwStyle);
1569  if (!m_hWnd)
1570  return E_FAIL;
1571 
1572  SetWindowTheme(m_hWnd, L"TrayNotify", NULL);
1573 
1574  return S_OK;
1575 }
1576 
1578 {
1579  return ShellObjectCreatorInit<CSysPagerWnd>(hwndParent, riid, ppv);
1580 }
VOID TrackActivate(IN HWND hwndToolOwner, IN UINT uId)
Definition: rosctrls.h:695
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define TBIF_COMMAND
Definition: commctrl.h:1196
#define StringCchLength
Definition: strsafe.h:829
HWND Create(HWND hWndParent, DWORD dwStyles=0, DWORD dwExStyles=0)
Definition: rosctrls.h:241
#define GA_ROOT
Definition: winuser.h:2743
INT WINAPI ImageList_ReplaceIcon(HIMAGELIST himl, INT nIndex, HICON hIcon)
Definition: imagelist.c:2720
#define BTNS_NOPREFIX
Definition: commctrl.h:977
static const int MaxTimeout
Definition: syspager.cpp:89
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3835
#define IN
Definition: typedefs.h:38
#define NIF_MESSAGE
Definition: shellapi.h:102
HRESULT WINAPI ContextSensitiveHelp(BOOL fEnterMode)
Definition: syspager.cpp:226
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
#define max(a, b)
Definition: svc.c:63
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ProcessId
Definition: fatprocs.h:2697
static HICON
Definition: imagelist.c:84
#define REFIID
Definition: guiddef.h:113
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
char hdr[14]
Definition: iptest.cpp:33
HRESULT Initialize(IN HWND hWndParent)
Definition: syspager.cpp:1563
#define WM_MOUSEFIRST
Definition: winuser.h:1750
void Show(Info &info)
Definition: syspager.cpp:614
BOOL SwitchVersion(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:812
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
void UpdateInfo(InternalIconData *notifyItem)
Definition: syspager.cpp:551
CNotifyToolbar * m_toolbar
Definition: syspager.cpp:119
void Initialize(HWND hWndParent, CBalloonQueue *queue)
Definition: syspager.cpp:1224
CAtlList< IconWatcherData * > m_WatcherList
Definition: syspager.cpp:56
long y
Definition: polytest.cpp:48
virtual ~CSysPagerWnd()
Definition: syspager.cpp:1266
#define WM_CONTEXTMENU
Definition: richedit.h:64
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
#define WM_LBUTTONDOWN
Definition: winuser.h:1752
#define DWORD_PTR
Definition: treelist.c:76
CNotifyToolbar Toolbar
Definition: syspager.cpp:193
HRESULT hr
Definition: shlfolder.c:183
struct _Entry Entry
Definition: kefuncs.h:640
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
BOOL WINAPI IsWindow(_In_opt_ HWND)
long x
Definition: polytest.cpp:48
INT HitTest(PPOINT ppt)
Definition: rosctrls.h:410
#define pt(x, y)
Definition: drawing.c:79
REFIID riid
Definition: precomp.h:44
#define TBIF_BYINDEX
Definition: commctrl.h:1198
#define MAXIMUM_WAIT_OBJECTS
Definition: winbase.h:385
#define TBSTYLE_TRANSPARENT
Definition: commctrl.h:968
const WCHAR * text
Definition: package.c:1827
void OnTimer(HWND hwnd, UINT id)
Definition: maze.c:850
HWND Create(HWND hWndParent, _U_RECT rect=NULL, LPCTSTR szWindowName=NULL, DWORD dwStyle=0, DWORD dwExStyle=0, _U_MENUorID MenuOrID=0U, LPVOID lpCreateParam=NULL)
Definition: atlwin.h:1631
#define _countof(array)
Definition: fontsub.cpp:30
GLuint GLuint GLsizei count
Definition: gl.h:1545
static COORD Position
Definition: mouse.c:34
LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1268
#define TBCDRF_NOOFFSET
Definition: commctrl.h:1007
CBalloonQueue m_BalloonQueue
Definition: syspager.cpp:195
#define WARN(fmt,...)
Definition: debug.h:111
IconWatcherData * GetListEntry(_In_opt_ CONST NOTIFYICONDATA *iconData, _In_opt_ HANDLE hProcess, _In_ bool Remove)
Definition: syspager.cpp:383
BOOL AddTool(IN CONST TTTOOLINFOW *pInfo)
Definition: rosctrls.h:617
LRESULT OnGetInfoTip(INT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1413
#define TNWM_GETMINIMUMSIZE
Definition: precomp.h:333
static HDC
Definition: imagelist.c:92
LRESULT OnTooltipShow(INT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1171
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
Definition: atlwin.h:1876
BOOL IsWindow() const
Definition: atlwin.h:879
ush Pos
Definition: deflate.h:92
HWND hWnd
Definition: settings.c:17
REFIID LPVOID * ppv
Definition: atlbase.h:39
VOID TrackPosition(IN WORD x, IN WORD y)
Definition: rosctrls.h:708
BOOL RemoveButton(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:940
LONG top
Definition: windef.h:292
LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1510
HANDLE HWND
Definition: compat.h:13
#define GET_X_LPARAM(lp)
Definition: windowsx.h:274
DWORD dwInfoFlags
Definition: shellapi.h:244
#define CDDS_ITEMPREPAINT
Definition: commctrl.h:270
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
WCHAR szInfoTitle[64]
Definition: syspager.cpp:97
#define ZeroMemory
Definition: winbase.h:1635
DWORD DeleteButton(int index)
Definition: rosctrls.h:327
HANDLE m_hWatcherThread
Definition: syspager.cpp:58
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:611
#define SM_CYSMICON
Definition: winuser.h:1003
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:70
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define TTS_CLOSE
Definition: commctrl.h:1734
static int OnCommand(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: clipbrd.c:202
Definition: dhcpd.h:245
UINT_PTR WPARAM
Definition: windef.h:207
#define SetWindowLong
Definition: winuser.h:5719
#define WS_CHILD
Definition: pedump.c:617
#define TTS_BALLOON
Definition: commctrl.h:1733
virtual ~CIconWatcher()
Definition: syspager.cpp:274
LONG left
Definition: windef.h:291
#define SWP_NOZORDER
Definition: winuser.h:1232
DWORD GetIdealSize(BOOL useHeight, LPSIZE size)
Definition: rosctrls.h:368
int32_t INT_PTR
Definition: typedefs.h:62
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void Deinit()
Definition: syspager.cpp:517
BYTE fsStyle
Definition: commctrl.h:924
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
#define WS_CLIPCHILDREN
Definition: pedump.c:619
LONG right
Definition: windef.h:293
TItemData * GetItemData(int index)
Definition: rosctrls.h:416
#define TBCDRF_NOEDGES
Definition: commctrl.h:1005
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
VOID TrackDeactivate()
Definition: rosctrls.h:703
RECT rcMonitor
Definition: winuser.h:3727
#define E_FAIL
Definition: ddrawi.h:102
int32_t INT
Definition: typedefs.h:56
NOTIFYICONDATA IconData
Definition: syspager.cpp:34
& rect
Definition: startmenu.cpp:1413
WPARAM wParam
Definition: combotst.c:138
LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: atlwin.h:1521
#define TBIF_IMAGE
Definition: commctrl.h:1191
CHAR * LPTSTR
Definition: xmlstorage.h:192
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1483
int GetButtonCount()
Definition: rosctrls.h:297
#define _In_opt_
Definition: no_sal2.h:213
#define WM_SETTINGCHANGE
Definition: winuser.h:1611
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:597
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:925
struct _test_info info[]
Definition: SetCursorPos.c:19
#define ILC_COLOR32
Definition: commctrl.h:343
int m_VisibleButtonCount
Definition: syspager.cpp:149
#define TTTOOLINFOW_V1_SIZE
Definition: commctrl.h:1693
#define CCS_NODIVIDER
Definition: commctrl.h:2220
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
ULONG_PTR dwData
Definition: winuser.h:2954
#define COLOR_3DFACE
Definition: winuser.h:919
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:801
BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
VOID UpdateTipText(IN HWND hwndToolOwner, IN UINT uId, IN PCWSTR szText, IN HINSTANCE hinstResourceOwner=NULL)
Definition: rosctrls.h:665
BOOL SetTitle(PCWSTR szTitleText, WPARAM icon=0)
Definition: rosctrls.h:690
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI IsAppThemed(void)
Definition: system.c:596
#define TTS_ALWAYSTIP
Definition: commctrl.h:1729
#define TTN_SHOW
Definition: commctrl.h:1846
HWND m_hwndSysTray
Definition: syspager.cpp:60
BOOL GetClientRect(LPRECT lpRect) const
Definition: atlwin.h:507
Info(InternalIconData *source)
Definition: syspager.cpp:101
#define TTF_IDISHWND
Definition: commctrl.h:1736
bool SendNotifyCallback(InternalIconData *notifyItem, UINT uMsg)
Definition: syspager.cpp:1075
CHAR szTip[128]
Definition: shellapi.h:235
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
Definition: uxthemesupp.c:69
#define TBMF_BUTTONSPACING
Definition: commctrl.h:1261
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
DWORD WINAPI GetWindowThreadProcessId(HWND, PDWORD)
#define E_INVALIDARG
Definition: ddrawi.h:101
Definition: _queue.h:59
void GetSize(IN BOOL IsHorizontal, IN PSIZE size)
Definition: syspager.cpp:1378
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:697
#define NIF_TIP
Definition: shellapi.h:104
bool OnTimer(int timerId)
Definition: syspager.cpp:525
smooth NULL
Definition: ftsmooth.c:416
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:622
static HWND hwndParent
Definition: cryptui.c:300
LONG cx
Definition: windef.h:319
LONG_PTR LPARAM
Definition: windef.h:208
#define CCS_TOP
Definition: commctrl.h:2214
#define CCS_NOPARENTALIGN
Definition: commctrl.h:2218
#define TOOLINFOW
Definition: commctrl.h:1687
_In_ BOOLEAN Remove
Definition: psfuncs.h:110
HRESULT WINAPI GetWindow(HWND *phwnd)
Definition: syspager.cpp:218
DWORD AutoSize()
Definition: rosctrls.h:358
#define CDRF_NOTIFYITEMDRAW
Definition: commctrl.h:260
CTooltips m_Balloons
Definition: syspager.cpp:194
InternalIconData * m_current
Definition: syspager.cpp:121
GLuint index
Definition: glext.h:6031
HIMAGELIST SetImageList(HIMAGELIST himl)
Definition: rosctrls.h:404
INT_PTR iString
Definition: commctrl.h:931
static UINT WINAPI WatcherThread(_In_opt_ LPVOID lpParam)
Definition: syspager.cpp:410
BOOL NotifyIcon(DWORD dwMessage, _In_ CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:1325
NOTIFYICONDATAA NOTIFYICONDATA
Definition: shellapi.h:675
#define NIF_ICON
Definition: shellapi.h:103
static PROTOCOLDATA * pdata
Definition: protocol.c:157
DWORD GetItemRect(int index, LPRECT prcItem)
Definition: rosctrls.h:383
DWORD_PTR dwData
Definition: commctrl.h:930
#define GetMonitorInfo
Definition: winuser.h:5657
#define WM_DESTROY
Definition: winuser.h:1591
void Init(HWND hwndParent, CNotifyToolbar *toolbar, CTooltips *balloons)
Definition: syspager.cpp:510
int iBitmap
Definition: commctrl.h:921
#define WM_RBUTTONDOWN
Definition: winuser.h:1755
void Uninitialize()
Definition: syspager.cpp:306
#define PostMessage
Definition: winuser.h:5698
static const WCHAR szSysPagerWndClass[]
Definition: syspager.cpp:184
#define TTF_TRACK
Definition: commctrl.h:1740
HRESULT WINAPI DrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc)
Definition: draw.c:72
LRESULT OnSettingChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1548
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:541
#define TBIF_STATE
Definition: commctrl.h:1193
#define WM_COPYDATA
Definition: winuser.h:1646
int cyButtonSpacing
Definition: commctrl.h:1271
static VOID OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
Definition: evtdetctl.c:484
#define TRACE(s)
Definition: solgame.cpp:4
#define NTNWM_REALIGN
Definition: precomp.h:336
#define WAIT_OBJECT_0
Definition: winbase.h:387
GLsizeiptr size
Definition: glext.h:5919
HRESULT CSysPagerWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
Definition: syspager.cpp:1577
DWORD WINAPI GetSize(LPVOID)
if(!(yy_init))
Definition: macro.lex.yy.c:714
__wchar_t WCHAR
Definition: xmlstorage.h:180
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WM_SIZE
Definition: winuser.h:1593
LONG HRESULT
Definition: typedefs.h:77
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define END_MSG_MAP()
Definition: atlwin.h:1789
#define WM_TIMER
Definition: winuser.h:1718
#define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func)
Definition: atlwin.h:1807
#define WM_MOUSELAST
Definition: winuser.h:1777
LRESULT OnBalloonPop(UINT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1516
#define WINAPI
Definition: msvc.h:8
HWND m_hwndParent
Definition: syspager.cpp:113
#define CopyMemory
Definition: winbase.h:1633
int FindExistingSharedIcon(HICON handle)
Definition: syspager.cpp:697
unsigned short WORD
Definition: ntddk_ex.h:93
int WINAPI GetSystemMetrics(_In_ int)
#define BN_CLICKED
Definition: winuser.h:1886
PVOID HANDLE
Definition: typedefs.h:71
unsigned long DWORD
Definition: ntddk_ex.h:95
IconWatcherData(CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:36
#define WAIT_FAILED
Definition: winbase.h:394
#define TBN_GETINFOTIPW
Definition: commctrl.h:1314
#define TBCDRF_NOETCHEDEFFECT
Definition: commctrl.h:1009
#define NIM_DELETE
Definition: shellapi.h:93
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1523
#define TBSTYLE_TOOLTIPS
Definition: commctrl.h:961
#define false
Definition: stdbool.h:38
INT WINAPI ImageList_AddIcon(HIMAGELIST himl, HICON hIcon)
Definition: imagelist.c:537
#define WM_RBUTTONUP
Definition: winuser.h:1756
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define TBCDRF_NOMARK
Definition: commctrl.h:1008
DWORD SetMetrics(TBMETRICS *tbm)
Definition: rosctrls.h:378
#define SM_CXSMICON
Definition: winuser.h:1002
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define CCS_NORESIZE
Definition: commctrl.h:2217
static VOID GetTooltipText(LPARAM data, LPTSTR szTip, DWORD cchTip)
Definition: syspager.cpp:1158
void RemoveInfo(InternalIconData *notifyItem)
Definition: syspager.cpp:575
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
int ret
int cxPad
Definition: commctrl.h:1266
#define NM_CUSTOMDRAW
Definition: commctrl.h:137
BOOL WINAPI ImageList_Remove(HIMAGELIST himl, INT i)
Definition: imagelist.c:2509
#define CDDS_PREPAINT
Definition: commctrl.h:265
int cyPad
Definition: commctrl.h:1267
static BOOL Uninitialize(LPCWSTR lpDriverPath)
Definition: main.c:16
#define index(s, c)
Definition: various.h:29
static const WCHAR L[]
Definition: oid.c:1250
#define StringCchCopy
Definition: strsafe.h:139
HDC hdc
Definition: main.c:9
#define GetWindowLong
Definition: winuser.h:5662
#define TTN_POP
Definition: commctrl.h:1847
void CloseCurrent()
Definition: syspager.cpp:590
BOOL SendNotifyMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
Definition: atlwin.h:1088
struct tagCOPYDATASTRUCT * PCOPYDATASTRUCT
int idCommand
Definition: commctrl.h:922
bool RemoveIconFromWatcher(_In_ CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:369
#define TB_GETTOOLTIPS
Definition: commctrl.h:1110
CRITICAL_SECTION m_ListLock
Definition: syspager.cpp:57
#define ILC_MASK
Definition: commctrl.h:336
GLenum GLsizei len
Definition: glext.h:6722
HWND m_hWnd
Definition: atlwin.h:268
CBalloonQueue * m_BalloonQueue
Definition: syspager.cpp:151
CTooltips * m_tooltips
Definition: syspager.cpp:115
#define CS_DBLCLKS
Definition: winuser.h:646
#define WM_COMMAND
Definition: winuser.h:1716
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
#define SYNCHRONIZE
Definition: nt_native.h:61
HIMAGELIST m_ImageList
Definition: syspager.cpp:148
BOOL AddButton(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:714
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1285
CAtlList< Info > m_queue
Definition: syspager.cpp:117
HWND Create(HWND hWndParent, DWORD dwStyles=WS_POPUP|TTS_NOPREFIX, DWORD dwExStyles=WS_EX_TOPMOST)
Definition: rosctrls.h:596
UINT uCallbackMessage
Definition: shellapi.h:229
static const int MinTimeout
Definition: syspager.cpp:88
Status
Definition: gdiplustypes.h:24
DWORD SetButtonSize(int w, int h)
Definition: rosctrls.h:353
#define SWP_NOSIZE
Definition: winuser.h:1230
#define ERR(fmt,...)
Definition: debug.h:109
VOID ResizeImagelist()
Definition: syspager.cpp:993
#define _In_
Definition: no_sal2.h:204
#define GWL_STYLE
Definition: winuser.h:846
int cxBarPad
Definition: commctrl.h:1268
HWND WINAPI GetParent(_In_ HWND)
BOOL UpdateButton(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:835
UINT WINAPI RegisterWindowMessageW(_In_ LPCWSTR)
#define S_OK
Definition: intsafe.h:59
InternalIconData * pSource
Definition: syspager.cpp:95
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1257
#define TBMF_BARPAD
Definition: commctrl.h:1260
int IndexOf(InternalIconData *pdata)
Definition: syspager.cpp:598
LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1027
void SetTimer(int length)
Definition: syspager.cpp:609
int cxButtonSpacing
Definition: commctrl.h:1270
HANDLE m_WakeUpEvent
Definition: syspager.cpp:59
GLsizei GLsizei GLchar * source
Definition: glext.h:6048
int FindItem(IN HWND hWnd, IN UINT uID, InternalIconData **pdata)
Definition: syspager.cpp:677
VOID SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wParam)
Definition: syspager.cpp:1113
DWORD cbSize
Definition: winuser.h:3726
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:561
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_LBUTTONUP
Definition: winuser.h:1753
#define E_NOTIMPL
Definition: ddrawi.h:99
WCHAR szInfo[256]
Definition: syspager.cpp:96
bool m_currentClosed
Definition: syspager.cpp:122
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
LRESULT OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1144
#define TBCDRF_NOBACKGROUND
Definition: commctrl.h:1012
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1434
unsigned int UINT
Definition: ndis.h:50
LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1557
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define TBMF_PAD
Definition: commctrl.h:1259
#define NOTIFY_CODE_HANDLER(cd, func)
Definition: atlwin.h:1852
CHAR szInfo[256]
Definition: shellapi.h:238
HANDLE hProcess
Definition: syspager.cpp:32
#define BEGIN_MSG_MAP(theClass)
Definition: atlwin.h:1770
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:275
#define NIM_ADD
Definition: shellapi.h:91
Definition: globals.h:96
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:639
#define MESSAGE_HANDLER(msg, func)
Definition: atlwin.h:1798
_Out_opt_ int * cx
Definition: commctrl.h:570
virtual ~CNotifyToolbar()
Definition: syspager.cpp:668
#define TBSTATE_HIDDEN
Definition: commctrl.h:947
#define SendMessage
Definition: winuser.h:5709
#define OUT
Definition: typedefs.h:39
#define TBSTATE_ENABLED
Definition: commctrl.h:946
#define WM_CREATE
Definition: winuser.h:1590
BOOL WINAPI ImageList_GetIconSize(HIMAGELIST himl, INT *cx, INT *cy)
Definition: imagelist.c:1978
const WCHAR * class
Definition: main.c:68
static const int CooldownBetweenBalloons
Definition: syspager.cpp:90
DWORD dwMask
Definition: commctrl.h:1265
const GUID IID_IOleWindow
#define TBSTYLE_WRAPABLE
Definition: commctrl.h:962
static LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
Definition: welcome.c:1552
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1318
#define HIWORD(l)
Definition: typedefs.h:246
LRESULT SendMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
Definition: atlwin.h:1048
#define const
Definition: zconf.h:230
DWORD SetButtonInfo(int cmdId, TBBUTTONINFO *info)
Definition: rosctrls.h:337
LONG bottom
Definition: windef.h:294
bool Initialize(_In_ HWND hWndParent)
Definition: syspager.cpp:285
PKSAUDIO_DEVICE_ENTRY GetListEntry(IN PLIST_ENTRY Head, IN ULONG Index)
Definition: control.c:45
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
LRESULT OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1533
CWindow GetParent() const
Definition: atlwin.h:654
#define END_COM_MAP()
Definition: atlcom.h:552
#define WM_ERASEBKGND
Definition: winuser.h:1607
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
BYTE fsState
Definition: commctrl.h:923
int GetVisibleButtonCount()
Definition: syspager.cpp:672
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
LONG_PTR LRESULT
Definition: windef.h:209
int cyBarPad
Definition: commctrl.h:1269
#define INFINITE
Definition: serial.h:102
#define WS_VISIBLE
Definition: pedump.c:620
#define HWND_BROADCAST
Definition: winuser.h:1190
LONG cy
Definition: windef.h:320
CHAR szInfoTitle[64]
Definition: shellapi.h:243
LPARAM lParam
Definition: combotst.c:139
#define TTS_NOPREFIX
Definition: commctrl.h:1730
#define LOWORD(l)
Definition: pedump.c:82
bool AddIconToWatcher(_In_ CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:330
#define CONST
Definition: pedump.c:81
static const int BalloonsTimerId
Definition: syspager.cpp:87
base of all file and directory entries
Definition: entries.h:82
#define SendNotifyMessage
Definition: winuser.h:5712
#define TBSTYLE_FLAT
Definition: commctrl.h:964
#define WM_NOTIFY
Definition: richedit.h:61
#define NIM_MODIFY
Definition: shellapi.h:92
BOOL OnCreate(HWND hWnd)
Definition: msconfig.c:83
DWORD AddButton(TBBUTTON *btn)
Definition: rosctrls.h:307
DWORD WINAPI GetCurrentProcessId(VOID)
Definition: proc.c:1188
LRESULT OnCustomDraw(INT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1420
#define SUCCEEDED(hr)
Definition: intsafe.h:57
#define TBBUTTONINFO
Definition: commctrl.h:1226
DWORD GetButton(int index, TBBUTTON *btn)
Definition: rosctrls.h:302
void Close(IN OUT InternalIconData *notifyItem, IN UINT uReason)
Definition: syspager.cpp:642
static const int TimerInterval
Definition: syspager.cpp:86