36#define WM_NOTIFYICONMSG 0x8064
37#define WM_PENICONMSG 0x8065
39#define NOTIFY_ICON_ID_LANGUAGE 223
40#define NOTIFY_ICON_ID_SYSTEM_PEN 224
42#define TIMER_ID_LANG_CHANGED_DELAYED 0x10000
43#define TIMER_LANG_CHANGED_DELAY 200
45#define IME_HKL_MASK 0xF000FFFF
46#define IS_KOREAN_IME_HKL(hKL) ((HandleToUlong(hKL) & IME_HKL_MASK) == 0xE0000412)
74#define LAYOUTF_FAR_EAST 0x1
75#define LAYOUTF_IME_ICON 0x2
76#define LAYOUTF_TOOLTIP_ATOM 0x4
77#define LAYOUTF_REMOVE_LEFT_DEF_MENU 0x8
78#define LAYOUTF_REMOVE_RIGHT_DEF_MENU 0x10
94#define MAX_SPECIAL_IDS 256
108 TEXT(
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts"),
114 for (dwIndex = 0; dwIndex < 1000; ++dwIndex)
123 dwSize =
sizeof(szLayoutId);
143 ERR(
"g_SpecialIds is full!");
197 TRACE(
"hwndTarget: %p\n", hwndTarget);
218 for (iKL = 0; iKL <
g_cKLs; ++iKL)
247 ZeroMemory(ahSysPenIcons,
sizeof(ahSysPenIcons));
248 FillMemory(aiSysPenIcons,
sizeof(aiSysPenIcons), 0xFF);
255 for (iKL = 0; iKL < nKLs; ++iKL)
267 anFlags[iKL] &= ~LAYOUTF_FAR_EAST;
272 for (iKL2 = 0; iKL2 <
g_cKLs; ++iKL2)
274 if (ahKLs[iKL] ==
g_ahKLs[iKL2])
335 _T(
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szKLID);
349 dwBufLen = NameLength *
sizeof(
TCHAR);
372 if (szKLID[0] !=
TEXT(
'E') && szKLID[0] !=
TEXT(
'e'))
376 _T(
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szKLID);
381 dwBufLen = cchImeFile *
sizeof(
TCHAR);
416 if (pLoadIcon->
hIcon)
477 DWORD dwConversion = 0, dwSentence = 0;
549 ERR(
"Shell_NotifyIcon(NIM_DELETE) failed\n");
599 ERR(
"Shell_NotifyIcon failed\n");
610 HBITMAP hbmColor, hbmMono, hBmpOld;
620 if (szImeFile && szImeFile[0])
633 szBuf[0] = szBuf[1] =
_T(
'?');
645 if (!
hdc || !hbmColor || !hbmMono)
719 ERR(
"Shell_NotifyIcon(NIM_ADD) failed\n");
731 ERR(
"Shell_NotifyIcon(NIM_DELETE) failed\n");
786 if (hwndTarget && !bNoActivate)
797 INPUTLANGCHANGE_SYSCHARSET, (
LPARAM)hKl);
816 for (iKL = 0; iKL <
g_cKLs; ++iKL)
845#define IFN_KbSwitchSetHooks 1
846#define IFN_SetPenMenuData 14
862 ERR(
"SetHooks failed\n");
866 TRACE(
"SetHooks OK\n");
885 TRACE(
"DeleteHooks OK\n");
892 for (iKL = 0; iKL <
g_cKLs; ++iKL)
1040 ERR(
"Cannot open regkey: 0x%lX\n",
error);
1045 DWORD cbValue =
sizeof(szText);
1065 ERR(
"Cannot open regkey: 0x%lX\n",
error);
1096 TRACE(
"hwndTarget: %p\n", hwndTarget);
1102 WARN(
"No default IME\n");
1261 TEXT(
"control.exe"),
TEXT(
"input.dll"),
1287 TRACE(
"WM_LANG_CHANGED: hwndTarget:%p, hKL:%p\n", hwndTarget, hKL);
1298 TRACE(
"WM_WINDOW_ACTIVATE: hwndTarget:%p, lParam:%p\n", hwndTarget,
lParam);
1309 if (
wParam == SPI_SETNONCLIENTMETRICS)
1328 if (
wParam == HSHELL_LANGUAGE)
1367 g_anFlags[iKL] &= ~LAYOUTF_TOOLTIP_ATOM;
1393 ERR(
"uMsg: %u\n", uMsg);
1446 case WM_INPUTLANGCHANGEREQUEST:
1469 TRACE(
"LAYOUT_RTL\n");
1485 ERR(
"Another instance is already running\n");
1503 hwnd =
CreateWindow(
INDICATOR_CLASS,
NULL, 0, 0, 0, 1, 1,
HWND_DESKTOP,
NULL,
hInstance,
NULL);
1507 ERR(
"RegisterShellHookWindow failed\n");
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define IDI_KOREAN_A_FULL
#define IDI_KOREAN_A_HALF
#define IDI_KOREAN_JR_HALF
#define IDI_KOREAN_JR_FULL
#define RegCloseKey(hKey)
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define GetProcAddress(x, y)
LANGID WINAPI GetUserDefaultUILanguage(void)
#define FillMemory(BUF, SIZ, MASK)
GLenum const GLfloat * params
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define IMS_IMEMENUITEMSELECTED
#define IS_SPECIAL_HKL(hKL)
#define IMS_GETCONVSTATUS
#define IMS_NOTIFYIMESHOW
#define ImmGetDescription
BOOL WINAPI ImmGetConversionStatus(_In_ HIMC hIMC, _Out_opt_ LPDWORD lpfdwConversion, _Out_opt_ LPDWORD lpfdwSentence)
#define IME_CMODE_SOFTKBD
DWORD WINAPI ImmGetProperty(_In_ HKL hKL, _In_ DWORD fdwIndex)
BOOL WINAPI ImmGetOpenStatus(_In_ HIMC hIMC)
HWND WINAPI ImmGetDefaultIMEWnd(_In_opt_ HWND hWnd)
BOOL WINAPI ImmSetOpenStatus(_In_ HIMC hIMC, _In_ BOOL fOpen)
#define IME_CMODE_FULLSHAPE
_Out_opt_ PICONINFO IconInfo
#define INDICM_SETIMETOOLTIPS
#define INDICM_REMOVEDEFAULTMENUITEMS
#define INDICM_SETIMEICON
static void KbSwitch_OnCommand(HWND hwnd, UINT nID)
static UINT GetLayoutIndexFromHKL(HKL hKL)
WORD g_anToolTipAtoms[MAX_KLS]
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
BOOL g_bSysPenNotifyAdded
#define TIMER_ID_LANG_CHANGED_DELAYED
static VOID LoadSpecialIds(VOID)
static VOID ActivateLayout(HWND hwnd, UINT iKL, HWND hwndTarget OPTIONAL, BOOL bNoActivate)
static HBITMAP BitmapFromIcon(HICON hIcon)
static BOOL GetLayoutName(UINT iKL, LPTSTR szName, SIZE_T NameLength)
struct tagLOAD_ICON LOAD_ICON
static VOID UpdateTrayIcon(HWND hwnd, LPTSTR szKLID, LPTSTR szName)
static VOID GetKLIDFromLayoutNum(UINT iKL, LPTSTR szKLID, SIZE_T KLIDLength)
static LRESULT KbSwitch_OnWindowActivate(HWND hwnd, HWND hwndTarget OPTIONAL, LPARAM lParam OPTIONAL)
static HKL GetActiveKL(VOID)
static HICON LoadDefaultPenIcon(PCWSTR szImeFile, HKL hKL)
static VOID GetKLIDFromHKL(HKL hKL, LPTSTR szKLID, SIZE_T KLIDLength)
static LRESULT KbSwitch_OnDefault(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
SPECIAL_ID g_SpecialIds[MAX_SPECIAL_IDS]
static VOID DeleteHooks(VOID)
static UINT GetLayoutNum(HKL hKL)
static HWND GetTargetWindow(HWND hwndFore OPTIONAL)
static void KbSwitch_OnSettingChange(HWND hwnd, WPARAM wParam, LPARAM lParam)
HICON g_ahSysPenIcons[MAX_KLS]
#define NOTIFY_ICON_ID_SYSTEM_PEN
#define LAYOUTF_TOOLTIP_ATOM
static VOID UpdatePenIcon(HWND hwnd, UINT iKL)
#define TIMER_LANG_CHANGED_DELAY
#define NOTIFY_ICON_ID_LANGUAGE
static HICON CreateTrayIcon(LPTSTR szKLID, LPCTSTR szImeFile OPTIONAL)
static VOID DeletePenIcon(HWND hwnd, UINT iKL)
static VOID DestroyPenIcons(VOID)
static VOID KbSwitch_OnPenIconMsg(HWND hwnd, UINT uMouseMsg)
static BOOL IsRegImeToolbarShown(VOID)
static HMENU BuildLeftPopupMenu(VOID)
static HICON FakeExtractIcon(PCTSTR pszImeFile, INT nIconIndex)
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
static BOOL RememberLastActive(HWND hwnd, HWND hwndFore)
static DWORD GetImeStatus(HWND hwndTarget)
static VOID UpdateLayoutList(HKL hKL OPTIONAL)
#define LAYOUTF_REMOVE_LEFT_DEF_MENU
static BOOL CALLBACK EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LPARAM lParam)
static LRESULT KbSwitch_OnLangChanged(HWND hwnd, HWND hwndTarget OPTIONAL, HKL hKL OPTIONAL)
static void KbSwitch_OnNotifyIconMsg(HWND hwnd, UINT uMouseMsg)
WORD g_aiSysPenIcons[MAX_KLS]
static VOID DeletePenNotifyIcon(HWND hwnd)
static void KbSwitch_OnTimer(HWND hwnd, UINT_PTR nTimerID)
#define IFN_KbSwitchSetHooks
static VOID OnIndicatorMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
static VOID UpdateTrayInfo(VOID)
#define IFN_SetPenMenuData
UINT UpdateLanguageDisplay(HWND hwnd, HKL hKL)
static BOOL GetImeFile(LPTSTR szImeFile, SIZE_T cchImeFile, LPCTSTR szKLID)
UINT UpdateLanguageDisplayCurrent(HWND hwnd, HWND hwndFore)
static BOOL SetHooks(VOID)
#define LAYOUTF_REMOVE_RIGHT_DEF_MENU
struct tagLOAD_ICON * PLOAD_ICON
static BOOL GetSystemLibraryPath(LPTSTR szPath, SIZE_T cchPath, LPCTSTR FileName)
FN_KbSwitchSetHooks KbSwitchSetHooks
VOID(APIENTRY * FN_SetPenMenuData)(UINT nID, DWORD_PTR dwItemData)
static VOID AddTrayIcon(HWND hwnd)
static HKL GetHKLFromLayoutNum(UINT iKL)
static INT KbSwitch_OnCreate(HWND hwnd)
UINT g_uTaskbarRestartMsg
static void KbSwitch_OnDestroy(HWND hwnd)
BOOL(APIENTRY * FN_KbSwitchSetHooks)(BOOL bDoHook)
#define IS_KOREAN_IME_HKL(hKL)
static VOID DeleteTrayIcon(HWND hwnd)
struct tagSPECIAL_ID SPECIAL_ID
FN_SetPenMenuData SetPenMenuData
static VOID ShowImeToolbar(HWND hwndTarget, BOOL bShowToolbar)
struct tagSPECIAL_ID * PSPECIAL_ID
#define LANGID_CHINESE_SIMPLIFIED
#define WM_WINDOW_ACTIVATE
#define IME_STATUS_IME_CLOSED
#define IME_STATUS_IME_OPEN
#define LANGID_CHINESE_TRADITIONAL
static BOOL IsWndClassName(_In_opt_ HWND hwndTarget, PCTSTR pszName)
#define IME_STATUS_NO_IME
#define IME_STATUS_IME_FULLSHAPE
#define IME_STATUS_IME_NATIVE
#define ERROR_ALREADY_EXISTS
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
unsigned __int3264 UINT_PTR
#define UNREFERENCED_PARAMETER(P)
#define MAKEINTRESOURCE(i)
static const WCHAR szName[]
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
#define LANGIDFROMLCID(l)
#define SHLoadRegUIString
PULONG MinorVersion OPTIONAL
TW_UINT32 TW_UINT16 TW_UINT16 MSG
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_writes_opt_ NumCharacters PUSHORT _Inout_ PUSHORT _In_ UCHAR _In_opt_ USHORT LangID
COLORREF WINAPI SetDCBrushColor(_In_ HDC hdc, _In_ COLORREF crColor)
DWORD WINAPI InSendMessageEx(LPVOID lpReserved)
BOOL WINAPI SetProcessDefaultLayout(DWORD dwDefaultLayout)
#define GlobalGetAtomName
#define GetSystemDirectory
DWORD WINAPI GetLastError(void)
#define LOAD_LIBRARY_AS_DATAFILE
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define EnumResourceNames
HGDIOBJ WINAPI GetStockObject(_In_ int)
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI PatBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
BOOL WINAPI DeleteDC(_In_ HDC)
#define CreateFontIndirect
#define LOCALE_NOUSEROVERRIDE
#define LOCALE_SABBREVLANGNAME
#define HKEY_LOCAL_MACHINE
#define HKEY_CURRENT_USER
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
DWORD WINAPI GetSysColor(_In_ int)
#define HSHELL_RUDEAPPACTIVATED
BOOL WINAPI IsWindow(_In_opt_ HWND)
HMENU WINAPI CreatePopupMenu(void)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
HICON WINAPI CreateIconIndirect(_In_ PICONINFO)
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define KLF_SETFORPROCESS
HWND WINAPI GetForegroundWindow(void)
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
BOOL WINAPI RegisterShellHookWindow(_In_ HWND)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
BOOL WINAPI SetForegroundWindow(_In_ HWND)
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
#define LoadKeyboardLayout
#define SPI_GETICONTITLELOGFONT
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
DWORD WINAPI CheckMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)
#define RegisterWindowMessage
UINT WINAPI GetKeyboardLayoutList(_In_ int nBuff, _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList)
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
#define COLOR_HIGHLIGHTTEXT
HDC WINAPI GetDC(_In_opt_ HWND)
#define MAKEINTRESOURCEA(i)
BOOL WINAPI DestroyMenu(_In_ HMENU)
HKL WINAPI ActivateKeyboardLayout(_In_ HKL, _In_ UINT)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SystemParametersInfo
BOOL WINAPI IsWindowVisible(_In_ HWND)
BOOL WINAPI DestroyWindow(_In_ HWND)
int WINAPI GetSystemMetrics(_In_ int)
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
BOOL WINAPI DestroyIcon(_In_ HICON)