From 00dd17e6e5854fc32b07e4ac9de5c4e553178e4a Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sun, 16 Dec 2018 08:42:20 +0900 Subject: [PATCH] [USER32] App Switcher Arrow keys (#1136) Implement Arrow keys on App Switcher (Alt+Tab). CORE-15449 --- win32ss/user/user32/controls/appswitch.c | 67 ++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/win32ss/user/user32/controls/appswitch.c b/win32ss/user/user32/controls/appswitch.c index b3314602e0f..fb9f396d8ca 100644 --- a/win32ss/user/user32/controls/appswitch.c +++ b/win32ss/user/user32/controls/appswitch.c @@ -480,6 +480,50 @@ void RotateTasks(BOOL bShift) } } +static void MoveLeft(void) +{ + selectedWindow = selectedWindow - 1; + if (selectedWindow < 0) + selectedWindow = windowCount - 1; + InvalidateRect(switchdialog, NULL, TRUE); +} + +static void MoveRight(void) +{ + selectedWindow = (selectedWindow + 1) % windowCount; + InvalidateRect(switchdialog, NULL, TRUE); +} + +static void MoveUp(void) +{ + INT iRow = selectedWindow / nCols; + INT iCol = selectedWindow % nCols; + + --iRow; + if (iRow < 0) + iRow = nRows - 1; + + selectedWindow = iRow * nCols + iCol; + if (selectedWindow >= windowCount) + selectedWindow = windowCount - 1; + InvalidateRect(switchdialog, NULL, TRUE); +} + +static void MoveDown(void) +{ + INT iRow = selectedWindow / nCols; + INT iCol = selectedWindow % nCols; + + ++iRow; + if (iRow >= nRows) + iRow = 0; + + selectedWindow = iRow * nCols + iCol; + if (selectedWindow >= windowCount) + selectedWindow = windowCount - 1; + InvalidateRect(switchdialog, NULL, TRUE); +} + VOID DestroyAppWindows(VOID) { @@ -595,21 +639,34 @@ LRESULT WINAPI DoAppSwitch( WPARAM wParam, LPARAM lParam ) if (Esc) break; if (GetKeyState(VK_SHIFT) < 0) { - selectedWindow = selectedWindow - 1; - if (selectedWindow < 0) - selectedWindow = windowCount - 1; + MoveLeft(); } else { - selectedWindow = (selectedWindow + 1)%windowCount; + MoveRight(); } - InvalidateRect(switchdialog, NULL, TRUE); } else if ( msg.wParam == VK_ESCAPE ) { if (!Esc) break; RotateTasks(GetKeyState(VK_SHIFT) < 0); } + else if ( msg.wParam == VK_LEFT ) + { + MoveLeft(); + } + else if ( msg.wParam == VK_RIGHT ) + { + MoveRight(); + } + else if ( msg.wParam == VK_UP ) + { + MoveUp(); + } + else if ( msg.wParam == VK_DOWN ) + { + MoveDown(); + } } break; }