mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
125 lines
3.6 KiB
C++
125 lines
3.6 KiB
C++
/*
|
|
* PROJECT: ReactOS system libraries
|
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
|
* PURPOSE: Mouse keys notification icon handler
|
|
* COPYRIGHT: Copyright 2022 Mark Jansen <mark.jansen@reactos.org>
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
static MOUSEKEYS g_Mk;
|
|
static UINT g_MkState;
|
|
static HICON g_MkStateIcon;
|
|
|
|
HRESULT STDMETHODCALLTYPE
|
|
MouseKeys_Init(_In_ CSysTray *pSysTray)
|
|
{
|
|
TRACE("MouseKeys_Init!\n");
|
|
|
|
return MouseKeys_Update(pSysTray);
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE
|
|
MouseKeys_Shutdown(_In_ CSysTray *pSysTray)
|
|
{
|
|
TRACE("MouseKeys_Shutdown!\n");
|
|
|
|
if (g_MkStateIcon)
|
|
{
|
|
DestroyIcon(g_MkStateIcon);
|
|
g_MkStateIcon = NULL;
|
|
}
|
|
|
|
if (g_MkState)
|
|
{
|
|
g_MkState = 0;
|
|
pSysTray->NotifyIcon(NIM_DELETE, ID_ICON_MOUSE, g_MkStateIcon, L"MouseKeys");
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE
|
|
MouseKeys_Update(_In_ CSysTray *pSysTray)
|
|
{
|
|
TRACE("MouseKeys_Update!\n");
|
|
|
|
g_Mk.cbSize = sizeof(g_Mk);
|
|
SystemParametersInfoW(SPI_GETMOUSEKEYS, sizeof(g_Mk), &g_Mk, 0);
|
|
|
|
UINT state = 0;
|
|
if ((g_Mk.dwFlags & (MKF_INDICATOR | MKF_MOUSEKEYSON)) == (MKF_INDICATOR | MKF_MOUSEKEYSON))
|
|
{
|
|
if (g_Mk.dwFlags & MKF_MOUSEMODE)
|
|
{
|
|
switch (g_Mk.dwFlags & (MKF_LEFTBUTTONDOWN | MKF_LEFTBUTTONSEL | MKF_RIGHTBUTTONDOWN | MKF_RIGHTBUTTONSEL))
|
|
{
|
|
case 0:
|
|
default:
|
|
state = IDI_MOUSE_NOBTN;
|
|
break;
|
|
case MKF_LEFTBUTTONSEL:
|
|
state = IDI_MOUSE_L_ACTIVE;
|
|
break;
|
|
case MKF_LEFTBUTTONDOWN:
|
|
case MKF_LEFTBUTTONDOWN | MKF_LEFTBUTTONSEL:
|
|
state = IDI_MOUSE_L_DOWN;
|
|
break;
|
|
case MKF_RIGHTBUTTONSEL:
|
|
state = IDI_MOUSE_R_ACTIVE;
|
|
break;
|
|
case MKF_RIGHTBUTTONDOWN:
|
|
case MKF_RIGHTBUTTONDOWN | MKF_RIGHTBUTTONSEL:
|
|
state = IDI_MOUSE_R_DOWN;
|
|
break;
|
|
case MKF_LEFTBUTTONSEL | MKF_RIGHTBUTTONSEL:
|
|
state = IDI_MOUSE_LR_ACTIVE;
|
|
break;
|
|
case MKF_RIGHTBUTTONDOWN | MKF_LEFTBUTTONDOWN:
|
|
case MKF_RIGHTBUTTONDOWN | MKF_LEFTBUTTONDOWN | MKF_LEFTBUTTONSEL:
|
|
case MKF_RIGHTBUTTONDOWN | MKF_LEFTBUTTONDOWN | MKF_LEFTBUTTONSEL | MKF_RIGHTBUTTONSEL:
|
|
case MKF_RIGHTBUTTONDOWN | MKF_LEFTBUTTONDOWN | MKF_RIGHTBUTTONSEL:
|
|
state = IDI_MOUSE_LR_DOWN;
|
|
break;
|
|
case MKF_LEFTBUTTONSEL | MKF_RIGHTBUTTONDOWN:
|
|
case MKF_LEFTBUTTONSEL | MKF_RIGHTBUTTONDOWN | MKF_RIGHTBUTTONSEL:
|
|
state = IDI_MOUSE_L_ACTIVE_R_DOWN;
|
|
break;
|
|
case MKF_LEFTBUTTONDOWN | MKF_RIGHTBUTTONSEL:
|
|
case MKF_LEFTBUTTONDOWN | MKF_RIGHTBUTTONSEL | MKF_LEFTBUTTONSEL:
|
|
state = IDI_MOUSE_R_ACTIVE_L_DOWN;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
state = IDI_MOUSE_DISABLED;
|
|
}
|
|
}
|
|
|
|
UINT uId = NIM_MODIFY;
|
|
if (state != g_MkState)
|
|
{
|
|
if (g_MkStateIcon)
|
|
{
|
|
DestroyIcon(g_MkStateIcon);
|
|
g_MkStateIcon = NULL;
|
|
}
|
|
|
|
if (g_MkState == 0)
|
|
uId = NIM_ADD;
|
|
|
|
g_MkState = state;
|
|
if (g_MkState)
|
|
{
|
|
g_MkStateIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(g_MkState));
|
|
}
|
|
}
|
|
|
|
if (g_MkState == 0)
|
|
{
|
|
uId = NIM_DELETE;
|
|
}
|
|
|
|
return pSysTray->NotifyIcon(uId, ID_ICON_MOUSE, g_MkStateIcon, L"MouseKeys");
|
|
}
|