Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

229 lines
7.5 KiB

//+-------------------------------------------------------------------------
//
// TaskMan - NT TaskManager
// Copyright (C) Microsoft
//
// File: trayicon.CPP
//
// History: Jan-27-96 DavePl Created
//
//--------------------------------------------------------------------------
#include "precomp.h"
/*++ TrayThreadMessageLoop (WORKER THREAD CODE)
Routine Description:
Waits for messages telling it a notification packet is ready
in the queue, then dispatches it to the tray
Mar-27-95 Davepl Created
May-28-99 Jonburs Check for NIM_DELETE during PM_QUITTRAYTHREAD
--*/
DWORD TrayThreadMessageLoop(LPVOID)
{
MSG msg;
//
// Loop forever and process our messages
//
while( GetMessage( &msg, NULL, 0, 0 ) )
{
switch(msg.message)
{
case PM_INITIALIZEICONS:
{
//
// Add the tray icons to the tray icon cache by adding them all hidden.
//
NOTIFYICONDATA NotifyIconData;
ZeroMemory( &NotifyIconData, sizeof(NotifyIconData) );
NotifyIconData.cbSize = sizeof(NotifyIconData);
NotifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_STATE;
NotifyIconData.dwState = NIS_HIDDEN;
NotifyIconData.dwStateMask = NotifyIconData.dwState;
NotifyIconData.hWnd = g_hMainWnd;
NotifyIconData.uCallbackMessage = PWM_TRAYICON;
for ( UINT idx = 0; idx < g_cTrayIcons; idx ++ )
{
NotifyIconData.uID = ~idx; // anything but zero
NotifyIconData.hIcon = g_aTrayIcons[ idx ];
Shell_NotifyIcon( NIM_ADD, &NotifyIconData );
}
//
// We now add the zero-th icon which we will used to refer to the hidden
// cached icons we added above. This is the visible icon that users see
// in notification area.
//
NotifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
NotifyIconData.uID = 0;
NotifyIconData.hIcon = g_aTrayIcons[ 0 ];
//
// Initialize with the app title, so that the tray knows that it is
// task manager starting up, rather than "CPU Usage blah blah.."...
//
LoadString( g_hInstance, IDS_APPTITLE, NotifyIconData.szTip, ARRAYSIZE(NotifyIconData.szTip) );
Shell_NotifyIcon( NIM_ADD, &NotifyIconData );
}
break;
case PM_NOTIFYWAITING:
{
NOTIFYICONDATA NotifyIconData;
UINT uIcon = (UINT) msg.wParam;
LPCWSTR pszTipText = (LPCWSTR) msg.lParam;
//
// We need to update the icon. To do this, we tell the tray to
// use one of the icons we cached using NIS_HIDDEN into the
// zero-th position and make it visible. The hIcon indicates
// which icon to retrieve and display.
//
ZeroMemory( &NotifyIconData, sizeof(NotifyIconData) );
NotifyIconData.cbSize = sizeof(NotifyIconData);
NotifyIconData.hWnd = g_hMainWnd;
// NotifyIconData.uID = 0; - zero'ed above
NotifyIconData.uFlags = NIF_STATE | NIF_ICON;
NotifyIconData.dwStateMask = NIS_SHAREDICON;
NotifyIconData.dwState = NotifyIconData.dwStateMask;
NotifyIconData.hIcon = g_aTrayIcons[ uIcon ];
//
// If there is tool tip data to update, add it here and free
// the buffer.
//
if ( NULL != pszTipText)
{
NotifyIconData.uFlags |= NIF_TIP;
lstrcpyn( NotifyIconData.szTip, pszTipText, ARRAYSIZE(NotifyIconData.szTip) );
HeapFree( GetProcessHeap( ), 0, (LPVOID) pszTipText );
}
Shell_NotifyIcon( NIM_MODIFY, &NotifyIconData );
}
break;
case PM_QUITTRAYTHREAD:
{
//
// Remove the hidden tray icons.
//
NOTIFYICONDATA NotifyIconData;
ZeroMemory( &NotifyIconData, sizeof(NotifyIconData) );
NotifyIconData.cbSize = sizeof(NotifyIconData);
NotifyIconData.hWnd = g_hMainWnd;
for ( UINT idx = 0; idx < g_cTrayIcons; idx ++ )
{
NotifyIconData.uID = ~idx;
Shell_NotifyIcon( NIM_DELETE, &NotifyIconData );
}
//
// Before we leave, update the tool tip so the "notification
// area manager" has something better than "CPU Usage: 49%"
// to show.
//
LoadString( g_hInstance, IDS_APPTITLE, NotifyIconData.szTip, ARRAYSIZE(NotifyIconData.szTip) );
NotifyIconData.uID = 0;
NotifyIconData.uFlags = NIF_TIP;
Shell_NotifyIcon( NIM_MODIFY, &NotifyIconData );
//
// And now delete the last icon (the one we actually show).
//
NotifyIconData.uFlags = 0;
Shell_NotifyIcon( NIM_DELETE, &NotifyIconData );
g_idTrayThread = 0;
PostQuitMessage(0);
}
break;
default:
ASSERT(0 && "Taskman tray worker got unexpected message");
break;
}
}
return 0;
}
/*++ Tray_Notify (MAIN THREAD CODE)
Routine Description:
Handles notifications sent by the tray
Revision History:
Jan-27-95 Davepl Created
--*/
void Tray_Notify(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
switch (lParam)
{
case WM_LBUTTONDBLCLK:
ShowRunningInstance();
break;
case WM_RBUTTONDOWN:
{
HMENU hPopup = LoadPopupMenu(g_hInstance, IDR_TRAYMENU);
// Display the tray icons context menu at the current cursor location
if (hPopup)
{
POINT pt;
GetCursorPos(&pt);
if (IsWindowVisible(g_hMainWnd))
{
DeleteMenu(hPopup, IDM_RESTORETASKMAN, MF_BYCOMMAND);
}
else
{
SetMenuDefaultItem(hPopup, IDM_RESTORETASKMAN, FALSE);
}
CheckMenuItem(hPopup, IDM_ALWAYSONTOP,
MF_BYCOMMAND | (g_Options.m_fAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED));
SetForegroundWindow(hWnd);
g_fInPopup = TRUE;
TrackPopupMenuEx(hPopup, 0, pt.x, pt.y, hWnd, NULL);
g_fInPopup = FALSE;
DestroyMenu(hPopup);
}
break;
}
}
}