107 if (
source->dwInfoFlags == NIIF_USER)
267 m_hWatcherThread(
NULL),
281 if (m_hWatcherThread)
291 if (m_WakeUpEvent ==
NULL)
300 if (m_hWatcherThread ==
NULL)
315 for (
size_t i = 0;
i < m_WatcherList.GetCount();
i++)
317 Pos = m_WatcherList.FindIndex(
i);
321 Icon = m_WatcherList.GetAt(
Pos);
325 m_WatcherList.RemoveAll();
354 m_WatcherList.AddTail(
Icon);
386 POSITION NextPosition = m_WatcherList.GetHeadPosition();
392 Entry = m_WatcherList.GetNext(NextPosition);
395 if ((iconData && ((
Entry->IconData.hWnd == iconData->hWnd) && (
Entry->IconData.uID == iconData->uID))) ||
405 }
while (NextPosition !=
NULL);
421 Size =
This->m_WatcherList.GetCount() + 1;
427 WatchList[0] =
This->m_WakeUpEvent;
430 for (
size_t i = 0;
i <
This->m_WatcherList.GetCount();
i++)
432 Pos =
This->m_WatcherList.FindIndex(
i);
437 WatchList[
i + 1] =
Icon->hProcess;
452 TRACE(
"Updating watched icon list\n");
459 TRACE(
"Pid %lu owns a notification icon and has stopped without deleting it. We'll cleanup on its behalf\n",
Icon->ProcessId);
461 TRAYNOTIFYDATAW tnid = {0};
462 tnid.dwSignature = NI_NOTIFY_SIG;
468 data.cbData =
sizeof(tnid);
476 This->RemoveIconFromWatcher(&
Icon->IconData);
485 ERR(
"Failed to wait on process handles : %lu\n",
Status);
486 This->Uninitialize();
505 m_currentClosed(
false),
571 Close(notifyItem, NIN_BALLOONHIDE);
577 Close(notifyItem, NIN_BALLOONHIDE);
580 while(position !=
NULL)
583 if (
info.pSource == notifyItem)
616 TRACE(
"ShowBalloonTip called for flags=%x text=%ws; title=%ws\n",
info.uIcon,
info.szInfo,
info.szInfoTitle);
644 TRACE(
"HideBalloonTip called\n");
663 m_VisibleButtonCount(0),
679 int count = GetButtonCount();
699 int count = GetButtonCount();
720 TRACE(
"Adding icon %d from hWnd %08x flags%s%s state%s%s\n",
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" :
"");
727 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
730 TRACE(
"Icon %d from hWnd %08x ALREADY EXISTS!\n", iconData->uID, iconData->hWnd);
737 notifyItem->
hWnd = iconData->hWnd;
738 notifyItem->
uID = iconData->uID;
747 if (iconData->uFlags & NIF_STATE)
749 notifyItem->
dwState = iconData->dwState & iconData->dwStateMask;
759 notifyItem->
hIcon = iconData->hIcon;
760 BOOL hasSharedIcon = notifyItem->
dwState & NIS_SHAREDICON;
767 TRACE(
"Shared icon requested, but HICON not found!!!\n");
777 if (iconData->uFlags &
NIF_TIP)
782 if (iconData->uFlags & NIF_INFO)
788 notifyItem->
uTimeout = iconData->uTimeout;
791 if (notifyItem->
dwState & NIS_HIDDEN)
805 if (iconData->uFlags & NIF_INFO)
816 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
819 WARN(
"Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
823 if (iconData->uVersion != 0 && iconData->uVersion != NOTIFYICON_VERSION)
825 WARN(
"Tried to set the version of icon %d from hWnd %08x, to an unknown value %d. Vista+ program?\n", iconData->uID, iconData->hWnd, iconData->uVersion);
841 TRACE(
"Updating icon %d from hWnd %08x flags%s%s state%s%s\n",
842 iconData->uID, iconData->hWnd,
843 (iconData->uFlags &
NIF_ICON) ?
" ICON" :
"",
844 (iconData->uFlags & NIF_STATE) ?
" STATE" :
"",
845 (iconData->dwState & NIS_HIDDEN) ?
" HIDDEN" :
"",
846 (iconData->dwState & NIS_SHAREDICON) ?
" SHARED" :
"");
848 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
851 WARN(
"Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
856 GetButton(
index, &btn);
857 int oldIconIndex = btn.
iBitmap;
859 tbbi.cbSize =
sizeof(tbbi);
861 tbbi.idCommand =
index;
863 if (iconData->uFlags & NIF_STATE)
865 if (iconData->dwStateMask & NIS_HIDDEN &&
866 (notifyItem->
dwState & NIS_HIDDEN) != (iconData->dwState & NIS_HIDDEN))
869 if (iconData->dwState & NIS_HIDDEN)
876 tbbi.fsState &= ~TBSTATE_HIDDEN;
881 notifyItem->
dwState &= ~iconData->dwStateMask;
882 notifyItem->
dwState |= (iconData->dwState & iconData->dwStateMask);
892 BOOL hasSharedIcon = notifyItem->
dwState & NIS_SHAREDICON;
898 notifyItem->
hIcon = iconData->hIcon;
904 TRACE(
"Shared icon requested, but HICON not found!!! IGNORING!\n");
909 notifyItem->
hIcon = iconData->hIcon;
915 if (iconData->uFlags &
NIF_TIP)
920 if (iconData->uFlags & NIF_INFO)
926 notifyItem->
uTimeout = iconData->uTimeout;
931 SetButtonInfo(
index, &tbbi);
933 if (iconData->uFlags & NIF_INFO)
945 TRACE(
"Removing icon %d from hWnd %08x\n", iconData->uID, iconData->hWnd);
947 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
950 TRACE(
"Icon %d from hWnd %08x ALREADY MISSING!\n", iconData->uID, iconData->hWnd);
955 if (!(notifyItem->
dwState & NIS_HIDDEN))
960 if (!(notifyItem->
dwState & NIS_SHAREDICON))
963 GetButton(
index, &btn);
964 int oldIconIndex = btn.
iBitmap;
968 int count = GetButtonCount();
974 if (btn.
iBitmap > oldIconIndex)
977 tbbi2.cbSize =
sizeof(tbbi2);
980 SetButtonInfo(
i, &tbbi2);
1013 int count = GetButtonCount();
1017 BOOL hasSharedIcon =
data->dwState & NIS_SHAREDICON;
1022 SetButtonInfo(
i, &tbbi);
1038 INT iBtn = GetHotItem();
1082 TRACE(
"Destroying icon %d with invalid handle hWnd=%08x\n", notifyItem->
uID, notifyItem->
hWnd);
1116 static LPCWSTR eventNames [] = {
1120 L"WM_LBUTTONDBLCLK",
1123 L"WM_RBUTTONDBLCLK",
1126 L"WM_MBUTTONDBLCLK",
1137 TRACE(
"Sending message %S from button %d to %p (msg=%x, w=%x, l=%x)...\n",
1148 INT iBtn = HitTest(&
pt);
1179 INT iBtn = GetHotItem();
1186 monInfo.
cbSize =
sizeof(monInfo);
1193 GetItemRect(iBtn, &rcItem);
1199 ptItem.
x += szItem.
cx / 2;
1200 ptItem.
y -= szTip.
cy;
1214 TRACE(
"ptItem { %d, %d }\n", ptItem.
x, ptItem.
y);
1314 WARN(
"AddTool failed, LastError=%d (probably meaningless unless non-zero)\n",
GetLastError());
1340 TRACE(
"NotifyIcon received. Code=%d\n", dwMessage);
1368 case NIM_SETVERSION:
1373 TRACE(
"NotifyIcon received with unknown code %d.\n", dwMessage);
1417 rows =
max(
size->cy / cyButton, 1);
1418 columns = (VisibleButtonCount + rows - 1) / rows;
1422 columns =
max(
size->cx / cxButton, 1);
1423 rows = (VisibleButtonCount + columns - 1) / columns;
1425 size->cx = columns * cxButton;
1426 size->cy = rows * cyButton;
1519 INT xOff = (szClient.
cx - szBar.
cx) / 2;
1520 INT yOff = (szClient.
cy - szBar.
cy) / 2;
1556 PTRAYNOTIFYDATAW
pData = (PTRAYNOTIFYDATAW)cpData->lpData;
1557 if (
pData->dwSignature == NI_NOTIFY_SIG)
1562 FIXME(
"Taskbar Load In Proc\n");
1570 if (
wParam == SPI_SETNONCLIENTMETRICS)
#define TNWM_GETMINIMUMSIZE
TaskbarSettings g_TaskbarSettings
static VOID OnTimer(IN HWND hwndDlg, IN PSYS_SHUTDOWN_PARAMS pShutdownParams)
BOOL SetWindowPos(HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags)
LRESULT SendMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
BOOL GetClientRect(LPRECT lpRect) const
BOOL GetWindowRect(LPRECT lpRect) const
CWindow GetParent() const
BOOL ClientToScreen(LPPOINT lpPoint) const
static const int MinTimeout
static const int CooldownBetweenBalloons
CNotifyToolbar * m_toolbar
void RemoveInfo(InternalIconData *notifyItem)
InternalIconData * m_current
static const int TimerInterval
void SetTimer(int length)
void UpdateInfo(InternalIconData *notifyItem)
void Init(HWND hwndParent, CNotifyToolbar *toolbar, CTooltips *balloons)
void Close(IN OUT InternalIconData *notifyItem, IN UINT uReason)
static const int MaxTimeout
int IndexOf(InternalIconData *pdata)
static const int BalloonsTimerId
bool OnTimer(int timerId)
bool RemoveIconFromWatcher(_In_ CONST NOTIFYICONDATA *iconData)
bool AddIconToWatcher(_In_ CONST NOTIFYICONDATA *iconData)
CRITICAL_SECTION m_ListLock
bool Initialize(_In_ HWND hWndParent)
IconWatcherData * GetListEntry(_In_opt_ CONST NOTIFYICONDATA *iconData, _In_opt_ HANDLE hProcess, _In_ bool Remove)
static UINT WINAPI WatcherThread(_In_opt_ LPVOID lpParam)
CAtlList< IconWatcherData * > m_WatcherList
static int OnCommand(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
DWORD WINAPI GetSize(LPVOID)
BOOL WINAPI ImageList_Remove(HIMAGELIST himl, INT i)
INT WINAPI ImageList_ReplaceIcon(HIMAGELIST himl, INT nIndex, HICON hIcon)
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
BOOL WINAPI ImageList_GetIconSize(HIMAGELIST himl, INT *cx, INT *cy)
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
HRESULT WINAPI DrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc)
BOOL WINAPI IsAppThemed(void)
PKSAUDIO_DEVICE_ENTRY GetListEntry(IN PLIST_ENTRY Head, IN ULONG Index)
static VOID OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ProcessId
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLsizei GLsizei * length
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
#define COM_INTERFACE_ENTRY_IID(iid, x)
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
#define DECLARE_NOT_AGGREGATABLE(x)
#define MESSAGE_HANDLER(msg, func)
#define NOTIFY_CODE_HANDLER(cd, func)
#define BEGIN_MSG_MAP(theClass)
#define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func)
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
_In_ BOOL _In_ HANDLE hProcess
static BOOL Uninitialize(LPCWSTR lpDriverPath)
static PROTOCOLDATA * pdata
static VOID SetImageList(HWND hwnd)
unsigned __int3264 UINT_PTR
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
const GUID IID_IOleWindow
_Out_opt_ int _Out_opt_ int * cy
#define CDDS_ITEMPREPAINT
#define CDRF_NOTIFYITEMDRAW
#define TTTOOLINFOW_V1_SIZE
#define TBCDRF_NOBACKGROUND
#define TBSTYLE_TRANSPARENT
#define TBMF_BUTTONSPACING
#define TBCDRF_NOETCHEDEFFECT
#define ImageList_AddIcon(himl, hicon)
#define CCS_NOPARENTALIGN
_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)
NOTIFYICONDATAA NOTIFYICONDATA
Info(InternalIconData *source)
InternalIconData * pSource
base of all file and directory entries
IconWatcherData(CONST NOTIFYICONDATA *iconData)
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
#define TABDMC_LOADINPROC
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
static LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
DWORD WINAPI GetLastError(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
#define MAXIMUM_WAIT_OBJECTS
DWORD WINAPI GetCurrentProcessId(void)
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
#define SubclassWindow(hwnd, lpfn)
BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
struct tagCOPYDATASTRUCT * PCOPYDATASTRUCT
HWND WINAPI GetDesktopWindow(void)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
UINT WINAPI RegisterWindowMessageW(_In_ LPCWSTR)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SendNotifyMessage
int WINAPI GetSystemMetrics(_In_ int)
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)