24#define BALLOON_MAXWIDTH 340
114 if (
source->dwInfoFlags == NIIF_USER)
283 m_hWatcherThread(
NULL),
297 if (m_hWatcherThread)
307 if (m_WakeUpEvent ==
NULL)
316 if (m_hWatcherThread ==
NULL)
331 for (
size_t i = 0;
i < m_WatcherList.GetCount();
i++)
333 Pos = m_WatcherList.FindIndex(
i);
337 Icon = m_WatcherList.GetAt(
Pos);
341 m_WatcherList.RemoveAll();
370 m_WatcherList.AddTail(Icon);
402 for (
POSITION NextPosition = m_WatcherList.GetHeadPosition(); NextPosition;)
405 Entry = m_WatcherList.GetNext(NextPosition);
408 if ((iconData && ((
Entry->IconData.hWnd == iconData->hWnd) && (
Entry->IconData.uID == iconData->uID))) ||
431 Size =
This->m_WatcherList.GetCount() + 1;
437 WatchList[0] =
This->m_WakeUpEvent;
440 for (
size_t i = 0;
i <
This->m_WatcherList.GetCount();
i++)
442 Pos =
This->m_WatcherList.FindIndex(
i);
446 Icon =
This->m_WatcherList.GetAt(
Pos);
462 TRACE(
"Updating watched icon list\n");
469 TRACE(
"Pid %lu owns a notification icon and has stopped without deleting it. We'll cleanup on its behalf\n", Icon->
ProcessId);
471 TRAYNOTIFYDATAW tnid = {0};
472 tnid.dwSignature = NI_NOTIFY_SIG;
478 data.cbData =
sizeof(tnid);
495 ERR(
"Failed to wait on process handles : %lu\n",
Status);
496 This->Uninitialize();
560 if (notifyItem->
szInfo[0])
576 Close(notifyItem, NIN_BALLOONHIDE);
582 Close(notifyItem, NIN_BALLOONHIDE);
588 if (
info.pSource == notifyItem)
622 TRACE(
"ShowBalloonTip called for flags=%x text=%ws; title=%ws\n",
info.uIcon,
info.szInfo,
info.szInfoTitle);
650 TRACE(
"HideBalloonTip called\n");
668 m_VisibleButtonCount(0),
696 int count = GetButtonCount();
716 int count = GetButtonCount();
737 TRACE(
"Adding icon %d from hWnd %08x flags%s%s state%s%s\n",
738 iconData->uID, iconData->hWnd,
739 (iconData->uFlags &
NIF_ICON) ?
" ICON" :
"",
740 (iconData->uFlags & NIF_STATE) ?
" STATE" :
"",
741 (iconData->dwState & NIS_HIDDEN) ?
" HIDDEN" :
"",
742 (iconData->dwState & NIS_SHAREDICON) ?
" SHARED" :
"");
744 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
747 TRACE(
"Icon %d from hWnd %08x ALREADY EXISTS!\n", iconData->uID, iconData->hWnd);
754 notifyItem->
hWnd = iconData->hWnd;
755 notifyItem->
uID = iconData->uID;
764 if (iconData->uFlags & NIF_STATE)
766 notifyItem->
dwState = iconData->dwState & iconData->dwStateMask;
776 notifyItem->
hIcon = iconData->hIcon;
777 BOOL hasSharedIcon = notifyItem->
dwState & NIS_SHAREDICON;
784 TRACE(
"Shared icon requested, but HICON not found!!!\n");
794 if (iconData->uFlags &
NIF_TIP)
799 if (iconData->uFlags & NIF_INFO)
805 notifyItem->
uTimeout = iconData->uTimeout;
808 if (notifyItem->
dwState & NIS_HIDDEN)
822 if (iconData->uFlags & NIF_INFO)
833 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
836 WARN(
"Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
840 if (iconData->uVersion != 0 && iconData->uVersion != NOTIFYICON_VERSION)
842 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);
858 TRACE(
"Updating icon %d from hWnd %08x flags%s%s state%s%s\n",
859 iconData->uID, iconData->hWnd,
860 (iconData->uFlags &
NIF_ICON) ?
" ICON" :
"",
861 (iconData->uFlags & NIF_STATE) ?
" STATE" :
"",
862 (iconData->dwState & NIS_HIDDEN) ?
" HIDDEN" :
"",
863 (iconData->dwState & NIS_SHAREDICON) ?
" SHARED" :
"");
865 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
868 WARN(
"Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
873 GetButton(
index, &btn);
874 int oldIconIndex = btn.
iBitmap;
876 tbbi.cbSize =
sizeof(tbbi);
878 tbbi.idCommand =
index;
880 if (iconData->uFlags & NIF_STATE)
882 if (iconData->dwStateMask & NIS_HIDDEN &&
883 (notifyItem->
dwState & NIS_HIDDEN) != (iconData->dwState & NIS_HIDDEN))
886 if (iconData->dwState & NIS_HIDDEN)
893 tbbi.fsState &= ~TBSTATE_HIDDEN;
898 notifyItem->
dwState &= ~iconData->dwStateMask;
899 notifyItem->
dwState |= (iconData->dwState & iconData->dwStateMask);
909 BOOL hasSharedIcon = notifyItem->
dwState & NIS_SHAREDICON;
915 notifyItem->
hIcon = iconData->hIcon;
921 TRACE(
"Shared icon requested, but HICON not found!!! IGNORING!\n");
926 notifyItem->
hIcon = iconData->hIcon;
932 if (iconData->uFlags &
NIF_TIP)
937 if (iconData->uFlags & NIF_INFO)
943 notifyItem->
uTimeout = iconData->uTimeout;
948 SetButtonInfo(
index, &tbbi);
950 if (iconData->uFlags & NIF_INFO)
962 TRACE(
"Removing icon %d from hWnd %08x\n", iconData->uID, iconData->hWnd);
964 int index =
FindItem(iconData->hWnd, iconData->uID, ¬ifyItem);
967 TRACE(
"Icon %d from hWnd %08x ALREADY MISSING!\n", iconData->uID, iconData->hWnd);
976 if (!(notifyItem->
dwState & NIS_HIDDEN))
981 if (!(notifyItem->
dwState & NIS_SHAREDICON))
984 GetButton(
index, &btn);
985 int oldIconIndex = btn.
iBitmap;
989 int count = GetButtonCount();
995 if (btn.
iBitmap > oldIconIndex)
998 tbbi2.cbSize =
sizeof(tbbi2);
1001 SetButtonInfo(
i, &tbbi2);
1008 DeleteButton(
index);
1034 int count = GetButtonCount();
1038 BOOL hasSharedIcon =
data->dwState & NIS_SHAREDICON;
1043 SetButtonInfo(
i, &tbbi);
1070 INT iBtn = GetHotItem();
1079 if (notifyItem->
GetVersion() >= NOTIFYICON_VERSION)
1114 TRACE(
"Destroying icon %d with invalid handle hWnd=%08x\n", notifyItem->
uID, notifyItem->
hWnd);
1148 static LPCWSTR eventNames [] = {
1152 L"WM_LBUTTONDBLCLK",
1155 L"WM_RBUTTONDBLCLK",
1158 L"WM_MBUTTONDBLCLK",
1169 TRACE(
"Sending message %S from button %d to %p (msg=%x, w=%x, l=%x)...\n",
1180 INT iBtn = HitTest(&
pt);
1211 INT iBtn = GetHotItem();
1218 monInfo.
cbSize =
sizeof(monInfo);
1225 GetItemRect(iBtn, &rcItem);
1231 ptItem.
x += szItem.
cx / 2;
1232 ptItem.
y -= szTip.
cy;
1246 TRACE(
"ptItem { %d, %d }\n", ptItem.
x, ptItem.
y);
1356 WARN(
"AddTool failed, LastError=%d (probably meaningless unless non-zero)\n",
GetLastError());
1382 TRACE(
"NotifyIcon received. Code=%d\n", dwMessage);
1410 if (
index < 0 || (
pData->dwState & NIS_HIDDEN))
1418 case NIM_SETVERSION:
1423 TRACE(
"NotifyIcon received with unknown code %d.\n", dwMessage);
1468 rows =
max(
size->cy / cyButton, 1);
1469 columns = (VisibleButtonCount + rows - 1) / rows;
1473 columns =
max(
size->cx / cxButton, 1);
1474 rows = (VisibleButtonCount + columns - 1) / columns;
1476 size->cx = columns * cxButton;
1477 size->cy = rows * cyButton;
1522 if (notifyItem->
GetVersion() >= NOTIFYICON_VERSION)
1570 INT xOff = (szClient.
cx - szBar.
cx) / 2;
1571 INT yOff = (szClient.
cy - szBar.
cy) / 2;
1608 PTRAYNOTIFYDATAW
pData = (PTRAYNOTIFYDATAW)cpData->lpData;
1609 if (
pData->dwSignature == NI_NOTIFY_SIG)
1614 FIXME(
"Taskbar Load In Proc\n");
1622 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
struct task_struct * current
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
static unsigned __int64 next
NOTIFYICONDATAA NOTIFYICONDATA
Info(InternalIconData *source)
InternalIconData * pSource
IconWatcherData(CONST NOTIFYICONDATA *iconData)
void SaveVersion(UINT Version)
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
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
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
BOOL WINAPI SetForegroundWindow(_In_ HWND)
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)