24#define BALLOON_MAXWIDTH 340
109 if (
source->dwInfoFlags == NIIF_USER)
275 m_hWatcherThread(
NULL),
289 if (m_hWatcherThread)
299 if (m_WakeUpEvent ==
NULL)
308 if (m_hWatcherThread ==
NULL)
323 for (
size_t i = 0;
i < m_WatcherList.GetCount();
i++)
325 Pos = m_WatcherList.FindIndex(
i);
329 Icon = m_WatcherList.GetAt(
Pos);
333 m_WatcherList.RemoveAll();
362 m_WatcherList.AddTail(
Icon);
394 POSITION NextPosition = m_WatcherList.GetHeadPosition();
400 Entry = m_WatcherList.GetNext(NextPosition);
403 if ((iconData && ((
Entry->IconData.hWnd == iconData->hWnd) && (
Entry->IconData.uID == iconData->uID))) ||
413 }
while (NextPosition !=
NULL);
429 Size =
This->m_WatcherList.GetCount() + 1;
435 WatchList[0] =
This->m_WakeUpEvent;
438 for (
size_t i = 0;
i <
This->m_WatcherList.GetCount();
i++)
440 Pos =
This->m_WatcherList.FindIndex(
i);
445 WatchList[
i + 1] =
Icon->hProcess;
460 TRACE(
"Updating watched icon list\n");
467 TRACE(
"Pid %lu owns a notification icon and has stopped without deleting it. We'll cleanup on its behalf\n",
Icon->ProcessId);
469 TRAYNOTIFYDATAW tnid = {0};
470 tnid.dwSignature = NI_NOTIFY_SIG;
476 data.cbData =
sizeof(tnid);
484 This->RemoveIconFromWatcher(&
Icon->IconData);
493 ERR(
"Failed to wait on process handles : %lu\n",
Status);
494 This->Uninitialize();
513 m_currentClosed(
false),
579 Close(notifyItem, NIN_BALLOONHIDE);
585 Close(notifyItem, NIN_BALLOONHIDE);
588 while(position !=
NULL)
591 if (
info.pSource == notifyItem)
624 TRACE(
"ShowBalloonTip called for flags=%x text=%ws; title=%ws\n",
info.uIcon,
info.szInfo,
info.szInfoTitle);
652 TRACE(
"HideBalloonTip called\n");
671 m_VisibleButtonCount(0),
687 int count = GetButtonCount();
707 int count = GetButtonCount();
728 TRACE(
"Adding icon %d from hWnd %08x flags%s%s state%s%s\n",
729 iconData->uID, iconData->hWnd,
730 (iconData->uFlags &
NIF_ICON) ?
" ICON" :
"",
731 (iconData->uFlags & NIF_STATE) ?
" STATE" :
"",
732 (iconData->dwState & NIS_HIDDEN) ?
" HIDDEN" :
"",
733 (iconData->dwState & NIS_SHAREDICON) ?
" SHARED" :
"");
735 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
738 TRACE(
"Icon %d from hWnd %08x ALREADY EXISTS!\n", iconData->uID, iconData->hWnd);
745 notifyItem->
hWnd = iconData->hWnd;
746 notifyItem->
uID = iconData->uID;
755 if (iconData->uFlags & NIF_STATE)
757 notifyItem->
dwState = iconData->dwState & iconData->dwStateMask;
767 notifyItem->
hIcon = iconData->hIcon;
768 BOOL hasSharedIcon = notifyItem->
dwState & NIS_SHAREDICON;
775 TRACE(
"Shared icon requested, but HICON not found!!!\n");
785 if (iconData->uFlags &
NIF_TIP)
790 if (iconData->uFlags & NIF_INFO)
796 notifyItem->
uTimeout = iconData->uTimeout;
799 if (notifyItem->
dwState & NIS_HIDDEN)
813 if (iconData->uFlags & NIF_INFO)
824 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
827 WARN(
"Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
831 if (iconData->uVersion != 0 && iconData->uVersion != NOTIFYICON_VERSION)
833 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);
849 TRACE(
"Updating icon %d from hWnd %08x flags%s%s state%s%s\n",
850 iconData->uID, iconData->hWnd,
851 (iconData->uFlags &
NIF_ICON) ?
" ICON" :
"",
852 (iconData->uFlags & NIF_STATE) ?
" STATE" :
"",
853 (iconData->dwState & NIS_HIDDEN) ?
" HIDDEN" :
"",
854 (iconData->dwState & NIS_SHAREDICON) ?
" SHARED" :
"");
856 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
859 WARN(
"Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
864 GetButton(
index, &btn);
865 int oldIconIndex = btn.
iBitmap;
867 tbbi.cbSize =
sizeof(tbbi);
869 tbbi.idCommand =
index;
871 if (iconData->uFlags & NIF_STATE)
873 if (iconData->dwStateMask & NIS_HIDDEN &&
874 (notifyItem->
dwState & NIS_HIDDEN) != (iconData->dwState & NIS_HIDDEN))
877 if (iconData->dwState & NIS_HIDDEN)
884 tbbi.fsState &= ~TBSTATE_HIDDEN;
889 notifyItem->
dwState &= ~iconData->dwStateMask;
890 notifyItem->
dwState |= (iconData->dwState & iconData->dwStateMask);
900 BOOL hasSharedIcon = notifyItem->
dwState & NIS_SHAREDICON;
906 notifyItem->
hIcon = iconData->hIcon;
912 TRACE(
"Shared icon requested, but HICON not found!!! IGNORING!\n");
917 notifyItem->
hIcon = iconData->hIcon;
923 if (iconData->uFlags &
NIF_TIP)
928 if (iconData->uFlags & NIF_INFO)
934 notifyItem->
uTimeout = iconData->uTimeout;
939 SetButtonInfo(
index, &tbbi);
941 if (iconData->uFlags & NIF_INFO)
953 TRACE(
"Removing icon %d from hWnd %08x\n", iconData->uID, iconData->hWnd);
955 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
958 TRACE(
"Icon %d from hWnd %08x ALREADY MISSING!\n", iconData->uID, iconData->hWnd);
963 if (!(notifyItem->
dwState & NIS_HIDDEN))
968 if (!(notifyItem->
dwState & NIS_SHAREDICON))
971 GetButton(
index, &btn);
972 int oldIconIndex = btn.
iBitmap;
976 int count = GetButtonCount();
982 if (btn.
iBitmap > oldIconIndex)
985 tbbi2.cbSize =
sizeof(tbbi2);
988 SetButtonInfo(
i, &tbbi2);
1021 int count = GetButtonCount();
1025 BOOL hasSharedIcon =
data->dwState & NIS_SHAREDICON;
1030 SetButtonInfo(
i, &tbbi);
1057 INT iBtn = GetHotItem();
1101 TRACE(
"Destroying icon %d with invalid handle hWnd=%08x\n", notifyItem->
uID, notifyItem->
hWnd);
1135 static LPCWSTR eventNames [] = {
1139 L"WM_LBUTTONDBLCLK",
1142 L"WM_RBUTTONDBLCLK",
1145 L"WM_MBUTTONDBLCLK",
1156 TRACE(
"Sending message %S from button %d to %p (msg=%x, w=%x, l=%x)...\n",
1167 INT iBtn = HitTest(&
pt);
1198 INT iBtn = GetHotItem();
1205 monInfo.
cbSize =
sizeof(monInfo);
1212 GetItemRect(iBtn, &rcItem);
1218 ptItem.
x += szItem.
cx / 2;
1219 ptItem.
y -= szTip.
cy;
1233 TRACE(
"ptItem { %d, %d }\n", ptItem.
x, ptItem.
y);
1343 WARN(
"AddTool failed, LastError=%d (probably meaningless unless non-zero)\n",
GetLastError());
1369 TRACE(
"NotifyIcon received. Code=%d\n", dwMessage);
1397 case NIM_SETVERSION:
1402 TRACE(
"NotifyIcon received with unknown code %d.\n", dwMessage);
1446 rows =
max(
size->cy / cyButton, 1);
1447 columns = (VisibleButtonCount + rows - 1) / rows;
1451 columns =
max(
size->cx / cxButton, 1);
1452 rows = (VisibleButtonCount + columns - 1) / columns;
1454 size->cx = columns * cxButton;
1455 size->cy = rows * cyButton;
1548 INT xOff = (szClient.
cx - szBar.
cx) / 2;
1549 INT yOff = (szClient.
cy - szBar.
cy) / 2;
1586 PTRAYNOTIFYDATAW
pData = (PTRAYNOTIFYDATAW)cpData->lpData;
1587 if (
pData->dwSignature == NI_NOTIFY_SIG)
1592 FIXME(
"Taskbar Load In Proc\n");
1600 if (
wParam == SPI_SETNONCLIENTMETRICS)
static BOOL OnCopyData(HWND hwnd, HWND hwndSender, COPYDATASTRUCT *pCopyData)
#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)
_ACRTIMP uintptr_t __cdecl _beginthreadex(void *, unsigned int, _beginthreadex_start_routine_t, void *, unsigned int, unsigned int *)
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
GLuint GLuint GLsizei count
GLint GLint GLint GLint GLint GLint y
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
NOTIFYICONDATAA NOTIFYICONDATA
Info(InternalIconData *source)
InternalIconData * pSource
base of all file and directory entries
IconWatcherData(CONST NOTIFYICONDATA *iconData)
TrayIconsMode eCompactTrayIcons
BOOL UseCompactTrayIcons()
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
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)