[OSK] Reduce the delay when redrawing LED keyboard resources (#1385)

200 ms would mean that the LEDs redraw each 0,2 second and this adds a slight delay. This can be seen if you press the Num lock key (for example) many times in a row and the LED resources won't update instantly. Therefore reducing the value of uElapse should significantly decrease the delay and the LEDs should update in a realistic way. Furthermore, before invalidating the LED resource check the toggle state of the keys.
This commit is contained in:
Bișoc George 2019-11-18 21:24:45 +01:00 committed by Hermès BÉLUSCA - MAÏTO
parent eb0f16433b
commit 411a599610
2 changed files with 62 additions and 6 deletions

View file

@ -14,6 +14,13 @@
OSK_GLOBALS Globals; OSK_GLOBALS Globals;
OSK_KEYLEDINDICATOR LedKey[] =
{
{VK_NUMLOCK, IDC_LED_NUM, 0x0145, FALSE},
{VK_CAPITAL, IDC_LED_CAPS, 0x013A, FALSE},
{VK_SCROLL, IDC_LED_SCROLL, 0x0146, FALSE}
};
/* FUNCTIONS ******************************************************************/ /* FUNCTIONS ******************************************************************/
/*********************************************************************** /***********************************************************************
@ -237,7 +244,7 @@ int OSK_DlgInitDialog(HWND hDlg)
Globals.hBrushGreenLed = CreateSolidBrush(RGB(0, 255, 0)); Globals.hBrushGreenLed = CreateSolidBrush(RGB(0, 255, 0));
/* Set a timer for periodics tasks */ /* Set a timer for periodics tasks */
Globals.iTimer = SetTimer(hDlg, 0, 200, NULL); Globals.iTimer = SetTimer(hDlg, 0, 50, NULL);
return TRUE; return TRUE;
} }
@ -281,6 +288,29 @@ int OSK_DlgClose(void)
return TRUE; return TRUE;
} }
/***********************************************************************
*
* OSK_RefreshLEDKeys
*
* Updates (invalidates) the LED icon resources then the respective
* keys (Caps Lock, Scroll Lock or Num Lock) are being held down
*/
VOID OSK_RefreshLEDKeys(VOID)
{
INT i;
BOOL bKeyIsPressed;
for (i = 0; i < _countof(LedKey); i++)
{
bKeyIsPressed = (GetAsyncKeyState(LedKey[i].vKey) & 0x8000) != 0;
if (LedKey[i].bWasKeyPressed != bKeyIsPressed)
{
LedKey[i].bWasKeyPressed = bKeyIsPressed;
InvalidateRect(GetDlgItem(Globals.hMainWnd, LedKey[i].DlgResource), NULL, FALSE);
}
}
}
/*********************************************************************** /***********************************************************************
* *
* OSK_DlgTimer * OSK_DlgTimer
@ -298,10 +328,11 @@ int OSK_DlgTimer(void)
Globals.hActiveWnd = hWndActiveWindow; Globals.hActiveWnd = hWndActiveWindow;
} }
/* Always redraw leds because it can be changed by the real keyboard) */ /*
InvalidateRect(GetDlgItem(Globals.hMainWnd, IDC_LED_NUM), NULL, TRUE); Update the LED key indicators accordingly to their state (if one
InvalidateRect(GetDlgItem(Globals.hMainWnd, IDC_LED_CAPS), NULL, TRUE); of the specific keys is held down).
InvalidateRect(GetDlgItem(Globals.hMainWnd, IDC_LED_SCROLL), NULL, TRUE); */
OSK_RefreshLEDKeys();
return TRUE; return TRUE;
} }
@ -320,6 +351,7 @@ BOOL OSK_DlgCommand(WPARAM wCommand, HWND hWndControl)
BOOL bKeyDown; BOOL bKeyDown;
BOOL bKeyUp; BOOL bKeyUp;
LONG WindowStyle; LONG WindowStyle;
INT i;
/* FIXME: To be deleted when ReactOS will support WS_EX_NOACTIVATE */ /* FIXME: To be deleted when ReactOS will support WS_EX_NOACTIVATE */
if (Globals.hActiveWnd) if (Globals.hActiveWnd)
@ -357,8 +389,23 @@ BOOL OSK_DlgCommand(WPARAM wCommand, HWND hWndControl)
bKeyUp = TRUE; bKeyUp = TRUE;
} }
/* Extended key ? */ /* Get the key from dialog control key command */
ScanCode = wCommand; ScanCode = wCommand;
/*
The user could've pushed one of the key buttons of the dialog that
can trigger particular function toggling (Caps Lock, Num Lock or Scroll Lock). Update
(invalidate) the LED icon resources accordingly.
*/
for (i = 0; i < _countof(LedKey); i++)
{
if (LedKey[i].wScanCode == ScanCode)
{
InvalidateRect(GetDlgItem(Globals.hMainWnd, LedKey[i].DlgResource), NULL, FALSE);
}
}
/* Extended key ? */
if (ScanCode & 0x0200) if (ScanCode & 0x0200)
bExtendedKey = TRUE; bExtendedKey = TRUE;
else else

View file

@ -46,6 +46,14 @@ typedef struct
INT PosY; INT PosY;
} OSK_GLOBALS; } OSK_GLOBALS;
typedef struct
{
INT vKey;
INT DlgResource;
WORD wScanCode;
BOOL bWasKeyPressed;
} OSK_KEYLEDINDICATOR;
/* PROTOTYPES *****************************************************************/ /* PROTOTYPES *****************************************************************/
/* main.c */ /* main.c */
@ -59,6 +67,7 @@ INT_PTR APIENTRY OSK_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT APIENTRY OSK_ThemeHandler(HWND hDlg, NMCUSTOMDRAW *pNmDraw); LRESULT APIENTRY OSK_ThemeHandler(HWND hDlg, NMCUSTOMDRAW *pNmDraw);
int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int); int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
VOID OSK_RestoreDlgPlacement(HWND hDlg); VOID OSK_RestoreDlgPlacement(HWND hDlg);
VOID OSK_RefreshLEDKeys(VOID);
/* settings.c */ /* settings.c */
BOOL LoadDataFromRegistry(VOID); BOOL LoadDataFromRegistry(VOID);