Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143/* * 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 STDMETHODCALLTYPEMouseKeys_Init(_In_ CSysTray *pSysTray){ TRACE("MouseKeys_Init!\n");
return MouseKeys_Update(pSysTray);}
HRESULT STDMETHODCALLTYPEMouseKeys_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 STDMETHODCALLTYPEMouseKeys_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");}
HRESULT STDMETHODCALLTYPE MouseKeys_Message(_In_ CSysTray * pSysTray, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult){ switch (uMsg) { case ID_ICON_MOUSE: switch (lParam) { case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: pSysTray->RunAccessCpl(",,4"); return S_OK; } break; } return S_FALSE;}