32#define WM_NOTIFYICONMSG (WM_USER + 248)
34#define TIMER_ID_LANG_CHANGED_DELAYED 0x10000
35#define TIMER_LANG_CHANGED_DELAY 200
56#define MAX_SPECIAL_IDS 256
70 TEXT(
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts"),
76 for (dwIndex = 0; dwIndex < 1000; ++dwIndex)
85 dwSize =
sizeof(szLayoutId);
105 ERR(
"g_SpecialIds is full!");
160 for (iKL = 0; iKL <
g_cKLs; ++iKL)
203 _T(
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szKLID);
240 if (szKLID[0] !=
TEXT(
'E') && szKLID[0] !=
TEXT(
'e'))
244 _T(
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szKLID);
278 if (pLoadIcon->
hIcon)
322 HBITMAP hbmColor, hbmMono, hBmpOld;
332 if (szImeFile && szImeFile[0])
345 szBuf[0] = szBuf[1] =
_T(
'?');
357 if (!
hdc || !hbmColor || !hbmMono)
490 if (hwndTarget && !bNoActivate)
501 INPUTLANGCHANGE_SYSCHARSET, (
LPARAM)hKl);
520 for (iKL = 0; iKL <
g_cKLs; ++iKL)
563 ERR(
"SetHooks failed\n");
567 TRACE(
"SetHooks OK\n");
586 TRACE(
"DeleteHooks OK\n");
593 for (iKL = 0; iKL <
g_cKLs; ++iKL)
748 TEXT(
"control.exe"),
TEXT(
"input.dll"),
774 TRACE(
"WM_LANG_CHANGED: hwndTarget:%p, hKL:%p\n", hwndTarget, hKL);
785 TRACE(
"WM_WINDOW_ACTIVATE: hwndTarget:%p, lParam:%p\n", hwndTarget,
lParam);
796 if (
wParam == SPI_SETNONCLIENTMETRICS)
813 if (
wParam == HSHELL_LANGUAGE)
875 TRACE(
"LAYOUT_RTL\n");
891 ERR(
"Another instance is already running\n");
909 hwnd =
CreateWindow(
szKbSwitcherName,
NULL, 0, 0, 0, 1, 1,
HWND_DESKTOP,
NULL,
hInstance,
NULL);
913 ERR(
"RegisterShellHookWindow failed\n");
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define RegCloseKey(hKey)
#define GetProcAddress(x, y)
LANGID WINAPI GetUserDefaultUILanguage(void)
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 IS_SPECIAL_HKL(hKL)
_Out_opt_ PICONINFO IconInfo
static void KbSwitch_OnCommand(HWND hwnd, UINT nID)
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
#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 HICON FakeExtractIcon(LPCTSTR szIconPath, INT cxIcon, INT cyIcon)
static LRESULT KbSwitch_OnWindowActivate(HWND hwnd, HWND hwndTarget OPTIONAL, LPARAM lParam OPTIONAL)
static HKL GetActiveKL(VOID)
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 void KbSwitch_OnSettingChange(HWND hwnd, WPARAM wParam, LPARAM lParam)
#define TIMER_LANG_CHANGED_DELAY
static HICON CreateTrayIcon(LPTSTR szKLID, LPCTSTR szImeFile OPTIONAL)
static HMENU BuildLeftPopupMenu(VOID)
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
static BOOL RememberLastActive(HWND hwnd, HWND hwndFore)
static VOID UpdateLayoutList(HKL hKL OPTIONAL)
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)
HWND GetTargetWindow(HWND hwndFore OPTIONAL)
static void KbSwitch_OnTimer(HWND hwnd, UINT_PTR nTimerID)
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)
struct tagLOAD_ICON * PLOAD_ICON
static BOOL GetSystemLibraryPath(LPTSTR szPath, SIZE_T cchPath, LPCTSTR FileName)
FN_KbSwitchSetHooks KbSwitchSetHooks
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)
static VOID DeleteTrayIcon(HWND hwnd)
struct tagSPECIAL_ID SPECIAL_ID
struct tagSPECIAL_ID * PSPECIAL_ID
const TCHAR szKbSwitcherName[]
#define WM_WINDOW_ACTIVATE
static BOOL IsWndClassName(_In_opt_ HWND hwndTarget, PCTSTR pszName)
BOOL(APIENTRY * FN_KbSwitchSetHooks)(BOOL bDoHook)
#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 MAKEINTRESOURCE(i)
static const WCHAR szName[]
#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)
BOOL WINAPI SetProcessDefaultLayout(DWORD dwDefaultLayout)
#define GetSystemDirectory
DWORD WINAPI GetLastError(void)
#define LOAD_LIBRARY_AS_DATAFILE
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define EnumResourceNames
_In_ HCRYPTHASH _In_ BOOL _In_ DWORD _Inout_ DWORD _In_ DWORD dwBufLen
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
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)
__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)