|
|
//
// Include Files.
//
#ifndef INPUTDLG_H
#define INPUTDLG_H
#ifndef ARRAYSIZE
#define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0]))
#endif
//
// Constant Declarations.
//
#define US_LOCALE MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
#define IS_DIRECT_SWITCH_HOTKEY(p) \
(((p) >= IME_HOTKEY_DSWITCH_FIRST) && \ ((p) <= IME_HOTKEY_DSWITCH_LAST))
#define DESC_MAX MAX_PATH // max size of a description
#define ALLOCBLOCK 3 // # items added to block for alloc/realloc
#define HKL_LEN 9 // max # chars in hkl id + null
#define LIST_MARGIN 2 // for making the list box look good
#define MB_OK_OOPS (MB_OK | MB_ICONEXCLAMATION) // msg box flags
//
// wStatus bit pile.
//
#define LANG_ACTIVE 0x0001 // language is active
#define LANG_ORIGACTIVE 0x0002 // language was active to start with
#define LANG_CHANGED 0x0004 // user changed status of language
#define ICON_LOADED 0x0010 // icon read in from file
#define LANG_DEFAULT 0x0020 // current language
#define LANG_DEF_CHANGE 0x0040 // language default has changed
#define LANG_IME 0x0080 // IME
#define LANG_HOTKEY 0x0100 // a hotkey has been defined
#define LANG_UNLOAD 0x0200 // unload language
#define LANG_UPDATE 0x8000 // language needs to be updated
#define HOTKEY_SWITCH_LANG 0x0000 // id to switch between locales
#define MAX(i, j) (((i) > (j)) ? (i) : (j))
#define LANG_OAC (LANG_ORIGACTIVE | LANG_ACTIVE | LANG_CHANGED)
//
// Bits for g_dwChanges.
//
#define CHANGE_SWITCH 0x0001
#define CHANGE_DEFAULT 0x0002
#define CHANGE_CAPSLOCK 0x0004
#define CHANGE_NEWKBDLAYOUT 0x0008
#define CHANGE_TIPCHANGE 0x0010
#define CHANGE_LANGSWITCH 0x0020
#define CHANGE_DIRECTSWITCH 0x0040
//
// For the indicator on the tray.
//
#define IDM_NEWSHELL 249
#define IDM_EXIT 259
#define MOD_VIRTKEY 0x0080
//
// These are according to the US English kbd layout
//
#define VK_OEM_SEMICLN 0xba // ; :
#define VK_OEM_EQUAL 0xbb // = +
#define VK_OEM_SLASH 0xbf // / ?
#define VK_OEM_LBRACKET 0xdb // [ {
#define VK_OEM_BSLASH 0xdc // \ |
#define VK_OEM_RBRACKET 0xdd // ] }
#define VK_OEM_QUOTE 0xde // ' "
//
// For the hot key switching.
//
#define DIALOG_SWITCH_INPUT_LOCALES 0
#define DIALOG_SWITCH_KEYBOARD_LAYOUT 1
#define DIALOG_SWITCH_IME 2
//
// Show Language bar
//
#define REG_LANGBAR_SHOWNORMAL (DWORD)0
#define REG_LANGBAR_DOCK (DWORD)1
#define REG_LANGBAR_MINIMIZED (DWORD)2
#define REG_LANGBAR_HIDDEN (DWORD)3
#define REG_LANGBAR_DESKBAND (DWORD)4
//
// Typedef Declarations.
//
typedef struct { DWORD dwLangID; // language id
BOOL bDefLang; // default language
BOOL bNoAddCat; // don't add category
UINT uInputType; // default input type
LPARAM lParam; // item data
int iIdxTips; // index of Tips
CLSID clsid; // tip clsid
GUID guidProfile; // tip profile guid
HKL hklSub; // tip substitute hkl
ATOM atmDefTipName; // default input name
ATOM atmTVItemName; // tree view item name
} TVITEMNODE, *LPTVITEMNODE;
typedef struct langnode_s { WORD wStatus; // status flags
UINT iLayout; // offset into layout array
HKL hkl; // hkl
HKL hklUnload; // hkl of currently loaded layout
UINT iLang; // offset into lang array
HANDLE hLangNode; // handle to free for this structure
int nIconIME; // IME icon
struct langnode_s *pNext; // ptr to next langnode
UINT uModifiers; // hide Hotkey stuff here
UINT uVKey; // so we can rebuild the hotkey record
} LANGNODE, *LPLANGNODE;
typedef struct { DWORD dwID; // language id
ATOM atmLanguageName; // language name - localized
TCHAR szSymbol[3]; // 2 letter indicator symbol (+ null)
UINT iUseCount; // usage count for this language
UINT iNumCount; // number of links attached
DWORD dwDefaultLayout; // default layout id
LPLANGNODE pNext; // ptr to lang node structure
} INPUTLANG, *LPINPUTLANG;
typedef struct { DWORD dwID; // numeric id
BOOL bInstalled; // if layout is installed
UINT iSpecialID; // special id (0xf001 for dvorak etc)
ATOM atmLayoutFile; // layout file name
ATOM atmLayoutText; // layout text name
ATOM atmIMEFile; // IME file name
} LAYOUT, *LPLAYOUT;
typedef struct { DWORD dwLangID; // language id
BOOL bEnabled; // enable status
BOOL bDefault; // default profile
BOOL fEngineAvailable; // engine status
BOOL bNoAddCat; // don't add category
UINT uInputType; // input type
CLSID clsid; // tip clsid
GUID guidProfile; // tip profile guid
HKL hklSub; // tip substitute hkl
UINT iLayout; // offset into keyboard layout array
ATOM atmTipText; // layout text name
} TIPS, *LPTIPS;
typedef struct { DWORD dwHotKeyID; UINT idHotKeyName; DWORD fdwEnable; UINT uModifiers; UINT uVKey; HKL hkl; ATOM atmHotKeyName; UINT idxLayout; UINT uLayoutHotKey; } HOTKEYINFO, *LPHOTKEYINFO;
typedef struct { HWND hwndMain; LPLANGNODE pLangNode; LPHOTKEYINFO pHotKeyNode; } INITINFO, *LPINITINFO;
typedef struct { UINT uVirtKeyValue; UINT idVirtKeyName; ATOM atVirtKeyName; } VIRTKEYDESC;
//
// Global Variables.
//
static VIRTKEYDESC g_aVirtKeyDesc[] = { {0, IDS_VK_NONE, 0}, {VK_SPACE, IDS_VK_SPACE, 0}, {VK_PRIOR, IDS_VK_PRIOR, 0}, {VK_NEXT, IDS_VK_NEXT, 0}, {VK_END, IDS_VK_END, 0}, {VK_HOME, IDS_VK_HOME, 0}, {VK_F1, IDS_VK_F1, 0}, {VK_F2, IDS_VK_F2, 0}, {VK_F3, IDS_VK_F3, 0}, {VK_F4, IDS_VK_F4, 0}, {VK_F5, IDS_VK_F5, 0}, {VK_F6, IDS_VK_F6, 0}, {VK_F7, IDS_VK_F7, 0}, {VK_F8, IDS_VK_F8, 0}, {VK_F9, IDS_VK_F9, 0}, {VK_F10, IDS_VK_F10, 0}, {VK_F11, IDS_VK_F11, 0}, {VK_F12, IDS_VK_F12, 0}, {VK_OEM_SEMICLN, IDS_VK_OEM_SEMICLN, 0}, {VK_OEM_EQUAL, IDS_VK_OEM_EQUAL, 0}, {VK_OEM_COMMA, IDS_VK_OEM_COMMA, 0}, {VK_OEM_MINUS, IDS_VK_OEM_MINUS, 0}, {VK_OEM_PERIOD, IDS_VK_OEM_PERIOD, 0}, {VK_OEM_SLASH, IDS_VK_OEM_SLASH, 0}, {VK_OEM_3, IDS_VK_OEM_3, 0}, {VK_OEM_LBRACKET, IDS_VK_OEM_LBRACKET, 0}, {VK_OEM_BSLASH, IDS_VK_OEM_BSLASH, 0}, {VK_OEM_RBRACKET, IDS_VK_OEM_RBRACKET, 0}, {VK_OEM_QUOTE, IDS_VK_OEM_QUOTE, 0}, {'A', IDS_VK_A + 0, 0}, {'B', IDS_VK_A + 1, 0}, {'C', IDS_VK_A + 2, 0}, {'D', IDS_VK_A + 3, 0}, {'E', IDS_VK_A + 4, 0}, {'F', IDS_VK_A + 5, 0}, {'G', IDS_VK_A + 6, 0}, {'H', IDS_VK_A + 7, 0}, {'I', IDS_VK_A + 8, 0}, {'J', IDS_VK_A + 9, 0}, {'K', IDS_VK_A + 10, 0}, {'L', IDS_VK_A + 11, 0}, {'M', IDS_VK_A + 12, 0}, {'N', IDS_VK_A + 13, 0}, {'O', IDS_VK_A + 14, 0}, {'P', IDS_VK_A + 15, 0}, {'Q', IDS_VK_A + 16, 0}, {'R', IDS_VK_A + 17, 0}, {'S', IDS_VK_A + 18, 0}, {'T', IDS_VK_A + 19, 0}, {'U', IDS_VK_A + 20, 0}, {'V', IDS_VK_A + 21, 0}, {'W', IDS_VK_A + 22, 0}, {'X', IDS_VK_A + 23, 0}, {'Y', IDS_VK_A + 24, 0}, {'Z', IDS_VK_A + 25, 0}, {0, IDS_VK_NONE1, 0}, {'0', IDS_VK_0 + 0, 0}, {'1', IDS_VK_0 + 1, 0}, {'2', IDS_VK_0 + 2, 0}, {'3', IDS_VK_0 + 3, 0}, {'4', IDS_VK_0 + 4, 0}, {'5', IDS_VK_0 + 5, 0}, {'6', IDS_VK_0 + 6, 0}, {'7', IDS_VK_0 + 7, 0}, {'8', IDS_VK_0 + 8, 0}, {'9', IDS_VK_0 + 9, 0}, {'~', IDS_VK_0 + 10, 0}, {'`', IDS_VK_0 + 11, 0}, };
static BOOL g_bAdmin_Privileges = FALSE; static BOOL g_bSetupCase = FALSE;
static BOOL g_bCHSystem = FALSE; static BOOL g_bMESystem = FALSE; static BOOL g_bShowRtL = FALSE;
static UINT g_iEnabledTips = 0; static UINT g_iEnabledKbdTips = 0; static DWORD g_dwToolBar = 0; static DWORD g_dwChanges = 0;
static LPINPUTLANG g_lpLang = NULL; static UINT g_iLangBuff; static HANDLE g_hLang; static UINT g_nLangBuffSize;
static LPLAYOUT g_lpLayout = NULL; static UINT g_iLayoutBuff; static HANDLE g_hLayout; static UINT g_nLayoutBuffSize; static UINT g_iLayoutIME; // Number of IME keyboard layouts.
static int g_iUsLayout; static DWORD g_dwAttributes;
static int g_cyText; static int g_cyListItem;
static LPTIPS g_lpTips = NULL; static UINT g_iTipsBuff; static UINT g_nTipsBuffSize; static HANDLE g_hTips;
static TCHAR c_szLocaleInfo[] = TEXT("SYSTEM\\CurrentControlSet\\Control\\Nls\\Locale"); static TCHAR c_szLocaleInfoNT4[] = TEXT("SYSTEM\\CurrentControlSet\\Control\\Nls\\Language"); static TCHAR c_szLayoutPath[] = TEXT("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts"); static TCHAR c_szLayoutFile[] = TEXT("layout file"); static TCHAR c_szLayoutText[] = TEXT("layout text"); static TCHAR c_szLayoutID[] = TEXT("layout id"); static TCHAR c_szInstalled[] = TEXT("installed"); static TCHAR c_szIMEFile[] = TEXT("IME File"); static TCHAR c_szDisplayLayoutText[] = TEXT("Layout Display Name");
static TCHAR c_szKbdLayouts[] = TEXT("Keyboard Layout"); static TCHAR c_szPreloadKey[] = TEXT("Preload"); static TCHAR c_szSubstKey[] = TEXT("Substitutes"); static TCHAR c_szToggleKey[] = TEXT("Toggle"); static TCHAR c_szToggleHotKey[] = TEXT("Hotkey"); static TCHAR c_szToggleLang[] = TEXT("Language Hotkey"); static TCHAR c_szToggleLayout[] = TEXT("Layout Hotkey"); static TCHAR c_szAttributes[] = TEXT("Attributes"); static TCHAR c_szKbdPreloadKey[] = TEXT("Keyboard Layout\\Preload"); static TCHAR c_szKbdSubstKey[] = TEXT("Keyboard Layout\\Substitutes"); static TCHAR c_szKbdToggleKey[] = TEXT("Keyboard Layout\\Toggle"); static TCHAR c_szInternat[] = TEXT("internat.exe"); static char c_szInternatA[] = "internat.exe";
static TCHAR c_szTipInfo[] = TEXT("SOFTWARE\\Microsoft\\CTF"); static TCHAR c_szCTFMon[] = TEXT("CTFMON.EXE"); static char c_szCTFMonA[] = "ctfmon.exe";
static TCHAR c_szScanCodeKey[] = TEXT("Keyboard Layout\\IMEtoggle\\scancode"); static TCHAR c_szValueShiftLeft[] = TEXT("Shift Left"); static TCHAR c_szValueShiftRight[] = TEXT("Shift Right");
static TCHAR c_szIndicator[] = TEXT("Indicator"); static TCHAR c_szCTFMonClass[] = TEXT("CicLoaderWndClass");
static TCHAR c_szLoadImmPath[] = TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\IMM");
static TCHAR c_szPrefixCopy[] = TEXT("KEYBOARD_"); static TCHAR c_szKbdInf[] = TEXT("kbd.inf"); static TCHAR c_szKbdInf9x[] = TEXT("multilng.inf"); static TCHAR c_szKbdIMEInf9x[] = TEXT("ime.inf"); static TCHAR c_szIMECopy[] = TEXT("IME_");
static TCHAR c_szTipCategoryEnable[] = TEXT("Enable"); static TCHAR c_szCTFTipPath[] = TEXT("SOFTWARE\\Microsoft\\CTF\\TIP\\"); static TCHAR c_szLangProfileKey[] = TEXT("LanguageProfile"); static TCHAR c_szSubstituteLayout[] = TEXT("SubstituteLayout");
static TCHAR c_szKbdPreloadKey_DefUser[] = TEXT(".DEFAULT\\Keyboard Layout\\Preload"); static TCHAR c_szKbdSubstKey_DefUser[] = TEXT(".DEFAULT\\Keyboard Layout\\Substitutes"); static TCHAR c_szKbdToggleKey_DefUser[] = TEXT(".DEFAULT\\Keyboard Layout\\Toggle"); static TCHAR c_szRunPath_DefUser[] = TEXT(".DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\Run");
static TCHAR c_szHelpFile[] = TEXT("input.hlp");
static HOTKEYINFO g_aDirectSwitchHotKey[IME_HOTKEY_DSWITCH_LAST - IME_HOTKEY_DSWITCH_FIRST + 1]; #define DSWITCH_HOTKEY_SIZE sizeof(g_aDirectSwitchHotKey) / sizeof(HOTKEYINFO)
static HOTKEYINFO g_SwitchLangHotKey;
static HOTKEYINFO g_aImeHotKey0404[] = { {IME_ITHOTKEY_RESEND_RESULTSTR, IDS_RESEND_RESULTSTR_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, {IME_ITHOTKEY_PREVIOUS_COMPOSITION, IDS_PREVIOUS_COMPOS_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, {IME_ITHOTKEY_UISTYLE_TOGGLE, IDS_UISTYLE_TOGGLE_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, {IME_THOTKEY_IME_NONIME_TOGGLE, IDS_IME_NONIME_TOGGLE_CHT, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_THOTKEY_SHAPE_TOGGLE, IDS_SHAPE_TOGGLE_CHT, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_THOTKEY_SYMBOL_TOGGLE, IDS_SYMBOL_TOGGLE_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, };
static HOTKEYINFO g_aImeHotKey0804[] = {
{IME_CHOTKEY_IME_NONIME_TOGGLE, IDS_IME_NONIME_TOGGLE_CHS, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_CHOTKEY_SHAPE_TOGGLE, IDS_SHAPE_TOGGLE_CHS, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_CHOTKEY_SYMBOL_TOGGLE, IDS_SYMBOL_TOGGLE_CHS, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1},
};
static HOTKEYINFO g_aImeHotKeyCHxBoth[]= {
// CHS HOTKEYs,
{IME_CHOTKEY_IME_NONIME_TOGGLE, IDS_IME_NONIME_TOGGLE_CHS, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_CHOTKEY_SHAPE_TOGGLE, IDS_SHAPE_TOGGLE_CHS, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_CHOTKEY_SYMBOL_TOGGLE, IDS_SYMBOL_TOGGLE_CHS, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1},
// CHT HOTKEYs,
{IME_ITHOTKEY_RESEND_RESULTSTR, IDS_RESEND_RESULTSTR_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, {IME_ITHOTKEY_PREVIOUS_COMPOSITION, IDS_PREVIOUS_COMPOS_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, {IME_ITHOTKEY_UISTYLE_TOGGLE, IDS_UISTYLE_TOGGLE_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, {IME_THOTKEY_IME_NONIME_TOGGLE, IDS_IME_NONIME_TOGGLE_CHT, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_THOTKEY_SHAPE_TOGGLE, IDS_SHAPE_TOGGLE_CHT, MOD_LEFT, 0, 0, (HKL)NULL, 0, -1}, {IME_THOTKEY_SYMBOL_TOGGLE, IDS_SYMBOL_TOGGLE_CHT, MOD_VIRTKEY|MOD_CONTROL|MOD_ALT|MOD_SHIFT, 0, 0, (HKL)NULL, 0, -1}, };
//
// Function Prototypes.
//
INT_PTR CALLBACK KbdLocaleAddDlg( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK KbdLocaleEditDlg( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK KbdLocaleChangeInputLocaleHotkey( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK KbdLocaleChangeThaiInputLocaleHotkey( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK KbdLocaleChangeMEInputLocaleHotkey( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK KbdLocaleChangeKeyboardLayoutHotkey( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK KbdLocaleHotKeyDlg( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK KbdLocaleSimpleHotkey( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK ToolBarSettingDlg( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL Locale_LoadLocales(HWND hwnd);
BOOL IsEnabledTipOrMultiLayouts();
HKL GetSubstituteHKL( REFCLSID rclsid, LANGID langid, REFGUID guidProfile);
#endif // INPUTDLG_H
|