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.
187 lines
4.0 KiB
187 lines
4.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "stdafx.h" |
|
#include "shell_icon_mgr.h" |
|
#include "tier1/strtools.h" |
|
#include "tier0/dbg.h" |
|
#include "shellapi.h" |
|
|
|
|
|
#define SHELLICONMGR_CLASSNAME "VMPI_ShellIconMgr" |
|
|
|
|
|
|
|
CShellIconMgr::CShellIconMgr() |
|
{ |
|
m_hWnd = NULL; |
|
m_hWndClass = NULL; |
|
m_uTaskbarRestart = (UINT)-1; |
|
m_iCurIconResourceID = 0; |
|
m_pHelper = NULL; |
|
} |
|
|
|
|
|
CShellIconMgr::~CShellIconMgr() |
|
{ |
|
Term(); |
|
} |
|
|
|
|
|
bool CShellIconMgr::Init( |
|
IShellIconMgrHelper *pHelper, |
|
const char *pToolTip, |
|
int iCallbackMessage, |
|
int iIconResourceID ) |
|
{ |
|
Term(); |
|
|
|
m_pHelper = pHelper; |
|
m_iCallbackMessage = iCallbackMessage; |
|
m_pToolTip = pToolTip; |
|
|
|
// Create the window class. |
|
WNDCLASS wndclass; |
|
memset( &wndclass, 0, sizeof( wndclass ) ); |
|
wndclass.lpfnWndProc = &CShellIconMgr::StaticWindowProc; |
|
wndclass.hInstance = (HINSTANCE)pHelper->GetHInstance(); |
|
wndclass.hIcon = NULL; |
|
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); |
|
wndclass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); |
|
wndclass.lpszMenuName = NULL; |
|
wndclass.lpszClassName = SHELLICONMGR_CLASSNAME; |
|
m_hWndClass = RegisterClass( &wndclass ); |
|
if ( !m_hWndClass ) |
|
{ |
|
Assert( false ); |
|
Warning( "RegisterClass failed.\n" ); |
|
Term(); |
|
return false; |
|
} |
|
|
|
|
|
// Create the window. |
|
m_hWnd = CreateWindow( |
|
SHELLICONMGR_CLASSNAME, |
|
SHELLICONMGR_CLASSNAME, |
|
WS_DISABLED, // we only want shell notify messages |
|
0, 0, 0, 0, // position |
|
NULL, // parent |
|
NULL, // menu |
|
pHelper->GetHInstance(), // hInstance |
|
this // lpParam |
|
); |
|
if ( !m_hWnd ) |
|
{ |
|
Assert( false ); |
|
Warning( "CreateWindow failed.\n" ); |
|
Term(); |
|
return false; |
|
} |
|
|
|
m_uTaskbarRestart = RegisterWindowMessage( TEXT( "TaskbarCreated" ) ); |
|
SetWindowLong( m_hWnd, GWL_USERDATA, (LONG)this ); |
|
UpdateWindow( m_hWnd ); |
|
|
|
// Don't handle errors here because the taskbar may not be created yet if we are a service. |
|
m_iCurIconResourceID = iIconResourceID; |
|
CreateTrayIcon(); |
|
return true; |
|
} |
|
|
|
|
|
void CShellIconMgr::Term() |
|
{ |
|
if ( m_hWndClass ) |
|
{ |
|
UnregisterClass( SHELLICONMGR_CLASSNAME, m_pHelper->GetHInstance() ); |
|
m_hWndClass = NULL; |
|
} |
|
|
|
if ( m_hWnd ) |
|
{ |
|
// Remove the shell icon if there is one. |
|
NOTIFYICONDATA data; |
|
memset( &data, 0, sizeof( data ) ); |
|
data.cbSize = sizeof( data ); |
|
data.hWnd = m_hWnd; |
|
Shell_NotifyIcon( NIM_DELETE, &data ); |
|
|
|
DestroyWindow( m_hWnd ); |
|
m_hWnd = NULL; |
|
} |
|
} |
|
|
|
|
|
void CShellIconMgr::ChangeIcon( int iIconResourceID ) |
|
{ |
|
NOTIFYICONDATA data; |
|
|
|
memset( &data, 0, sizeof( data ) ); |
|
data.cbSize = sizeof( data ); |
|
data.uFlags = NIF_ICON; |
|
data.hWnd = m_hWnd; |
|
data.hIcon = LoadIcon( m_pHelper->GetHInstance(), MAKEINTRESOURCE( iIconResourceID ) ); |
|
|
|
Shell_NotifyIcon( NIM_MODIFY, &data ); |
|
|
|
m_iCurIconResourceID = iIconResourceID; |
|
} |
|
|
|
|
|
void CShellIconMgr::CreateTrayIcon() |
|
{ |
|
// Now create the shell icon. |
|
NOTIFYICONDATA data; |
|
|
|
memset( &data, 0, sizeof( data ) ); |
|
data.cbSize = sizeof( data ); |
|
data.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE; |
|
data.uCallbackMessage = m_iCallbackMessage; |
|
data.hWnd = m_hWnd; |
|
data.hIcon = LoadIcon( m_pHelper->GetHInstance(), MAKEINTRESOURCE( m_iCurIconResourceID ) ); |
|
Q_strncpy( data.szTip, m_pToolTip, sizeof( data.szTip ) ); |
|
|
|
Shell_NotifyIcon( NIM_ADD, &data ); |
|
} |
|
|
|
|
|
LRESULT CShellIconMgr::WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) |
|
{ |
|
if ( hWnd != m_hWnd ) |
|
{ |
|
return DefWindowProc( hWnd, uMsg, wParam, lParam ); |
|
} |
|
|
|
if ( uMsg == m_uTaskbarRestart ) |
|
{ |
|
CreateTrayIcon(); |
|
return 0; |
|
} |
|
|
|
return m_pHelper->WindowProc( hWnd, uMsg, wParam, lParam ); |
|
} |
|
|
|
|
|
LRESULT CShellIconMgr::StaticWindowProc( |
|
HWND hwnd, // handle to window |
|
UINT uMsg, // message identifier |
|
WPARAM wParam, // first message parameter |
|
LPARAM lParam // second message parameter |
|
) |
|
{ |
|
CShellIconMgr *pMgr = (CShellIconMgr*)GetWindowLong( hwnd, GWL_USERDATA ); |
|
if ( pMgr ) |
|
{ |
|
return pMgr->WindowProc( hwnd, uMsg, wParam, lParam ); |
|
} |
|
else |
|
{ |
|
return DefWindowProc( hwnd, uMsg, wParam, lParam ); |
|
} |
|
} |
|
|
|
|