1 // xkeymacs.h: interface for the CXkeymacsDll class.
\r
3 //////////////////////////////////////////////////////////////////////
\r
5 #if !defined(AFX_XKEYMACS_H__88552DEC_1233_4A0A_BE62_9EF7BC618EC6__INCLUDED_)
\r
6 #define AFX_XKEYMACS_H__88552DEC_1233_4A0A_BE62_9EF7BC618EC6__INCLUDED_
\r
10 #endif // _MSC_VER > 1000
\r
12 #include "ClipboardSnap.h"
\r
14 enum { MAX_APP = 64 };
\r
15 enum { NONE = 0x0, SHIFT = 0x1, CONTROL = 0x2, META = 0x4, CONTROLX = 0x8,
\r
16 MAX_COMMAND_TYPE = NONE + SHIFT + CONTROL + META + CONTROLX + 1 };
\r
17 enum { /* WIN_SHIFT = 0x100, */ WIN_CTRL = 0x200, WIN_ALT = 0x400, WIN_WIN = 0x800 };
\r
18 enum { MAX_KEY = 256 };
\r
19 enum { MAX_FUNCTION = 64 };
\r
20 enum { MAX_DEFINITION = 256 };
\r
22 enum { WINDOW_NAME_LENGTH = 128 };
\r
23 enum { CLASS_NAME_LENGTH = 128 };
\r
24 enum { SUB_KEY_NAME_LENGTH = 128 };
\r
25 enum { WINDOW_TEXT_LENGTH = 128 + 128 + 3};
\r
27 enum ICON_TYPE { MAIN_ICON, CX_ICON, MX_ICON, META_ICON, SHIFT_ICON, CTRL_ICON, ALT_ICON, MAX_ICON_TYPE };
\r
28 enum XKEYMACS_STATUS { STATUS_ENABLE, STATUS_DISABLE_TMP, STATUS_DISABLE_WOCQ, STATUS_DISABLE, MAX_STATUS };
\r
29 enum { ON_ICON, OFF_ICON }; // alias of status
\r
31 enum GOTO { GOTO_DO_NOTHING, GOTO_HOOK, GOTO_RECURSIVE, GOTO_HOOKX, GOTO_HOOK0_9, CONTINUE };
\r
32 enum SETTING_STYLE { SETTING_DEFAULT, SETTING_SPECIFIC, SETTING_DISABLE, SETTING_UNDEFINED };
\r
34 enum { EXTENDED_KEY = 0x01000000 };
\r
35 enum { REPEATED_KEY = 0x40000000 };
\r
36 enum { BEING_RELEASED = 0x80000000 };
\r
38 typedef struct KeyBind
\r
45 typedef struct KbdMacro
\r
53 typedef struct Modifier {
\r
58 static const Modifier_t Modifiers[] = {
\r
59 // { _T("A-"), ALT },
\r
60 { _T("C-"), CONTROL},
\r
61 // { _T("H-"), HYPER },
\r
63 { _T("S-"), SHIFT },
\r
64 // { _T("s-"), SUPER },
\r
65 { _T("Ctrl+"), WIN_CTRL },
\r
66 { _T("Alt+"), WIN_ALT },
\r
67 { _T("Win+"), WIN_WIN },
\r
70 typedef struct KeyName
\r
76 static const KeyName_t ControlCharacters[] = {
\r
77 // { VK_LBUTTON, _T("mouse-1") }, // does not work well
\r
78 // { VK_RBUTTON, _T("mouse-3") }, // does not work well
\r
79 { VK_CANCEL, _T("break") },
\r
80 // { VK_MBUTTON, _T("mouse-2") }, // does not work well
\r
81 { VK_BACK, _T("backspace") },
\r
82 { VK_TAB, _T("tab") },
\r
83 { VK_RETURN, _T("return") },
\r
84 { VK_CAPITAL, _T("capslock") },
\r
85 { VK_KANA, _T("kana") },
\r
86 { VK_KANJI, _T("kanji") },
\r
87 { VK_ESCAPE, _T("escape") },
\r
88 { VK_CONVERT, _T("convert") },
\r
89 { VK_NONCONVERT, _T("nonconvert") },
\r
90 // { VK_SPACE, _T("SPC") }, // [? ]
\r
91 { VK_PRIOR, _T("prior") },
\r
92 { VK_NEXT, _T("next") },
\r
93 { VK_END, _T("end") },
\r
94 { VK_HOME, _T("home") },
\r
95 { VK_LEFT, _T("left") },
\r
96 { VK_UP, _T("up") },
\r
97 { VK_RIGHT, _T("right") },
\r
98 { VK_DOWN, _T("down") },
\r
99 { VK_SELECT, _T("select") },
\r
100 { VK_PRINT, _T("print") },
\r
101 { VK_EXECUTE, _T("execute") },
\r
102 { VK_SNAPSHOT, _T("printscreen") }, // work as print
\r
103 { VK_INSERT, _T("insert") },
\r
104 { VK_DELETE, _T("delete") },
\r
105 { VK_LWIN, _T("lwindow") },
\r
106 { VK_RWIN, _T("rwindow") },
\r
107 { VK_APPS, _T("apps") },
\r
108 { VK_SLEEP, _T("sleep") },
\r
109 { VK_NUMPAD0, _T("kp-0") },
\r
110 { VK_NUMPAD1, _T("kp-1") },
\r
111 { VK_NUMPAD2, _T("kp-2") },
\r
112 { VK_NUMPAD3, _T("kp-3") },
\r
113 { VK_NUMPAD4, _T("kp-4") },
\r
114 { VK_NUMPAD5, _T("kp-5") },
\r
115 { VK_NUMPAD6, _T("kp-6") },
\r
116 { VK_NUMPAD7, _T("kp-7") },
\r
117 { VK_NUMPAD8, _T("kp-8") },
\r
118 { VK_NUMPAD9, _T("kp-9") },
\r
119 { VK_MULTIPLY, _T("kp-multiply") },
\r
120 { VK_ADD, _T("kp-add") },
\r
121 { VK_SUBTRACT, _T("kp-subtract") },
\r
122 { VK_DECIMAL, _T("kp-decimal") },
\r
123 { VK_DIVIDE, _T("kp-divide") },
\r
124 // { VK_F1, _T("f1") }, // FIXME
\r
125 // { VK_F2, _T("f2") }, // Move at the end of definition of funcgtion keys to keep away confliction f1/f2 and f1?/f2? by _tcsncmp() i.e. strncmp()
\r
126 { VK_F3, _T("f3") },
\r
127 { VK_F4, _T("f4") },
\r
128 { VK_F5, _T("f5") },
\r
129 { VK_F6, _T("f6") },
\r
130 { VK_F7, _T("f7") },
\r
131 { VK_F8, _T("f8") },
\r
132 { VK_F9, _T("f9") },
\r
133 { VK_F10, _T("f10") },
\r
134 { VK_F11, _T("f11") },
\r
135 { VK_F12, _T("f12") },
\r
136 { VK_F13, _T("f13") },
\r
137 { VK_F14, _T("f14") },
\r
138 { VK_F15, _T("f15") },
\r
139 { VK_F16, _T("f16") },
\r
140 { VK_F17, _T("f17") },
\r
141 { VK_F18, _T("f18") },
\r
142 { VK_F19, _T("f19") },
\r
143 { VK_F20, _T("f20") },
\r
144 { VK_F21, _T("f21") },
\r
145 { VK_F22, _T("f22") },
\r
146 { VK_F23, _T("f23") },
\r
147 { VK_F24, _T("f24") },
\r
148 { VK_F1, _T("f1") },
\r
149 { VK_F2, _T("f2") },
\r
150 { VK_NUMLOCK, _T("kp-numlock") },
\r
151 { VK_SCROLL, _T("scroll") },
\r
152 { 0xa6, _T("browser-back") }, // VK_BROWSER_BACK
\r
153 { 0xa7, _T("browser-forward") }, // VK_BROWSER_FORWARD
\r
154 { 0xa8, _T("browser-refresh") }, // VK_BROWSER_REFRESH
\r
155 { 0xa9, _T("browser-stop") }, // VK_BROWSER_STOP
\r
156 { 0xaa, _T("browser-search") }, // VK_BROWSER_SEARCH
\r
157 { 0xab, _T("browser-favorites") }, // VK_BROWSER_FAVORITES
\r
158 { 0xac, _T("browser-home") }, // VK_BROWSER_HOME
\r
159 { 0xad, _T("volume-mute") }, // VK_VOLUME_MUTE
\r
160 { 0xae, _T("volume-down") }, // VK_VOLUME_DOWN
\r
161 { 0xaf, _T("volume-up") }, // VK_VOLUME_UP
\r
162 { 0xb0, _T("media-next-track") }, // VK_MEDIA_NEXT_TRACK
\r
163 { 0xb1, _T("media-prev-track") }, // VK_MEDIA_PREV_TRACK
\r
164 { 0xb2, _T("media-stop") }, // VK_MEDIA_STOP
\r
165 { 0xb3, _T("media-play-pause") }, // VK_MEDIA_PLAY_PAUSE
\r
166 { 0xb4, _T("launch-mail") }, // VK_LAUNCH_MAIL
\r
167 { 0xb5, _T("launch-media-select") }, // VK_LAUNCH_MEDIA_SELECT
\r
168 { 0xb6, _T("launch-1") }, // VK_LAUNCH_APP1
\r
169 { 0xb7, _T("launch-2") }, // VK_LAUNCH_APP2
\r
172 class AFX_EXT_CLASS CXkeymacsDll
\r
175 static void ModifyM_xTip(const TCHAR *const szPath);
\r
176 static BOOL Get326Compatible();
\r
177 void Set326Compatible(int nApplicationID, BOOL b326Compatible);
\r
178 void SetCursorData(HCURSOR hEnable, HCURSOR hDisableTMP, HCURSOR hDisableWOCQ, HICON hDisable, BOOL bEnable);
\r
179 static unsigned int GetMaxKeyInterval(void);
\r
180 static void SetKeyboardSpeed(int nKeyboardSpeed);
\r
181 static int GetAccelerate(void);
\r
182 static void SetAccelerate(int nAccelerate);
\r
183 void SetWindowText(int nApplicationID, CString szWindowText);
\r
184 // static int m_nPassThrough;
\r
185 void AddAllShell_NotifyIcon();
\r
186 void DeleteAllShell_NotifyIcon();
\r
187 void SetKillRingMax(int nApplicationID, int nKillRingMax);
\r
188 void CXkeymacsDll::EnableShell_NotifyIcon(ICON_TYPE icon, BOOL bEnable);
\r
189 void SetNotifyIconData(ICON_TYPE icon, NOTIFYICONDATA stNtfyIcon, HICON hEnable, HICON hDisableTMP, HICON hDisableWOCQ, HICON hDisable, BOOL bEnable);
\r
190 void SetNotifyIconData(ICON_TYPE icon, NOTIFYICONDATA stNtfyIcon, HICON hOn, HICON hOff, BOOL bEnable);
\r
191 void Clear(int nApplicationID);
\r
192 BOOL IsKeyboardHook();
\r
193 void SetCommandID(int nApplicationID, int nCommandType, int nKey, int nCommandID);
\r
194 void SetAtIbeamCursorOnly(int nApplicationID, int nCommandType, int nKey, BOOL bAtIbeamCursorOnly);
\r
195 void SetApplicationName(int nApplicationID, CString szApplicationName);
\r
196 static void ReleaseHooks();
\r
197 static void ReleaseKeyboardHook();
\r
198 void SetEnableCUA(int nApplicationID, BOOL bEnableCUA);
\r
199 void SetIgnoreUndefinedC_x(int nApplicationID, BOOL bIgnoreUndefinedC_x);
\r
200 void SetIgnoreUndefinedMetaCtrl(int nApplicationID, BOOL bIgnoreUndefinedMetaCtrl);
\r
201 static void SetHooks();
\r
202 static void SetKeyboardHook();
\r
203 void SetSettingStyle(int nApplicationID, int nSettingStyle);
\r
204 void SetUseDialogSetting(int nApplicationID, BOOL bUseDialogSetting);
\r
205 static void AddKillRing(BOOL bNewData = TRUE);
\r
206 static void CallMacro();
\r
207 static void ClearFunctionDefinition();
\r
208 static void DefiningMacro(BOOL bDefiningMacro);
\r
209 static void DepressKey(BYTE bVk, BOOL bOriginal = TRUE);
\r
210 static BOOL GetEnableCUA();
\r
211 static CClipboardSnap* GetKillRing(CClipboardSnap *pSnap, BOOL bForce = TRUE);
\r
212 static void IncreaseKillRingIndex(int nKillRing = 1);
\r
213 static BOOL IsDown(BYTE bVk, BOOL bPhysicalKey = TRUE);
\r
214 static void Kdu(BYTE bVk, DWORD n = 1, BOOL bOriginal = TRUE);
\r
215 static int ModifyShell_NotifyIcon(ICON_TYPE icon, BOOL bNewStatus, BOOL bForce = TRUE);
\r
216 static void ReleaseKey(BYTE bVk);
\r
217 static void SetFunctionDefinition(int nFunctionID, CString szDefinition);
\r
218 static void SetFunctionKey(int nFunctionID, int nApplicationID, int nCommandType, int nKey);
\r
219 static void SetKeyboardHookFlag();
\r
220 static void SetKeyboardHookFlag(BOOL bFlag);
\r
222 virtual ~CXkeymacsDll();
\r
224 static void InvokeM_x(const TCHAR* const szPath);
\r
225 static BOOL m_b326Compatible[MAX_APP];
\r
226 static void LogCallWndProcMessage(WPARAM wParam, LPARAM lParam);
\r
227 static void DoSetCursor();
\r
228 static HCURSOR m_hCurrentCursor;
\r
229 static BOOL m_bCursor;
\r
230 static HCURSOR m_hCursor[MAX_STATUS];
\r
231 static int m_nKeyboardSpeed;
\r
232 static int m_nAccelerate;
\r
233 static HHOOK m_hHookCallWndRet;
\r
234 static LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam);
\r
235 static BOOL IsMatchWindowText(CString szWindowText);
\r
236 static TCHAR m_szWindowText[MAX_APP][WINDOW_TEXT_LENGTH];
\r
237 static BOOL m_bEnableKeyboardHook;
\r
238 static HHOOK m_hHookCallWnd;
\r
239 static HHOOK m_hHookGetMessage;
\r
240 static HHOOK m_hHookShell;
\r
241 static void AddShell_NotifyIcon(ICON_TYPE icon);
\r
242 void DeleteShell_NotifyIcon(ICON_TYPE icon);
\r
243 static BOOL DefiningMacro();
\r
244 static BOOL IsControl();
\r
245 static BOOL IsMeta();
\r
246 static void DoKeybd_event(BYTE bVk, DWORD dwFlags);
\r
247 static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
\r
248 static LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
\r
249 static LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam);
\r
250 static LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam);
\r
251 static KeyBind_t ParseKey(const int nFunctionID, unsigned int &i);
\r
252 static BYTE a2v(TCHAR nAscii);
\r
253 static BOOL IsShift(TCHAR nAscii);
\r
254 static TCHAR m_szFunctionDefinition[MAX_FUNCTION][MAX_DEFINITION];
\r
255 static void CallFunction(int nFunctionID);
\r
256 static int m_nFunctionID[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY];
\r
257 static BOOL m_bEnableCUA[MAX_APP];
\r
258 static TCHAR m_szOldApplicationName[MAX_PATH];
\r
259 static TCHAR m_szApplicationName[MAX_PATH];
\r
260 static int IsPassThrough(BYTE nKey);
\r
261 static BOOL IsDepressedShiftKeyOnly(BYTE nKey);
\r
262 static BOOL IsDepressedModifier(int Modifier(), BOOL bPhysicalKey = TRUE);
\r
263 static BOOL IsValidKey(BYTE bVk);
\r
264 static CObList m_Macro;
\r
265 static BOOL m_bDefiningMacro;
\r
266 static void Original(int nCommandType, BYTE bVk, int nOriginal);
\r
267 static int Original(int nCommandType, BYTE bVk);
\r
268 static HICON m_hIcon[MAX_ICON_TYPE][MAX_STATUS];
\r
269 static BOOL m_bUseDialogSetting[MAX_APP];
\r
270 static void InitKeyboardProc(BOOL bImeComposition);
\r
271 static BOOL m_bIgnoreUndefinedC_x[MAX_APP];
\r
272 static BOOL m_bIgnoreUndefinedMetaCtrl[MAX_APP];
\r
273 static int m_nSettingStyle[MAX_APP];
\r
274 static int m_nApplicationID;
\r
275 static int m_nOriginal[MAX_COMMAND_TYPE][MAX_KEY];
\r
276 static int m_nKillRing;
\r
277 static CList<CClipboardSnap *, CClipboardSnap *> m_oKillRing;
\r
278 static int m_nKillRingMax[MAX_APP];
\r
279 static int GetMickey(int nDifferential, int nThreshold1, int nThreshold2, int nAcceleration, int nSpeed);
\r
280 static BOOL DoShell_NotifyIcon(ICON_TYPE icon, DWORD dwMessage);
\r
281 static BOOL m_bIcon[MAX_ICON_TYPE];
\r
282 static DWORD m_dwOldMessage[MAX_ICON_TYPE];
\r
283 static NOTIFYICONDATA m_stNtfyIcon[MAX_ICON_TYPE];
\r
284 static NOTIFYICONDATA m_stOldNtfyIcon[MAX_ICON_TYPE];
\r
285 static BOOL m_bHook;
\r
286 static BOOL m_bRightShift;
\r
287 static BOOL m_bRightAlt;
\r
288 static BOOL m_bRightControl;
\r
289 static TCHAR m_szSpecialApp[MAX_APP][CLASS_NAME_LENGTH];
\r
290 static int m_nCommandID[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY];
\r
291 static BOOL m_bAtIbeamCursorOnly[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY];
\r
295 class AFX_EXT_CLASS CXkeymacsData
\r
298 void Set326Compatible(BOOL b326Compatible);
\r
299 BOOL Get326Compatible();
\r
300 int GetWindowTextType();
\r
301 void SetWindowTextType(int nWindowTextType);
\r
302 CString GetWindowText();
\r
303 void SetWindowText(LPCTSTR lpszWindowText);
\r
304 static BOOL Is106Keyboard();
\r
305 static void Set106Keyboard(BOOL b106Keyboard);
\r
306 static int GetToolTipID(int nCommandID);
\r
307 static int GetDescriptionID(int nCommandID);
\r
308 void SetUseDialogSetting(BOOL bUseDialogSetting);
\r
309 BOOL GetUseDialogSetting();
\r
310 BOOL GetEnableCUA();
\r
311 void SetEnableCUA(BOOL bEnableCUA);
\r
312 BOOL GetIgnoreUndefinedC_x();
\r
313 void SetIgnoreUndefinedC_x(BOOL bIgnoreUndefinedC_x);
\r
314 BOOL GetIgnoreUndefinedMetaCtrl();
\r
315 void SetIgnoreUndefinedMetaCtrl(BOOL bIgnoreUndefinedMetaCtrl);
\r
316 static int GetCategoryID(int nCommandID);
\r
317 void SetSettingStyle(int nSettingStyle);
\r
318 int GetSettingStyle();
\r
319 static int GetDefaultControlID(int nCommandID, int nIndex);
\r
320 static int GetDefaultCommandKey(int nCommandID, int nIndex);
\r
321 static int GetDefaultCommandType(int nCommandID, int nIndex);
\r
322 static CString GetCommandName(int nCommandID);
\r
323 void SetKillRingMax(int nKillRingMax);
\r
324 int GetKillRingMax();
\r
325 CString GetApplicationTitle();
\r
326 void SetApplicationTitle(LPCTSTR lpszApplicationTitle);
\r
328 int GetCommandID(int nCommandType, int nKey);
\r
329 void SetCommandID(int nCommandType, int nKey, int nCommandID);
\r
330 BOOL GetAtIbeamCursorOnly(int nCommandType, int nKey);
\r
331 void SetAtIbeamCursorOnly(int nCommandType, int nKey, BOOL bAtIbeamCursorOnly);
\r
332 CString GetApplicationName();
\r
333 void SetApplicationName(LPCTSTR lpszApplicationName);
\r
335 virtual ~CXkeymacsData();
\r
338 BOOL m_b326Compatible;
\r
339 int m_nWindowTextType;
\r
340 CString m_strWindowText;
\r
342 static BOOL m_b106Keyboard;
\r
343 BOOL m_bUseDialogSetting;
\r
344 BOOL m_bIgnoreUndefinedC_x;
\r
345 BOOL m_bIgnoreUndefinedMetaCtrl;
\r
346 int m_nSettingStyle;
\r
347 int m_nKillRingMax;
\r
348 CString m_strApplicationTitle;
\r
349 CString m_strApplicationName;
\r
350 int m_nCommandID[MAX_COMMAND_TYPE][MAX_KEY];
\r
351 BOOL m_bAtIbeamCursorOnly[MAX_COMMAND_TYPE][MAX_KEY];
\r
354 #endif // !defined(AFX_XKEYMACS_H__88552DEC_1233_4A0A_BE62_9EF7BC618EC6__INCLUDED_)
\r