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),
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);
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)
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;
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))
964 int oldIconIndex = btn.
iBitmap;
974 if (btn.
iBitmap > oldIconIndex)
977 tbbi2.cbSize =
sizeof(tbbi2);
1017 BOOL hasSharedIcon =
data->dwState & NIS_SHAREDICON;
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",
1186 monInfo.
cbSize =
sizeof(monInfo);
1199 ptItem.
x += szItem.
cx / 2;
1200 ptItem.
y -= szTip.
cy;
1214 TRACE(
"ptItem { %d, %d }\n", ptItem.
x, ptItem.
y);
1301 ti.uId = reinterpret_cast<UINT_PTR>(
Toolbar.m_hWnd);
1309 WARN(
"AddTool failed, LastError=%d (probably meaningless unless non-zero)\n",
GetLastError());
1335 TRACE(
"NotifyIcon received. Code=%d\n", dwMessage);
1363 case NIM_SETVERSION:
1368 TRACE(
"NotifyIcon received with unknown code %d.\n", dwMessage);
1404 rows =
max(
size->cy / cyButton, 1);
1405 columns = (VisibleButtonCount + rows - 1) / rows;
1409 columns =
max(
size->cx / cxButton, 1);
1410 rows = (VisibleButtonCount + columns - 1) / columns;
1412 size->cx = columns * cxButton;
1413 size->cy = rows * cyButton;
1506 INT xOff = (szClient.
cx - szBar.
cx) / 2;
1507 INT yOff = (szClient.
cy - szBar.
cy) / 2;
1543 PTRAYNOTIFYDATAW
pData = (PTRAYNOTIFYDATAW)cpData->lpData;
1544 if (
pData->dwSignature == NI_NOTIFY_SIG)
1549 FIXME(
"Taskbar Load In Proc\n");
1557 if (
wParam == SPI_SETNONCLIENTMETRICS)
INT WINAPI ImageList_ReplaceIcon(HIMAGELIST himl, INT nIndex, HICON hIcon)
static const int MaxTimeout
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ProcessId
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
void UpdateInfo(InternalIconData *notifyItem)
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
CNotifyToolbar * m_toolbar
CAtlList< IconWatcherData * > m_WatcherList
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define MAXIMUM_WAIT_OBJECTS
#define TBSTYLE_TRANSPARENT
void OnTimer(HWND hwnd, UINT id)
HWND Create(HWND hWndParent, _U_RECT rect=NULL, LPCTSTR szWindowName=NULL, DWORD dwStyle=0, DWORD dwExStyle=0, _U_MENUorID MenuOrID=0U, LPVOID lpCreateParam=NULL)
GLuint GLuint GLsizei count
IconWatcherData * GetListEntry(_In_opt_ CONST NOTIFYICONDATA *iconData, _In_opt_ HANDLE hProcess, _In_ bool Remove)
#define TNWM_GETMINIMUMSIZE
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
#define CDDS_ITEMPREPAINT
IN PVOID IN PVOID IN USHORT IN USHORT Size
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
DWORD WINAPI GetLastError(VOID)
#define DECLARE_NOT_AGGREGATABLE(x)
_In_ BOOL _In_ HANDLE hProcess
GLint GLint GLint GLint GLint x
static int OnCommand(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
_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)
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
#define TTTOOLINFOW_V1_SIZE
BOOL SubclassWindow(HWND hWnd)
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI IsAppThemed(void)
static struct _test_info info[]
BOOL GetClientRect(LPRECT lpRect) const
GLenum GLuint GLenum GLsizei length
Info(InternalIconData *source)
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
#define TBMF_BUTTONSPACING
_Out_opt_ int _Out_opt_ int * cy
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
bool OnTimer(int timerId)
HWND WINAPI GetDesktopWindow(void)
#define CCS_NOPARENTALIGN
#define CDRF_NOTIFYITEMDRAW
InternalIconData * m_current
static UINT WINAPI WatcherThread(_In_opt_ LPVOID lpParam)
NOTIFYICONDATAA NOTIFYICONDATA
static PROTOCOLDATA * pdata
void Init(HWND hwndParent, CNotifyToolbar *toolbar, CTooltips *balloons)
HRESULT WINAPI DrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc)
static VOID OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
DWORD WINAPI GetSize(LPVOID)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func)
int WINAPI GetSystemMetrics(_In_ int)
IconWatcherData(CONST NOTIFYICONDATA *iconData)
#define TBCDRF_NOETCHEDEFFECT
INT WINAPI ImageList_AddIcon(HIMAGELIST himl, HICON hIcon)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
void RemoveInfo(InternalIconData *notifyItem)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
BOOL WINAPI ImageList_Remove(HIMAGELIST himl, INT i)
static BOOL Uninitialize(LPCWSTR lpDriverPath)
BOOL SendNotifyMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
struct tagCOPYDATASTRUCT * PCOPYDATASTRUCT
bool RemoveIconFromWatcher(_In_ CONST NOTIFYICONDATA *iconData)
CRITICAL_SECTION m_ListLock
static const int MinTimeout
HWND WINAPI GetParent(_In_ HWND)
UINT WINAPI RegisterWindowMessageW(_In_ LPCWSTR)
InternalIconData * pSource
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
int IndexOf(InternalIconData *pdata)
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
void SetTimer(int length)
GLsizei GLsizei GLchar * source
#define COM_INTERFACE_ENTRY_IID(iid, x)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
#define TBCDRF_NOBACKGROUND
#define TABDMC_LOADINPROC
GLint GLint GLint GLint GLint GLint y
#define NOTIFY_CODE_HANDLER(cd, func)
#define BEGIN_MSG_MAP(theClass)
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
#define MESSAGE_HANDLER(msg, func)
BOOL WINAPI ImageList_GetIconSize(HIMAGELIST himl, INT *cx, INT *cy)
static const int CooldownBetweenBalloons
const GUID IID_IOleWindow
static LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
LRESULT SendMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
bool Initialize(_In_ HWND hWndParent)
PKSAUDIO_DEVICE_ENTRY GetListEntry(IN PLIST_ENTRY Head, IN ULONG Index)
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)
CWindow GetParent() const
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
bool AddIconToWatcher(_In_ CONST NOTIFYICONDATA *iconData)
static const int BalloonsTimerId
base of all file and directory entries
#define SendNotifyMessage
DWORD WINAPI GetCurrentProcessId(VOID)
void Close(IN OUT InternalIconData *notifyItem, IN UINT uReason)
static const int TimerInterval