@@ -38,12 +38,11 @@ FN_KbSwitchSetHooks KbSwitchSetHooks = NULL;
3838
3939HINSTANCE g_hInst = NULL ;
4040HMODULE g_hHookDLL = NULL ;
41- INT g_nCurrentLayoutNum = 1 ;
4241HICON g_hTrayIcon = NULL ;
4342HWND g_hwndLastActive = NULL ;
44- INT g_cKLs = 0 ;
43+ UINT g_iKL = 0 ;
44+ UINT g_cKLs = 0 ;
4545HKL g_ahKLs [64 ];
46- HMENU g_hPopupMenu = NULL ;
4746UINT g_uTaskbarRestartMsg = 0 ;
4847UINT g_uShellHookMessage = 0 ;
4948
@@ -150,42 +149,33 @@ static HKL GetActiveKL(VOID)
150149
151150static 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
185175static 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
191181static BOOL
@@ -200,14 +190,14 @@ GetSystemLibraryPath(LPTSTR szPath, SIZE_T cchPath, LPCTSTR FileName)
200190}
201191
202192static 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
483473static 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
522511static 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
561550SetHooks (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
583572DeleteHooks (VOID )
584573{
585574 if (KbSwitchSetHooks )
@@ -599,23 +588,17 @@ DeleteHooks(VOID)
599588
600589static 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-
619602UINT
620603UpdateLanguageDisplay (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)
717698static void
718699KbSwitch_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 }
0 commit comments