Skip to content

Commit 51495b1

Browse files
authored
[KBSWITCH] Refactor on layout numbers (reactos#8052)
We believe the power of simplicity. JIRA issue: CORE-20142 - Rename g_nCurrentLayoutNum as g_iKL for simplicity. - Make g_iKL zero-based indexing. - Add ID_LANG_BASE id for language menu items and adjust ID_EXIT/ID_PREFERENCES values. - Fix KbSwitch_OnNotifyIconMsg function.
1 parent c187cf8 commit 51495b1

File tree

2 files changed

+44
-61
lines changed

2 files changed

+44
-61
lines changed

base/applications/kbswitch/kbswitch.c

Lines changed: 40 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,11 @@ FN_KbSwitchSetHooks KbSwitchSetHooks = NULL;
3838

3939
HINSTANCE g_hInst = NULL;
4040
HMODULE g_hHookDLL = NULL;
41-
INT g_nCurrentLayoutNum = 1;
4241
HICON g_hTrayIcon = NULL;
4342
HWND g_hwndLastActive = NULL;
44-
INT g_cKLs = 0;
43+
UINT g_iKL = 0;
44+
UINT g_cKLs = 0;
4545
HKL g_ahKLs[64];
46-
HMENU g_hPopupMenu = NULL;
4746
UINT g_uTaskbarRestartMsg = 0;
4847
UINT g_uShellHookMessage = 0;
4948

@@ -150,42 +149,33 @@ static HKL GetActiveKL(VOID)
150149

151150
static VOID UpdateLayoutList(HKL hKL OPTIONAL)
152151
{
153-
INT iKL;
152+
UINT iKL;
154153

155154
if (!hKL)
156155
hKL = GetActiveKL();
157156

158157
g_cKLs = GetKeyboardLayoutList(_countof(g_ahKLs), g_ahKLs);
159158

160-
g_nCurrentLayoutNum = -1;
159+
g_iKL = 0;
161160
for (iKL = 0; iKL < g_cKLs; ++iKL)
162161
{
163162
if (g_ahKLs[iKL] == hKL)
164163
{
165-
g_nCurrentLayoutNum = iKL + 1;
164+
g_iKL = iKL;
166165
break;
167166
}
168167
}
169-
170-
if (g_nCurrentLayoutNum == -1 && g_cKLs < _countof(g_ahKLs))
171-
{
172-
g_nCurrentLayoutNum = g_cKLs;
173-
g_ahKLs[g_cKLs++] = hKL;
174-
}
175168
}
176169

177-
static HKL GetHKLFromLayoutNum(INT nLayoutNum)
170+
static HKL GetHKLFromLayoutNum(UINT iKL)
178171
{
179-
if (0 <= (nLayoutNum - 1) && (nLayoutNum - 1) < g_cKLs)
180-
return g_ahKLs[nLayoutNum - 1];
181-
else
182-
return GetActiveKL();
172+
return (iKL < g_cKLs) ? g_ahKLs[iKL] : GetActiveKL();
183173
}
184174

185175
static VOID
186-
GetKLIDFromLayoutNum(INT nLayoutNum, LPTSTR szKLID, SIZE_T KLIDLength)
176+
GetKLIDFromLayoutNum(UINT iKL, LPTSTR szKLID, SIZE_T KLIDLength)
187177
{
188-
GetKLIDFromHKL(GetHKLFromLayoutNum(nLayoutNum), szKLID, KLIDLength);
178+
GetKLIDFromHKL(GetHKLFromLayoutNum(iKL), szKLID, KLIDLength);
189179
}
190180

191181
static BOOL
@@ -200,14 +190,14 @@ GetSystemLibraryPath(LPTSTR szPath, SIZE_T cchPath, LPCTSTR FileName)
200190
}
201191

202192
static BOOL
203-
GetLayoutName(INT nLayoutNum, LPTSTR szName, SIZE_T NameLength)
193+
GetLayoutName(UINT iKL, LPTSTR szName, SIZE_T NameLength)
204194
{
205195
HKEY hKey;
206196
HRESULT hr;
207197
DWORD dwBufLen;
208198
TCHAR szBuf[MAX_PATH], szKLID[CCH_LAYOUT_ID + 1];
209199

210-
GetKLIDFromLayoutNum(nLayoutNum, szKLID, _countof(szKLID));
200+
GetKLIDFromLayoutNum(iKL, szKLID, _countof(szKLID));
211201

212202
StringCchPrintf(szBuf, _countof(szBuf),
213203
_T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szKLID);
@@ -426,8 +416,8 @@ AddTrayIcon(HWND hwnd)
426416
NOTIFYICONDATA tnid = { sizeof(tnid), hwnd, 1, NIF_ICON | NIF_MESSAGE | NIF_TIP };
427417
TCHAR szKLID[CCH_LAYOUT_ID + 1], szName[MAX_PATH], szImeFile[80];
428418

429-
GetKLIDFromLayoutNum(g_nCurrentLayoutNum, szKLID, _countof(szKLID));
430-
GetLayoutName(g_nCurrentLayoutNum, szName, _countof(szName));
419+
GetKLIDFromLayoutNum(g_iKL, szKLID, _countof(szKLID));
420+
GetLayoutName(g_iKL, szName, _countof(szName));
431421
GetImeFile(szImeFile, _countof(szImeFile), szKLID);
432422

433423
tnid.uCallbackMessage = WM_NOTIFYICONMSG;
@@ -481,17 +471,16 @@ EnumWindowsProc(HWND hwnd, LPARAM lParam)
481471
}
482472

483473
static VOID
484-
ActivateLayout(HWND hwnd, ULONG uLayoutNum, HWND hwndTarget OPTIONAL, BOOL bNoActivate)
474+
ActivateLayout(HWND hwnd, UINT iKL, HWND hwndTarget OPTIONAL, BOOL bNoActivate)
485475
{
486476
HKL hKl;
487477
TCHAR szKLID[CCH_LAYOUT_ID + 1], szLangName[MAX_PATH];
488478
LANGID LangID;
489479

490-
/* The layout number starts from one. Zero is invalid */
491-
if (uLayoutNum == 0 || uLayoutNum > 0xFF) /* Invalid */
480+
if (iKL >= g_cKLs) /* Invalid */
492481
return;
493482

494-
GetKLIDFromLayoutNum(uLayoutNum, szKLID, _countof(szKLID));
483+
GetKLIDFromLayoutNum(iKL, szKLID, _countof(szKLID));
495484
LangID = (LANGID)_tcstoul(szKLID, NULL, 16);
496485

497486
/* Switch to the new keyboard layout */
@@ -516,7 +505,7 @@ ActivateLayout(HWND hwnd, ULONG uLayoutNum, HWND hwndTarget OPTIONAL, BOOL bNoAc
516505
EnumWindows(EnumWindowsProc, (LPARAM) hKl);
517506
}
518507

519-
g_nCurrentLayoutNum = uLayoutNum;
508+
g_iKL = iKL;
520509
}
521510

522511
static HMENU
@@ -526,18 +515,18 @@ BuildLeftPopupMenu(VOID)
526515
TCHAR szName[MAX_PATH], szKLID[CCH_LAYOUT_ID + 1], szImeFile[80];
527516
HICON hIcon;
528517
MENUITEMINFO mii = { sizeof(mii) };
529-
INT iKL;
518+
UINT iKL;
530519

531520
for (iKL = 0; iKL < g_cKLs; ++iKL)
532521
{
533522
GetKLIDFromHKL(g_ahKLs[iKL], szKLID, _countof(szKLID));
534523
GetImeFile(szImeFile, _countof(szImeFile), szKLID);
535524

536-
if (!GetLayoutName(iKL + 1, szName, _countof(szName)))
525+
if (!GetLayoutName(iKL, szName, _countof(szName)))
537526
continue;
538527

539528
mii.fMask = MIIM_ID | MIIM_STRING;
540-
mii.wID = iKL + 1;
529+
mii.wID = ID_LANG_BASE + iKL;
541530
mii.dwTypeData = szName;
542531

543532
hIcon = CreateTrayIcon(szKLID, szImeFile);
@@ -552,12 +541,12 @@ BuildLeftPopupMenu(VOID)
552541
DestroyIcon(hIcon);
553542
}
554543

555-
CheckMenuItem(hMenu, g_nCurrentLayoutNum, MF_CHECKED);
544+
CheckMenuItem(hMenu, ID_LANG_BASE + g_iKL, MF_CHECKED);
556545

557546
return hMenu;
558547
}
559548

560-
BOOL
549+
static BOOL
561550
SetHooks(VOID)
562551
{
563552
g_hHookDLL = LoadLibrary(_T("kbsdll.dll"));
@@ -579,7 +568,7 @@ SetHooks(VOID)
579568
return TRUE;
580569
}
581570

582-
VOID
571+
static VOID
583572
DeleteHooks(VOID)
584573
{
585574
if (KbSwitchSetHooks)
@@ -599,23 +588,17 @@ DeleteHooks(VOID)
599588

600589
static UINT GetLayoutNum(HKL hKL)
601590
{
602-
INT iKL;
591+
UINT iKL;
603592

604593
for (iKL = 0; iKL < g_cKLs; ++iKL)
605594
{
606595
if (g_ahKLs[iKL] == hKL)
607-
return iKL + 1;
596+
return iKL;
608597
}
609598

610599
return 0;
611600
}
612601

613-
ULONG
614-
GetNextLayout(VOID)
615-
{
616-
return (g_nCurrentLayoutNum % g_cKLs) + 1;
617-
}
618-
619602
UINT
620603
UpdateLanguageDisplay(HWND hwnd, HKL hKL)
621604
{
@@ -626,7 +609,7 @@ UpdateLanguageDisplay(HWND hwnd, HKL hKL)
626609
LangID = (LANGID)_tcstoul(szKLID, NULL, 16);
627610
GetLocaleInfo(LangID, LOCALE_SLANGUAGE, szLangName, _countof(szLangName));
628611
UpdateTrayIcon(hwnd, szKLID, szLangName);
629-
g_nCurrentLayoutNum = GetLayoutNum(hKL);
612+
g_iKL = GetLayoutNum(hKL);
630613

631614
return 0;
632615
}
@@ -682,7 +665,7 @@ KbSwitch_OnCreate(HWND hwnd)
682665
UpdateLayoutList(NULL);
683666
AddTrayIcon(hwnd);
684667

685-
ActivateLayout(hwnd, g_nCurrentLayoutNum, NULL, TRUE);
668+
ActivateLayout(hwnd, g_iKL, NULL, TRUE);
686669
g_uTaskbarRestartMsg = RegisterWindowMessage(TEXT("TaskbarCreated"));
687670

688671
return 0; /* Success */
@@ -694,8 +677,6 @@ KbSwitch_OnDestroy(HWND hwnd)
694677
{
695678
KillTimer(hwnd, TIMER_ID_LANG_CHANGED_DELAYED);
696679
DeleteHooks();
697-
if (g_hPopupMenu)
698-
DestroyMenu(g_hPopupMenu);
699680
DeleteTrayIcon(hwnd);
700681
PostQuitMessage(0);
701682
}
@@ -717,7 +698,7 @@ KbSwitch_OnTimer(HWND hwnd, UINT_PTR nTimerID)
717698
static void
718699
KbSwitch_OnNotifyIconMsg(HWND hwnd, UINT uMouseMsg)
719700
{
720-
if (uMouseMsg != WM_LBUTTONUP && uMouseMsg != WM_RBUTTONUP)
701+
if (uMouseMsg != WM_LBUTTONUP && uMouseMsg != WM_RBUTTONUP && uMouseMsg != WM_CONTEXTMENU)
721702
return;
722703

723704
UpdateLayoutList(NULL);
@@ -731,17 +712,18 @@ KbSwitch_OnNotifyIconMsg(HWND hwnd, UINT uMouseMsg)
731712
if (uMouseMsg == WM_LBUTTONUP)
732713
{
733714
/* Rebuild the left popup menu on every click to take care of keyboard layout changes */
734-
HMENU hLeftPopupMenu = BuildLeftPopupMenu();
735-
nID = TrackPopupMenu(hLeftPopupMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL);
736-
DestroyMenu(hLeftPopupMenu);
715+
HMENU hPopupMenu = BuildLeftPopupMenu();
716+
nID = TrackPopupMenuEx(hPopupMenu, TPM_LEFTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON,
717+
pt.x, pt.y, hwnd, NULL);
718+
DestroyMenu(hPopupMenu);
737719
}
738-
else /* WM_RBUTTONUP */
720+
else /* WM_RBUTTONUP or WM_CONTEXTMENU */
739721
{
740-
if (!g_hPopupMenu)
741-
g_hPopupMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_POPUP));
742-
743-
HMENU hSubMenu = GetSubMenu(g_hPopupMenu, 0);
744-
nID = TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL);
722+
HMENU hPopupMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_POPUP));
723+
HMENU hSubMenu = GetSubMenu(hPopupMenu, 0);
724+
nID = TrackPopupMenuEx(hSubMenu, TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
725+
pt.x, pt.y, hwnd, NULL);
726+
DestroyMenu(hPopupMenu);
745727
}
746728

747729
PostMessage(hwnd, WM_NULL, 0, 0);
@@ -772,13 +754,13 @@ KbSwitch_OnCommand(HWND hwnd, UINT nID)
772754

773755
default:
774756
{
775-
if (1 <= nID && nID <= 1000)
757+
if (nID >= ID_LANG_BASE)
776758
{
777759
if (!IsWindow(g_hwndLastActive))
778760
{
779761
g_hwndLastActive = NULL;
780762
}
781-
ActivateLayout(hwnd, nID, g_hwndLastActive, FALSE);
763+
ActivateLayout(hwnd, nID - ID_LANG_BASE, g_hwndLastActive, FALSE);
782764
}
783765
break;
784766
}

base/applications/kbswitch/resource.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
#define IDI_MAIN 100
55

66
/* Menus */
7-
#define IDR_POPUP 12000
7+
#define IDR_POPUP 100
88

99
/* Menu items */
10-
#define ID_EXIT 10001
11-
#define ID_PREFERENCES 10002
10+
#define ID_EXIT 100
11+
#define ID_PREFERENCES 101
12+
#define ID_LANG_BASE 1000

0 commit comments

Comments
 (0)