OSDN Git Service

Make the keyboard hook thread local.
[xkeymacs/xkeymacs.git] / xkeymacsdll / xkeymacsdll.h
1 // xkeymacs.h: interface for the CXkeymacsDll class.\r
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \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
7 \r
8 #if _MSC_VER > 1000\r
9 #pragma once\r
10 #endif // _MSC_VER > 1000\r
11 \r
12 #include "ClipboardSnap.h"\r
13 \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
21 \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
26 \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
30 \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
33 \r
34 enum { EXTENDED_KEY = 0x01000000 };\r
35 enum { REPEATED_KEY = 0x40000000 };\r
36 enum { BEING_RELEASED = 0x80000000 };\r
37 \r
38 typedef struct KeyBind\r
39 {\r
40         int nCommandType;\r
41         BYTE bVk;\r
42         int nControlID;\r
43 } KeyBind_t;\r
44 \r
45 typedef struct KbdMacro\r
46 {\r
47         int nCode;\r
48         WPARAM wParam;\r
49         LPARAM lParam;\r
50         BOOL bOriginal;\r
51 } KbdMacro_t;\r
52 \r
53 typedef struct Modifier {\r
54         LPCTSTR name;\r
55         int id;\r
56 } Modifier_t;\r
57 \r
58 static const Modifier_t Modifiers[] = {\r
59 //      { _T("A-"), ALT },\r
60         { _T("C-"), CONTROL},\r
61 //      { _T("H-"), HYPER },\r
62         { _T("M-"), META },\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
68 };\r
69 \r
70 typedef struct KeyName\r
71 {\r
72         BYTE bVk;\r
73         LPCTSTR name;\r
74 } KeyName_t;\r
75 \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
170 };\r
171 \r
172 class AFX_EXT_CLASS CXkeymacsDll  \r
173 {\r
174 public:\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
221         CXkeymacsDll();\r
222         virtual ~CXkeymacsDll();\r
223 private:\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
292 };\r
293 \r
294 \r
295 class AFX_EXT_CLASS CXkeymacsData  \r
296 {\r
297 public:\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
327         void ClearAll();\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
334         CXkeymacsData();\r
335         virtual ~CXkeymacsData();\r
336 \r
337 private:\r
338         BOOL m_b326Compatible;\r
339         int m_nWindowTextType;\r
340         CString m_strWindowText;\r
341         BOOL m_bEnableCUA;\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
352 };\r
353 \r
354 #endif // !defined(AFX_XKEYMACS_H__88552DEC_1233_4A0A_BE62_9EF7BC618EC6__INCLUDED_)\r