OSDN Git Service

Import from xkeymacssrc347. init
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sat, 2 Apr 2011 05:08:43 +0000 (14:08 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sat, 2 Apr 2011 05:08:43 +0000 (14:08 +0900)
77 files changed:
xkeymacs/104keyboard.cpp [new file with mode: 0644]
xkeymacs/104keyboard.h [new file with mode: 0644]
xkeymacs/109keyboard.cpp [new file with mode: 0644]
xkeymacs/109keyboard.h [new file with mode: 0644]
xkeymacs/dot.xkeymacs [new file with mode: 0644]
xkeymacs/dotxkeymacs.cpp [new file with mode: 0644]
xkeymacs/dotxkeymacs.h [new file with mode: 0644]
xkeymacs/key.cpp [new file with mode: 0644]
xkeymacs/key.h [new file with mode: 0644]
xkeymacs/mainfrm.cpp [new file with mode: 0644]
xkeymacs/mainfrm.h [new file with mode: 0644]
xkeymacs/mx_off.ico [new file with mode: 0644]
xkeymacs/mx_on.ico [new file with mode: 0644]
xkeymacs/optionsdlg.cpp [new file with mode: 0644]
xkeymacs/optionsdlg.h [new file with mode: 0644]
xkeymacs/profile.cpp [new file with mode: 0644]
xkeymacs/profile.h [new file with mode: 0644]
xkeymacs/properties.cpp [new file with mode: 0644]
xkeymacs/properties.h [new file with mode: 0644]
xkeymacs/propertiesadvanced.cpp [new file with mode: 0644]
xkeymacs/propertiesadvanced.h [new file with mode: 0644]
xkeymacs/propertiesbasic.cpp [new file with mode: 0644]
xkeymacs/propertiesbasic.h [new file with mode: 0644]
xkeymacs/propertieslist.cpp [new file with mode: 0644]
xkeymacs/propertieslist.h [new file with mode: 0644]
xkeymacs/res/alt_off.ico [new file with mode: 0644]
xkeymacs/res/alt_on.ico [new file with mode: 0644]
xkeymacs/res/ctrl_off.ico [new file with mode: 0644]
xkeymacs/res/ctrl_on.ico [new file with mode: 0644]
xkeymacs/res/cx_off.ico [new file with mode: 0644]
xkeymacs/res/cx_on.ico [new file with mode: 0644]
xkeymacs/res/disable.ico [new file with mode: 0644]
xkeymacs/res/disable_.cur [new file with mode: 0644]
xkeymacs/res/disable_tmp.cur [new file with mode: 0644]
xkeymacs/res/disable_wocq.cur [new file with mode: 0644]
xkeymacs/res/disabletmp.ico [new file with mode: 0644]
xkeymacs/res/disablewocq.ico [new file with mode: 0644]
xkeymacs/res/drag.cur [new file with mode: 0644]
xkeymacs/res/hand.cur [new file with mode: 0644]
xkeymacs/res/meta_off.ico [new file with mode: 0644]
xkeymacs/res/meta_on.ico [new file with mode: 0644]
xkeymacs/res/mx_off.ico [new file with mode: 0644]
xkeymacs/res/mx_on.ico [new file with mode: 0644]
xkeymacs/res/shift_of.ico [new file with mode: 0644]
xkeymacs/res/shift_on.ico [new file with mode: 0644]
xkeymacs/res/sort_asc.bmp [new file with mode: 0644]
xkeymacs/res/sort_des.bmp [new file with mode: 0644]
xkeymacs/res/xkeymacs.ico [new file with mode: 0644]
xkeymacs/res/xkeymacs.rc2 [new file with mode: 0644]
xkeymacs/resource.h [new file with mode: 0644]
xkeymacs/stdafx.cpp [new file with mode: 0644]
xkeymacs/stdafx.h [new file with mode: 0644]
xkeymacs/xkeymacs.cpp [new file with mode: 0644]
xkeymacs/xkeymacs.dsp [new file with mode: 0644]
xkeymacs/xkeymacs.dsw [new file with mode: 0644]
xkeymacs/xkeymacs.h [new file with mode: 0644]
xkeymacs/xkeymacs.rc [new file with mode: 0644]
xkeymacsdll/ClipboardFormatSnap.cpp [new file with mode: 0644]
xkeymacsdll/ClipboardFormatSnap.h [new file with mode: 0644]
xkeymacsdll/ClipboardSnap.cpp [new file with mode: 0644]
xkeymacsdll/ClipboardSnap.h [new file with mode: 0644]
xkeymacsdll/Commands.cpp [new file with mode: 0644]
xkeymacsdll/Commands.h [new file with mode: 0644]
xkeymacsdll/FunctionDefinition.cpp [new file with mode: 0644]
xkeymacsdll/FunctionDefinition.h [new file with mode: 0644]
xkeymacsdll/StdAfx.cpp [new file with mode: 0644]
xkeymacsdll/StdAfx.h [new file with mode: 0644]
xkeymacsdll/Utils.cpp [new file with mode: 0644]
xkeymacsdll/Utils.h [new file with mode: 0644]
xkeymacsdll/res/xkeymacsdll.rc2 [new file with mode: 0644]
xkeymacsdll/resource.h [new file with mode: 0644]
xkeymacsdll/xkeymacsdll.cpp [new file with mode: 0644]
xkeymacsdll/xkeymacsdll.def [new file with mode: 0644]
xkeymacsdll/xkeymacsdll.dsp [new file with mode: 0644]
xkeymacsdll/xkeymacsdll.dsw [new file with mode: 0644]
xkeymacsdll/xkeymacsdll.h [new file with mode: 0644]
xkeymacsdll/xkeymacsdll.rc [new file with mode: 0644]

diff --git a/xkeymacs/104keyboard.cpp b/xkeymacs/104keyboard.cpp
new file mode 100644 (file)
index 0000000..2004953
--- /dev/null
@@ -0,0 +1,156 @@
+// 104Keyboard.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include <Lmcons.h>\r
+#include "xkeymacs.h"\r
+#include "104Keyboard.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// C104Keyboard dialog\r
+\r
+\r
+C104Keyboard::C104Keyboard(const HKEY_TYPE hkey_type, CWnd *const pParent /*=NULL*/)\r
+       : CDialog(C104Keyboard::IDD, pParent)\r
+{\r
+       //{{AFX_DATA_INIT(C104Keyboard)\r
+               // NOTE: the ClassWizard will add member initialization here\r
+       //}}AFX_DATA_INIT\r
+       m_HkeyType = hkey_type;\r
+}\r
+\r
+\r
+void C104Keyboard::DoDataExchange(CDataExchange *const pDX)\r
+{\r
+       CDialog::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(C104Keyboard)\r
+               // NOTE: the ClassWizard will add DDX and DDV calls here\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(C104Keyboard, CDialog)\r
+       //{{AFX_MSG_MAP(C104Keyboard)\r
+       ON_WM_DESTROY()\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// C104Keyboard message handlers\r
+\r
+BOOL C104Keyboard::OnInitDialog() \r
+{\r
+       CDialog::OnInitDialog();\r
+       \r
+       // TODO: Add extra initialization here\r
+       CString szWindowText;\r
+       CString szFor;\r
+       switch (m_HkeyType) {\r
+       case CURRENT_USER:\r
+               {\r
+                       TCHAR szUserName[UNLEN + 1] = {'0'};\r
+                       DWORD nSize = UNLEN + 1;\r
+                       if (GetUserName(szUserName, &nSize)) {\r
+                               szFor.Format(IDS_FOR, szUserName);\r
+                       } else {\r
+                               szFor.LoadString(IDS_FOR_LOGGED_ON_USER);\r
+                       }\r
+               }\r
+               break;\r
+       case LOCAL_MACHINE:\r
+               szFor.LoadString(IDS_FOR_ANY_USER);\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+       this->GetWindowText(szWindowText);\r
+       this->SetWindowText(szWindowText + szFor);\r
+\r
+       m_ToolTip.Create(this, TTS_ALWAYSTIP | TTS_NOPREFIX);\r
+       m_ToolTip.SetMaxTipWidth(0x100);        // Enable multiline\r
+\r
+       CProfile::LoadScanCodeMap(m_HkeyType);\r
+       for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
+               if (!GetDlgItem(KeyboardLayouts[i].nBaseControlID)\r
+                || !GetDlgItem(KeyboardLayouts[i].nCurrentControlID)) {\r
+                       continue;\r
+               }\r
+\r
+               KeyboardLayouts[i].pBaseKey = new CKey(KeyboardLayouts[i].nBaseControlID, NORMAL_KEY, m_HkeyType);\r
+               KeyboardLayouts[i].pBaseKey->SubclassDlgItem(KeyboardLayouts[i].nBaseControlID, this);\r
+               m_ToolTip.AddTool(GetDlgItem(KeyboardLayouts[i].nBaseControlID), CProfile::GetToolTipID(KeyboardLayouts[i].nToolTipID));\r
+\r
+               KeyboardLayouts[i].pCurrentKey = new CKey(KeyboardLayouts[i].nCurrentControlID, ORIGINAL_KEY, m_HkeyType);\r
+               KeyboardLayouts[i].pCurrentKey->SubclassDlgItem(KeyboardLayouts[i].nCurrentControlID, this);\r
+               m_ToolTip.AddTool(GetDlgItem(KeyboardLayouts[i].nCurrentControlID), CProfile::GetToolTipID(KeyboardLayouts[i].nToolTipID));\r
+\r
+               ScanCode_t current = {'\0'};\r
+               if (CProfile::GetScanCodeMap(m_HkeyType, KeyboardLayouts[i].scancode, &current)) {\r
+                       KeyboardLayouts[i].pCurrentKey->SetKeyType(REMAPPED_KEY);\r
+\r
+                       CString szWindowText;\r
+                       GetDlgItem(CProfile::GetBaseControlID(current))->GetWindowText(szWindowText);\r
+                       GetDlgItem(KeyboardLayouts[i].nCurrentControlID)->SetWindowText(szWindowText);\r
+\r
+                       KeyboardLayout_t *pKeyboardLayout = CProfile::GetKeyboardLayouts(CProfile::GetBaseControlID(current));\r
+                       if (pKeyboardLayout) {\r
+                               m_ToolTip.UpdateTipText(CProfile::GetToolTipID(pKeyboardLayout->nToolTipID), GetDlgItem(KeyboardLayouts[i].nCurrentControlID));\r
+                       }\r
+               }\r
+       }\r
+       \r
+       return TRUE;  // return TRUE unless you set the focus to a control\r
+                     // EXCEPTION: OCX Property Pages should return FALSE\r
+}\r
+\r
+void C104Keyboard::OnOK() \r
+{\r
+       // TODO: Add extra validation here\r
+       if (CProfile::LostKeyWarning(m_HkeyType) != IDCANCEL) {\r
+               CProfile::SaveScanCodeMap(m_HkeyType);\r
+\r
+               CDialog::OnOK();\r
+       }\r
+}\r
+\r
+void C104Keyboard::OnDestroy() \r
+{\r
+       CDialog::OnDestroy();\r
+\r
+       // TODO: Add your message handler code here\r
+       for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
+               if (!GetDlgItem(KeyboardLayouts[i].nBaseControlID)\r
+                || !GetDlgItem(KeyboardLayouts[i].nCurrentControlID)) {\r
+                       continue;\r
+               }\r
+\r
+               if (KeyboardLayouts[i].pBaseKey) {\r
+                       delete KeyboardLayouts[i].pBaseKey;\r
+                       KeyboardLayouts[i].pBaseKey = NULL;\r
+               }\r
+               if (KeyboardLayouts[i].pCurrentKey) {\r
+                       delete KeyboardLayouts[i].pCurrentKey;\r
+                       KeyboardLayouts[i].pCurrentKey = NULL;\r
+               }\r
+       }\r
+}\r
+\r
+BOOL C104Keyboard::PreTranslateMessage(MSG *const pMsg) \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       switch (pMsg->message) {\r
+       case WM_LBUTTONDOWN:\r
+       case WM_LBUTTONUP:\r
+       case WM_MOUSEMOVE:\r
+               m_ToolTip.RelayEvent(pMsg);\r
+               break;\r
+       }\r
+\r
+       return CDialog::PreTranslateMessage(pMsg);\r
+}\r
diff --git a/xkeymacs/104keyboard.h b/xkeymacs/104keyboard.h
new file mode 100644 (file)
index 0000000..5102c7f
--- /dev/null
@@ -0,0 +1,55 @@
+#if !defined(AFX_104KEYBOARD_H__0206A99F_158D_419A_A816_CC493DDDA16C__INCLUDED_)\r
+#define AFX_104KEYBOARD_H__0206A99F_158D_419A_A816_CC493DDDA16C__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#include "Key.h"\r
+\r
+// 104Keyboard.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// C104Keyboard dialog\r
+\r
+class C104Keyboard : public CDialog\r
+{\r
+// Construction\r
+public:\r
+       CToolTipCtrl m_ToolTip;\r
+       C104Keyboard(HKEY_TYPE hkey_type, CWnd* pParent = NULL);   // standard constructor\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(C104Keyboard)\r
+       enum { IDD = IDD_104KEYBOARD };\r
+               // NOTE: the ClassWizard will add data members here\r
+       //}}AFX_DATA\r
+\r
+\r
+// Overrides\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(C104Keyboard)\r
+       public:\r
+       virtual BOOL PreTranslateMessage(MSG* pMsg);\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+protected:\r
+       // Generated message map functions\r
+       //{{AFX_MSG(C104Keyboard)\r
+       virtual BOOL OnInitDialog();\r
+       virtual void OnOK();\r
+       afx_msg void OnDestroy();\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       HKEY_TYPE m_HkeyType;\r
+};\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_104KEYBOARD_H__0206A99F_158D_419A_A816_CC493DDDA16C__INCLUDED_)\r
diff --git a/xkeymacs/109keyboard.cpp b/xkeymacs/109keyboard.cpp
new file mode 100644 (file)
index 0000000..5e3d48b
--- /dev/null
@@ -0,0 +1,156 @@
+// 109Keyboard.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include <Lmcons.h>\r
+#include "xkeymacs.h"\r
+#include "109Keyboard.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// C109Keyboard dialog\r
+\r
+\r
+C109Keyboard::C109Keyboard(const HKEY_TYPE hkey_type, CWnd *const pParent /*=NULL*/)\r
+       : CDialog(C109Keyboard::IDD, pParent)\r
+{\r
+       //{{AFX_DATA_INIT(C109Keyboard)\r
+               // NOTE: the ClassWizard will add member initialization here\r
+       //}}AFX_DATA_INIT\r
+       m_HkeyType = hkey_type;\r
+}\r
+\r
+\r
+void C109Keyboard::DoDataExchange(CDataExchange *const pDX)\r
+{\r
+       CDialog::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(C109Keyboard)\r
+               // NOTE: the ClassWizard will add DDX and DDV calls here\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(C109Keyboard, CDialog)\r
+       //{{AFX_MSG_MAP(C109Keyboard)\r
+       ON_WM_DESTROY()\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// C109Keyboard message handlers\r
+\r
+BOOL C109Keyboard::OnInitDialog() \r
+{\r
+       CDialog::OnInitDialog();\r
+       \r
+       // TODO: Add extra initialization here\r
+       CString szWindowText;\r
+       CString szFor;\r
+       switch (m_HkeyType) {\r
+       case CURRENT_USER:\r
+               {\r
+                       TCHAR szUserName[UNLEN + 1] = {'0'};\r
+                       DWORD nSize = UNLEN + 1;\r
+                       if (GetUserName(szUserName, &nSize)) {\r
+                               szFor.Format(IDS_FOR, szUserName);\r
+                       } else {\r
+                               szFor.LoadString(IDS_FOR_LOGGED_ON_USER);\r
+                       }\r
+               }\r
+               break;\r
+       case LOCAL_MACHINE:\r
+               szFor.LoadString(IDS_FOR_ANY_USER);\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+       this->GetWindowText(szWindowText);\r
+       this->SetWindowText(szWindowText + szFor);\r
+\r
+       m_ToolTip.Create(this, TTS_ALWAYSTIP | TTS_NOPREFIX);\r
+       m_ToolTip.SetMaxTipWidth(0x100);        // Enable multiline\r
+\r
+       CProfile::LoadScanCodeMap(m_HkeyType);\r
+       for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
+               if (!GetDlgItem(KeyboardLayouts[i].nBaseControlID)\r
+                || !GetDlgItem(KeyboardLayouts[i].nCurrentControlID)) {\r
+                       continue;\r
+               }\r
+\r
+               KeyboardLayouts[i].pBaseKey = new CKey(KeyboardLayouts[i].nBaseControlID, NORMAL_KEY, m_HkeyType);\r
+               KeyboardLayouts[i].pBaseKey->SubclassDlgItem(KeyboardLayouts[i].nBaseControlID, this);\r
+               m_ToolTip.AddTool(GetDlgItem(KeyboardLayouts[i].nBaseControlID), CProfile::GetToolTipID(KeyboardLayouts[i].nToolTipID));\r
+\r
+               KeyboardLayouts[i].pCurrentKey = new CKey(KeyboardLayouts[i].nCurrentControlID, ORIGINAL_KEY, m_HkeyType);\r
+               KeyboardLayouts[i].pCurrentKey->SubclassDlgItem(KeyboardLayouts[i].nCurrentControlID, this);\r
+               m_ToolTip.AddTool(GetDlgItem(KeyboardLayouts[i].nCurrentControlID), CProfile::GetToolTipID(KeyboardLayouts[i].nToolTipID));\r
+\r
+               ScanCode_t current = {'\0'};\r
+               if (CProfile::GetScanCodeMap(m_HkeyType, KeyboardLayouts[i].scancode, &current)) {\r
+                       KeyboardLayouts[i].pCurrentKey->SetKeyType(REMAPPED_KEY);\r
+\r
+                       CString szWindowText;\r
+                       GetDlgItem(CProfile::GetBaseControlID(current))->GetWindowText(szWindowText);\r
+                       GetDlgItem(KeyboardLayouts[i].nCurrentControlID)->SetWindowText(szWindowText);\r
+\r
+                       KeyboardLayout_t *pKeyboardLayout = CProfile::GetKeyboardLayouts(CProfile::GetBaseControlID(current));\r
+                       if (pKeyboardLayout) {\r
+                               m_ToolTip.UpdateTipText(CProfile::GetToolTipID(pKeyboardLayout->nToolTipID), GetDlgItem(KeyboardLayouts[i].nCurrentControlID));\r
+                       }\r
+               }\r
+       }\r
+\r
+       return TRUE;  // return TRUE unless you set the focus to a control\r
+                     // EXCEPTION: OCX Property Pages should return FALSE\r
+}\r
+\r
+void C109Keyboard::OnOK() \r
+{\r
+       // TODO: Add extra validation here\r
+       if (CProfile::LostKeyWarning(m_HkeyType) != IDCANCEL) {\r
+               CProfile::SaveScanCodeMap(m_HkeyType);\r
+\r
+               CDialog::OnOK();\r
+       }\r
+}\r
+\r
+void C109Keyboard::OnDestroy() \r
+{\r
+       CDialog::OnDestroy();\r
+\r
+       // TODO: Add your message handler code here\r
+       for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
+               if (!GetDlgItem(KeyboardLayouts[i].nBaseControlID)\r
+                || !GetDlgItem(KeyboardLayouts[i].nCurrentControlID)) {\r
+                       continue;\r
+               }\r
+\r
+               if (KeyboardLayouts[i].pBaseKey) {\r
+                       delete KeyboardLayouts[i].pBaseKey;\r
+                       KeyboardLayouts[i].pBaseKey = NULL;\r
+               }\r
+               if (KeyboardLayouts[i].pCurrentKey) {\r
+                       delete KeyboardLayouts[i].pCurrentKey;\r
+                       KeyboardLayouts[i].pCurrentKey = NULL;\r
+               }\r
+       }\r
+}\r
+\r
+BOOL C109Keyboard::PreTranslateMessage(MSG *const pMsg) \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       switch (pMsg->message) {\r
+       case WM_LBUTTONDOWN:\r
+       case WM_LBUTTONUP:\r
+       case WM_MOUSEMOVE:\r
+               m_ToolTip.RelayEvent(pMsg);\r
+               break;\r
+       }\r
+\r
+       return CDialog::PreTranslateMessage(pMsg);\r
+}\r
diff --git a/xkeymacs/109keyboard.h b/xkeymacs/109keyboard.h
new file mode 100644 (file)
index 0000000..a79a8c2
--- /dev/null
@@ -0,0 +1,55 @@
+#if !defined(AFX_109KEYBOARD_H__269D3317_3B74_469E_8C53_49EE2D785965__INCLUDED_)\r
+#define AFX_109KEYBOARD_H__269D3317_3B74_469E_8C53_49EE2D785965__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#include "Key.h"\r
+\r
+// 109Keyboard.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// C109Keyboard dialog\r
+\r
+class C109Keyboard : public CDialog\r
+{\r
+// Construction\r
+public:\r
+       CToolTipCtrl m_ToolTip;\r
+       C109Keyboard(HKEY_TYPE hkey_type, CWnd* pParent = NULL);   // standard constructor\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(C109Keyboard)\r
+       enum { IDD = IDD_109KEYBOARD };\r
+               // NOTE: the ClassWizard will add data members here\r
+       //}}AFX_DATA\r
+\r
+\r
+// Overrides\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(C109Keyboard)\r
+       public:\r
+       virtual BOOL PreTranslateMessage(MSG* pMsg);\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+protected:\r
+       // Generated message map functions\r
+       //{{AFX_MSG(C109Keyboard)\r
+       virtual BOOL OnInitDialog();\r
+       virtual void OnOK();\r
+       afx_msg void OnDestroy();\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       HKEY_TYPE m_HkeyType;\r
+};\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_109KEYBOARD_H__269D3317_3B74_469E_8C53_49EE2D785965__INCLUDED_)\r
diff --git a/xkeymacs/dot.xkeymacs b/xkeymacs/dot.xkeymacs
new file mode 100644 (file)
index 0000000..d1f1059
--- /dev/null
@@ -0,0 +1,111 @@
+(fset 'sample-hello-world "Hello World!")\r
+(fset 'sample-isprint "_ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~_")\r
+(fset 'sample-forward-char-next-line "\C-f\C-n")\r
+(fset 'sample-foobar [?b ?a ?r home ?f ?o ?o ?\C-e])\r
+(fset 'sample-find "\Ctrl+F")\r
+(fset 'sample-desktop "\Win+D")\r
+(fset 'sample-mkdir [?\Alt+F ?w ?f])\r
+(fset 'sample-cycle-items [?\Alt+escape])\r
+(fset 'sample-cycle-items-inversely [?\Alt+S-escape])\r
+(fset 'sample-backward-kill-line "\C-0\C-k")\r
+(fset 'sample-calc [?\M-x ?c ?a ?l ?c return])\r
+(fset 'sample-notepad [?\M-x ?C ?: ?\\ ?W ?I ?N ?D ?O ?W ?S ?\\ ?s ?y ?s ?t ?e ?m ?3 ?2 ?\\ ?n ?o ?t ?e ?p ?a ?d return])\r
+\r
+; Supported Modifiers List\r
+;\r
+; C-\r
+; M-\r
+; S-\r
+; Ctrl+\r
+; Alt+\r
+; Win+\r
+\r
+; Supported Control Keys List\r
+;\r
+;(fset 'sample-break [break])\r
+;(fset 'sample-backspace [backspace])\r
+;(fset 'sample-tab [tab])\r
+;(fset 'sample-return [return])\r
+;(fset 'sample-capslock [capslock])\r
+;(fset 'sample-romaji [kana])\r
+;(fset 'sample-hiragana [kanji])\r
+;(fset 'sample-escape [escape])\r
+;(fset 'sample-convert [convert])\r
+;(fset 'sample-nonconvert [nonconvert])\r
+;(fset 'sample-space [? ])\r
+;(fset 'sample-pageup [prior])\r
+;(fset 'sample-pagedown [next])\r
+;(fset 'sample-end [end])\r
+;(fset 'sample-home [home])\r
+;(fset 'sample-left [left])\r
+;(fset 'sample-up [up])\r
+;(fset 'sample-right [right])\r
+;(fset 'sample-down [down])\r
+;(fset 'sample-select [select])\r
+;(fset 'sample-print [print])\r
+;(fset 'sample-execute [execute])\r
+;(fset 'sample-insert [insert])\r
+;(fset 'sample-delete [delete])\r
+;(fset 'sample-left-windows-key [lwindow])\r
+;(fset 'sample-right-windows-key [rwindow])\r
+;(fset 'sample-application-key [apps])\r
+;(fset 'sample-sleep [sleep])\r
+;(fset 'sample-kp-0 [kp-0])\r
+;(fset 'sample-kp-1 [kp-1])\r
+;(fset 'sample-kp-2 [kp-2])\r
+;(fset 'sample-kp-3 [kp-3])\r
+;(fset 'sample-kp-4 [kp-4])\r
+;(fset 'sample-kp-5 [kp-5])\r
+;(fset 'sample-kp-6 [kp-6])\r
+;(fset 'sample-kp-7 [kp-7])\r
+;(fset 'sample-kp-8 [kp-8])\r
+;(fset 'sample-kp-9 [kp-9])\r
+;(fset 'sample-kp-multiply [kp-multiply])\r
+;(fset 'sample-kp-add [kp-add])\r
+;(fset 'sample-kp-subtract [kp-subtract])\r
+;(fset 'sample-kp-decimal [kp-decimal])\r
+;(fset 'sample-kp-devide [kp-divide])\r
+;(fset 'sample-f1 [f1])\r
+;(fset 'sample-f2 [f2])\r
+;(fset 'sample-f3 [f3])\r
+;(fset 'sample-f4 [f4])\r
+;(fset 'sample-f5 [f5])\r
+;(fset 'sample-f6 [f6])\r
+;(fset 'sample-f7 [f7])\r
+;(fset 'sample-f8 [f8])\r
+;(fset 'sample-f9 [f9])\r
+;(fset 'sample-f10 [f10])\r
+;(fset 'sample-f11 [f11])\r
+;(fset 'sample-f12 [f12])\r
+;(fset 'sample-f13 [f13])\r
+;(fset 'sample-f14 [f14])\r
+;(fset 'sample-f15 [f15])\r
+;(fset 'sample-f16 [f16])\r
+;(fset 'sample-f17 [f17])\r
+;(fset 'sample-f18 [f18])\r
+;(fset 'sample-f19 [f19])\r
+;(fset 'sample-f20 [f20])\r
+;(fset 'sample-f21 [f21])\r
+;(fset 'sample-f22 [f22])\r
+;(fset 'sample-f23 [f23])\r
+;(fset 'sample-f24 [f24])\r
+;(fset 'sample-kp-numlock [kp-numlock])\r
+;(fset 'sample-scrolllock [scroll])\r
+;(fset 'sample-browser-back [browser-back])\r
+;(fset 'sample-browser-forward [browser-forward])\r
+;(fset 'sample-browser-refresh [browser-refresh])\r
+;(fset 'sample-browser-stop [browser-stop])\r
+;(fset 'sample-browser-search [browser-search])\r
+;(fset 'sample-browser-favorites [browser-favorites])\r
+;(fset 'sample-browser-home [browser-home])\r
+;(fset 'sample-volume-mute [volume-mute])\r
+;(fset 'sample-volume-down [volume-down])\r
+;(fset 'sample-volume-up [volume-up])\r
+;(fset 'sample-media-next-track [media-next-track])\r
+;(fset 'sample-media-prev-track [media-prev-track])\r
+;(fset 'sample-media-stop [media-stop])\r
+;(fset 'sample-media-play-pause [media-play-pause])\r
+;(fset 'sample-launch-mail [launch-mail])\r
+;(fset 'sample-launch-media-select [launch-media-select])\r
+;(fset 'sample-launch-1 [launch-1])\r
+;(fset 'sample-launch-2 [launch-2])\r
diff --git a/xkeymacs/dotxkeymacs.cpp b/xkeymacs/dotxkeymacs.cpp
new file mode 100644 (file)
index 0000000..547cd5a
--- /dev/null
@@ -0,0 +1,298 @@
+// DotXkeymacs.cpp: implementation of the CDotXkeymacs class.\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "stdafx.h"\r
+#include <direct.h>\r
+#include <Shlwapi.h>\r
+#include "xkeymacs.h"\r
+#include "DotXkeymacs.h"\r
+\r
+#ifdef _DEBUG\r
+#undef THIS_FILE\r
+static char THIS_FILE[]=__FILE__;\r
+#define new DEBUG_NEW\r
+#endif\r
+\r
+#pragma data_seg(".xkmcs")\r
+       CObList         CDotXkeymacs::m_oFunctionDefinition;\r
+       int                     CDotXkeymacs::m_nIndex[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
+       const TCHAR     CDotXkeymacs::m_szExt[] = _T("xkeymacs");\r
+#pragma data_seg()\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// Construction/Destruction\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CDotXkeymacs::CDotXkeymacs()\r
+{\r
+\r
+}\r
+\r
+CDotXkeymacs::~CDotXkeymacs()\r
+{\r
+\r
+}\r
+\r
+void CDotXkeymacs::Load(LPCTSTR lpszFileName)\r
+{\r
+       CStdioFile oDotXkeymacs;\r
+       if (oDotXkeymacs.Open(lpszFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeRead | CFile::shareDenyWrite | CFile::typeText)) {\r
+               CString szRead;\r
+               while (oDotXkeymacs.ReadString(szRead)) {\r
+                       if (IsFunctionDefinition(szRead)) {\r
+                               CFunctionDefinition *pFunctionDefinition = new CFunctionDefinition(GetSymbol(szRead), GetDefinition(szRead));\r
+\r
+                               // Delete a listed definition which has the same symbol as a new one.\r
+                               for (POSITION currentPos, pos = m_oFunctionDefinition.GetHeadPosition(); (currentPos = pos) != NULL; ) {\r
+                                       CFunctionDefinition *pCurrentDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetNext(pos);\r
+\r
+                                       if (pCurrentDefinition->GetSymbol() == pFunctionDefinition->GetSymbol()) {\r
+                                               CFunctionDefinition *pOverwritten = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(currentPos);\r
+                                               m_oFunctionDefinition.RemoveAt(currentPos);\r
+                                               delete pOverwritten;\r
+                                       }\r
+                               }\r
+\r
+                               m_oFunctionDefinition.AddTail((CObject *)pFunctionDefinition);\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+void CDotXkeymacs::LoadMainData(LPCTSTR lpszFileName)\r
+{\r
+       TCHAR szModuleFileName[MAX_PATH] = {'\0'};\r
+       TCHAR szDrive[_MAX_DRIVE] = {'\0'};\r
+       TCHAR szDir[_MAX_DIR] = {'\0'};\r
+\r
+       if (GetModuleFileName(NULL, szModuleFileName, sizeof(szModuleFileName))) {\r
+               _tsplitpath(szModuleFileName, szDrive, szDir, NULL, NULL);\r
+       }\r
+\r
+       TCHAR szOldPath[MAX_PATH] = {'\0'};     // This path is used by XKeymacs 3.22 and earlier\r
+       _tmakepath(szOldPath, szDrive, szDir, lpszFileName, m_szExt);\r
+\r
+       PathAppend(szDir, _T("etc"));\r
+       TCHAR szEtc[MAX_PATH] = {'\0'};\r
+       _tmakepath(szEtc, szDrive, szDir, NULL, NULL);\r
+       (void)_tmkdir(szEtc);   // make etc directory if needed\r
+\r
+       TCHAR szPath[MAX_PATH] = {'\0'};\r
+       _tmakepath(szPath, szDrive, szDir, lpszFileName, m_szExt);\r
+\r
+       if (_trename(szOldPath, szPath)) {                      // try to move old file as backup when rename returns an error because files exist in both directorys\r
+               TCHAR szBackupPath[MAX_PATH] = {'\0'};\r
+               TCHAR szBackupFlag[_MAX_FNAME] = _T("~");\r
+               _tmakepath(szBackupPath, szDrive, szDir, _tcscat(szBackupFlag, lpszFileName), m_szExt);\r
+               (void)_trename(szOldPath, szBackupPath);        // do nothing when a backup file has existed already\r
+       }\r
+\r
+       Load(szPath);\r
+}\r
+\r
+void CDotXkeymacs::LoadUserData(LPCTSTR lpszFileName)\r
+{\r
+       TCHAR szPath[MAX_PATH] = {'\0'};\r
+       if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_APPDATA, TRUE)) {\r
+               _tmakepath(szPath, NULL, szPath, lpszFileName, m_szExt);\r
+               Load(szPath);\r
+       }\r
+}\r
+\r
+void CDotXkeymacs::Load()\r
+{\r
+       static LPCTSTR szFileName = _T("dot");\r
+\r
+       ClearFunctionDefinition();\r
+       LoadMainData(GetLanguage());    // just for localization\r
+       LoadMainData(szFileName);\r
+       LoadUserData(szFileName);       // overwrite main data\r
+}\r
+\r
+BOOL CDotXkeymacs::IsFunctionDefinition(CString szFunctionDefinition)\r
+{\r
+       return !_tcsncmp(szFunctionDefinition, CString(MAKEINTRESOURCE(IDS_FSET)), _tcslen(CString(MAKEINTRESOURCE(IDS_FSET))));\r
+}\r
+\r
+CString CDotXkeymacs::GetSymbol(CString szFunctionDefinition)\r
+{\r
+       const int nFirst = _tcslen(CString(MAKEINTRESOURCE(IDS_FSET))) + _tcslen(_T("'"));\r
+       return szFunctionDefinition.Mid(nFirst, szFunctionDefinition.Find(_T(' '), nFirst) - nFirst);\r
+}\r
+\r
+CString CDotXkeymacs::GetDefinition(CString szFunctionDefinition)\r
+{\r
+       const int nFirst = szFunctionDefinition.Find(_T(' '), _tcslen(CString(MAKEINTRESOURCE(IDS_FSET)))) + _tcslen(_T("'"));\r
+       return szFunctionDefinition.Mid(nFirst, szFunctionDefinition.GetLength() - nFirst - _tcslen(_T(")")));\r
+}\r
+\r
+void CDotXkeymacs::ClearFunctionDefinition()\r
+{\r
+       while (!m_oFunctionDefinition.IsEmpty()) {\r
+               CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetHead();\r
+               delete pFunctionDefinition;\r
+               pFunctionDefinition = NULL;\r
+               m_oFunctionDefinition.RemoveHead();\r
+       }\r
+       memset(m_nIndex, -1, sizeof(m_nIndex));\r
+}\r
+\r
+int CDotXkeymacs::GetFunctionNumber()\r
+{\r
+       return m_oFunctionDefinition.GetCount();\r
+}\r
+\r
+CString CDotXkeymacs::GetFunctionSymbol(int nIndex)\r
+{\r
+       if (nIndex < 0 || m_oFunctionDefinition.GetCount() <= nIndex) {\r
+               return CString();\r
+       }\r
+\r
+       if (CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex))) {\r
+               return pFunctionDefinition->GetSymbol();\r
+       }\r
+       return CString();\r
+}\r
+\r
+CString CDotXkeymacs::GetFunctionDefinition(int nIndex)\r
+{\r
+       if (nIndex < 0 || m_oFunctionDefinition.GetCount() <= nIndex) {\r
+               return CString();\r
+       }\r
+\r
+       if (CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex))) {\r
+               return pFunctionDefinition->GetDefinition();\r
+       }\r
+       return CString();\r
+}\r
+\r
+CString CDotXkeymacs::GetFunctionDefinition(CString szSymbol)\r
+{\r
+       for (POSITION pos = m_oFunctionDefinition.GetHeadPosition(); pos;) {\r
+               CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetNext(pos);\r
+               if (!pFunctionDefinition->GetSymbol().Compare(szSymbol)) {\r
+                       return pFunctionDefinition->GetDefinition();\r
+               }\r
+       }\r
+\r
+       return CString(_T("Undefined Command"));\r
+}\r
+\r
+void CDotXkeymacs::ClearKey(int nIndex, int nApplicationID)\r
+{\r
+       if (nIndex < 0 || m_oFunctionDefinition.GetCount() <= nIndex) {\r
+               return;\r
+       }\r
+\r
+       if (CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex))) {\r
+               pFunctionDefinition->ClearKey(nApplicationID);\r
+       }\r
+\r
+       for (int nCommandType = 0; nCommandType < MAX_COMMAND_TYPE; ++nCommandType) {\r
+               for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
+                       if (m_nIndex[nApplicationID][nCommandType][nKey] == nIndex) {\r
+                               m_nIndex[nApplicationID][nCommandType][nKey] = -1;\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+void CDotXkeymacs::SetKey(int nIndex, int nApplicationID, int nCommandType, int nKey)\r
+{\r
+       if (nIndex < 0 || m_oFunctionDefinition.GetCount() <= nIndex) {\r
+               return;\r
+       }\r
+\r
+       if (CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex))) {\r
+               pFunctionDefinition->SetKey(nApplicationID, nCommandType, nKey);\r
+               m_nIndex[nApplicationID][nCommandType][nKey] = nIndex;\r
+       }\r
+}\r
+\r
+int CDotXkeymacs::GetIndex(CString szSymbol)\r
+{\r
+       int nIndex = 0;\r
+       for (nIndex = 0; nIndex < m_oFunctionDefinition.GetCount(); ++nIndex) {\r
+               CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex));\r
+               if (!pFunctionDefinition->GetSymbol().Compare(szSymbol)) {\r
+                       return nIndex;\r
+               }\r
+       }\r
+       return -1;\r
+}\r
+\r
+int CDotXkeymacs::GetKeyNumber(int nIndex, int nApplicationID)\r
+{\r
+       if (nIndex < 0 || m_oFunctionDefinition.GetCount() <= nIndex) {\r
+               return 0;\r
+       }\r
+\r
+       CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex));\r
+       return pFunctionDefinition->GetKeyNumber(nApplicationID);\r
+}\r
+\r
+void CDotXkeymacs::GetKey(int nIndex, int nApplicationID, int nKeyID, int *pCommandType, int *pKey)\r
+{\r
+       if (nIndex < 0 || m_oFunctionDefinition.GetCount() <= nIndex) {\r
+               return;\r
+       }\r
+\r
+       CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex));\r
+       pFunctionDefinition->GetKey(nApplicationID, nKeyID, pCommandType, pKey);\r
+}\r
+\r
+int CDotXkeymacs::GetIndex(int nApplicationID, int nCommandType, int nKey)\r
+{\r
+       return m_nIndex[nApplicationID][nCommandType][nKey];\r
+}\r
+\r
+void CDotXkeymacs::RemoveKey(const int nIndex, const int nApplicationID, const int nCommandType, const int nKey)\r
+{\r
+       if (nIndex < 0 || m_oFunctionDefinition.GetCount() <= nIndex) {\r
+               return;\r
+       }\r
+\r
+       CFunctionDefinition *pFunctionDefinition = (CFunctionDefinition *)m_oFunctionDefinition.GetAt(m_oFunctionDefinition.FindIndex(nIndex));\r
+       if (pFunctionDefinition) {\r
+               pFunctionDefinition->RemoveKey(nApplicationID, nCommandType, nKey);\r
+       }\r
+}\r
+\r
+void CDotXkeymacs::RemoveKey(const int nApplicationID, const int nCommandType, const int nKey)\r
+{\r
+       for (int nIndex = 0; nIndex < m_oFunctionDefinition.GetCount(); ++nIndex) {\r
+               RemoveKey(nIndex, nApplicationID, nCommandType, nKey);\r
+       }\r
+}\r
+\r
+LPCTSTR CDotXkeymacs::GetLanguage()\r
+{\r
+       LPCTSTR szLanguage = _T("unknown");\r
+\r
+       TCHAR lptstrFilename[MAX_PATH] = {'\0'};\r
+       _tmakepath(lptstrFilename, NULL, _tgetenv(_T("windir")), _T("explorer"), _T("exe"));\r
+       DWORD dwLen = GetFileVersionInfoSize(lptstrFilename, NULL);\r
+\r
+       if (dwLen) {\r
+               LPVOID lpData = malloc(dwLen);\r
+\r
+               if (lpData && GetFileVersionInfo(lptstrFilename, NULL, dwLen, lpData)) {\r
+                       Translate_t *lpTranslate;\r
+                       UINT cbTranslate = 0;\r
+\r
+                       if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslate, &cbTranslate) && sizeof(Translate_t) <= cbTranslate) {\r
+                               for (int i = 0; i < sizeof(Languages)/sizeof(Languages[0]); ++i) {\r
+                                       if (Languages[i].wLanguage == lpTranslate->wLanguage) {\r
+                                               szLanguage = Languages[i].szLanguage;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               free(lpData);\r
+       }\r
+\r
+       return szLanguage;\r
+}\r
diff --git a/xkeymacs/dotxkeymacs.h b/xkeymacs/dotxkeymacs.h
new file mode 100644 (file)
index 0000000..d5559cc
--- /dev/null
@@ -0,0 +1,231 @@
+// DotXkeymacs.h: interface for the CDotXkeymacs class.\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_DOTXKEYMACS_H__0538C427_5733_47DA_B2C6_2E957EEFC59D__INCLUDED_)\r
+#define AFX_DOTXKEYMACS_H__0538C427_5733_47DA_B2C6_2E957EEFC59D__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+typedef struct Language\r
+{\r
+       WORD wLanguage;\r
+       LPCTSTR szLanguage;\r
+} Language_t;\r
+\r
+static const Language_t Languages[] = {\r
+       { 0x0001, _T("Arabic") },\r
+       { 0x0004, _T("Chinese") },\r
+       { 0x0009, _T("English") },\r
+       { 0x0401, _T("Arabic (Saudi Arabia)") },\r
+       { 0x0402, _T("Bulgarian") },\r
+       { 0x0403, _T("Catalan") },\r
+       { 0x0404, _T("Chinese (Taiwan)") },\r
+       { 0x0405, _T("Czech") },\r
+       { 0x0406, _T("Danish") },\r
+       { 0x0407, _T("German (Germany)") },\r
+       { 0x0408, _T("Greek") },\r
+       { 0x0409, _T("English (United States)") },\r
+       { 0x040A, _T("Spanish (Traditional Sort)") },\r
+       { 0x040B, _T("Finnish") },\r
+       { 0x040C, _T("French (France)") },\r
+       { 0x040D, _T("Hebrew") },\r
+       { 0x040E, _T("Hungarian") },\r
+       { 0x040F, _T("Icelandic") },\r
+       { 0x0410, _T("Italian (Italy)") },\r
+       { 0x0411, _T("Japanese") },\r
+       { 0x0412, _T("Korean") },\r
+       { 0x0413, _T("Dutch (Netherlands)") },\r
+       { 0x0414, _T("Norwegian (Bokmal)") },\r
+       { 0x0415, _T("Polish") },\r
+       { 0x0416, _T("Portuguese (Brazil)") },\r
+       { 0x0417, _T("Rhaeto-Romanic") },\r
+       { 0x0418, _T("Romanian") },\r
+       { 0x0419, _T("Russian") },\r
+       { 0x041A, _T("Croatian") },\r
+       { 0x041B, _T("Slovak") },\r
+       { 0x041C, _T("Albanian") },\r
+       { 0x041D, _T("Swedish") },\r
+       { 0x041E, _T("Thai") },\r
+       { 0x041F, _T("Turkish") },\r
+       { 0x0420, _T("Urdu") },\r
+       { 0x0421, _T("Indonesian") },\r
+       { 0x0422, _T("Ukrainian") },\r
+       { 0x0423, _T("Belarusian") },\r
+       { 0x0424, _T("Slovenian") },\r
+       { 0x0425, _T("Estonian") },\r
+       { 0x0426, _T("Latvian") },\r
+       { 0x0427, _T("Lithuanian") },\r
+       { 0x0428, _T("Tajik") },\r
+       { 0x0429, _T("Farsi") },\r
+       { 0x042A, _T("Vietnamese") },\r
+       { 0x042B, _T("Armenian") },\r
+       { 0x042C, _T("Azeri (Latin)") },\r
+       { 0x042D, _T("Basque") },\r
+       { 0x042E, _T("Sorbian") },\r
+       { 0x042F, _T("Macedonian (FYROM)") },\r
+       { 0x0430, _T("Sutu") },\r
+       { 0x0431, _T("Tsonga") },\r
+       { 0x0432, _T("Tswana") },\r
+       { 0x0434, _T("Xhosa") },\r
+       { 0x0435, _T("Zulu") },\r
+       { 0x0436, _T("Afrikaans") },\r
+       { 0x0437, _T("Georgian") },\r
+       { 0x0438, _T("Faeroese") },\r
+       { 0x0439, _T("Hindi") },\r
+       { 0x043A, _T("Maltese") },\r
+       { 0x043C, _T("Gaelic") },\r
+       { 0x043D, _T("Yiddish") },\r
+       { 0x043E, _T("Malay (Malaysia)") },\r
+       { 0x043F, _T("Kazakh") },\r
+       { 0x0440, _T("Kyrgyz") },\r
+       { 0x0441, _T("Swahili") },\r
+       { 0x0442, _T("Turkmen") },\r
+       { 0x0443, _T("Uzbek (Latin)") },\r
+       { 0x0444, _T("Tatar") },\r
+       { 0x0445, _T("Bengali") },\r
+       { 0x0446, _T("Punjabi") },\r
+       { 0x0447, _T("Gujarati") },\r
+       { 0x0448, _T("Oriya") },\r
+       { 0x0449, _T("Tamil") },\r
+       { 0x044A, _T("Telugu") },\r
+       { 0x044B, _T("Kannada") },\r
+       { 0x044C, _T("Malayalam") },\r
+       { 0x044D, _T("Assamese") },\r
+       { 0x044E, _T("Marathi") },\r
+       { 0x044F, _T("Sanskrit") },\r
+       { 0x0450, _T("Mongolian") },\r
+       { 0x0456, _T("Galician") },\r
+       { 0x0457, _T("Konkani") },\r
+       { 0x0458, _T("Manipuri") },\r
+       { 0x0459, _T("Sindhi") },\r
+       { 0x045A, _T("Syriac") },\r
+       { 0x045B, _T("Sinhalese") },\r
+       { 0x045C, _T("Cherokee") },\r
+       { 0x045D, _T("Inuktitut") },\r
+       { 0x045E, _T("Amharic") },\r
+       { 0x045F, _T("Tamazight (Berber/Arabic)") },\r
+       { 0x0460, _T("Kashmiri (Arabic)") },\r
+       { 0x0461, _T("Nepali") },\r
+       { 0x0462, _T("Frisian") },\r
+       { 0x0463, _T("Pashto") },\r
+       { 0x0464, _T("Filipino") },\r
+       { 0x0465, _T("Dhivehi") },\r
+       { 0x0466, _T("Edo") },\r
+       { 0x0467, _T("Fulfulde") },\r
+       { 0x0468, _T("Hausa") },\r
+       { 0x0469, _T("Ibibio") },\r
+       { 0x046A, _T("Yoruba") },\r
+       { 0x0470, _T("Igbo") },\r
+       { 0x0471, _T("Kanuri") },\r
+       { 0x0472, _T("Oromo") },\r
+       { 0x0473, _T("Tigrigna (Ethiopia)") },\r
+       { 0x0475, _T("Hawaiian") },\r
+       { 0x0476, _T("Latin") },\r
+       { 0x0477, _T("Somali") },\r
+       { 0x0478, _T("Yi") },\r
+       { 0x0801, _T("Arabic (Iraq)") },\r
+       { 0x0804, _T("Chinese (PRC)") },\r
+       { 0x0807, _T("German (Switzerland)") },\r
+       { 0x0809, _T("English (United Kingdom)") },\r
+       { 0x080A, _T("Spanish (Mexico)") },\r
+       { 0x080C, _T("French (Belgium)") },\r
+       { 0x0810, _T("Italian (Switzerland)") },\r
+       { 0x0813, _T("Dutch (Belgium)") },\r
+       { 0x0814, _T("Norwegian (Nynorsk)") },\r
+       { 0x0816, _T("Portuguese (Portugal)") },\r
+       { 0x0818, _T("Romanian (Moldova)") },\r
+       { 0x0819, _T("Russian (Moldova)") },\r
+       { 0x081A, _T("Serbian (Latin)") },\r
+       { 0x081D, _T("Swedish (Finland)") },\r
+       { 0x082C, _T("Azeri (Cyrillic)") },\r
+       { 0x0843, _T("Uzbek (Cyrillic)") },\r
+       { 0x085F, _T("Tamazight (Latin)") },\r
+       { 0x0873, _T("Tigrigna (Eritrea)") },\r
+       { 0x0C01, _T("Arabic (Egypt)") },\r
+       { 0x0C04, _T("Chinese (Hong Kong SAR)") },\r
+       { 0x0C07, _T("German (Austria)") },\r
+       { 0x0C09, _T("English (Australia)") },\r
+       { 0x0C0A, _T("Spanish (International Sort)") },\r
+       { 0x0C0C, _T("French (Canada)") },\r
+       { 0x0C1A, _T("Serbian (Cyrillic)") },\r
+       { 0x1001, _T("Arabic (Libya)") },\r
+       { 0x1004, _T("Chinese (Singapore)") },\r
+       { 0x1007, _T("German (Luxembourg)") },\r
+       { 0x1009, _T("English (Canada)") },\r
+       { 0x100A, _T("Spanish (Guatemala)") },\r
+       { 0x100C, _T("French (Switzerland)") },\r
+       { 0x1401, _T("Arabic (Algeria)") },\r
+       { 0x1407, _T("German (Liechtenstein)") },\r
+       { 0x1409, _T("English (New Zealand)") },\r
+       { 0x140A, _T("Spanish (Costa Rica)") },\r
+       { 0x140C, _T("French (Luxembourg)") },\r
+       { 0x1801, _T("Arabic (Morocco)") },\r
+       { 0x1809, _T("English (Ireland)") },\r
+       { 0x180A, _T("Spanish (Panama)") },\r
+       { 0x1C01, _T("Arabic (Tunisia)") },\r
+       { 0x1C09, _T("English (South Africa)") },\r
+       { 0x1C0A, _T("Spanish (Dominican Republic)") },\r
+       { 0x2001, _T("Arabic (Oman)") },\r
+       { 0x2009, _T("English (Jamaica)") },\r
+       { 0x200A, _T("Spanish (Venezuela)") },\r
+       { 0x2401, _T("Arabic (Yemen)") },\r
+       { 0x240A, _T("Spanish (Colombia)") },\r
+       { 0x2801, _T("Arabic (Syria)") },\r
+       { 0x2809, _T("English (Belize)") },\r
+       { 0x280A, _T("Spanish (Peru)") },\r
+       { 0x2C01, _T("Arabic (Jordan)") },\r
+       { 0x2C09, _T("English (Trinidad)") },\r
+       { 0x2C0A, _T("Spanish (Argentina)") },\r
+       { 0x3001, _T("Arabic (Lebanon)") },\r
+       { 0x300A, _T("Spanish (Ecuador)") },\r
+       { 0x3401, _T("Arabic (Kuwait)") },\r
+       { 0x340A, _T("Spanish (Chile)") },\r
+       { 0x3801, _T("Arabic (U.A.E.)") },\r
+       { 0x380A, _T("Spanish (Uruguay)") },\r
+       { 0x3C01, _T("Arabic (Bahrain)") },\r
+       { 0x3C0A, _T("Spanish (Paraguay)") },\r
+       { 0x4001, _T("Arabic (Qatar)") },\r
+       { 0x400A, _T("Spanish (Bolivia)") },\r
+       { 0x440A, _T("Spanish (El Salvador)") },\r
+       { 0x480A, _T("Spanish (Honduras)") },\r
+       { 0x4C0A, _T("Spanish (Nicaragua)") },\r
+       { 0x500A, _T("Spanish (Puerto Rico)") },\r
+};\r
+       \r
+class CDotXkeymacs  \r
+{\r
+public:\r
+       static void RemoveKey(const int nApplicationID, const int nCommandType, const int nKey);\r
+       static void RemoveKey(const int nIndex, const int nApplicationID, const int nCommandType, const int nKey);\r
+       static CString GetFunctionDefinition(int nIndex);\r
+       static int GetIndex(int nApplicationID, int nCommandType, int nKey);\r
+       static void GetKey(int nIndex, int nApplicationID, int nKeyID, int *pCommandType, int *pKey);\r
+       static int GetKeyNumber(int nIndex, int nApplicationID);\r
+       static int GetIndex(CString szSymbol);\r
+       static void SetKey(int nIndex, int nApplicationID, int nCommandType, int nKey);\r
+       static void ClearKey(int nIndex, int nApplicationID);\r
+       static CString GetFunctionDefinition(CString szSymbol);\r
+       static CString GetFunctionSymbol(int nIndex);\r
+       static int GetFunctionNumber();\r
+       static void Load();\r
+       CDotXkeymacs();\r
+       virtual ~CDotXkeymacs();\r
+\r
+private:\r
+       static LPCTSTR GetLanguage();\r
+       static const TCHAR m_szExt[];\r
+       static int m_nIndex[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY];\r
+       static void ClearFunctionDefinition();\r
+       static CString GetDefinition(CString szFunctionDefinition);\r
+       static CString GetSymbol(CString szFunctionDefinition);\r
+       static BOOL IsFunctionDefinition(CString szFunctionDefinition);\r
+       static CObList m_oFunctionDefinition;\r
+       static void LoadUserData(LPCTSTR lpszFileName);\r
+       static void LoadMainData(LPCTSTR lpszFileName);\r
+       static void Load(LPCTSTR lpszFileName);\r
+};\r
+\r
+#endif // !defined(AFX_DOTXKEYMACS_H__0538C427_5733_47DA_B2C6_2E957EEFC59D__INCLUDED_)\r
diff --git a/xkeymacs/key.cpp b/xkeymacs/key.cpp
new file mode 100644 (file)
index 0000000..3df9698
--- /dev/null
@@ -0,0 +1,306 @@
+// Key.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "Key.h"\r
+#include "Profile.h"\r
+#include "104Keyboard.h"\r
+#include "109Keyboard.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CKey\r
+\r
+CKey::CKey(const int nKey, const int nKeyType, const HKEY_TYPE hkeyType)\r
+{\r
+       m_nKey = nKey;\r
+       m_nKeyType = nKeyType;\r
+       m_nDroppableKey = 0;\r
+       m_nDroppableKeyType = NORMAL_KEY;\r
+       m_HkeyType = hkeyType;\r
+}\r
+\r
+CKey::~CKey()\r
+{\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CKey, CButton)\r
+       //{{AFX_MSG_MAP(CKey)\r
+       ON_WM_LBUTTONDOWN()\r
+       ON_WM_LBUTTONUP()\r
+       ON_WM_MOUSEMOVE()\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CKey message handlers\r
+\r
+\r
+\r
+void CKey::DrawItem(const LPDRAWITEMSTRUCT lpDrawItemStruct) \r
+{\r
+       // TODO: Add your code to draw the specified item\r
+       static const COLORREF BLACK = RGB(0, 0, 0);\r
+       static const COLORREF RED = RGB(255, 0, 0);\r
+       static const COLORREF BLUE = RGB(0, 0, 255);\r
+\r
+       COLORREF textcolor = BLACK;\r
+       UINT nEdge = EDGE_RAISED;\r
+       CRect textrect;\r
+       textrect.CopyRect(&lpDrawItemStruct->rcItem);\r
+\r
+       switch (m_nKeyType) {\r
+       case NORMAL_KEY:\r
+               nEdge = EDGE_RAISED;\r
+               textcolor = BLACK;\r
+               break;\r
+       case PUSHED_KEY:\r
+               nEdge = EDGE_SUNKEN;\r
+               textcolor = BLACK;\r
+               textrect.OffsetRect(1, 1);\r
+               break;\r
+       case DROPPABLE_KEY:\r
+               nEdge = EDGE_SUNKEN;\r
+               textcolor = BLUE;\r
+               textrect.OffsetRect(1, 1);\r
+               break;\r
+       case ORIGINAL_KEY:\r
+               nEdge = EDGE_ETCHED;\r
+               textcolor = BLACK;\r
+               break;\r
+       case REMAPPED_KEY:\r
+               nEdge = EDGE_RAISED;\r
+               textcolor = RED;\r
+               break;\r
+       case REMAPPED_PUSHED_KEY:\r
+               nEdge = EDGE_SUNKEN;\r
+               textcolor = RED;\r
+               textrect.OffsetRect(1, 1);\r
+               break;\r
+       default:\r
+               ASSERT(0);\r
+               break;\r
+       }\r
+\r
+       CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);\r
+       CRect buttonrect;\r
+       buttonrect.CopyRect(&lpDrawItemStruct->rcItem);\r
+\r
+       pDC->DrawEdge(buttonrect, nEdge, BF_RECT);\r
+       pDC->SetTextColor(textcolor);\r
+\r
+       CString szWindowText;\r
+       GetWindowText(szWindowText);\r
+\r
+       if (textcolor == RED) { // FW_BOLD\r
+               LOGFONT logfont;\r
+               GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(logfont), &logfont);\r
+               logfont.lfWeight = FW_BOLD;\r
+\r
+               CFont font;\r
+               font.CreateFontIndirect(&logfont);\r
+\r
+               pDC->SelectObject(&font);\r
+               pDC->DrawText(szWindowText, textrect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);\r
+               pDC->SelectStockObject(DEFAULT_GUI_FONT);\r
+       } else { // FW_NORMAL\r
+               pDC->DrawText(szWindowText, textrect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);\r
+       }\r
+}\r
+\r
+void CKey::SetKeyType(const int nKeyType)\r
+{\r
+       if (m_nKeyType != nKeyType) {\r
+               m_nKeyType = nKeyType;\r
+               RedrawWindow();\r
+       }\r
+}\r
+\r
+int CKey::GetKeyType()\r
+{\r
+       return m_nKeyType;\r
+}\r
+\r
+void CKey::OnLButtonDown(const UINT nFlags, const CPoint point) \r
+{\r
+       // TODO: Add your message handler code here and/or call default\r
+       switch (m_nKeyType) {\r
+       case NORMAL_KEY:\r
+               SetKeyType(PUSHED_KEY);\r
+               CProfile::SetDraggingCursor();\r
+               break;\r
+       case REMAPPED_KEY:\r
+               SetKeyType(REMAPPED_PUSHED_KEY);\r
+               break;\r
+       }\r
+\r
+       CButton::OnLButtonDown(nFlags, point);\r
+}\r
+\r
+void CKey::OnLButtonUp(const UINT nFlags, const CPoint point) \r
+{\r
+       // TODO: Add your message handler code here and/or call default\r
+       if (m_nKeyType == PUSHED_KEY) {\r
+               SetKeyType(NORMAL_KEY);\r
+       }\r
+\r
+       if (m_nKeyType == REMAPPED_PUSHED_KEY) {\r
+               if (m_nKey == GetPointedKey(point)) {\r
+                       KeyboardLayout_t *pKeyboardLayout = CProfile::GetKeyboardLayouts(m_nKey);\r
+                       if (pKeyboardLayout) {\r
+                               CString szWindowText;\r
+                               GetParent()->GetDlgItem(pKeyboardLayout->nBaseControlID)->GetWindowText(szWindowText);\r
+                               SetWindowText(szWindowText);\r
+\r
+                               if (CProfile::Is106Keyboard()) {\r
+                                       ((C109Keyboard*)GetParent())->m_ToolTip.UpdateTipText(CProfile::GetToolTipID(pKeyboardLayout->nToolTipID), this);\r
+                               } else {\r
+                                       ((C104Keyboard*)GetParent())->m_ToolTip.UpdateTipText(CProfile::GetToolTipID(pKeyboardLayout->nToolTipID), this);\r
+                               }\r
+\r
+                               ScanCodeMapping_t ScanCodeMapping = {{0, 0}, {pKeyboardLayout->scancode.nScanCode, pKeyboardLayout->scancode.nPrefixedScanCode}};\r
+                               CProfile::SetScanCodeMap(m_HkeyType, ScanCodeMapping);\r
+                       }\r
+                       SetKeyType(ORIGINAL_KEY);\r
+               } else {\r
+                       SetKeyType(REMAPPED_KEY);\r
+               }\r
+       }\r
+\r
+       int nPointedKey = GetPointedKey(point);\r
+       if (m_nDroppableKey && nPointedKey) {\r
+               if (m_nDroppableKey != nPointedKey) {\r
+                       ((CKey*)GetParent()->GetDlgItem(m_nDroppableKey))->SetKeyType(m_nDroppableKeyType);\r
+                       if (IsDroppableKey(nPointedKey)) {\r
+                               m_nDroppableKey = nPointedKey;\r
+                       } else {\r
+                               m_nDroppableKey = 0;\r
+                       }\r
+               }\r
+\r
+               if (m_nDroppableKey) {\r
+                       KeyboardLayout_t *pKeyboardLayout = CProfile::GetKeyboardLayouts(m_nDroppableKey);\r
+                       KeyboardLayout_t *pBaseKeyboardLayout = CProfile::GetKeyboardLayouts(m_nKey);\r
+                       if (pKeyboardLayout && pBaseKeyboardLayout) {\r
+                               CString szWindowText;\r
+                               GetWindowText(szWindowText);\r
+                               GetParent()->GetDlgItem(pKeyboardLayout->nCurrentControlID)->SetWindowText(szWindowText);\r
+\r
+                               if (CProfile::Is106Keyboard()) {\r
+                                       ((C109Keyboard*)GetParent())->m_ToolTip.UpdateTipText(CProfile::GetToolTipID(pBaseKeyboardLayout->nToolTipID), GetParent()->GetDlgItem(pKeyboardLayout->nCurrentControlID));\r
+                               } else {\r
+                                       ((C104Keyboard*)GetParent())->m_ToolTip.UpdateTipText(CProfile::GetToolTipID(pBaseKeyboardLayout->nToolTipID), GetParent()->GetDlgItem(pKeyboardLayout->nCurrentControlID));\r
+                               }\r
+\r
+                               ((CKey*)GetParent()->GetDlgItem(pKeyboardLayout->nBaseControlID))->SetKeyType(NORMAL_KEY);\r
+                               ((CKey*)GetParent()->GetDlgItem(pKeyboardLayout->nCurrentControlID))->SetKeyType(REMAPPED_KEY);\r
+\r
+                               ScanCodeMapping_t ScanCodeMapping = {{pBaseKeyboardLayout->scancode.nScanCode, pBaseKeyboardLayout->scancode.nPrefixedScanCode}, \r
+                                                                                                        {pKeyboardLayout->scancode.nScanCode, pKeyboardLayout->scancode.nPrefixedScanCode}};\r
+                               CProfile::SetScanCodeMap(m_HkeyType, ScanCodeMapping);\r
+                       }\r
+               }\r
+       }\r
+\r
+       m_nDroppableKey = 0;\r
+       m_nDroppableKeyType = NORMAL_KEY;\r
+\r
+       CProfile::SetNormalCursor();\r
+\r
+       CButton::OnLButtonUp(nFlags, point);\r
+}\r
+\r
+int CKey::GetPointedKey(const CPoint point)\r
+{\r
+       for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
+               if (!GetParent()->GetDlgItem(KeyboardLayouts[i].nBaseControlID)\r
+                || !GetParent()->GetDlgItem(KeyboardLayouts[i].nCurrentControlID)) {\r
+                       continue;\r
+               }\r
+\r
+               CRect rButton;\r
+               GetParent()->GetDlgItem(KeyboardLayouts[i].nBaseControlID)->GetWindowRect(&rButton);\r
+               ScreenToClient(&rButton);\r
+               if (rButton.PtInRect(point)) {\r
+                       return KeyboardLayouts[i].nBaseControlID;\r
+               }\r
+               GetParent()->GetDlgItem(KeyboardLayouts[i].nCurrentControlID)->GetWindowRect(&rButton);\r
+               ScreenToClient(&rButton);\r
+               if (rButton.PtInRect(point)) {\r
+                       return KeyboardLayouts[i].nCurrentControlID;\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+void CKey::OnMouseMove(const UINT nFlags, const CPoint point) \r
+{\r
+       // TODO: Add your message handler code here and/or call default\r
+       if (nFlags & MK_LBUTTON) {\r
+               if (m_nKeyType == PUSHED_KEY) {\r
+                       int nPointedKey = GetPointedKey(point);\r
+                       if (nPointedKey) {\r
+                               if (nPointedKey != m_nDroppableKey) {\r
+                                       if (m_nDroppableKey) {\r
+                                               ((CKey*)GetParent()->GetDlgItem(m_nDroppableKey))->SetKeyType(m_nDroppableKeyType);\r
+                                               CProfile::SetNoCursor();\r
+                                       }\r
+                                       if (IsDroppableKey(nPointedKey)) {\r
+                                               m_nDroppableKey = nPointedKey;\r
+                                               m_nDroppableKeyType = ((CKey*)GetParent()->GetDlgItem(m_nDroppableKey))->GetKeyType();\r
+                                               ((CKey*)GetParent()->GetDlgItem(m_nDroppableKey))->SetKeyType(DROPPABLE_KEY);\r
+                                               CProfile::SetDraggingCursor();\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               if (m_nDroppableKey) {\r
+                                       ((CKey*)GetParent()->GetDlgItem(m_nDroppableKey))->SetKeyType(m_nDroppableKeyType);\r
+                                       m_nDroppableKey = 0;\r
+                                       m_nDroppableKeyType = NORMAL_KEY;\r
+                                       CProfile::SetNoCursor();\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (m_nKeyType == REMAPPED_PUSHED_KEY) {\r
+                       if (m_nKey != GetPointedKey(point)) {\r
+                               SetKeyType(REMAPPED_KEY);\r
+                       }\r
+               }\r
+               if (m_nKeyType == REMAPPED_KEY) {\r
+                       if (m_nKey == GetPointedKey(point)) {\r
+                               SetKeyType(REMAPPED_PUSHED_KEY);\r
+                       }\r
+               }\r
+       }\r
+       \r
+       CButton::OnMouseMove(nFlags, point);\r
+}\r
+\r
+BOOL CKey::IsDroppableKey(const int nKey)\r
+{\r
+       if (m_nKeyType != PUSHED_KEY\r
+        || !nKey) {\r
+               return FALSE;\r
+       }\r
+\r
+       for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
+               if (KeyboardLayouts[i].nBaseControlID != m_nKey) {\r
+                       continue;\r
+               }\r
+\r
+               if (KeyboardLayouts[i].nBaseControlID == nKey\r
+                || KeyboardLayouts[i].nCurrentControlID == nKey) {\r
+                       return FALSE;\r
+               }\r
+               return TRUE;\r
+       }\r
+       return FALSE;\r
+}\r
diff --git a/xkeymacs/key.h b/xkeymacs/key.h
new file mode 100644 (file)
index 0000000..af86c2a
--- /dev/null
@@ -0,0 +1,63 @@
+#if !defined(AFX_KEY_H__509440FD_B54D_4C17_AAA1_C394820F4FB6__INCLUDED_)\r
+#define AFX_KEY_H__509440FD_B54D_4C17_AAA1_C394820F4FB6__INCLUDED_\r
+\r
+#include "Profile.h"   // Added by ClassView\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+// Key.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CKey window\r
+\r
+class CKey : public CButton\r
+{\r
+// Construction\r
+public:\r
+       CKey(int nKey = 0, int nKeyType = NORMAL_KEY, HKEY_TYPE hkeyType = CURRENT_USER);\r
+\r
+// Attributes\r
+public:\r
+\r
+// Operations\r
+public:\r
+\r
+// Overrides\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(CKey)\r
+       public:\r
+       virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+public:\r
+       int GetKeyType();\r
+       void SetKeyType(int nKeyType);\r
+       virtual ~CKey();\r
+\r
+       // Generated message map functions\r
+protected:\r
+       //{{AFX_MSG(CKey)\r
+       afx_msg void OnLButtonDown(UINT nFlags, CPoint point);\r
+       afx_msg void OnLButtonUp(UINT nFlags, CPoint point);\r
+       afx_msg void OnMouseMove(UINT nFlags, CPoint point);\r
+       //}}AFX_MSG\r
+\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       BOOL IsDroppableKey(int nKey);\r
+       int m_nDroppableKeyType;\r
+       int m_nDroppableKey;\r
+       int m_nKey;\r
+       int GetPointedKey(CPoint point);\r
+       int m_nKeyType;\r
+       HKEY_TYPE m_HkeyType;\r
+};\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_KEY_H__509440FD_B54D_4C17_AAA1_C394820F4FB6__INCLUDED_)\r
diff --git a/xkeymacs/mainfrm.cpp b/xkeymacs/mainfrm.cpp
new file mode 100644 (file)
index 0000000..4ab3300
--- /dev/null
@@ -0,0 +1,497 @@
+// MainFrm.cpp : implementation of the CMainFrame class\r
+//\r
+\r
+#include "stdafx.h"\r
+#include <Lmcons.h>\r
+#include "xkeymacs.h"\r
+#include "Profile.h"\r
+\r
+#include "MainFrm.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+#define WM_USER_NTFYICON (WM_USER+100)\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CMainFrame\r
+\r
+IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)\r
+\r
+BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)\r
+       //{{AFX_MSG_MAP(CMainFrame)\r
+       ON_WM_CREATE()\r
+       ON_COMMAND(IDC_ABOUT, OnAbout)\r
+       ON_COMMAND(IDC_QUIT, OnQuit)\r
+       ON_COMMAND(IDC_DISABLE, OnDisable)\r
+       ON_COMMAND(IDC_PROPERTIES, OnProperties)\r
+       ON_COMMAND(IDC_OPTIONS, OnOptions)\r
+       ON_COMMAND(IDC_KEYBOARD, OnKeyboard)\r
+       ON_COMMAND(IDC_IMPORT, OnImport)\r
+       ON_COMMAND(IDC_EXPORT, OnExport)\r
+       ON_COMMAND(IDC_RESET, OnReset)\r
+       ON_COMMAND(ID_HELP_FINDER, OnHelpFinder)\r
+       ON_COMMAND(IDC_KEYBOARD_ANY_USER, OnKeyboardAnyUser)\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CMainFrame construction/destruction\r
+\r
+CMainFrame::CMainFrame()\r
+{\r
+       // TODO: add member initialization code here\r
+\r
+       m_pXkeymacsDll                  = new CXkeymacsDll;\r
+       m_pPropertiesDlg                = new CProperties;\r
+       m_nResultPropertiesDlg  = -1;\r
+       m_bPropertiesDlgExist   = FALSE;\r
+       m_pAboutDlg                             = new CAboutDlg;\r
+       m_nResultAboutDlg               = -1;\r
+       m_bAboutDlgExist                = FALSE;\r
+       m_pOptionsDlg                   = new COptionsDlg;\r
+       m_nResultOptionsDlg             = -1;\r
+       m_bOptionsDlgExist              = FALSE;\r
+       memset(m_p104KeyboardDlg, 0, sizeof(m_p104KeyboardDlg));\r
+       memset(m_p109KeyboardDlg, 0, sizeof(m_p109KeyboardDlg));\r
+       for (int i = 0; i < MAX_HKEY_TYPE; ++i) {\r
+               m_p104KeyboardDlg[i] = new C104Keyboard((HKEY_TYPE) i);\r
+               m_p109KeyboardDlg[i] = new C109Keyboard((HKEY_TYPE) i);\r
+       }\r
+       memset(m_nResultKeyboardDlg, -1, sizeof(m_nResultKeyboardDlg));\r
+       memset(m_bKeyboardDlgExist, 0, sizeof(m_bKeyboardDlgExist));\r
+\r
+       // register window class\r
+       WNDCLASS        stWndClass;\r
+       CString szClassName(MAKEINTRESOURCE(AFX_IDS_APP_TITLE));\r
+\r
+       stWndClass.style                        = CS_BYTEALIGNWINDOW;\r
+       stWndClass.lpfnWndProc          = &AfxWndProc;\r
+       stWndClass.cbClsExtra           = 0;\r
+       stWndClass.cbWndExtra           = 0;\r
+       stWndClass.hInstance            = AfxGetInstanceHandle();\r
+       stWndClass.hIcon                        = NULL;\r
+       stWndClass.hCursor                      = NULL;\r
+       stWndClass.hbrBackground        = (HBRUSH)COLOR_BACKGROUND;\r
+       stWndClass.lpszMenuName         = NULL;\r
+       stWndClass.lpszClassName        = szClassName;\r
+\r
+       AfxRegisterClass(&stWndClass);\r
+\r
+       // make window\r
+       CRect   rect(0, 0, 100, 100);\r
+\r
+       Create(szClassName, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)), WS_OVERLAPPEDWINDOW | WS_MINIMIZE, rect);\r
+}\r
+\r
+CMainFrame::~CMainFrame()\r
+{\r
+       delete m_pXkeymacsDll;\r
+       m_pXkeymacsDll = NULL;\r
+\r
+       delete m_pPropertiesDlg;\r
+       m_pPropertiesDlg = NULL;\r
+\r
+       delete m_pAboutDlg;\r
+       m_pAboutDlg = NULL;\r
+\r
+       delete m_pOptionsDlg;\r
+       m_pOptionsDlg = NULL;\r
+\r
+       for (int i = 0; i < MAX_HKEY_TYPE; ++i) {\r
+               delete m_p104KeyboardDlg[i];\r
+               m_p104KeyboardDlg[i] = NULL;\r
+\r
+               delete m_p109KeyboardDlg[i];\r
+               m_p109KeyboardDlg[i] = NULL;\r
+       }\r
+}\r
+\r
+int CMainFrame::OnCreate(const LPCREATESTRUCT lpCreateStruct)\r
+{\r
+       if (CFrameWnd::OnCreate(lpCreateStruct) == -1) {\r
+               return -1;\r
+       }\r
+\r
+       CXkeymacsData::Set106Keyboard(CProfile::Is106Keyboard());\r
+\r
+       // init notify icon data\r
+       NOTIFYICONDATA notifyIconData[MAX_ICON_TYPE] = {\r
+               { sizeof(NOTIFYICONDATA), m_hWnd, MAIN_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
+                 (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_SHARED) },\r
+               { sizeof(NOTIFYICONDATA), m_hWnd, CX_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
+                 AfxGetApp()->LoadIcon(IDI_CX_OFF) },\r
+               { sizeof(NOTIFYICONDATA), m_hWnd, MX_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
+                 AfxGetApp()->LoadIcon(IDI_MX_OFF) },\r
+               { sizeof(NOTIFYICONDATA), m_hWnd, META_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
+                 AfxGetApp()->LoadIcon(IDI_META_OFF) },\r
+               { sizeof(NOTIFYICONDATA), m_hWnd, SHIFT_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
+                 AfxGetApp()->LoadIcon(IDI_SHIFT_OFF) },\r
+               { sizeof(NOTIFYICONDATA), m_hWnd, CTRL_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
+                 AfxGetApp()->LoadIcon(IDI_CTRL_OFF) },\r
+               { sizeof(NOTIFYICONDATA), m_hWnd, ALT_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
+                 AfxGetApp()->LoadIcon(IDI_ALT_OFF) },\r
+       };\r
+       LoadString(AfxGetInstanceHandle(), AFX_IDS_APP_TITLE, notifyIconData[MAIN_ICON].szTip,\r
+                          sizeof(notifyIconData[MAIN_ICON].szTip));\r
+       LoadString(AfxGetInstanceHandle(), IDS_TIP_CX, notifyIconData[CX_ICON].szTip,\r
+                          sizeof(notifyIconData[CX_ICON].szTip));\r
+       LoadString(AfxGetInstanceHandle(), IDS_TIP_MX, notifyIconData[MX_ICON].szTip,\r
+                          sizeof(notifyIconData[MX_ICON].szTip));\r
+       LoadString(AfxGetInstanceHandle(), IDS_TIP_META, notifyIconData[META_ICON].szTip,\r
+                          sizeof(notifyIconData[META_ICON].szTip));\r
+       LoadString(AfxGetInstanceHandle(), IDS_TIP_SHIFT, notifyIconData[SHIFT_ICON].szTip,\r
+                          sizeof(notifyIconData[SHIFT_ICON].szTip));\r
+       LoadString(AfxGetInstanceHandle(), IDS_TIP_CTRL, notifyIconData[CTRL_ICON].szTip,\r
+                          sizeof(notifyIconData[CTRL_ICON].szTip));\r
+       LoadString(AfxGetInstanceHandle(), IDS_TIP_ALT, notifyIconData[ALT_ICON].szTip,\r
+                          sizeof(notifyIconData[ALT_ICON].szTip));\r
+\r
+       // set notify icon data\r
+       m_pXkeymacsDll->SetNotifyIconData(MAIN_ICON, notifyIconData[MAIN_ICON],\r
+               (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_SHARED),\r
+               (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAIN_DISABLE_TMP), IMAGE_ICON, 16, 16, LR_SHARED),\r
+               (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAIN_DISABLE_WOCQ), IMAGE_ICON, 16, 16, LR_SHARED),              // disable without C-q\r
+               (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAIN_DISABLE), IMAGE_ICON, 16, 16, LR_SHARED),\r
+               AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_MAIN)), 1));\r
+\r
+       // set notify ^X icon data\r
+       m_pXkeymacsDll->SetNotifyIconData(CX_ICON, notifyIconData[CX_ICON], AfxGetApp()->LoadIcon(IDI_CX_ON),\r
+                                                                         AfxGetApp()->LoadIcon(IDI_CX_OFF),\r
+                                                                         AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CX)), 0));\r
+\r
+       // set notify M-x icon data\r
+       m_pXkeymacsDll->SetNotifyIconData(MX_ICON, notifyIconData[MX_ICON], AfxGetApp()->LoadIcon(IDI_MX_ON),\r
+                                                                         AfxGetApp()->LoadIcon(IDI_MX_OFF),\r
+                                                                         AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_MX)), 0));\r
+\r
+       // set notify Meta icon data\r
+       m_pXkeymacsDll->SetNotifyIconData(META_ICON, notifyIconData[META_ICON], AfxGetApp()->LoadIcon(IDI_META_ON),\r
+                                                                         AfxGetApp()->LoadIcon(IDI_META_OFF),\r
+                                                                         AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_META)), 0));\r
+\r
+       // set notify Shift icon data\r
+       m_pXkeymacsDll->SetNotifyIconData(SHIFT_ICON, notifyIconData[SHIFT_ICON], AfxGetApp()->LoadIcon(IDI_SHIFT_ON),\r
+                                                                         AfxGetApp()->LoadIcon(IDI_SHIFT_OFF),\r
+                                                                         AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_SHIFT)), 0));\r
+\r
+       // set notify Ctrl icon data\r
+       m_pXkeymacsDll->SetNotifyIconData(CTRL_ICON, notifyIconData[CTRL_ICON], AfxGetApp()->LoadIcon(IDI_CTRL_ON),\r
+                                                                         AfxGetApp()->LoadIcon(IDI_CTRL_OFF),\r
+                                                                         AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CTRL)), 0));\r
+\r
+       // set notify Alt icon data\r
+       m_pXkeymacsDll->SetNotifyIconData(ALT_ICON, notifyIconData[ALT_ICON], AfxGetApp()->LoadIcon(IDI_ALT_ON),\r
+                                                                         AfxGetApp()->LoadIcon(IDI_ALT_OFF),\r
+                                                                         AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ALT)), 0));\r
+\r
+       m_pXkeymacsDll->SetKeyboardSpeed(CProfile::GetKeyboardSpeed());\r
+       m_pXkeymacsDll->SetAccelerate(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ACCELERATE)), 1));\r
+\r
+       m_pXkeymacsDll->SetCursorData((HCURSOR)::LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
+                                                                 (HCURSOR)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_DISABLE_TMP_CURSOR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
+                                                                 (HCURSOR)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_DISABLE_WOCQ_CURSOR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
+                                                                 (HCURSOR)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_DISABLE_CURSOR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
+                                                                 AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CHANGE_CURSOR)), 0));\r
+\r
+       m_pXkeymacsDll->SetKeyboardHook();\r
+\r
+       return 0;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CMainFrame diagnostics\r
+\r
+#ifdef _DEBUG\r
+void CMainFrame::AssertValid() const\r
+{\r
+       CFrameWnd::AssertValid();\r
+}\r
+\r
+void CMainFrame::Dump(CDumpContext& dc) const\r
+{\r
+       CFrameWnd::Dump(dc);\r
+}\r
+\r
+#endif //_DEBUG\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CMainFrame message handlers\r
+\r
+void CMainFrame::SetForegroundTheDialog(CDialog *const pDialog)\r
+{\r
+       if (pDialog) {\r
+               pDialog->SetForegroundWindow();\r
+       }\r
+}\r
+\r
+void CMainFrame::SetForegroundSomeDialog()\r
+{\r
+       CDialog *pDialog = NULL;\r
+\r
+       if (m_bPropertiesDlgExist) {\r
+               pDialog = m_pPropertiesDlg;\r
+       } else if (m_bOptionsDlgExist) {\r
+               pDialog = m_pOptionsDlg;\r
+       } else if (m_bKeyboardDlgExist[ENGLISH_KEYBOARD][CURRENT_USER]) {\r
+               pDialog = m_p104KeyboardDlg[CURRENT_USER];\r
+       } else if (m_bKeyboardDlgExist[ENGLISH_KEYBOARD][LOCAL_MACHINE]) {\r
+               pDialog = m_p104KeyboardDlg[LOCAL_MACHINE];\r
+       } else if (m_bKeyboardDlgExist[JAPANESE_KEYBOARD][CURRENT_USER]) {\r
+               pDialog = m_p109KeyboardDlg[CURRENT_USER];\r
+       } else if (m_bKeyboardDlgExist[JAPANESE_KEYBOARD][LOCAL_MACHINE]) {\r
+               pDialog = m_p109KeyboardDlg[LOCAL_MACHINE];\r
+       } else if (m_bAboutDlgExist) {\r
+               pDialog = m_pAboutDlg;\r
+       } else {\r
+               EnableWindow(FALSE);\r
+               return;\r
+       }\r
+\r
+       SetForegroundTheDialog(pDialog);\r
+       return;\r
+}\r
+\r
+void CMainFrame::PopUpDialog(CDialog *const pDialog, int *const pnResultDialog, BOOL *const pbDialogExist)\r
+{\r
+       if (pDialog                     == NULL\r
+        || pnResultDialog      == NULL\r
+        || pbDialogExist       == NULL) {\r
+               return;\r
+       }\r
+\r
+       if (!*pbDialogExist) {\r
+               *pbDialogExist = TRUE;\r
+               *pnResultDialog = pDialog->DoModal();\r
+               *pbDialogExist = FALSE;\r
+               *pnResultDialog = -1;\r
+\r
+               SetForegroundSomeDialog();\r
+       } else {\r
+               SetForegroundTheDialog(pDialog);\r
+       }\r
+}\r
+\r
+void CMainFrame::PopUpPropertiesDialog()\r
+{\r
+       PopUpDialog(m_pPropertiesDlg, &m_nResultPropertiesDlg, &m_bPropertiesDlgExist);\r
+}\r
+\r
+// show right menu on icon in system tray\r
+void CMainFrame::ShowRightMenu(const ICON_TYPE icon)\r
+{\r
+       CMenu rightMenu;\r
+       rightMenu.LoadMenu(IDR_RIGHT_MENU);\r
+\r
+       CMenu *popUp = rightMenu.GetSubMenu(0);\r
+\r
+       if (icon == MAIN_ICON) {\r
+               popUp->SetDefaultItem(IDC_PROPERTIES);\r
+\r
+               CString szDisable(MAKEINTRESOURCE(IDS_ENABLE));\r
+               if (m_pXkeymacsDll->IsKeyboardHook()) {\r
+                       szDisable.LoadString(IDS_DISABLE);\r
+               }\r
+               szDisable += _T("\tCtrl+Q");\r
+               popUp->ModifyMenu(IDC_DISABLE, MF_STRING, IDC_DISABLE, szDisable);\r
+\r
+               TCHAR szUserName[UNLEN + 1] = {'0'};\r
+               DWORD nSize = UNLEN + 1;\r
+               if (GetUserName(szUserName, &nSize)) {\r
+                       CString szFor;\r
+                       szFor.Format(IDS_KEYBOARD, szUserName);\r
+                       popUp->ModifyMenu(IDC_KEYBOARD, MF_STRING, IDC_KEYBOARD, szFor);\r
+               }\r
+\r
+               if (CProfile::Is9x()) {\r
+                       popUp->DeleteMenu(IDC_KEYBOARD, MF_BYCOMMAND);\r
+                       popUp->DeleteMenu(IDC_KEYBOARD_ANY_USER, MF_BYCOMMAND);\r
+               } else if (CProfile::IsVistaOrLater()) {\r
+                       popUp->DeleteMenu(IDC_KEYBOARD_ANY_USER, MF_BYCOMMAND);\r
+               }\r
+       } else {\r
+               popUp->SetDefaultItem(IDC_OPTIONS);\r
+\r
+               popUp->DeleteMenu(IDC_PROPERTIES, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(IDC_IMPORT, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(IDC_EXPORT, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(IDC_KEYBOARD, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(IDC_KEYBOARD_ANY_USER, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(IDC_DISABLE, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(IDC_RESET, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(IDC_QUIT, MF_BYCOMMAND);\r
+               popUp->DeleteMenu(0, MF_BYPOSITION);    // Delete separator\r
+               popUp->DeleteMenu(1, MF_BYPOSITION);    // Delete separator\r
+               popUp->DeleteMenu(2, MF_BYPOSITION);    // Delete popup menu of Keyboard Layout\r
+       }\r
+\r
+       SetForegroundWindow();\r
+\r
+       CPoint pt;\r
+       GetCursorPos(&pt);\r
+       popUp->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);\r
+}\r
+\r
+// get message of icon on system tray\r
+LRESULT CMainFrame::WindowProc(const UINT message, const WPARAM wParam, const LPARAM lParam) \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       static UINT s_uTaskbarRestart;\r
+\r
+       switch (message) {\r
+       case WM_CREATE:\r
+               s_uTaskbarRestart = RegisterWindowMessage(_T("TaskbarCreated"));\r
+               break;\r
+       case WM_USER_NTFYICON:\r
+               switch (lParam) {\r
+               case WM_LBUTTONUP:\r
+                       SetForegroundSomeDialog();\r
+                       break;\r
+               case WM_LBUTTONDBLCLK:\r
+                       if (wParam == MAIN_ICON) {\r
+                               PopUpPropertiesDialog();\r
+                       } else {\r
+                               PopUpOptionsDialog();\r
+                       }\r
+                       break;\r
+               case WM_RBUTTONUP:\r
+                       ShowRightMenu((ICON_TYPE)wParam);\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
+       default:\r
+               if (message == s_uTaskbarRestart) {\r
+                       m_pXkeymacsDll->AddAllShell_NotifyIcon();\r
+               }\r
+               break;\r
+       }\r
+       \r
+       return CFrameWnd::WindowProc(message, wParam, lParam);\r
+}\r
+\r
+void CMainFrame::OnProperties()\r
+{\r
+       PopUpPropertiesDialog();\r
+}\r
+\r
+void CMainFrame::PopUpOptionsDialog()\r
+{\r
+       PopUpDialog(m_pOptionsDlg, &m_nResultOptionsDlg, &m_bOptionsDlgExist);\r
+}\r
+\r
+void CMainFrame::OnOptions() \r
+{\r
+       // TODO: Add your command handler code here\r
+       PopUpOptionsDialog();\r
+}\r
+\r
+// stop/start keyboard hook\r
+void CMainFrame::OnDisable() \r
+{\r
+       // TODO: Add your command handler code here\r
+       if (m_pXkeymacsDll->IsKeyboardHook()) {\r
+               m_pXkeymacsDll->SetKeyboardHookFlag(FALSE);\r
+       } else {\r
+               m_pXkeymacsDll->SetKeyboardHookFlag(TRUE);\r
+       }\r
+}\r
+\r
+// Close the Dialog if it is opened.\r
+void CMainFrame::CloseDialog(CDialog *const pDialog, int *const pnResult)\r
+{\r
+       if (*pnResult != -1) {\r
+               pDialog->EndDialog(*pnResult);\r
+               *pnResult = -1;\r
+       }\r
+}\r
+\r
+void CMainFrame::OnQuit() \r
+{\r
+       // TODO: Add your command handler code here\r
+       CloseDialog(m_pAboutDlg, &m_nResultAboutDlg);\r
+       CloseDialog(m_pPropertiesDlg, &m_nResultPropertiesDlg);\r
+       CloseDialog(m_pOptionsDlg, &m_nResultOptionsDlg);\r
+       for (int i = 0; i < MAX_HKEY_TYPE; ++i) {\r
+               CloseDialog(m_p104KeyboardDlg[i], &m_nResultKeyboardDlg[ENGLISH_KEYBOARD][i]);\r
+               CloseDialog(m_p109KeyboardDlg[i], &m_nResultKeyboardDlg[JAPANESE_KEYBOARD][i]);\r
+       }\r
+\r
+       m_pXkeymacsDll->ReleaseKeyboardHook();\r
+       m_pXkeymacsDll->DeleteAllShell_NotifyIcon();\r
+\r
+       PostQuitMessage(0);\r
+}\r
+\r
+void CMainFrame::PopUpAboutDialog()\r
+{\r
+       PopUpDialog(m_pAboutDlg, &m_nResultAboutDlg, &m_bAboutDlgExist);\r
+}\r
+\r
+void CMainFrame::OnAbout() \r
+{\r
+       // TODO: Add your command handler code here\r
+       PopUpAboutDialog();\r
+}\r
+\r
+void CMainFrame::OnKeyboard() \r
+{\r
+       // TODO: Add your command handler code here\r
+       PopUpKeyboardDialog(CURRENT_USER);\r
+}\r
+\r
+void CMainFrame::OnKeyboardAnyUser() \r
+{\r
+       // TODO: Add your command handler code here\r
+       PopUpKeyboardDialog(LOCAL_MACHINE);\r
+}\r
+\r
+void CMainFrame::PopUpKeyboardDialog(const HKEY_TYPE hkeyType)\r
+{\r
+       if (CProfile::Is106Keyboard()) {\r
+               PopUpDialog(m_p109KeyboardDlg[hkeyType], &m_nResultKeyboardDlg[JAPANESE_KEYBOARD][hkeyType], &m_bKeyboardDlgExist[JAPANESE_KEYBOARD][hkeyType]);\r
+       } else {\r
+               PopUpDialog(m_p104KeyboardDlg[hkeyType], &m_nResultKeyboardDlg[ENGLISH_KEYBOARD][hkeyType], &m_bKeyboardDlgExist[ENGLISH_KEYBOARD][hkeyType]);\r
+       }\r
+}\r
+\r
+void CMainFrame::OnImport() \r
+{\r
+       // TODO: Add your command handler code here\r
+       CProfile::ImportProperties();\r
+       CProfile::InitDllData();\r
+}\r
+\r
+void CMainFrame::OnExport() \r
+{\r
+       // TODO: Add your command handler code here\r
+       CProfile::ExportProperties();\r
+}\r
+\r
+void CMainFrame::OnReset() \r
+{\r
+       // TODO: Add your command handler code here\r
+       m_pXkeymacsDll->ReleaseKeyboardHook();\r
+       m_pXkeymacsDll->SetKeyboardHook();\r
+}\r
+\r
+void CMainFrame::OnHelpFinder() \r
+{\r
+       // TODO: Add your command handler code here\r
+       TCHAR szPath[MAX_PATH] = {'\0'};\r
+       const TCHAR szExt[] = _T("txt");\r
+       _tmakepath(szPath, NULL, NULL, CString(MAKEINTRESOURCE(IDS_README)), szExt);\r
+\r
+       TCHAR szModuleFileName[MAX_PATH] = {'\0'};\r
+       if (GetModuleFileName(NULL, szModuleFileName, sizeof(szModuleFileName))) {\r
+               TCHAR szDrive[_MAX_DRIVE] = {'\0'};\r
+               TCHAR szDir[_MAX_DIR] = {'\0'};\r
+               _tsplitpath(szModuleFileName, szDrive, szDir, NULL, NULL);\r
+               _tmakepath(szPath, szDrive, szDir, CString(MAKEINTRESOURCE(IDS_README)), szExt);\r
+       }\r
+\r
+       ShellExecute(NULL, NULL, szPath, NULL, NULL, SW_SHOWNORMAL);\r
+}\r
diff --git a/xkeymacs/mainfrm.h b/xkeymacs/mainfrm.h
new file mode 100644 (file)
index 0000000..ad9673d
--- /dev/null
@@ -0,0 +1,99 @@
+// MainFrm.h : interface of the CMainFrame class\r
+//\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_MAINFRM_H__CF58719A_1B31_4BC0_8E55_06E0AE5BED2E__INCLUDED_)\r
+#define AFX_MAINFRM_H__CF58719A_1B31_4BC0_8E55_06E0AE5BED2E__INCLUDED_\r
+\r
+#include "OptionsDlg.h"        // Added by ClassView\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#include "104Keyboard.h"\r
+#include "109Keyboard.h"\r
+#include "Properties.h"\r
+\r
+enum KEYBOARD_TYPE { UNKNOWN_KEYBOARD, ENGLISH_KEYBOARD, JAPANESE_KEYBOARD, MAX_KEYBOARD_TYPE };\r
+\r
+class CMainFrame : public CFrameWnd\r
+{\r
+       \r
+protected: // create from serialization only\r
+public:\r
+       CMainFrame();\r
+protected:\r
+       DECLARE_DYNCREATE(CMainFrame)\r
+\r
+// Attributes\r
+public:\r
+\r
+// Operations\r
+public:\r
+\r
+// Overrides\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(CMainFrame)\r
+       public:\r
+       protected:\r
+       virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+public:\r
+       virtual ~CMainFrame();\r
+#ifdef _DEBUG\r
+       virtual void AssertValid() const;\r
+       virtual void Dump(CDumpContext& dc) const;\r
+#endif\r
+\r
+// Generated message map functions\r
+protected:\r
+       //{{AFX_MSG(CMainFrame)\r
+       afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);\r
+       afx_msg void OnAbout();\r
+       afx_msg void OnQuit();\r
+       afx_msg void OnDisable();\r
+       afx_msg void OnProperties();\r
+       afx_msg void OnOptions();\r
+       afx_msg void OnKeyboard();\r
+       afx_msg void OnImport();\r
+       afx_msg void OnExport();\r
+       afx_msg void OnReset();\r
+       afx_msg void OnHelpFinder();\r
+       afx_msg void OnKeyboardAnyUser();\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       BOOL m_bKeyboardDlgExist[MAX_KEYBOARD_TYPE][MAX_HKEY_TYPE];\r
+       int m_nResultKeyboardDlg[MAX_KEYBOARD_TYPE][MAX_HKEY_TYPE];\r
+       C109Keyboard *m_p109KeyboardDlg[MAX_HKEY_TYPE];\r
+       C104Keyboard *m_p104KeyboardDlg[MAX_HKEY_TYPE];\r
+       void PopUpKeyboardDialog(HKEY_TYPE hkeyType);\r
+       void SetForegroundTheDialog(CDialog *pDialog);\r
+       void CloseDialog(CDialog *pDialog, int *pnResult);\r
+       void SetForegroundSomeDialog();\r
+       void PopUpOptionsDialog();\r
+       void PopUpDialog(CDialog *pDialog, int *pnDialogExist, BOOL *pbDialogExist);\r
+       void PopUpAboutDialog();\r
+       void PopUpPropertiesDialog();\r
+       void ShowRightMenu(ICON_TYPE icon);\r
+       BOOL m_bPropertiesDlgExist;\r
+       BOOL m_bOptionsDlgExist;\r
+       BOOL m_bAboutDlgExist;\r
+       COptionsDlg *m_pOptionsDlg;\r
+       int m_nResultOptionsDlg;\r
+       CAboutDlg *m_pAboutDlg;\r
+       int     m_nResultAboutDlg;\r
+       int m_nResultPropertiesDlg;\r
+public:\r
+       CProperties *m_pPropertiesDlg;\r
+       CXkeymacsDll *m_pXkeymacsDll;\r
+};\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_MAINFRM_H__CF58719A_1B31_4BC0_8E55_06E0AE5BED2E__INCLUDED_)\r
diff --git a/xkeymacs/mx_off.ico b/xkeymacs/mx_off.ico
new file mode 100644 (file)
index 0000000..73daa9f
Binary files /dev/null and b/xkeymacs/mx_off.ico differ
diff --git a/xkeymacs/mx_on.ico b/xkeymacs/mx_on.ico
new file mode 100644 (file)
index 0000000..c67e7cf
Binary files /dev/null and b/xkeymacs/mx_on.ico differ
diff --git a/xkeymacs/optionsdlg.cpp b/xkeymacs/optionsdlg.cpp
new file mode 100644 (file)
index 0000000..18eef9f
--- /dev/null
@@ -0,0 +1,181 @@
+// OptionsDlg.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "OptionsDlg.h"\r
+#include "MainFrm.h"\r
+#include "Profile.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// COptionsDlg dialog\r
+\r
+\r
+COptionsDlg::COptionsDlg(CWnd *pParent /*=NULL*/)\r
+       : CDialog(COptionsDlg::IDD, pParent)\r
+{\r
+       //{{AFX_DATA_INIT(COptionsDlg)\r
+       //}}AFX_DATA_INIT\r
+}\r
+\r
+COptionsDlg::~COptionsDlg()\r
+{\r
+}\r
+\r
+void COptionsDlg::DoDataExchange(CDataExchange *pDX)\r
+{\r
+       CDialog::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(COptionsDlg)\r
+       DDX_Control(pDX, IDC_M_X, m_cMx);\r
+       DDX_Control(pDX, IDC_M_, m_cM_);\r
+       DDX_Control(pDX, IDC_ALT, m_cAlt);\r
+       DDX_Control(pDX, IDC_SHIFT, m_cShift);\r
+       DDX_Control(pDX, IDC_CTRL, m_cCtrl);\r
+       DDX_Control(pDX, IDC_C_X_, m_cCx);\r
+       DDX_Control(pDX, IDC_FILE_COMPLETION, m_cFileCompletion);\r
+       DDX_Control(pDX, IDC_AUTO_RUN, m_cAutoRun);\r
+       DDX_Control(pDX, IDOK, m_cOK);\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(COptionsDlg, CDialog)\r
+       //{{AFX_MSG_MAP(COptionsDlg)\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// COptionsDlg message handlers\r
+\r
+BOOL COptionsDlg::OnInitDialog() \r
+{\r
+       CDialog::OnInitDialog();\r
+       \r
+       // TODO: Add extra initialization here\r
+       // clear all check\r
+       m_cAutoRun.SetCheck(0);\r
+       m_cCx.SetCheck(0);\r
+       m_cMx.SetCheck(0);\r
+       m_cM_.SetCheck(0);\r
+       m_cShift.SetCheck(0);\r
+       m_cCtrl.SetCheck(0);\r
+       m_cAlt.SetCheck(0);\r
+\r
+       // for auto run\r
+       {\r
+               TCHAR szFileName[MAX_PATH] = {'\0'};\r
+               GetModuleFileName(NULL, szFileName, sizeof(szFileName));\r
+               HKEY hKey = NULL;\r
+\r
+               if (RegOpenKeyEx(HKEY_CURRENT_USER,  CString(MAKEINTRESOURCE(IDS_REGSUBKEY_AUTORUN)), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS\r
+                || RegOpenKeyEx(HKEY_LOCAL_MACHINE, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_AUTORUN)), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {\r
+                       DWORD dwType = REG_SZ;\r
+                       TCHAR szSavedFileName[MAX_PATH] = {'\0'};\r
+                       DWORD dwBufLen = sizeof(szSavedFileName);\r
+                       RegQueryValueEx(hKey, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)), NULL, &dwType,\r
+                                                       (LPBYTE)szSavedFileName, &dwBufLen);\r
+                       RegCloseKey(hKey);\r
+\r
+                       if (!_tcsnicmp(szFileName, szSavedFileName, sizeof(szFileName))) {\r
+                               m_cAutoRun.SetCheck(1);\r
+                       }\r
+               }\r
+       }\r
+\r
+       // for file and directory name completion\r
+       if (CProfile::IsNT()) {\r
+               HKEY hKey = NULL;\r
+\r
+               if (RegOpenKeyEx(HKEY_CURRENT_USER,  CString(MAKEINTRESOURCE(IDS_REGSUBKEY_FILE_COMPLETION)), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS\r
+                || RegOpenKeyEx(HKEY_LOCAL_MACHINE, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_FILE_COMPLETION)), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {\r
+                       DWORD dwType = REG_DWORD;\r
+                       DWORD dwCompletionChar = 0;\r
+                       DWORD dwcbData = sizeof(dwCompletionChar);\r
+                       RegQueryValueEx(hKey, CString(MAKEINTRESOURCE(IDS_COMPLETION_CHAR)), NULL, &dwType,\r
+                                                       (LPBYTE)&dwCompletionChar, &dwcbData);\r
+                       RegCloseKey(hKey);\r
+                       if (dwCompletionChar == 0x9) {\r
+                               m_cFileCompletion.SetCheck(1);\r
+                       }\r
+               }\r
+       } else if (CProfile::Is9x()) {\r
+               m_cFileCompletion.EnableWindow(FALSE);\r
+       }\r
+\r
+       // for icons in the taskbar's status area\r
+       m_cCx.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CX)), 0));\r
+       m_cMx.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_MX)), 0));\r
+       m_cM_.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_META)), 0));\r
+       m_cShift.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_SHIFT)), 0));\r
+       m_cCtrl.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CTRL)), 0));\r
+       m_cAlt.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ALT)), 0));\r
+\r
+       return TRUE;  // return TRUE unless you set the focus to a control\r
+                     // EXCEPTION: OCX Property Pages should return FALSE\r
+}\r
+\r
+void COptionsDlg::OnOK() \r
+{\r
+       // TODO: Add extra validation here\r
+       // for auto run\r
+       {\r
+               TCHAR szFileName[MAX_PATH] = {'\0'};\r
+               GetModuleFileName(NULL, szFileName, sizeof(szFileName));\r
+               HKEY hKey = NULL;\r
+\r
+               DWORD dwDisposition;\r
+               if (RegCreateKeyEx(HKEY_CURRENT_USER, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_AUTORUN)), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) {\r
+                       if (m_cAutoRun.GetCheck() == 1) {\r
+                               RegSetValueEx(hKey, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)), 0, REG_SZ, (LPBYTE)szFileName, _tcslen(szFileName));\r
+                       } else {\r
+                               RegDeleteValue(hKey, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)));\r
+                       }\r
+                       RegCloseKey(hKey);\r
+               }\r
+       }\r
+\r
+       // for file and directory name completion\r
+       if (CProfile::IsNT()) {\r
+               HKEY hKey = NULL;\r
+\r
+               if (RegCreateKeyEx(HKEY_CURRENT_USER, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_FILE_COMPLETION)), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {\r
+                       DWORD dwCompletionChar;\r
+                       if (m_cFileCompletion.GetCheck() == 1) {\r
+                               dwCompletionChar = 0x9; // use enum\r
+                       } else {\r
+                               dwCompletionChar = 0x0;\r
+                       }\r
+                       RegSetValueEx(hKey, CString(MAKEINTRESOURCE(IDS_COMPLETION_CHAR)), 0, REG_DWORD,\r
+                                                 (LPBYTE)&dwCompletionChar, sizeof(dwCompletionChar));\r
+                       RegCloseKey(hKey);\r
+               }\r
+       }\r
+\r
+       // for icons in the taskbar's status area\r
+       {\r
+               // write data in registry\r
+               AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CX)), m_cCx.GetCheck());\r
+               AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_MX)), m_cMx.GetCheck());\r
+               AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_META)), m_cM_.GetCheck());\r
+               AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_SHIFT)), m_cShift.GetCheck());\r
+               AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CTRL)), m_cCtrl.GetCheck());\r
+               AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ALT)), m_cAlt.GetCheck());\r
+\r
+               // set dll data\r
+               CMainFrame *pMainFrame = (CMainFrame*)AfxGetMainWnd();\r
+               pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(CX_ICON, m_cCx.GetCheck());\r
+               pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(MX_ICON, m_cMx.GetCheck());\r
+               pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(META_ICON, m_cM_.GetCheck());\r
+               pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(SHIFT_ICON, m_cShift.GetCheck());\r
+               pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(CTRL_ICON, m_cCtrl.GetCheck());\r
+               pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(ALT_ICON, m_cAlt.GetCheck());\r
+       }\r
+\r
+       CDialog::OnOK();\r
+}\r
diff --git a/xkeymacs/optionsdlg.h b/xkeymacs/optionsdlg.h
new file mode 100644 (file)
index 0000000..03126f8
--- /dev/null
@@ -0,0 +1,54 @@
+#if !defined(AFX_OPTIONSDLG_H__526E5E0B_92DC_4F9C_BCE5_5ADB5DFE3444__INCLUDED_)\r
+#define AFX_OPTIONSDLG_H__526E5E0B_92DC_4F9C_BCE5_5ADB5DFE3444__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+// OptionsDlg.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// COptionsDlg dialog\r
+\r
+class COptionsDlg : public CDialog\r
+{\r
+// Construction\r
+public:\r
+       virtual  ~COptionsDlg();\r
+       COptionsDlg(CWnd *pParent = NULL);   // standard constructor\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(COptionsDlg)\r
+       enum { IDD = IDD_OPTIONS };\r
+       CButton m_cMx;\r
+       CButton m_cM_;\r
+       CButton m_cAlt;\r
+       CButton m_cShift;\r
+       CButton m_cCtrl;\r
+       CButton m_cCx;\r
+       CButton m_cFileCompletion;\r
+       CButton m_cAutoRun;\r
+       CButton m_cOK;\r
+       //}}AFX_DATA\r
+\r
+// Overrides\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(COptionsDlg)\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange *pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+protected:\r
+       // Generated message map functions\r
+       //{{AFX_MSG(COptionsDlg)\r
+       virtual BOOL OnInitDialog();\r
+       virtual void OnOK();\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+};\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_OPTIONSDLG_H__526E5E0B_92DC_4F9C_BCE5_5ADB5DFE3444__INCLUDED_)\r
diff --git a/xkeymacs/profile.cpp b/xkeymacs/profile.cpp
new file mode 100644 (file)
index 0000000..02ea29c
--- /dev/null
@@ -0,0 +1,1884 @@
+// Profile.cpp: implementation of the CProfile class\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "Profile.h"\r
+#include "MainFrm.h"\r
+#include "DotXkeymacs.h"\r
+#include <Imm.h>\r
+#include <Shlwapi.h>   // Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 4.0 or later). \r
+                                               // Windows 95/98/Me: Requires Windows 98 (or Windows 95 with Internet Explorer 4.0 or later). \r
+\r
+#ifdef _DEBUG\r
+#undef THIS_FILE\r
+static char THIS_FILE[]=__FILE__;\r
+#define new DEBUG_NEW\r
+#endif\r
+\r
+#pragma data_seg(".xkmcs")\r
+       CXkeymacsData CProfile::m_XkeymacsData[MAX_APP];\r
+       TASK_LIST CProfile::m_TaskList[MAX_TASKS];\r
+       DWORD CProfile::m_dwTasks;\r
+       ScanCode_t CProfile::m_CurrentScanCodeMap[MAX_HKEY_TYPE][4][256];\r
+       ScanCode_t CProfile::m_ScanCodeMap[MAX_HKEY_TYPE][4][256];\r
+#pragma data_seg()\r
+\r
+enum { INITIAL_SIZE    = 51200 };\r
+enum { EXTEND_SIZE     = 25600 };\r
+\r
+void CProfile::Item2AppName(CString *const sz)\r
+{\r
+       if (IsTheString(*sz, IDS_DEFAULT_TITLE)) {\r
+               sz->LoadString(IDS_DEFAULT);\r
+       }\r
+\r
+       if (IsTheString(*sz, IDS_DIALOG_TITLE)) {\r
+               sz->LoadString(IDS_DIALOG);\r
+       }\r
+\r
+       int nStart, nEnd, nCount;\r
+\r
+       nStart  = sz->ReverseFind(_T('(')) + 1;\r
+       nEnd    = sz->Find(_T(')'), nStart) - 1;\r
+       nCount  = (nEnd + 1) - nStart;\r
+       *sz             = sz->Mid(nStart, nCount);\r
+}\r
+\r
+int CProfile::IsNotSameString(CComboBox *const pApplication, const CString szListItem)\r
+{\r
+       CString szItem, szList;\r
+       szList = szListItem;\r
+       Item2AppName(&szList);\r
+\r
+       for (int i = 0; i < pApplication->GetCount(); ++i) {\r
+               pApplication->GetLBText(i, szItem);\r
+               Item2AppName(&szItem);\r
+               if (!_tcsicmp(szItem, szList)) {\r
+                       return 0;\r
+               }\r
+       }\r
+\r
+       return 1;\r
+}\r
+\r
+int CProfile::CountSeparator(const CString szMainString, const CString szSeparator)\r
+{\r
+       int index       = 0;\r
+       int counter     = 0;\r
+\r
+       while ((index = szMainString.Find(szSeparator, index)) != -1) {\r
+               ++index;\r
+               ++counter;\r
+       }\r
+\r
+       return counter;\r
+}\r
+\r
+void CProfile::GetNthString(CString *const szAppName, const CString szWindowName, const CString szSeparator, int n)\r
+{\r
+       int index = -1;\r
+\r
+       while (--n) {\r
+               index = szWindowName.Find(szSeparator, index + 1);\r
+       }\r
+\r
+       int nStart;\r
+       if (index != -1) {\r
+               nStart = index + szSeparator.GetLength();\r
+       } else {\r
+               nStart = 0;\r
+       }\r
+\r
+       int nEnd = szWindowName.Find(szSeparator, nStart);\r
+       if (nEnd == -1) {\r
+               nEnd = szWindowName.GetLength();\r
+       }\r
+\r
+       *szAppName = szWindowName.Mid(nStart, nEnd - nStart);\r
+}\r
+\r
+void CProfile::GetAppName(CString *const szAppName, LPCTSTR pWindowName)\r
+{\r
+       CString szWindowName(pWindowName);\r
+       CString szSeparator(MAKEINTRESOURCE(IDS_SEPARATE_WINDOWTITLE));\r
+       int nWord = CountSeparator(szWindowName, szSeparator) + 1;\r
+\r
+       while (nWord) {\r
+               GetNthString(szAppName, szWindowName, szSeparator, nWord);\r
+               if (szAppName->GetAt(0) == _T('[')\r
+                || szAppName->Find(_T('.'), 0) != -1           // for Microsoft Project\r
+                || szAppName->Find(_T(']'), 0) != -1) {        // for the file name like [foo - bar]\r
+                       --nWord;\r
+               } else {\r
+                       return;\r
+               }\r
+       }\r
+\r
+       *szAppName = szWindowName;\r
+}\r
+\r
+BOOL CALLBACK CProfile::EnumWindowsProc(const HWND hWnd, const LPARAM lParam)\r
+{\r
+       CComboBox               *pApplication   = (CComboBox*)lParam;\r
+       PTASK_LIST              pTask                   = CProfile::m_TaskList;\r
+       \r
+       TCHAR szWindowName[WINDOW_NAME_LENGTH];\r
+       TCHAR szClassName[CLASS_NAME_LENGTH];\r
+       WINDOWPLACEMENT wpl;\r
+       \r
+       wpl.length = sizeof(WINDOWPLACEMENT);\r
+       ::GetWindowText(hWnd, szWindowName, sizeof(szWindowName));\r
+       GetClassName(hWnd, szClassName, sizeof(szClassName));\r
+\r
+       CString szAppName;\r
+       // Get Process Name\r
+       DWORD dwProcessId = 0;\r
+       GetWindowThreadProcessId(hWnd, &dwProcessId);\r
+       for (DWORD i = 0; i < CProfile::m_dwTasks; ++i) {\r
+               if (pTask[i].dwProcessId == dwProcessId) {\r
+\r
+                       // Get Application Name\r
+                       if (szWindowName[0] == '\0') {\r
+                               continue;\r
+                       }\r
+                       if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_B2)), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.LoadString(IDS_BECKY);\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_EXPLORER)), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.LoadString(IDS_PROGRAM_MANAGER);\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_MSIMN)), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.LoadString(IDS_OUTLOOK_EXPRESS);\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_PROJECT)), sizeof(pTask[i].ProcessName))\r
+                                       || !_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_EXCEL)), sizeof(pTask[i].ProcessName))\r
+                                       || !_tcsnicmp(pTask[i].ProcessName, _T("psp.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               GetNthString(&szAppName, szWindowName, CString(MAKEINTRESOURCE(IDS_SEPARATE_WINDOWTITLE)), 1);\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, _T("sakura.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               GetNthString(&szAppName, szWindowName, CString(MAKEINTRESOURCE(IDS_SEPARATE_WINDOWTITLE)), 2);  // '.' is included, so...\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_MSDN)), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName = szWindowName;\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, _T("devenv.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.Format(_T("Microsoft Visual Studio .NET"));\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, _T("vb6.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.Format(_T("Microsoft Visual Basic"));\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, _T("ssexp.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.LoadString(IDS_VISUAL_SOURCESAFE_EXPLORER);\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, _T("sh.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.Format(_T("MKS Korn Shell"));\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, _T("csh.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.Format(_T("C Shell"));\r
+                       } else if (!_tcsnicmp(pTask[i].ProcessName, _T("vim.exe"), sizeof(pTask[i].ProcessName))) {\r
+                               szAppName.Format(_T("VIM"));\r
+                       } else {\r
+                               CUtils::SetCorrectApplicationName(pTask[i].ProcessName, sizeof(pTask[i].ProcessName), szWindowName, sizeof(szWindowName));\r
+                               GetAppName(&szAppName, szWindowName);\r
+                       }\r
+                       break;\r
+               }\r
+       }\r
+       \r
+       \r
+       if ((IsWindowVisible(hWnd))                                                                     // Is visible?\r
+        && (GetWindow(hWnd, GW_OWNER) == NULL)                                         // Is top level window?\r
+        && (lstrlen(szWindowName) > 0)                                                         // Have caption?\r
+        && (pApplication->FindString(-1, szClassName) == CB_ERR)) {// Is not same string?\r
+               CString szListItem;\r
+               szListItem.Format(IDS_APPLICATION_LIST_ITEM, szAppName, pTask[i].ProcessName);\r
+               if (IsNotSameString(pApplication, szListItem)) {\r
+                       pApplication->AddString(szListItem);\r
+               }\r
+       }\r
+       return TRUE;\r
+}\r
+\r
+       \r
+//////////////////////////////////////////////////////////////////////\r
+// Construction/Destruction\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CProfile::CProfile()\r
+{\r
+\r
+}\r
+\r
+CProfile::~CProfile()\r
+{\r
+\r
+}\r
+\r
+// This method initializes data in the registry, or retrieves and validates registry data.\r
+// bSaveAndValidate specifies a flag that indicates \r
+// whether registry data is being initialized (FALSE) or data is being retrieved (TRUE). \r
+void CProfile::UpdateRegistryData(const BOOL bSaveAndValidate)\r
+{\r
+       CString szEntry;\r
+       CString szApplicationName;\r
+       CString szApplicationTitle;\r
+       CString szWindowText;\r
+       CString szWindowTextType;\r
+\r
+       BOOL bUseDialogSetting = FALSE;\r
+\r
+       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+               // application name\r
+               CString szSection(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION));\r
+               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nApplicationID);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       m_XkeymacsData[nApplicationID].ClearAll();\r
+                       szApplicationName = AfxGetApp()->GetProfileString(szSection, szEntry);\r
+                       if (szApplicationName.IsEmpty()) {\r
+                               if (nApplicationID) {\r
+                                       if (!bUseDialogSetting) {\r
+                                               szApplicationName.LoadString(IDS_DIALOG);\r
+                                               bUseDialogSetting = TRUE;\r
+                                       } else {\r
+                                               continue;\r
+                                       }\r
+                               } else {\r
+                                       szApplicationName.LoadString(IDS_DEFAULT);\r
+                               }\r
+                       } else {\r
+                               if (szApplicationName == CString(MAKEINTRESOURCE(IDS_DIALOG))) {\r
+                                       bUseDialogSetting = TRUE;\r
+                               }\r
+                       }\r
+                       m_XkeymacsData[nApplicationID].SetApplicationName(szApplicationName);\r
+               } else {                                // initialize\r
+                       szApplicationName = m_XkeymacsData[nApplicationID].GetApplicationName();\r
+                       if (szApplicationName.IsEmpty()) {\r
+                               continue;\r
+                       }\r
+                       AfxGetApp()->WriteProfileString(szSection, szEntry, szApplicationName);\r
+               }\r
+\r
+               // application title\r
+               szEntry.LoadString(IDS_REG_ENTRY_APPLICATOIN_TITLE);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       szApplicationTitle = AfxGetApp()->GetProfileString(szApplicationName, szEntry);\r
+                       m_XkeymacsData[nApplicationID].SetApplicationTitle(szApplicationTitle);\r
+               } else {                                // initialize\r
+                       szApplicationTitle = m_XkeymacsData[nApplicationID].GetApplicationTitle();\r
+                       while (!szApplicationTitle.IsEmpty() && szApplicationTitle.GetAt(0) == _T(' ')) {\r
+                               szApplicationTitle.Delete(0);\r
+                       }\r
+                       AfxGetApp()->WriteProfileString(szApplicationName, szEntry, szApplicationTitle);\r
+               }\r
+\r
+               // window text\r
+               szEntry.LoadString(IDS_REG_ENTRY_WINDOW_TEXT);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       szWindowText = AfxGetApp()->GetProfileString(szApplicationName, szEntry, _T("*"));\r
+                       if (szWindowText.IsEmpty()) {\r
+                               szWindowText = _T('*');\r
+                       }\r
+                       m_XkeymacsData[nApplicationID].SetWindowText(szWindowText);\r
+               } else {                                // initialize\r
+                       szWindowText = m_XkeymacsData[nApplicationID].GetWindowText();\r
+                       AfxGetApp()->WriteProfileString(szApplicationName, szEntry, szWindowText);\r
+               }\r
+\r
+               // window text type\r
+               szEntry.LoadString(IDS_REG_ENTRY_WINDOW_TEXT_TYPE);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       szWindowTextType = AfxGetApp()->GetProfileString(szApplicationName, szEntry);\r
+\r
+                       int nWindowTextType = IDS_WINDOW_TEXT_IGNORE;\r
+                       if (szWindowTextType == CString(MAKEINTRESOURCE(IDS_WINDOW_TEXT_MATCH))) {\r
+                               nWindowTextType = IDS_WINDOW_TEXT_MATCH;\r
+                       } else if (szWindowTextType == CString(MAKEINTRESOURCE(IDS_WINDOW_TEXT_MATCH_FORWARD))) {\r
+                               nWindowTextType = IDS_WINDOW_TEXT_MATCH_FORWARD;\r
+                       } else if (szWindowTextType == CString(MAKEINTRESOURCE(IDS_WINDOW_TEXT_MATCH_BACKWARD))) {\r
+                               nWindowTextType = IDS_WINDOW_TEXT_MATCH_BACKWARD;\r
+                       } else if (szWindowTextType == CString(MAKEINTRESOURCE(IDS_WINDOW_TEXT_MATCH_FULL))) {\r
+                               nWindowTextType = IDS_WINDOW_TEXT_MATCH_FULL;\r
+                       }\r
+\r
+                       m_XkeymacsData[nApplicationID].SetWindowTextType(nWindowTextType);\r
+               } else {                                // initialize\r
+                       szWindowTextType.LoadString(m_XkeymacsData[nApplicationID].GetWindowTextType());\r
+                       AfxGetApp()->WriteProfileString(szApplicationName, szEntry, szWindowTextType);\r
+               }\r
+\r
+               // on/off\r
+               if (bSaveAndValidate) { // retrieve\r
+                       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                               szEntry = CXkeymacsData::GetCommandName(nCommandID);\r
+                               if (szEntry.IsEmpty()) {\r
+                                       break;\r
+                               }\r
+\r
+                               HKEY hKey = NULL;\r
+                               CString szSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
+                               szSubKey += _T("\\") + szApplicationName + _T("\\") + szEntry;\r
+                               if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\r
+                                       // Use registry data\r
+                                       TCHAR szKeyBind[128] = {'\0'};\r
+                                       DWORD dwKeyBind = sizeof(szKeyBind);\r
+                                       FILETIME ft = {'\0'};   // not use\r
+                                       for (DWORD dwIndex = 0;\r
+                                                RegEnumKeyEx(hKey, dwIndex, szKeyBind, &dwKeyBind, NULL, NULL, NULL, &ft) == ERROR_SUCCESS;\r
+                                                ++dwIndex) {\r
+                                               int nCommandType = 0;\r
+                                               int nKey = 0;\r
+                                               ReadKeyBind(&nCommandType, &nKey, szKeyBind);\r
+                                               m_XkeymacsData[nApplicationID].SetCommandID(nCommandType, nKey, nCommandID);\r
+\r
+//                                             if (nCommandType == CONTROL && nKey == 'D') {\r
+//                                                     CUtils::Log("GetProfileInt(at ibeam cursor only): %s, %s", szSubKey, szKeyBind);\r
+//                                             }\r
+                                               const CString szSection = szSubKey.Right(szSubKey.GetLength() - CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)).GetLength() - _tcslen(_T("\\"))) + _T("\\") + szKeyBind;\r
+                                               const BOOL bAtIbeamCursorOnly = AfxGetApp()->GetProfileInt(szSection, CString(MAKEINTRESOURCE(IDS_REG_ENTRY_AT_IBEAM_CURSOR_ONLY)), FALSE);\r
+                                               m_XkeymacsData[nApplicationID].SetAtIbeamCursorOnly(nCommandType, nKey, bAtIbeamCursorOnly);\r
+\r
+                                               memset(szKeyBind, 0, sizeof(szKeyBind));\r
+                                               dwKeyBind = sizeof(szKeyBind);\r
+                                       }\r
+                                       RegCloseKey(hKey);\r
+                               } else {\r
+                                       // Use default setting\r
+                                       for (int i = 0; ; ++i) {\r
+                                               if (CXkeymacsData::GetDefaultControlID(nCommandID, i) == IDC_CO2) {\r
+                                                       continue;\r
+                                               }\r
+\r
+                                               int nCommandType = CXkeymacsData::GetDefaultCommandType(nCommandID, i);\r
+                                               int nKey = CXkeymacsData::GetDefaultCommandKey(nCommandID, i);\r
+                                               if (nKey == 0) {\r
+                                                       break;\r
+                                               }\r
+                                               m_XkeymacsData[nApplicationID].SetCommandID(nCommandType, nKey, nCommandID);\r
+                                               m_XkeymacsData[nApplicationID].SetAtIbeamCursorOnly(nCommandType, nKey, FALSE);\r
+                                       }\r
+                               }\r
+                       }\r
+                       for (int nFunctionID = 0; nFunctionID < CDotXkeymacs::GetFunctionNumber(); ++nFunctionID) {\r
+                               HKEY hKey = NULL;\r
+                               CString szSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
+                               szSubKey += _T("\\") + szApplicationName + _T("\\") + CDotXkeymacs::GetFunctionSymbol(nFunctionID);\r
+                               if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\r
+                                       // Use registry data\r
+                                       CDotXkeymacs::ClearKey(nFunctionID, nApplicationID);\r
+                                       TCHAR szKeyBind[128] = {'\0'};\r
+                                       DWORD dwKeyBind = sizeof(szKeyBind);\r
+                                       FILETIME ft = {'\0'};   // not use\r
+                                       for (DWORD dwIndex = 0; RegEnumKeyEx(hKey, dwIndex, szKeyBind, &dwKeyBind, NULL, NULL, NULL, &ft) == ERROR_SUCCESS; ++dwIndex) {\r
+                                               int nCommandType = 0;\r
+                                               int nKey = 0;\r
+                                               ReadKeyBind(&nCommandType, &nKey, szKeyBind);\r
+                                               CDotXkeymacs::SetKey(nFunctionID, nApplicationID, nCommandType, nKey);\r
+\r
+                                               memset(szKeyBind, 0, sizeof(szKeyBind));\r
+                                               dwKeyBind = sizeof(szKeyBind);\r
+                                       }\r
+                                       RegCloseKey(hKey);\r
+                               }\r
+                       }\r
+               } else {                                // initialize\r
+                       // create all commands\r
+                       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                               szEntry = CXkeymacsData::GetCommandName(nCommandID);\r
+                               if (szEntry.IsEmpty()) {\r
+                                       break;\r
+                               }\r
+\r
+                               SaveCommand(szApplicationName, nCommandID);\r
+                       }\r
+                       for (int nCommandType = 0; nCommandType < MAX_COMMAND_TYPE; ++nCommandType) {\r
+                               for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
+                                       int nCommandID = m_XkeymacsData[nApplicationID].GetCommandID(nCommandType, nKey);\r
+                                       SaveKeyBind(szApplicationName, nCommandID, nCommandType, nKey);\r
+                               }\r
+                       }\r
+                       for (int nFunctionID = 0; nFunctionID < CDotXkeymacs::GetFunctionNumber(); ++nFunctionID) {\r
+                               for (int nKeyID = 0; nKeyID < CDotXkeymacs::GetKeyNumber(nFunctionID, nApplicationID); ++nKeyID) {\r
+                                       int nCommandType = 0;\r
+                                       int nKey = 0;\r
+                                       CDotXkeymacs::GetKey(nFunctionID, nApplicationID, nKeyID, &nCommandType, &nKey);\r
+                                       SaveKeyBind(szApplicationName, CDotXkeymacs::GetFunctionSymbol(nFunctionID), nCommandType, nKey);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // kill-ring-max\r
+               szEntry.LoadString(IDS_REG_ENTRY_KILL_RING_MAX);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       int nKillRingMax = AfxGetApp()->GetProfileInt(szApplicationName, szEntry, 1);\r
+                       m_XkeymacsData[nApplicationID].SetKillRingMax(nKillRingMax);\r
+               } else {                                // initialize\r
+                       int nKillRingMax = m_XkeymacsData[nApplicationID].GetKillRingMax();\r
+                       AfxGetApp()->WriteProfileInt(szApplicationName, szEntry, nKillRingMax);\r
+               }\r
+\r
+               // Use Dialog Setting\r
+               szEntry.LoadString(IDS_REG_ENTRY_USE_DIALOG_SETTING);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       BOOL bUseDialogSetting = AfxGetApp()->GetProfileInt(szApplicationName,szEntry, 1);\r
+                       m_XkeymacsData[nApplicationID].SetUseDialogSetting(bUseDialogSetting);\r
+               } else {                                // initialize\r
+                       BOOL bUseDialogSetting = m_XkeymacsData[nApplicationID].GetUseDialogSetting();\r
+                       AfxGetApp()->WriteProfileInt(szApplicationName, szEntry, bUseDialogSetting);\r
+               }\r
+\r
+               // Setting Style\r
+               szEntry.LoadString(IDS_REG_ENTRY_DISABLE_XKEYMACS);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       int nSettingStyle = SETTING_SPECIFIC;\r
+                       if (AfxGetApp()->GetProfileInt(szApplicationName, szEntry, 0) != 0) {\r
+                               nSettingStyle = SETTING_DISABLE;\r
+                       }\r
+                       m_XkeymacsData[nApplicationID].SetSettingStyle(nSettingStyle);\r
+               } else {                                // initialize\r
+                       BOOL bDisableXkeymacs = FALSE;\r
+                       if (m_XkeymacsData[nApplicationID].GetSettingStyle() == SETTING_DISABLE) {\r
+                               bDisableXkeymacs = TRUE;\r
+                       }\r
+                       AfxGetApp()->WriteProfileInt(szApplicationName, szEntry, bDisableXkeymacs);\r
+               }\r
+\r
+               // Ignore Meta Ctrl+? when it is undefined.\r
+               szEntry.LoadString(IDC_REG_ENTRY_IGNORE_META_CTRL);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       m_XkeymacsData[nApplicationID].SetIgnoreUndefinedMetaCtrl(AfxGetApp()->GetProfileInt(szApplicationName, szEntry, 0));\r
+               } else {                                // initialize\r
+                       AfxGetApp()->WriteProfileInt(szApplicationName, szEntry, m_XkeymacsData[nApplicationID].GetIgnoreUndefinedMetaCtrl());\r
+               }\r
+\r
+               // Ignore C-x ? when it is undefined.\r
+               szEntry.LoadString(IDC_REG_ENTRY_IGNORE_C_X);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       m_XkeymacsData[nApplicationID].SetIgnoreUndefinedC_x(AfxGetApp()->GetProfileInt(szApplicationName, szEntry, 0));\r
+               } else {                                // initialize\r
+                       AfxGetApp()->WriteProfileInt(szApplicationName, szEntry, m_XkeymacsData[nApplicationID].GetIgnoreUndefinedC_x());\r
+               }\r
+\r
+               // Enable CUA-mode\r
+               szEntry.LoadString(IDC_REG_ENTRY_ENABLE_CUA);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       m_XkeymacsData[nApplicationID].SetEnableCUA(AfxGetApp()->GetProfileInt(szApplicationName, szEntry, 0));\r
+               } else {                                // initialize\r
+                       AfxGetApp()->WriteProfileInt(szApplicationName, szEntry, m_XkeymacsData[nApplicationID].GetEnableCUA());\r
+               }\r
+\r
+               // Version 3.26 compatible mode\r
+               szEntry.LoadString(IDS_REG_ENTRY_326_COMPATIBLE);\r
+               if (bSaveAndValidate) { // retrieve\r
+                       m_XkeymacsData[nApplicationID].Set326Compatible(AfxGetApp()->GetProfileInt(szApplicationName, szEntry, 0));\r
+               } else {                                // initialize\r
+                       AfxGetApp()->WriteProfileInt(szApplicationName, szEntry, m_XkeymacsData[nApplicationID].Get326Compatible());\r
+               }\r
+       }\r
+}\r
+\r
+void CProfile::LoadRegistryData()\r
+{\r
+       CDotXkeymacs::Load();\r
+       LevelUp();\r
+       UpdateRegistryData(TRUE);\r
+}\r
+\r
+void CProfile::SaveRegistryData()\r
+{\r
+       DeleteAllRegistryData();\r
+       UpdateRegistryData(FALSE);\r
+       SetDllData();\r
+}\r
+\r
+void CProfile::SetDllData()\r
+{\r
+       CMainFrame *pMainFrame = (CMainFrame*)AfxGetMainWnd();\r
+\r
+       pMainFrame->m_pXkeymacsDll->ClearFunctionDefinition();\r
+       for (int nFunctionID = 0; nFunctionID < CDotXkeymacs::GetFunctionNumber(); ++nFunctionID) {\r
+               pMainFrame->m_pXkeymacsDll->SetFunctionDefinition(nFunctionID, CDotXkeymacs::GetFunctionDefinition(nFunctionID));\r
+       }\r
+\r
+       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+\r
+               CString szApplicationName = m_XkeymacsData[nApplicationID].GetApplicationName();\r
+\r
+               if (szApplicationName.IsEmpty()) {\r
+                       pMainFrame->m_pXkeymacsDll->Clear(nApplicationID);\r
+                       continue;\r
+               }\r
+\r
+               pMainFrame->m_pXkeymacsDll->SetApplicationName(nApplicationID, szApplicationName);\r
+               pMainFrame->m_pXkeymacsDll->SetWindowText(nApplicationID, m_XkeymacsData[nApplicationID].GetWindowText());\r
+               pMainFrame->m_pXkeymacsDll->SetCommandID(nApplicationID, CONTROL, 'X', 0);\r
+               pMainFrame->m_pXkeymacsDll->SetAtIbeamCursorOnly(nApplicationID, CONTROL, 'X', FALSE);\r
+\r
+               for (int nCommandType = 0; nCommandType < MAX_COMMAND_TYPE; ++nCommandType) {\r
+                       for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
+                               const int nCommandID = m_XkeymacsData[nApplicationID].GetCommandID(nCommandType, nKey);\r
+                               pMainFrame->m_pXkeymacsDll->SetCommandID(nApplicationID, nCommandType, nKey, nCommandID);\r
+                               const BOOL bAtIbeamCursorOnly = m_XkeymacsData[nApplicationID].GetAtIbeamCursorOnly(nCommandType, nKey);\r
+                               pMainFrame->m_pXkeymacsDll->SetAtIbeamCursorOnly(nApplicationID, nCommandType, nKey, bAtIbeamCursorOnly);\r
+                               if ((nCommandType & CONTROLX) && nCommandID) {\r
+                                       pMainFrame->m_pXkeymacsDll->SetCommandID(nApplicationID, CONTROL, 'X', 1);                      // Commands[1] is C-x\r
+                                       pMainFrame->m_pXkeymacsDll->SetAtIbeamCursorOnly(nApplicationID, CONTROL, 'X', bAtIbeamCursorOnly);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               for (int nFunctionID = 0; nFunctionID < CDotXkeymacs::GetFunctionNumber(); ++nFunctionID) {\r
+                       for (int nKeyID = 0; nKeyID < CDotXkeymacs::GetKeyNumber(nFunctionID, nApplicationID); ++nKeyID) {\r
+                               int nCommandType = 0;\r
+                               int nKey = 0;\r
+                               CDotXkeymacs::GetKey(nFunctionID, nApplicationID, nKeyID, &nCommandType, &nKey);\r
+                               pMainFrame->m_pXkeymacsDll->SetFunctionKey(nFunctionID, nApplicationID, nCommandType, nKey);\r
+                               if (nCommandType & CONTROLX) {\r
+                                       pMainFrame->m_pXkeymacsDll->SetCommandID(nApplicationID, CONTROL, 'X', 1);                      // Commands[1] is C-x\r
+                                       const BOOL bAtIbeamCursorOnly = m_XkeymacsData[nApplicationID].GetAtIbeamCursorOnly(nCommandType, nKey);\r
+                                       pMainFrame->m_pXkeymacsDll->SetAtIbeamCursorOnly(nApplicationID, CONTROL, 'X', bAtIbeamCursorOnly);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               pMainFrame->m_pXkeymacsDll->SetKillRingMax(nApplicationID, m_XkeymacsData[nApplicationID].GetKillRingMax());\r
+               pMainFrame->m_pXkeymacsDll->SetUseDialogSetting(nApplicationID, m_XkeymacsData[nApplicationID].GetUseDialogSetting());\r
+               pMainFrame->m_pXkeymacsDll->SetSettingStyle(nApplicationID, m_XkeymacsData[nApplicationID].GetSettingStyle());\r
+               pMainFrame->m_pXkeymacsDll->SetIgnoreUndefinedMetaCtrl(nApplicationID, m_XkeymacsData[nApplicationID].GetIgnoreUndefinedMetaCtrl());\r
+               pMainFrame->m_pXkeymacsDll->SetIgnoreUndefinedC_x(nApplicationID, m_XkeymacsData[nApplicationID].GetIgnoreUndefinedC_x());\r
+               pMainFrame->m_pXkeymacsDll->SetEnableCUA(nApplicationID, m_XkeymacsData[nApplicationID].GetEnableCUA());\r
+               pMainFrame->m_pXkeymacsDll->Set326Compatible(nApplicationID, m_XkeymacsData[nApplicationID].Get326Compatible());\r
+       }\r
+}\r
+\r
+void CProfile::ReadKeyBind(int *const pnCommandType, int *const pnKey, LPCTSTR szKeyBind)\r
+{\r
+       *pnCommandType = KeyBind2CommandType(szKeyBind);\r
+       *pnKey = KeyBind2Key(szKeyBind + _tcslen(CommandType2String(*pnCommandType)));\r
+}\r
+\r
+CString CProfile::WriteKeyBind(const int nCommandType, const int nKey)\r
+{\r
+       CString szKeyBind;\r
+       szKeyBind.Format(_T("%s%s"), CommandType2String(nCommandType), Key2String(nKey));\r
+       return szKeyBind;\r
+}\r
+\r
+int CProfile::KeyBind2CommandType(LPCTSTR szKeyBind)\r
+{\r
+       for (int nCommandType = MAX_COMMAND_TYPE - 1; nCommandType; --nCommandType) {\r
+               if (IsCommandType(nCommandType, szKeyBind)) {\r
+                       return nCommandType;\r
+               }\r
+       }\r
+       return NONE;\r
+}\r
+\r
+int CProfile::KeyBind2Key(LPCTSTR szKey)\r
+{\r
+       for (int nKey = 1; nKey < 0xff; ++nKey) {\r
+               if (!_tcscmp(szKey, Key2String(nKey))) {\r
+                       return nKey;\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+LPCTSTR CProfile::CommandType2String(int nCommandType)\r
+{\r
+       if (nCommandType < 0 || sizeof(CommandTypes) / sizeof(CommandTypes[0]) <= nCommandType) {\r
+               ASSERT(0);\r
+               nCommandType = NONE;\r
+       }\r
+       return CommandTypes[nCommandType].szCommandTypeName;\r
+}\r
+\r
+LPCTSTR CProfile::Key2String(int nKey)\r
+{\r
+       if (CProfile::Is106Keyboard()) {\r
+               switch (nKey) {\r
+               case 0xBA:\r
+                       return _T(":");\r
+               case 0xBB:\r
+                       return _T(";");\r
+               case 0xC0:\r
+                       return _T("@");\r
+               case 0xDE:\r
+                       return _T("^");\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+\r
+       if (nKey < 0 || sizeof(KeyNames) / sizeof(KeyNames[0]) <= nKey) {\r
+               ASSERT(0);\r
+               nKey = 0;\r
+       }\r
+       return KeyNames[nKey].name;\r
+}\r
+\r
+BOOL CProfile::IsCommandType(const int nCommandType, LPCTSTR szKeyBind)\r
+{\r
+       LPCTSTR szCommandType = CommandType2String(nCommandType);\r
+\r
+       if (!_tcsnicmp(szKeyBind, szCommandType, _tcslen(szCommandType))) {\r
+               return TRUE;\r
+       }\r
+\r
+       return FALSE;\r
+}\r
+\r
+void CProfile::SaveKeyBind(const CString szApplicationName, const int nCommandID, const int nCommandType, const int nKey)\r
+{\r
+       if (!nCommandID) {\r
+               return;\r
+       }\r
+\r
+       CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+       if (szCommandName.IsEmpty()) {\r
+               return;\r
+       }\r
+\r
+       SaveKeyBind(szApplicationName, szCommandName, nCommandType, nKey);\r
+}\r
+\r
+void CProfile::SaveKeyBind(const CString szApplicationName, const CString szCommandName, const int nCommandType, const int nKey)\r
+{\r
+       CString szKeyBind = WriteKeyBind(nCommandType, nKey);\r
+       CString szSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
+       szSubKey += _T("\\") + szApplicationName + _T("\\") + szCommandName;\r
+       if (!szKeyBind.IsEmpty()) {\r
+               szSubKey += _T("\\") + szKeyBind;\r
+       }\r
+\r
+       HKEY hKey = NULL;\r
+       if (RegCreateKeyEx(HKEY_CURRENT_USER, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) == ERROR_SUCCESS) {\r
+               RegCloseKey(hKey);\r
+       }\r
+}\r
+\r
+void CProfile::SaveCommand(const CString szApplicationName, const int nCommandID)\r
+{\r
+       SaveKeyBind(szApplicationName, nCommandID, 0, 0);\r
+}\r
+\r
+void CProfile::AddKeyBind2C_(const CString szApplicationName, const BYTE bVk)\r
+{\r
+       for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               if (Commands[nCommandID].fCommand == CCommands::C_) {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       SaveKeyBind(szApplicationName, nCommandID, NONE, bVk);\r
+}\r
+\r
+void CProfile::LevelUp()\r
+{\r
+       const int nDefalutLevel = 0;\r
+       const int nLatestLevel = 4;\r
+\r
+       CString szSection;\r
+       CString szEntry;\r
+       szEntry.Format(_T("Level"));\r
+\r
+//     const int nCurrentLevel = AfxGetApp()->GetProfileInt(szSection, szEntry, nDefalutLevel);\r
+       switch (AfxGetApp()->GetProfileInt(szSection, szEntry, nDefalutLevel)) {\r
+       case nDefalutLevel:\r
+               {\r
+                       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                               CString szEntry;\r
+                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nApplicationID);\r
+\r
+                               CString szApplicationName;\r
+                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
+                               if (szApplicationName.IsEmpty()) {\r
+                                       continue;\r
+                               }\r
+\r
+                               AddKeyBind2C_(szApplicationName, VK_LCONTROL);\r
+                               AddKeyBind2C_(szApplicationName, VK_RCONTROL);\r
+                       }\r
+               }\r
+               // Do NOT write break; here.\r
+       case 1:\r
+               {\r
+                       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                               CString szEntry;\r
+                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nApplicationID);\r
+\r
+                               CString szApplicationName;\r
+                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
+                               if (szApplicationName.IsEmpty()) {\r
+                                       continue;\r
+                               }\r
+\r
+                               // Set kill-ring-max 1 if it is 0.\r
+                               if (!AfxGetApp()->GetProfileInt(szApplicationName, CString(MAKEINTRESOURCE(IDS_REG_ENTRY_KILL_RING_MAX)), 0)) {\r
+                                       AfxGetApp()->WriteProfileInt(szApplicationName, CString(MAKEINTRESOURCE(IDS_REG_ENTRY_KILL_RING_MAX)), 1);\r
+                               }\r
+                       }\r
+               }\r
+               // Do NOT write break; here.\r
+       case 2:\r
+               {\r
+                       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                               CString szEntry;\r
+                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nApplicationID);\r
+\r
+                               CString szApplicationName;\r
+                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
+                               if (szApplicationName.IsEmpty()) {\r
+                                       continue;\r
+                               }\r
+\r
+                               // Chaged a label from Enter to newline.\r
+                               CString szSrcSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
+                               szSrcSubKey += _T("\\") + szApplicationName + _T("\\") + _T("Enter");\r
+                               CString szDestSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
+                               szDestSubKey += _T("\\") + szApplicationName + _T("\\") + _T("newline");\r
+                               HKEY hKeyDest = NULL;\r
+                               if (RegCreateKeyEx(HKEY_CURRENT_USER, szDestSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyDest, NULL) == ERROR_SUCCESS) {\r
+                                       SHCopyKey(HKEY_CURRENT_USER, szSrcSubKey, hKeyDest, NULL);\r
+                                       SHDeleteKey(HKEY_CURRENT_USER, szSrcSubKey);\r
+                                       RegCloseKey(hKeyDest);\r
+                               }\r
+                       }\r
+               }\r
+               // Do NOT write break; here.\r
+       case 3:\r
+               {\r
+                       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                               CString szEntry;\r
+                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nApplicationID);\r
+\r
+                               CString szApplicationName;\r
+                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
+                               if (szApplicationName.IsEmpty()) {\r
+                                       continue;\r
+                               }\r
+\r
+                               // rename original function to remove IDS_REG_ORIGINAL_PREFIX\r
+                               for (int nFunctionID = 0; nFunctionID < CDotXkeymacs::GetFunctionNumber(); ++nFunctionID) {\r
+                                       HKEY hKey = NULL;\r
+                                       CString szSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
+                                       szSubKey += _T("\\") + szApplicationName + _T("\\") + CString(MAKEINTRESOURCE(IDS_REG_ORIGINAL_PREFIX)) + CDotXkeymacs::GetFunctionSymbol(nFunctionID);\r
+                                       if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\r
+                                               // Use registry data\r
+                                               TCHAR szKeyBind[128] = {'\0'};\r
+                                               DWORD dwKeyBind = sizeof(szKeyBind);\r
+                                               FILETIME ft = {'\0'};   // not use\r
+                                               for (DWORD dwIndex = 0; RegEnumKeyEx(hKey, dwIndex, szKeyBind, &dwKeyBind, NULL, NULL, NULL, &ft) == ERROR_SUCCESS; ++dwIndex) {\r
+                                                       int nCommandType = 0;\r
+                                                       int nKey = 0;\r
+                                                       ReadKeyBind(&nCommandType, &nKey, szKeyBind);\r
+                                                       SaveKeyBind(szApplicationName, CDotXkeymacs::GetFunctionSymbol(nFunctionID), nCommandType, nKey);\r
+\r
+                                                       memset(szKeyBind, 0, sizeof(szKeyBind));\r
+                                                       dwKeyBind = sizeof(szKeyBind);\r
+                                               }\r
+                                               RegCloseKey(hKey);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+//     case 4:\r
+//             foo();\r
+//     ...\r
+//     case nLatestLevel-1:\r
+//             bar();\r
+               AfxGetApp()->WriteProfileInt(szSection, szEntry, nLatestLevel);\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+}\r
+\r
+void CProfile::InitDllData()\r
+{\r
+       LoadRegistryData();\r
+       SetDllData();\r
+}\r
+\r
+void CProfile::ClearData(const CString szCurrentApplication)\r
+{\r
+       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+               if (m_XkeymacsData[nApplicationID].GetApplicationName() == szCurrentApplication) {\r
+                       break;\r
+               }\r
+       }\r
+       if (nApplicationID < MAX_APP) {\r
+               m_XkeymacsData[nApplicationID].ClearAll();\r
+       }\r
+}\r
+\r
+// return count of saved settings\r
+int CProfile::GetSavedSettingCount()\r
+{\r
+       int nSavedSetting = 0;\r
+\r
+       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+               CString szApplicationName;\r
+               szApplicationName = m_XkeymacsData[nApplicationID].GetApplicationName();\r
+               if (!szApplicationName.IsEmpty()) {\r
+                       ++nSavedSetting;\r
+               }\r
+       }\r
+\r
+       return nSavedSetting;\r
+}\r
+\r
+void CProfile::InitApplicationList(CComboBox *const cApplicationList)\r
+{\r
+       cApplicationList->ResetContent();\r
+\r
+       m_dwTasks = GetTaskList(m_TaskList, MAX_TASKS);\r
+\r
+       EnumWindows(EnumWindowsProc, (LPARAM)cApplicationList);\r
+\r
+       for (int i = 0; i < MAX_APP; ++i) {\r
+               CString szApplicationName       = m_XkeymacsData[i].GetApplicationName();\r
+               CString szApplicationTitle      = m_XkeymacsData[i].GetApplicationTitle();\r
+\r
+               CString szListItem;\r
+               szListItem.Format(IDS_APPLICATION_LIST_ITEM, szApplicationTitle, szApplicationName);\r
+               if (IsNotSameString(cApplicationList, szListItem)\r
+                && !IsDefault(szApplicationName)\r
+                && !IsDialog(szApplicationName)\r
+                && !szApplicationName.IsEmpty()) {\r
+                       cApplicationList->AddString(szListItem);\r
+               }\r
+       }\r
+\r
+       // Add IME\r
+       HKL hKL = GetKeyboardLayout(0);\r
+       if (ImmIsIME(hKL)) {\r
+               LPTSTR szIMEDescription = NULL;\r
+               UINT nIMEDescription = ImmGetDescription(hKL, NULL, 0);\r
+               if (nIMEDescription) {\r
+                       nIMEDescription += sizeof(TCHAR);       // for NULL\r
+                       if ((szIMEDescription = new TCHAR[nIMEDescription]) != NULL) {\r
+                               ImmGetDescription(hKL, szIMEDescription, nIMEDescription);\r
+                       }\r
+//                     CUtils::Log(_T("nIMEDescription = %d, szIMEDescription = _%s_"), nIMEDescription, szIMEDescription);\r
+               }\r
+\r
+               LPTSTR szIMEFileName = NULL;\r
+               UINT nIMEFileName = ImmGetIMEFileName(hKL, NULL, 0);\r
+               if (nIMEFileName) {\r
+                       nIMEFileName += sizeof(TCHAR);\r
+                       if ((szIMEFileName = new TCHAR[nIMEFileName]) != NULL) {\r
+                               ImmGetIMEFileName(hKL, szIMEFileName, nIMEFileName);\r
+                       }\r
+//                     CUtils::Log(_T("nIMEFileName = %d, szIMEFileName = _%s_"), nIMEFileName, szIMEFileName);\r
+               }\r
+\r
+               CString szIMETitle;\r
+               CString szIME(MAKEINTRESOURCE(IDS_IME_FILE_NAME));\r
+               szIMETitle.Format(IDS_APPLICATION_LIST_ITEM, szIMEDescription ? szIMEDescription : szIME, szIMEFileName ? szIMEFileName : szIME);\r
+//             CUtils::Log(_T("szIMETitle = _%s_, szIMEDescription = _%s_, szIMEFileName = _%s_"), szIMETitle, szIMEDescription, szIMEFileName);\r
+               if (IsNotSameString(cApplicationList, szIMETitle)) {\r
+                       cApplicationList->AddString(szIMETitle);\r
+               }\r
+\r
+               delete[] szIMEDescription;\r
+               szIMEDescription = NULL;\r
+               delete[] szIMEFileName;\r
+               szIMEFileName = NULL;\r
+       }\r
+\r
+       // Add Dialog\r
+       cApplicationList->InsertString(0, CString(MAKEINTRESOURCE(IDS_DIALOG_TITLE)));\r
+\r
+       // Add Default\r
+       cApplicationList->InsertString( 0, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
+       cApplicationList->SelectString(-1, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
+}\r
+\r
+DWORD CProfile::GetTaskList(PTASK_LIST pTask, const DWORD dwNumTasks)\r
+{\r
+       for (int i = 0; i < MAX_TASKS; ++i) {\r
+               ZeroMemory(&pTask[i], sizeof(PTASK_LIST));\r
+       }\r
+\r
+       OSVERSIONINFO verInfo = {0};\r
+       verInfo.dwOSVersionInfoSize = sizeof (verInfo);\r
+       GetVersionEx(&verInfo);\r
+       if (verInfo.dwPlatformId == VER_PLATFORM_WIN32_NT\r
+        && verInfo.dwMajorVersion < 5) {\r
+               return GetTaskListNT(pTask, dwNumTasks);\r
+       }\r
+\r
+       HMODULE hKernel = GetModuleHandle(_T("KERNEL32.DLL"));\r
+       if (!hKernel) {\r
+               return 0;\r
+       }\r
+\r
+       CREATESNAPSHOT pCreateToolhelp32Snapshot = (CREATESNAPSHOT)GetProcAddress(hKernel, "CreateToolhelp32Snapshot");\r
+       if (!pCreateToolhelp32Snapshot) {\r
+               return 0;\r
+       }\r
+\r
+       PROCESSWALK pProcess32First = (PROCESSWALK)GetProcAddress(hKernel, "Process32First");\r
+       if (!pProcess32First) {\r
+               return 0;\r
+       }\r
+\r
+       PROCESSWALK pProcess32Next = (PROCESSWALK)GetProcAddress(hKernel, "Process32Next");\r
+       if (!pProcess32Next) {\r
+               return 0;\r
+       }\r
+\r
+       HANDLE hProcessSnap = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\r
+       if (hProcessSnap == (HANDLE)-1) {\r
+               return 0;\r
+       }\r
+\r
+       DWORD dwTaskCount = 0;\r
+       PROCESSENTRY32 processEntry32 = {sizeof(PROCESSENTRY32)};\r
+       if (pProcess32First(hProcessSnap, &processEntry32)) {\r
+               do {\r
+                       LPTSTR pCurChar = NULL;\r
+                       for (pCurChar = processEntry32.szExeFile + lstrlen(processEntry32.szExeFile); *pCurChar != _T('\\') && pCurChar != processEntry32.szExeFile; --pCurChar) {\r
+                               ;\r
+                       }\r
+                       if (*pCurChar == _T('\\')) {\r
+                               ++pCurChar;\r
+                       }\r
+\r
+                       lstrcpy(pTask->ProcessName, pCurChar);\r
+                       pTask->dwProcessId = processEntry32.th32ProcessID;\r
+\r
+                       ++dwTaskCount;\r
+                       ++pTask;\r
+               } while (dwTaskCount < dwNumTasks && pProcess32Next(hProcessSnap, &processEntry32));\r
+       }\r
+\r
+       CloseHandle(hProcessSnap);\r
+       return dwTaskCount;\r
+}\r
+\r
+LPBYTE CProfile::GetCounters()\r
+{\r
+       LANGID lid = MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL);\r
+       CString szSubKey;\r
+       szSubKey.Format(CString(MAKEINTRESOURCE(IDS_REGSUBKEY_PERF)), lid);\r
+       HKEY hKey = NULL;\r
+       if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS) {\r
+               return NULL;\r
+       }\r
+\r
+       DWORD dwSize = 0;\r
+       if (RegQueryValueEx(hKey, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_COUNTERS)), NULL, NULL, NULL, &dwSize) != ERROR_SUCCESS) {\r
+               RegCloseKey(hKey);\r
+               return NULL;\r
+       }\r
+       LPBYTE pCounters = (LPBYTE) calloc(dwSize, sizeof(BYTE));\r
+       if (pCounters == NULL) {\r
+               RegCloseKey(hKey);\r
+               return NULL;\r
+       }\r
+       if (RegQueryValueEx(hKey, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_COUNTERS)), NULL, NULL, pCounters, &dwSize) != ERROR_SUCCESS) {\r
+               RegCloseKey(hKey);\r
+               free(pCounters);\r
+               return NULL;\r
+       }\r
+       RegCloseKey(hKey);\r
+       return pCounters;\r
+}\r
+\r
+BOOL CProfile::GetProcessInfo(CString *const szProcessName, DWORD *const dwProcessId)\r
+{\r
+       LPBYTE pCounters = GetCounters();\r
+       if (!pCounters) {\r
+               return FALSE;\r
+       }\r
+       LPTSTR pTopOfString = (LPTSTR)pCounters;\r
+       while (*pTopOfString) {\r
+               if (_tcsicmp(pTopOfString, CString(MAKEINTRESOURCE(IDS_PROCESS))) == 0) {\r
+                       for (LPTSTR p2 = pTopOfString - 2; _istdigit(*p2); --p2) {\r
+                               ;\r
+                       }\r
+                       szProcessName->Format(_T("%s"), p2 + 1);        // 230\r
+               } else if (_tcsicmp(pTopOfString, CString(MAKEINTRESOURCE(IDS_PROCESSID))) == 0) {\r
+                       for (LPTSTR p2 = pTopOfString - 2; _istdigit(*p2); --p2) {\r
+                               ;\r
+                       }\r
+                       *dwProcessId = _ttol(p2 + 1);                   // 784\r
+               }\r
+               pTopOfString += (_tcslen(pTopOfString) + 1);\r
+       }\r
+       free(pCounters);\r
+       return TRUE;\r
+}\r
+\r
+PPERF_DATA_BLOCK CProfile::GetPerformanceData(const CString szProcessName)\r
+{\r
+       DWORD dwSize = INITIAL_SIZE;\r
+       PPERF_DATA_BLOCK pPerformanceData = (PPERF_DATA_BLOCK) calloc(dwSize, sizeof(BYTE));\r
+       if (pPerformanceData == NULL) {\r
+               return NULL;\r
+       }\r
+\r
+       for (;;) {\r
+               switch (RegQueryValueEx(HKEY_PERFORMANCE_DATA, szProcessName, NULL, NULL, (LPBYTE)pPerformanceData, &dwSize)) {\r
+               case ERROR_SUCCESS:\r
+                       if (0 < dwSize\r
+                        && pPerformanceData->Signature[0] == (WCHAR)'P'\r
+                        && pPerformanceData->Signature[1] == (WCHAR)'E'\r
+                        && pPerformanceData->Signature[2] == (WCHAR)'R'\r
+                        && pPerformanceData->Signature[3] == (WCHAR)'F') {\r
+                               return pPerformanceData;\r
+                       }\r
+               case ERROR_MORE_DATA:\r
+                       dwSize += EXTEND_SIZE;\r
+                       pPerformanceData = (PPERF_DATA_BLOCK) realloc(pPerformanceData, dwSize);\r
+                       if (!pPerformanceData) {\r
+                               return NULL;\r
+                       }\r
+                       memset(pPerformanceData, 0, dwSize);\r
+                       break;\r
+               default:\r
+                       free(pPerformanceData);\r
+                       return NULL;\r
+               }\r
+       }\r
+}\r
+\r
+// Add running application's names to the list\r
+// only for _Windows NT_\r
+DWORD CProfile::GetTaskListNT(PTASK_LIST pTask, DWORD dwNumTasks)\r
+{\r
+       CString szProcessName;\r
+       DWORD dwProcessIdTitle = 0;\r
+       if (!GetProcessInfo(&szProcessName, &dwProcessIdTitle)) {\r
+               return dwNumTasks;\r
+       }\r
+\r
+       PPERF_DATA_BLOCK pPerformanceData = GetPerformanceData(szProcessName);\r
+       if (!pPerformanceData) {\r
+               return dwNumTasks;\r
+       }\r
+\r
+       PPERF_OBJECT_TYPE pObj = (PPERF_OBJECT_TYPE) ((DWORD)pPerformanceData + pPerformanceData->HeaderLength);\r
+       PPERF_COUNTER_DEFINITION pCounterDef = (PPERF_COUNTER_DEFINITION) ((DWORD)pObj + pObj->HeaderLength);\r
+       DWORD dwProcessIdCounter = 0;\r
+       for (DWORD i = 0; i < pObj->NumCounters; ++i) {\r
+               if (pCounterDef->CounterNameTitleIndex == dwProcessIdTitle) {\r
+                       dwProcessIdCounter = pCounterDef->CounterOffset;\r
+                       break;\r
+               }\r
+               ++pCounterDef;\r
+       }\r
+\r
+       dwNumTasks = min(dwNumTasks - 1, (DWORD)pObj->NumInstances);\r
+       PPERF_INSTANCE_DEFINITION pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pObj + pObj->DefinitionLength);\r
+       for (i = 0; i < dwNumTasks; ++i) {\r
+               LPCWSTR pProcessName = (LPCWSTR) ((DWORD)pInst + pInst->NameOffset);\r
+\r
+               CHAR szProcessName[MAX_PATH] = {'\0'};\r
+               if (!WideCharToMultiByte(CP_ACP, 0, pProcessName, -1, szProcessName, sizeof(szProcessName), NULL, NULL)) {\r
+                       _tcscpy(pTask->ProcessName, CString(MAKEINTRESOURCE(IDS_UNKNOWN_TASK)));\r
+               }\r
+\r
+               if (_tcslen(szProcessName)+4 <= sizeof(pTask->ProcessName)) {\r
+                       _tcscpy(pTask->ProcessName, szProcessName);\r
+                       _tcscat(pTask->ProcessName, CString(MAKEINTRESOURCE(IDS_EXTENSION_EXECUTABLE)));\r
+               }\r
+\r
+               PPERF_COUNTER_BLOCK pCounter = (PPERF_COUNTER_BLOCK) ((DWORD)pInst + pInst->ByteLength);\r
+               pTask->dwProcessId = *((LPDWORD) ((DWORD)pCounter + dwProcessIdCounter));\r
+               if (pTask->dwProcessId == 0) {\r
+                       pTask->dwProcessId = (DWORD) -2;\r
+               }\r
+\r
+               ++pTask;\r
+               pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pCounter + pCounter->ByteLength);\r
+       }\r
+\r
+       free(pPerformanceData);\r
+       return dwNumTasks;\r
+}\r
+\r
+// return application index\r
+// and update setting style\r
+// if there is NOT the application in the data, this function takes care of it.\r
+int CProfile::GetApplicationIndex(const CString szApplicationName, const BOOL bSaveAndValidate, int *const nSettingStyle)\r
+{\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               *nSettingStyle = SETTING_UNDEFINED;\r
+       }\r
+\r
+       int nApplicationID = GetApplicationIndex(szApplicationName);\r
+\r
+       if (nApplicationID == MAX_APP) {\r
+               if (bSaveAndValidate) { // GetDialogData\r
+                       for (nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                               CString sz = m_XkeymacsData[nApplicationID].GetApplicationName();\r
+                               if (sz.IsEmpty()) {\r
+                                       m_XkeymacsData[nApplicationID].SetApplicationName(szApplicationName);\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if (nApplicationID == MAX_APP) {\r
+                               return nApplicationID;\r
+                       }\r
+               } else {                                // SetDialogData\r
+                       for (nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                               if (IsDefault(m_XkeymacsData[nApplicationID].GetApplicationName())) {\r
+                                       *nSettingStyle = SETTING_DEFAULT;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if (nApplicationID == MAX_APP) {\r
+                               return nApplicationID;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               m_XkeymacsData[nApplicationID].SetSettingStyle(*nSettingStyle);\r
+       } else {                                // SetDialogData\r
+               if (*nSettingStyle == SETTING_UNDEFINED) {      // It means that *nSettingStyle != SETTING_DEFAULT.\r
+                       *nSettingStyle = m_XkeymacsData[nApplicationID].GetSettingStyle();\r
+               }\r
+       }\r
+\r
+       return nApplicationID;\r
+}\r
+\r
+BOOL CProfile::IsTheString(const CString sz, const UINT nID)\r
+{\r
+       return sz == CString(MAKEINTRESOURCE(nID));\r
+}\r
+\r
+// if sz is "Default", return TRUE\r
+BOOL CProfile::IsDefault(const CString sz)\r
+{\r
+       return IsTheString(sz, IDS_DEFAULT);\r
+}\r
+\r
+// if sz is "Dialog", return TRUE\r
+BOOL CProfile::IsDialog(const CString sz)\r
+{\r
+       return IsTheString(sz, IDS_DIALOG);\r
+}\r
+\r
+void CProfile::GetApplicationTitle(CComboBox *const cApplicationList, CString &rList, const int nIndex)\r
+{\r
+       if (0 <= nIndex) {\r
+               cApplicationList->GetLBText(nIndex, rList);\r
+       } else {\r
+               cApplicationList->GetWindowText(rList);\r
+       }\r
+\r
+       if (IsTheString(rList, IDS_DEFAULT_TITLE)) {\r
+               rList.LoadString(IDS_DEFAULT);\r
+       }\r
+\r
+       if (IsTheString(rList, IDS_DIALOG_TITLE)) {\r
+               rList.LoadString(IDS_DIALOG);\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void CProfile::UpdateApplicationTitle(CComboBox *const cApplicationList, const CString szCurrentApplication, const int nApplicationID, const BOOL bSaveAndValidate)\r
+{\r
+       static CString szApplicationTitle;\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               if (!CProfile::IsDefault(szCurrentApplication)) {\r
+                       m_XkeymacsData[nApplicationID].SetApplicationTitle(szApplicationTitle);\r
+               }\r
+               szApplicationTitle.Empty();\r
+       } else {                                // SetDialogData\r
+               CString szListItem;\r
+               CProfile::GetApplicationTitle(cApplicationList, szListItem);\r
+               int nEndTitle = szListItem.ReverseFind(_T('('));\r
+               if (nEndTitle > 0) {\r
+                       szApplicationTitle = szListItem.Left(nEndTitle);\r
+               }\r
+       }\r
+}\r
+\r
+void CProfile::SetCommandID(const int nApplicationID, const int nCommandType, const int nKey, int nCommandID)\r
+{\r
+       if (nKey == 0xf0 && Commands[nCommandID].fCommand == CCommands::C_) {\r
+               // Change CommandID C_Eisu\r
+               for (nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                       if (Commands[nCommandID].fCommand == CCommands::C_Eisu) {\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+       m_XkeymacsData[nApplicationID].SetCommandID(nCommandType, nKey, nCommandID);\r
+}\r
+\r
+int CProfile::GetCommandID(const int nApplicationID, const int nCommandType, const int nKey)\r
+{\r
+       int nCommandID = m_XkeymacsData[nApplicationID].GetCommandID(nCommandType, nKey);\r
+       if (nKey == 0xf0 && Commands[nCommandID].fCommand == CCommands::C_Eisu) {\r
+               // Change CommandID C_\r
+               for (nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                       if (Commands[nCommandID].fCommand == CCommands::C_) {\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+       return nCommandID;\r
+}\r
+\r
+void CProfile::SetKillRingMax(const int nApplicationID, const int nKillRingMax)\r
+{\r
+       m_XkeymacsData[nApplicationID].SetKillRingMax(nKillRingMax);\r
+}\r
+\r
+int CProfile::GetKillRingMax(const int nApplicationID)\r
+{\r
+       return m_XkeymacsData[nApplicationID].GetKillRingMax();\r
+}\r
+\r
+void CProfile::SetUseDialogSetting(const int nApplicationID, const BOOL bUseDialogSetting)\r
+{\r
+       m_XkeymacsData[nApplicationID].SetUseDialogSetting(bUseDialogSetting);\r
+}\r
+\r
+BOOL CProfile::GetUseDialogSetting(const int nApplicationID)\r
+{\r
+       return m_XkeymacsData[nApplicationID].GetUseDialogSetting();\r
+}\r
+\r
+void CProfile::SetWindowText(const int nApplicationID, const CString szWindowText)\r
+{\r
+       m_XkeymacsData[nApplicationID].SetWindowText(szWindowText);\r
+}\r
+\r
+CString CProfile::GetWindowText(const int nApplicationID)\r
+{\r
+       return m_XkeymacsData[nApplicationID].GetWindowText();\r
+}\r
+\r
+void CProfile::DeleteAllRegistryData()\r
+{\r
+       HKEY hkey = NULL;\r
+       if (RegOpenKeyEx(HKEY_CURRENT_USER, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)), 0, KEY_ALL_ACCESS, &hkey) == ERROR_SUCCESS) {\r
+               // I am sure that I have to do only one time, but...\r
+               for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                       DWORD dwIndex = 0;\r
+                       TCHAR szName[SUB_KEY_NAME_LENGTH] = {'\0'};\r
+                       DWORD dwName = sizeof(szName);\r
+                       FILETIME filetime;\r
+\r
+                       while (RegEnumKeyEx(hkey, dwIndex, szName, &dwName, NULL, NULL, NULL, &filetime) == ERROR_SUCCESS) {\r
+//                             RegDeleteKey(hkey, szName);\r
+                               SHDeleteKey(hkey, szName);\r
+                               ZeroMemory(szName, sizeof(szName));\r
+                               dwName = sizeof(szName);\r
+                       }\r
+               }\r
+               RegCloseKey(hkey);\r
+       }\r
+}\r
+\r
+int CProfile::GetCurrentApplicationID(CComboBox *const cApplicationList, const CString szCurrentApplication)\r
+{\r
+       int nCounter = cApplicationList->GetCount();\r
+       CString szListItem;\r
+       int nCurSel = cApplicationList->GetCurSel();\r
+\r
+       for (int i = 0; i < nCounter; ++i) {\r
+               cApplicationList->SetCurSel(i);\r
+               CProfile::GetApplicationTitle(cApplicationList, szListItem);\r
+               if (szListItem.Find(szCurrentApplication) != -1) {\r
+                       cApplicationList->SetCurSel(nCurSel);\r
+                       return i;\r
+               }\r
+       }\r
+       return -1;\r
+}\r
+\r
+void CProfile::CopyData(const CString szDestinationApplication, const CString szSourceApplication)\r
+{\r
+       int nSettingStyle = SETTING_SPECIFIC;\r
+       int nDestinationApplication = GetApplicationIndex(szDestinationApplication, TRUE, &nSettingStyle);\r
+       int nSourceApplication = GetApplicationIndex(szSourceApplication);\r
+\r
+       CString szApplicationName = m_XkeymacsData[nDestinationApplication].GetApplicationName();\r
+       CString szApplicationTitle = m_XkeymacsData[nDestinationApplication].GetApplicationTitle();\r
+       CString szWindowText = m_XkeymacsData[nDestinationApplication].GetWindowText();\r
+       int nWindowTextType = m_XkeymacsData[nDestinationApplication].GetWindowTextType();\r
+\r
+       m_XkeymacsData[nDestinationApplication] = m_XkeymacsData[nSourceApplication];\r
+\r
+       m_XkeymacsData[nDestinationApplication].SetApplicationName(szApplicationName);\r
+       m_XkeymacsData[nDestinationApplication].SetApplicationTitle(szApplicationTitle);\r
+       m_XkeymacsData[nDestinationApplication].SetWindowText(szWindowText);\r
+       m_XkeymacsData[nDestinationApplication].SetWindowTextType(nWindowTextType);\r
+}\r
+\r
+// return application index\r
+// if there is NOT the application in the data, return MAX_APP\r
+int CProfile::GetApplicationIndex(const CString szApplicationName)\r
+{\r
+       int nApplicationID = 0;\r
+       for (nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+               if (m_XkeymacsData[nApplicationID].GetApplicationName() == szApplicationName) {\r
+                       break;\r
+               }\r
+       }\r
+       return nApplicationID;\r
+}\r
+\r
+BOOL CProfile::Is106Keyboard()\r
+{\r
+       static KEYBOARD_TYPE keyboard = UNKNOWN_KEYBOARD;\r
+\r
+       if (keyboard == UNKNOWN_KEYBOARD) {\r
+               OSVERSIONINFO verInfo = {0};\r
+               verInfo.dwOSVersionInfoSize = sizeof (verInfo);\r
+               GetVersionEx(&verInfo);\r
+\r
+               DWORD subtype = 0;\r
+               DWORD cbData = sizeof(subtype);\r
+\r
+               if (verInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {\r
+                       HKEY hKey = NULL;\r
+                       CString szSubKey(_T("SYSTEM\\CurrentControlSet\\Services\\i8042prt\\Parameters"));\r
+                       if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {\r
+                               static const CString szValueName(_T("OverrideKeyboardSubtype"));\r
+                               if (RegQueryValueEx(hKey, szValueName, NULL, NULL, (LPBYTE)&subtype, &cbData) != ERROR_SUCCESS) {\r
+                                       subtype = 0;\r
+                               }\r
+                               RegCloseKey(hKey);\r
+                       }\r
+               } else if (verInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {\r
+                       subtype = GetPrivateProfileInt(_T("keyboard"), _T("subtype"), 0, _T("system.ini"));\r
+               }\r
+\r
+               keyboard = (subtype & 0x02) ? JAPANESE_KEYBOARD : ENGLISH_KEYBOARD;\r
+       }\r
+\r
+       return keyboard == JAPANESE_KEYBOARD;\r
+}\r
+\r
+void CProfile::LoadScanCodeMap(const HKEY_TYPE hkeyType)\r
+{\r
+       memset(m_ScanCodeMap[hkeyType], 0, sizeof(m_ScanCodeMap[hkeyType]));\r
+       memset(m_CurrentScanCodeMap[hkeyType], 0, sizeof(m_CurrentScanCodeMap[hkeyType]));\r
+\r
+       CString szSubKey;\r
+       CString szValueName;\r
+       HKEY hKey = HKEY_LOCAL_MACHINE;\r
+       if (IsNT()) {\r
+               switch (hkeyType) {\r
+               case CURRENT_USER:\r
+                       hKey = HKEY_CURRENT_USER;\r
+                       szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT);\r
+                       break;\r
+               case LOCAL_MACHINE:\r
+                       szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT_ANY_USER);\r
+                       break;\r
+               default:\r
+                       return;\r
+               }\r
+               szValueName.LoadString(IDS_SCANCODE_MAP);\r
+       } else if (Is9x()) {\r
+               szSubKey.LoadString(IDS_REGSUBKEY_KEY_REMAP);\r
+               szValueName.LoadString(IDS_0);\r
+       } else {\r
+               return;\r
+       }\r
+\r
+       HKEY hkResult = NULL;\r
+       if (RegOpenKeyEx(hKey, szSubKey, 0, KEY_QUERY_VALUE, &hkResult) == ERROR_SUCCESS) {\r
+               // get data size\r
+               DWORD dwType = REG_BINARY;\r
+               DWORD dwData = 0;\r
+               RegQueryValueEx(hkResult, szValueName, NULL, &dwType, NULL, &dwData);\r
+\r
+               // get data\r
+               LPBYTE lpData = new BYTE[dwData];\r
+               if (lpData) {\r
+                       RegQueryValueEx(hkResult, szValueName, NULL, &dwType, lpData, &dwData);\r
+               }\r
+               RegCloseKey(hkResult);\r
+\r
+               if (IsNT()) {\r
+                       if (lpData && dwData) {\r
+                               DWORD offset = 0;\r
+                               offset += 8;    // skip Version Information and Flags\r
+                               DWORD *pdwMappings = (DWORD *)(lpData + offset);\r
+                               offset += 4;    // skip Number of Mappings\r
+                               DWORD *pdwNullTerminator = (DWORD *)(lpData + dwData - 4);\r
+\r
+                               if (4 * *pdwMappings + 12 != dwData) {\r
+                                       // illegal data\r
+                               } else if (*pdwNullTerminator != 0) {\r
+                                       // illegal data\r
+                               } else {\r
+                                       while (offset < dwData - 4) {\r
+                                               ScanCodeMapping_t *pScanCodeMapping = (ScanCodeMapping_t *)(lpData + offset);\r
+                                               offset += 4;    // go to next data\r
+\r
+                                               m_CurrentScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nPrefixedScanCode = pScanCodeMapping->current.nPrefixedScanCode;\r
+                                               m_CurrentScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nScanCode = pScanCodeMapping->current.nScanCode;\r
+                                               m_ScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nPrefixedScanCode = pScanCodeMapping->current.nPrefixedScanCode;\r
+                                               m_ScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nScanCode = pScanCodeMapping->current.nScanCode;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               delete[] lpData;\r
+               lpData = NULL;\r
+       }\r
+}\r
+\r
+int CProfile::LostKeyWarning(const HKEY_TYPE hkeyType)\r
+{\r
+       if (!ChangedKeyboardLayout(hkeyType)) {\r
+               return IDOK;\r
+       }\r
+\r
+       CString szLostKeysList;\r
+\r
+       for (int nPrefixedScanCodeID = 0; nPrefixedScanCodeID < 3; ++nPrefixedScanCodeID) {\r
+               for (int nScanCode = 0; nScanCode < 256; ++nScanCode) {\r
+                       if (m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode) {\r
+                               BOOL lostKey = TRUE;\r
+\r
+                               for (int i = 0; i < 3 && lostKey; ++i) {\r
+                                       for (int j = 0; j < 256 && lostKey; ++j) {\r
+                                               if (m_ScanCodeMap[hkeyType][i][j].nPrefixedScanCode == nPrefixedScanCodeID\r
+                                                && m_ScanCodeMap[hkeyType][i][j].nScanCode == nScanCode) {\r
+                                                       lostKey = FALSE;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               if (lostKey) {\r
+                                       for (int i = 0; i < sizeof(KeyboardLayouts)/sizeof(KeyboardLayouts[0]); ++i) {\r
+                                               if (KeyboardLayouts[i].scancode.nScanCode == nScanCode\r
+                                                       && KeyboardLayouts[i].scancode.nPrefixedScanCode == nPrefixedScanCodeID) {\r
+                                                       CString szLostKey;\r
+                                                       szLostKey.Format(IDS_ERR_LOST_KEY, CString(MAKEINTRESOURCE(GetToolTipID(KeyboardLayouts[i].nToolTipID))));\r
+                                                       szLostKeysList += szLostKey;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (szLostKeysList.IsEmpty()) {\r
+               return IDOK;\r
+       }\r
+\r
+       return AfxMessageBox(szLostKeysList, MB_OKCANCEL | MB_ICONEXCLAMATION);\r
+}\r
+\r
+void CProfile::SaveScanCodeMap(const HKEY_TYPE hkeyType)\r
+{\r
+       CString szSubKey;\r
+       CString szValueName;\r
+       HKEY hKey = HKEY_LOCAL_MACHINE;\r
+       if (IsNT()) {\r
+               switch (hkeyType) {\r
+               case CURRENT_USER:\r
+                       hKey = HKEY_CURRENT_USER;\r
+                       szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT);\r
+                       break;\r
+               case LOCAL_MACHINE:\r
+                       szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT_ANY_USER);\r
+                       break;\r
+               default:\r
+                       return;\r
+               }\r
+               szValueName.LoadString(IDS_SCANCODE_MAP);\r
+       } else if (Is9x()) {\r
+               szSubKey.LoadString(IDS_REGSUBKEY_KEY_REMAP);\r
+               szValueName.LoadString(IDS_0);\r
+       } else {\r
+               return;\r
+       }\r
+\r
+       HKEY hkResult = NULL;\r
+       if (RegCreateKeyEx(hKey, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hkResult, NULL) == ERROR_SUCCESS) {\r
+               if (IsNT()) {\r
+                       DWORD cbData = GetScanCodeLength(hkeyType);\r
+                       if (cbData <= 16) {\r
+                               RegDeleteValue(hkResult, szValueName);\r
+                       } else {\r
+                               LPBYTE lpData = new BYTE[cbData];\r
+                               memset(lpData, 0, sizeof(BYTE) * cbData);\r
+\r
+                               {\r
+                                       DWORD dwMappings = (cbData - 12) / 4;\r
+                                       memmove(lpData + 8, &dwMappings, 4);\r
+                               }\r
+\r
+                               int offset = 12;\r
+                               for (int nPrefixedScanCodeID = 0; nPrefixedScanCodeID < 3; ++nPrefixedScanCodeID) {\r
+                                       for (int nScanCode = 0; nScanCode < 256; ++nScanCode) {\r
+                                               if (m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode) {\r
+                                                       ScanCodeMapping_t sScanCodeMapping = {'\0'};\r
+                                                       sScanCodeMapping.original.nPrefixedScanCode = PrefixedScanCodeID2Code(nPrefixedScanCodeID);\r
+                                                       sScanCodeMapping.original.nScanCode = (BYTE)nScanCode;\r
+                                                       sScanCodeMapping.current.nPrefixedScanCode = m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nPrefixedScanCode;\r
+                                                       sScanCodeMapping.current.nScanCode = m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode;\r
+                                                       memcpy(lpData + offset, &sScanCodeMapping, sizeof(sScanCodeMapping));\r
+                                                       offset += sizeof(sScanCodeMapping);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               RegSetValueEx(hkResult, szValueName, 0, REG_BINARY, lpData, cbData);\r
+\r
+                               delete[] lpData;\r
+                               lpData = NULL;\r
+                       }\r
+               }\r
+               RegCloseKey(hkResult);\r
+       }\r
+\r
+       // Do you want to restart computer?\r
+       if (ChangedKeyboardLayout(hkeyType)) {\r
+               if (AfxMessageBox(CString(MAKEINTRESOURCE(IDS_RESTART_OR_NOT)), MB_YESNO | MB_ICONQUESTION) == IDYES) {\r
+                       RestartComputer();\r
+               }\r
+       }\r
+}\r
+\r
+// Return True if Windows 95, Windows 98, or Windows Me. \r
+BOOL CProfile::Is9x()\r
+{\r
+       OSVERSIONINFO info = {sizeof(OSVERSIONINFO)};\r
+       GetVersionEx(&info);\r
+\r
+       if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {\r
+               return TRUE;\r
+       }\r
+       return FALSE;\r
+}\r
+\r
+// Return True if Windows NT 4.0, Windows 2000, Windows XP, Windows 2003 or Windows Vista.\r
+BOOL CProfile::IsNT()\r
+{\r
+       OSVERSIONINFO info = {sizeof(OSVERSIONINFO)};\r
+       GetVersionEx(&info);\r
+\r
+       if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) {\r
+               return TRUE;\r
+       }\r
+       return FALSE;\r
+}\r
+\r
+// Return True if Windows Vista or later.\r
+BOOL CProfile::IsVistaOrLater()\r
+{\r
+       OSVERSIONINFO info = {sizeof(OSVERSIONINFO)};\r
+       GetVersionEx(&info);\r
+\r
+       if (6 <= info.dwMajorVersion) {\r
+               return TRUE;\r
+       }\r
+       return FALSE;\r
+}\r
+\r
+void CProfile::RestartComputer()\r
+{\r
+       if (!AdjustTokenPrivileges(SE_SHUTDOWN_NAME)) {\r
+               return;\r
+       }\r
+\r
+       ExitWindowsEx(EWX_REBOOT, 0);\r
+}\r
+\r
+int CProfile::GetControlID(const ScanCode_t scancode, const BOOL bBase)\r
+{\r
+       for (int i = 0; ; ++i) {\r
+               if (KeyboardLayouts[i].scancode.nPrefixedScanCode == scancode.nPrefixedScanCode\r
+                && KeyboardLayouts[i].scancode.nScanCode == scancode.nScanCode) {\r
+                       if (bBase) {\r
+                               return KeyboardLayouts[i].nBaseControlID;\r
+                       } else {\r
+                               return KeyboardLayouts[i].nCurrentControlID;\r
+                       }\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+int CProfile::GetBaseControlID(const ScanCode_t scancode)\r
+{\r
+       return GetControlID(scancode, TRUE);\r
+}\r
+\r
+int CProfile::GetCurrentControlID(const ScanCode_t scancode)\r
+{\r
+       return GetControlID(scancode, FALSE);\r
+}\r
+\r
+BOOL CProfile::GetScanCodeMap(const HKEY_TYPE hkeyType, const ScanCode_t original, ScanCode_t *const current)\r
+{\r
+       if (!current) {\r
+               return FALSE;\r
+       }\r
+       *current = m_ScanCodeMap[hkeyType][PrefixedScanCode2ID(original.nPrefixedScanCode)][original.nScanCode];\r
+       return 0 < current->nScanCode;\r
+}\r
+\r
+void CProfile::SetScanCodeMap(const HKEY_TYPE hkeyType, const ScanCodeMapping_t ScanCodeMappeing)\r
+{\r
+       m_ScanCodeMap[hkeyType][PrefixedScanCode2ID(ScanCodeMappeing.original.nPrefixedScanCode)][ScanCodeMappeing.original.nScanCode] = ScanCodeMappeing.current;\r
+}\r
+\r
+int CProfile::PrefixedScanCode2ID(const BYTE nPrefixedScanCode)\r
+{\r
+       int nID = 0;\r
+\r
+       switch (nPrefixedScanCode) {\r
+       case 0x00:\r
+               nID = 0;\r
+               break;\r
+       case 0xe0:\r
+               nID = 1;\r
+               break;\r
+       case 0xe1:\r
+               nID = 2;\r
+               break;\r
+       default:\r
+               // invalid scan code\r
+               nID = 3;\r
+               break;\r
+       }\r
+\r
+       return nID;\r
+}\r
+\r
+BYTE CProfile::PrefixedScanCodeID2Code(const int nPrefixedScanCodeID)\r
+{\r
+       BYTE nCode = 0;\r
+\r
+       switch (nPrefixedScanCodeID) {\r
+       case 0:\r
+               nCode = 0x00;\r
+               break;\r
+       case 1:\r
+               nCode = 0xe0;\r
+               break;\r
+       case 2:\r
+               nCode = 0xe1;\r
+               break;\r
+       default:\r
+               ASSERT(0);\r
+               break;\r
+       }\r
+\r
+       return nCode;\r
+}\r
+\r
+DWORD CProfile::GetScanCodeLength(const HKEY_TYPE hkeyType)\r
+{\r
+       DWORD dwScanCodeLength = 0;\r
+       dwScanCodeLength += 4;  // Header: Version Information\r
+       dwScanCodeLength += 4;  // Header: Flags\r
+       dwScanCodeLength += 4;  // Header: Number of Mappings\r
+       for (int nPrefixedScanCodeID = 0; nPrefixedScanCodeID < 3; ++nPrefixedScanCodeID) {\r
+               for (int nScanCode = 0; nScanCode < 256; ++nScanCode) {\r
+                       if (m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode) {\r
+                               dwScanCodeLength += 4;  // Individual Mappings\r
+                       }\r
+               }\r
+       }\r
+       dwScanCodeLength += 4;  // Null Terminator (0x00000000)\r
+       return dwScanCodeLength;\r
+}\r
+\r
+BOOL CProfile::ChangedKeyboardLayout(const HKEY_TYPE hkeyType)\r
+{\r
+       for (int nPrefixedScanCodeID = 0; nPrefixedScanCodeID < 3; ++nPrefixedScanCodeID) {\r
+               for (int nScanCode = 0; nScanCode < 256; ++nScanCode) {\r
+                       if (m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nPrefixedScanCode   != m_CurrentScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nPrefixedScanCode\r
+                        || m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode                   != m_CurrentScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode) {\r
+                               return TRUE;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return FALSE;\r
+}\r
+\r
+void CProfile::SetDraggingCursor()\r
+{\r
+       HCURSOR hCursor = (HCURSOR)LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_DRAG_CURSOR),\r
+                                                                                IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);\r
+       SetCursor(hCursor);\r
+}\r
+\r
+void CProfile::SetNormalCursor()\r
+{\r
+       HCURSOR hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW),\r
+                                                                                IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);\r
+       SetCursor(hCursor);\r
+}\r
+\r
+void CProfile::SetNoCursor()\r
+{\r
+       HCURSOR hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_NO),\r
+                                                                                IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);\r
+       SetCursor(hCursor);\r
+}\r
+\r
+int CProfile::GetToolTipID(int nToolTipID)\r
+{\r
+       if (Is106Keyboard()) {\r
+               switch (nToolTipID) {\r
+               case IDS_EQUAL:                 // ^\r
+                       nToolTipID = IDS_CARET;\r
+                       break;\r
+               case IDS_SQUARE_BRA:    // @\r
+                       nToolTipID = IDS_AT_MARK;\r
+                       break;\r
+               case IDS_SQUARE_CKET:   // [\r
+                       nToolTipID = IDS_SQUARE_BRA;\r
+                       break;\r
+               case IDS_QUOTE:                 // :\r
+                       nToolTipID = IDS_COLON;\r
+                       break;\r
+               case IDS_BACK_QUOTE:    // Hankaku/Zenkaku\r
+                       nToolTipID = IDS_HANKAKU;\r
+                       break;\r
+               case IDS_BACKSLASH:             // ]\r
+                       nToolTipID = IDS_SQUARE_CKET;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       return nToolTipID;\r
+}\r
+\r
+KeyboardLayout_t* CProfile::GetKeyboardLayouts(const int nKey)\r
+{\r
+       for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
+               if (KeyboardLayouts[i].nBaseControlID == nKey\r
+                || KeyboardLayouts[i].nCurrentControlID == nKey) {\r
+                       return &KeyboardLayouts[i];\r
+               }\r
+       }\r
+       return NULL;\r
+}\r
+\r
+BOOL CProfile::AdjustTokenPrivileges(LPCTSTR lpName)\r
+{\r
+       BOOL rc = TRUE;\r
+\r
+       if (IsNT()) {\r
+               HANDLE hToken;\r
+               if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {\r
+                       LUID luid;\r
+                       if (LookupPrivilegeValue(NULL, lpName, &luid)) {\r
+                               TOKEN_PRIVILEGES tp;\r
+                               tp.PrivilegeCount = 1;\r
+                               tp.Privileges[0].Luid = luid;\r
+                               tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\r
+\r
+                               if (!::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) {\r
+                                       rc = FALSE;\r
+                               }\r
+                       } else {\r
+                               rc = FALSE;\r
+                       }\r
+                       CloseHandle(hToken);\r
+               } else {\r
+                       rc = FALSE;\r
+               }\r
+       }\r
+\r
+       return rc;\r
+}\r
+\r
+BOOL CProfile::DiableTokenPrivileges()\r
+{\r
+       BOOL rc = TRUE;\r
+\r
+       if (IsNT()) {\r
+               HANDLE hToken;\r
+               if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {\r
+                       if (!::AdjustTokenPrivileges(hToken, TRUE, NULL, NULL, NULL, NULL)) {\r
+                               rc = FALSE;\r
+                       }\r
+                       CloseHandle(hToken);\r
+               } else {\r
+                       rc = FALSE;\r
+               }\r
+       }\r
+\r
+       return rc;\r
+}\r
+\r
+void CProfile::ExportProperties()\r
+{\r
+       if (!AdjustTokenPrivileges(SE_BACKUP_NAME)) {\r
+               return;\r
+       }\r
+\r
+       CFileDialog oFileOpenDialog(FALSE, _T("reg"), _T("xkeymacs"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, CString(MAKEINTRESOURCE(IDS_REGISTRATION_FILTER)));\r
+       if (oFileOpenDialog.DoModal() == IDOK) {\r
+               CString szCommandLine;\r
+               szCommandLine.Format(_T("regedit /e \"%s\" HKEY_CURRENT_USER\\%s"), oFileOpenDialog.GetPathName(), CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)));\r
+               CUtils::Run(szCommandLine, TRUE);       // regedit /e "x:\xkeymacs.reg" HKEY_CURRENT_USER\Software\Oishi\XKeymacs2\r
+       }\r
+\r
+       DiableTokenPrivileges();\r
+       return;\r
+}\r
+\r
+void CProfile::ImportProperties()\r
+{\r
+       if (!AdjustTokenPrivileges(SE_RESTORE_NAME)) {\r
+               return;\r
+       }\r
+\r
+       CFileDialog oFileOpenDialog(TRUE, _T("reg"), _T("xkeymacs"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, CString(MAKEINTRESOURCE(IDS_REGISTRATION_FILTER)));\r
+       if (oFileOpenDialog.DoModal() == IDOK) {\r
+               CString szCommandLine;\r
+               szCommandLine.Format(_T("regedit \"%s\""), oFileOpenDialog.GetPathName());\r
+               CUtils::Run(szCommandLine, TRUE);       // regedit "x:\xkeymacs.reg"\r
+       }\r
+\r
+       DiableTokenPrivileges();\r
+       return;\r
+}\r
+\r
+BOOL CProfile::GetEnableCUA(const int nApplicationID)\r
+{\r
+       return m_XkeymacsData[nApplicationID].GetEnableCUA();\r
+}\r
+\r
+void CProfile::SetEnableCUA(const int nApplicationID, const BOOL bEnableCUA)\r
+{\r
+       m_XkeymacsData[nApplicationID].SetEnableCUA(bEnableCUA);\r
+}\r
+\r
+int CProfile::GetKeyboardSpeed()\r
+{\r
+       int nKeyboardSpeed = 31; // default value of Windows\r
+       CString szSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_KEYBOARD));\r
+       CString szValueName(MAKEINTRESOURCE(IDS_KEYBOARD_SPEED));\r
+\r
+       HKEY hKey = NULL;\r
+       if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKey, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {\r
+               // get data size\r
+               DWORD dwType = REG_SZ;\r
+               BYTE data[4] = {0};\r
+               DWORD dwcbData = sizeof(data)/sizeof(data[0]);\r
+               RegQueryValueEx(hKey, szValueName, NULL, &dwType, (LPBYTE)&data, &dwcbData);\r
+               RegCloseKey(hKey);\r
+\r
+               for (DWORD i = 0; i < dwcbData; ++i) {\r
+                       if (data[i]) {\r
+                               if (i) {\r
+                                       nKeyboardSpeed = nKeyboardSpeed * 10 + data[i] - _T('0');\r
+                               } else {\r
+                                       nKeyboardSpeed = data[i] - _T('0');\r
+                               }\r
+                       } else {\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return nKeyboardSpeed;\r
+}\r
diff --git a/xkeymacs/profile.h b/xkeymacs/profile.h
new file mode 100644 (file)
index 0000000..bde529d
--- /dev/null
@@ -0,0 +1,293 @@
+// Profile.h: interface of the CProfile class\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)\r
+#define AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#include <winperf.h>   // for Windows NT\r
+#include "resource.h"\r
+\r
+#define PROCESS_SIZE        MAX_PATH\r
+\r
+//\r
+// Function pointer types for accessing Toolhelp32 functions dynamically.\r
+// By dynamically accessing these functions, we can do so only on Windows\r
+// 95 and still run on Windows NT, which does not have these functions.\r
+//\r
+#include <tlhelp32.h>  // for Windows 95\r
+typedef BOOL (WINAPI *PROCESSWALK)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);\r
+typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);\r
+\r
+typedef struct _TASK_LIST {\r
+    DWORD dwProcessId;\r
+    CHAR ProcessName[PROCESS_SIZE];\r
+} TASK_LIST, *PTASK_LIST;\r
+\r
+enum { MAX_TASKS = 256 };\r
+\r
+enum KEY_TYPE { NORMAL_KEY, PUSHED_KEY, DROPPABLE_KEY, ORIGINAL_KEY, REMAPPED_KEY, REMAPPED_PUSHED_KEY };\r
+enum HKEY_TYPE { CURRENT_USER, LOCAL_MACHINE, MAX_HKEY_TYPE }; // USERS, CLASSES_ROOT, CURRENT_CONFIG, \r
+\r
+typedef struct ScanCode\r
+{\r
+       BYTE nScanCode;\r
+       BYTE nPrefixedScanCode; // 0x00, 0xE0 or 0xE1   cf. Keyboard Scan Code Specification -- 16\r
+} ScanCode_t;\r
+\r
+typedef struct ScanCodeMapping\r
+{\r
+       ScanCode_t current;\r
+       ScanCode_t original;\r
+} ScanCodeMapping_t;\r
+\r
+class CKey;\r
+\r
+typedef struct KeyboardLayout\r
+{\r
+       ScanCode_t scancode;\r
+       int nBaseControlID;\r
+       int nCurrentControlID;\r
+       int nToolTipID;\r
+       CKey *pBaseKey;\r
+       CKey *pCurrentKey;\r
+} KeyboardLayout_t;\r
+\r
+static KeyboardLayout_t KeyboardLayouts[] = {\r
+       {{0x01, 0x00}, IDC_ESC,                         IDC_ESC_,                       IDS_ESC},\r
+       {{0x02, 0x00}, IDC_1,                           IDC_1_,                         IDS_1},\r
+       {{0x03, 0x00}, IDC_2,                           IDC_2_,                         IDS_2},\r
+       {{0x04, 0x00}, IDC_3,                           IDC_3_,                         IDS_3},\r
+       {{0x05, 0x00}, IDC_4,                           IDC_4_,                         IDS_4},\r
+       {{0x06, 0x00}, IDC_5,                           IDC_5_,                         IDS_5},\r
+       {{0x07, 0x00}, IDC_6,                           IDC_6_,                         IDS_6},\r
+       {{0x08, 0x00}, IDC_7,                           IDC_7_,                         IDS_7},\r
+       {{0x09, 0x00}, IDC_8,                           IDC_8_,                         IDS_8},\r
+       {{0x0a, 0x00}, IDC_9,                           IDC_9_,                         IDS_9},\r
+       {{0x0b, 0x00}, IDC_0,                           IDC_0_,                         IDS_0_},\r
+       {{0x0c, 0x00}, IDC_MINUS,                       IDC_MINUS_,                     IDS_MINUS},\r
+       {{0x0d, 0x00}, IDC_EQUAL,                       IDC_EQUAL_,                     IDS_EQUAL},             // =            /// ^\r
+       {{0x0e, 0x00}, IDC_BACKSPACE,           IDC_BACKSPACE_,         IDS_BACKSPACE},\r
+       {{0x0f, 0x00}, IDC_TAB,                         IDC_TAB_,                       IDS_TAB},\r
+       {{0x10, 0x00}, IDC_Q,                           IDC_Q_,                         IDS_Q},\r
+       {{0x11, 0x00}, IDC_W,                           IDC_W_,                         IDS_W},\r
+       {{0x12, 0x00}, IDC_E,                           IDC_E_,                         IDS_E},\r
+       {{0x13, 0x00}, IDC_R,                           IDC_R_,                         IDS_R},\r
+       {{0x14, 0x00}, IDC_T,                           IDC_T_,                         IDS_T},\r
+       {{0x15, 0x00}, IDC_Y,                           IDC_Y_,                         IDS_Y},\r
+       {{0x16, 0x00}, IDC_U,                           IDC_U_,                         IDS_U},\r
+       {{0x17, 0x00}, IDC_I,                           IDC_I_,                         IDS_I},\r
+       {{0x18, 0x00}, IDC_O,                           IDC_O_,                         IDS_O},\r
+       {{0x19, 0x00}, IDC_P,                           IDC_P_,                         IDS_P},\r
+       {{0x1a, 0x00}, IDC_SQUARE_BRA,          IDC_SQUARE_BRA_,        IDS_SQUARE_BRA},        // 101/104: [, 106/109: @\r
+       {{0x1b, 0x00}, IDC_SQUARE_CKET,         IDC_SQUARE_CKET_,       IDS_SQUARE_CKET},       // 101/104: ], 106/109: [\r
+       {{0x1c, 0x00}, IDC_ENTER,                       IDC_ENTER_,                     IDS_ENTER},\r
+       {{0x1c, 0xe0}, IDC_NUMPADENTER,         IDC_NUMPADENTER_,       IDS_NUMPADENTER},\r
+       {{0x1d, 0x00}, IDC_LEFT_CTRL,           IDC_LEFT_CTRL_,         IDS_LEFT_CTRL},\r
+       {{0x1d, 0xe0}, IDC_RIGHT_CTRL,          IDC_RIGHT_CTRL_,        IDS_RIGHT_CTRL},\r
+       {{0x1d, 0xe1}, IDC_PAUSE,                       IDC_PAUSE_,                     IDS_PAUSE},\r
+       {{0x1e, 0x00}, IDC_A,                           IDC_A_,                         IDS_A},\r
+       {{0x1f, 0x00}, IDC_S,                           IDC_S_,                         IDS_S},\r
+       {{0x20, 0x00}, IDC_D,                           IDC_D_,                         IDS_D},\r
+       {{0x21, 0x00}, IDC_F,                           IDC_F_,                         IDS_F},\r
+       {{0x22, 0x00}, IDC_G,                           IDC_G_,                         IDS_G},\r
+       {{0x23, 0x00}, IDC_H,                           IDC_H_,                         IDS_H},\r
+       {{0x24, 0x00}, IDC_J,                           IDC_J_,                         IDS_J},\r
+       {{0x25, 0x00}, IDC_K,                           IDC_K_,                         IDS_K},\r
+       {{0x26, 0x00}, IDC_L,                           IDC_L_,                         IDS_L},\r
+       {{0x27, 0x00}, IDC_SEMICOLON,           IDC_SEMICOLON_,         IDS_SEMICOLON},\r
+       {{0x28, 0x00}, IDC_QUOTE,                       IDC_QUOTE_,                     IDS_QUOTE},             // 101/104: ', 106/109: :\r
+       {{0x29, 0x00}, IDC_BACK_QUOTE,          IDC_BACK_QUOTE_,        IDS_BACK_QUOTE},        // 101/104: `, 106/109: hankaku/zenkaku\r
+       {{0x2a, 0x00}, IDC_LEFT_SHIFT,          IDC_LEFT_SHIFT_,        IDS_LEFT_SHIFT},\r
+       {{0x2b, 0x00}, IDC_BACKSLASH,           IDC_BACKSLASH_,         IDS_BACKSLASH}, // 101/104: \, 106/109: ]\r
+       {{0x2c, 0x00}, IDC_Z,                           IDC_Z_,                         IDS_Z},\r
+       {{0x2d, 0x00}, IDC_X,                           IDC_X_,                         IDS_X},\r
+       {{0x2e, 0x00}, IDC_C,                           IDC_C_,                         IDS_C},\r
+       {{0x2f, 0x00}, IDC_V,                           IDC_V_,                         IDS_V},\r
+       {{0x30, 0x00}, IDC_B,                           IDC_B_,                         IDS_B},\r
+       {{0x31, 0x00}, IDC_N,                           IDC_N_,                         IDS_N},\r
+       {{0x32, 0x00}, IDC_M,                           IDC_M_,                         IDS_M},\r
+       {{0x33, 0x00}, IDC_COMMA,                       IDC_COMMA_,                     IDS_COMMA},\r
+       {{0x34, 0x00}, IDC_PERIOD,                      IDC_PERIOD_,            IDS_PERIOD},\r
+       {{0x35, 0x00}, IDC_SLASH,                       IDC_SLASH_,                     IDS_SLASH},\r
+       {{0x35, 0xe0}, IDC_DIVIDE,                      IDC_DIVIDE_,            IDS_DIVIDE},\r
+       {{0x36, 0x00}, IDC_RIGHT_SHIFT,         IDC_RIGHT_SHIFT_,       IDS_RIGHT_SHIFT},\r
+       {{0x37, 0x00}, IDC_MULTIPLY,            IDC_MULTIPLY_,          IDS_MULTIPLY},\r
+       {{0x37, 0xe0}, IDC_PRINT_SCREEN,        IDC_PRINT_SCREEN_,      IDS_PRINT_SCREEN},\r
+       {{0x38, 0x00}, IDC_LEFT_ALT,            IDC_LEFT_ALT_,          IDS_LEFT_ALT},\r
+       {{0x38, 0xe0}, IDC_RIGHT_ALT,           IDC_RIGHT_ALT_,         IDS_RIGHT_ALT},\r
+       {{0x39, 0x00}, IDC_SPACE,                       IDC_SPACE_,                     IDS_SPACE},\r
+       {{0x3a, 0x00}, IDC_CAPS_LOCK,           IDC_CAPS_LOCK_,         IDS_CAPS_LOCK},\r
+       {{0x3b, 0x00}, IDC_F1,                          IDC_F1_,                        IDS_F1},\r
+       {{0x3c, 0x00}, IDC_F2,                          IDC_F2_,                        IDS_F2},\r
+       {{0x3d, 0x00}, IDC_F3,                          IDC_F3_,                        IDS_F3},\r
+       {{0x3e, 0x00}, IDC_F4,                          IDC_F4_,                        IDS_F4},\r
+       {{0x3f, 0x00}, IDC_F5,                          IDC_F5_,                        IDS_F5},\r
+       {{0x40, 0x00}, IDC_F6,                          IDC_F6_,                        IDS_F6},\r
+       {{0x41, 0x00}, IDC_F7,                          IDC_F7_,                        IDS_F7},\r
+       {{0x42, 0x00}, IDC_F8,                          IDC_F8_,                        IDS_F8},\r
+       {{0x43, 0x00}, IDC_F9,                          IDC_F9_,                        IDS_F9},\r
+       {{0x44, 0x00}, IDC_F10,                         IDC_F10_,                       IDS_F10},\r
+       {{0x45, 0xe0}, IDC_NUM_LOCK,            IDC_NUM_LOCK_,          IDS_NUM_LOCK},\r
+       {{0x46, 0x00}, IDC_SCROLL_LOCK,         IDC_SCROLL_LOCK_,       IDS_SCROLL_LOCK},\r
+       {{0x47, 0x00}, IDC_NUMPAD7,                     IDC_NUMPAD7_,           IDS_NUMPAD7},\r
+       {{0x47, 0xe0}, IDC_HOME,                        IDC_HOME_,                      IDS_HOME},\r
+       {{0x48, 0x00}, IDC_NUMPAD8,                     IDC_NUMPAD8_,           IDS_NUMPAD8},\r
+       {{0x48, 0xe0}, IDC_UP,                          IDC_UP_,                        IDS_UP},\r
+       {{0x49, 0x00}, IDC_NUMPAD9,                     IDC_NUMPAD9_,           IDS_NUMPAD9},\r
+       {{0x49, 0xe0}, IDC_PAGE_UP,                     IDC_PAGE_UP_,           IDS_PAGE_UP},\r
+       {{0x4a, 0x00}, IDC_SUBTRACT,            IDC_SUBTRACT_,          IDS_SUBTRACT},\r
+       {{0x4b, 0x00}, IDC_NUMPAD4,                     IDC_NUMPAD4_,           IDS_NUMPAD4},\r
+       {{0x4b, 0xe0}, IDC_LEFT,                        IDC_LEFT_,                      IDS_LEFT},\r
+       {{0x4c, 0x00}, IDC_NUMPAD5,                     IDC_NUMPAD5_,           IDS_NUMPAD5},\r
+       {{0x4d, 0x00}, IDC_NUMPAD6,                     IDC_NUMPAD6_,           IDS_NUMPAD6},\r
+       {{0x4d, 0xe0}, IDC_RIGHT,                       IDC_RIGHT_,                     IDS_RIGHT},\r
+       {{0x4e, 0x00}, IDC_ADD,                         IDC_ADD_,                       IDS_ADD},\r
+       {{0x4f, 0x00}, IDC_NUMPAD1,                     IDC_NUMPAD1_,           IDS_NUMPAD1},\r
+       {{0x4f, 0xe0}, IDC_END,                         IDC_END_,                       IDS_END},\r
+       {{0x50, 0x00}, IDC_NUMPAD2,                     IDC_NUMPAD2_,           IDS_NUMPAD2},\r
+       {{0x50, 0xe0}, IDC_DOWN,                        IDC_DOWN_,                      IDS_DOWN},\r
+       {{0x51, 0x00}, IDC_NUMPAD3,                     IDC_NUMPAD3_,           IDS_NUMPAD3},\r
+       {{0x51, 0xe0}, IDC_PAGE_DOWN,           IDC_PAGE_DOWN_,         IDS_PAGE_DOWN},\r
+       {{0x52, 0x00}, IDC_NUMPAD0,                     IDC_NUMPAD0_,           IDS_NUMPAD0},\r
+       {{0x52, 0xe0}, IDC_INSERT,                      IDC_INSERT_,            IDS_INSERT},\r
+       {{0x53, 0x00}, IDC_NUMPADDELETE,        IDC_NUMPADDELETE_,      IDS_NUMPADDELETE},\r
+       {{0x53, 0xe0}, IDC_DELETE,                      IDC_DELETE_,            IDS_DELETE},\r
+       {{0x57, 0x00}, IDC_F11,                         IDC_F11_,                       IDS_F11},\r
+       {{0x58, 0x00}, IDC_F12,                         IDC_F12_,                       IDS_F12},\r
+       {{0x5b, 0xe0}, IDC_LEFT_WINDOWS,        IDC_LEFT_WINDOWS_,      IDS_LEFT_WINDOWS},\r
+       {{0x5c, 0xe0}, IDC_RIGHT_WINDOWS,       IDC_RIGHT_WINDOWS_,     IDS_RIGHT_WINDOWS},\r
+       {{0x5d, 0xe0}, IDC_APPLICATION,         IDC_APPLICATION_,       IDS_APPLICATION},\r
+       {{0x5e, 0xe0}, IDC_ACPI_POWER,          IDC_ACPI_POWER_,        IDS_ACPI_POWER},\r
+       {{0x5f, 0xe0}, IDC_ACPI_SLEEP,          IDC_ACPI_SLEEP_,        IDS_ACPI_SLEEP},\r
+       {{0x63, 0xe0}, IDC_ACPI_WAKE,           IDC_ACPI_WAKE_,         IDS_ACPI_WAKE},\r
+       {{0x70, 0x00}, IDC_KANA,                        IDC_KANA_,                      IDS_KANA},\r
+       {{0x73, 0x00}, IDC_BACKSLASH2,          IDC_BACKSLASH2_,        IDS_BACKSLASH2},        // \  ,./\ \r
+       {{0x79, 0x00}, IDC_CONVERT,                     IDC_CONVERT_,           IDS_CONVERT},\r
+       {{0x7b, 0x00}, IDC_NONCONVERT,          IDC_NONCONVERT_,        IDS_NONCONVERT},\r
+       {{0x7d, 0x00}, IDC_BACKSLASH1,          IDC_BACKSLASH1_,        IDS_BACKSLASH1},        // \  -^\ \r
+};\r
+\r
+class CProfile\r
+{\r
+public:\r
+       static int GetKeyboardSpeed(void);\r
+       static int LostKeyWarning(HKEY_TYPE hkeyType);\r
+       static CString GetWindowText(int nApplicationID);\r
+       static void SetWindowText(int nApplicationID, CString szWindowText);\r
+       static void SetEnableCUA(int nApplicationID, BOOL bEnableCUA);\r
+       static BOOL GetEnableCUA(int nApplicationID);\r
+       static void ImportProperties();\r
+       static void ExportProperties();\r
+       static KeyboardLayout_t* GetKeyboardLayouts(int nKey);\r
+       static int GetToolTipID(int nToolTipID);\r
+       static void SetNoCursor();\r
+       static void SetNormalCursor();\r
+       static void SetDraggingCursor();\r
+       static void SetScanCodeMap(HKEY_TYPE hkeyType, ScanCodeMapping_t ScanCodeMappeing);\r
+       static int GetCurrentControlID(ScanCode_t scancode);\r
+       static int GetBaseControlID(ScanCode_t scancode);\r
+       static BOOL GetScanCodeMap(HKEY_TYPE hkeyType, ScanCode_t original, ScanCode_t *current);\r
+       static void RestartComputer();\r
+       static BOOL IsVistaOrLater();\r
+       static BOOL IsNT();\r
+       static BOOL Is9x();\r
+       static void SaveScanCodeMap(HKEY_TYPE hkeyType);\r
+       static void LoadScanCodeMap(HKEY_TYPE hkeyType);\r
+       static BOOL Is106Keyboard();\r
+       static BOOL IsDialog(CString sz);\r
+       static BOOL GetUseDialogSetting(int nApplicationID);\r
+       static void SetUseDialogSetting(int nApplicationID, BOOL bUseDialogSetting);\r
+       static int GetApplicationIndex(CString szApplicationName);\r
+       static void CopyData(CString szDestinationApplication, CString szSourceApplication);\r
+       static void ReadKeyBind(int *pnCommandType, int *pnKey, LPCTSTR szKeyBind);\r
+       static LPCTSTR Key2String(int nKey);\r
+       static LPCTSTR CommandType2String(int nCommandType);\r
+       static int GetCurrentApplicationID(CComboBox *cApplicationList, CString szCurrentApplication);\r
+       static int GetKillRingMax(int nApplicationID);\r
+       static void SetKillRingMax(int nApplicationID, int nKillRingMax);\r
+       static int GetCommandID(int nApplicationID, int nCommandType, int nKey);\r
+       static void SetCommandID(int nApplicationID, int nCommandType, int nKey, int nCommandID);\r
+       static void UpdateApplicationTitle(CComboBox *cApplicationList, CString szCurrentApplication, int nApplicationID, BOOL bSaveAndValidate);\r
+       static void GetApplicationTitle(CComboBox *cApplicationList, CString &rList, int nIndex = -1);\r
+       static BOOL IsDefault(CString sz);\r
+       static int GetApplicationIndex(CString szApplicationName, BOOL bSaveAndValidate, int *nSettingStyle);\r
+       static TASK_LIST m_TaskList[MAX_TASKS];\r
+       static DWORD m_dwTasks;\r
+       static void InitApplicationList(CComboBox *cApplicationList);\r
+       static int GetSavedSettingCount();\r
+       static void ClearData(CString szCurrentApplication);\r
+       static void InitDllData();\r
+       static void SaveRegistryData();\r
+       static void LoadRegistryData();\r
+       CProfile();\r
+       virtual ~CProfile();\r
+\r
+private:\r
+       static void SaveKeyBind(CString szApplicationName, CString szCommandName, int nCommandType, int nKey);\r
+       static BOOL DiableTokenPrivileges();\r
+       static BOOL AdjustTokenPrivileges(LPCTSTR lpName);\r
+       static void SaveCommand(CString szApplicationName, int nCommandID);\r
+       static void SaveKeyBind(CString szApplicationName, int nCommandID, int nCommandType, int nKey);\r
+       static void AddKeyBind2C_(CString szApplicationName, BYTE bVk);\r
+       static void LevelUp();\r
+       static BOOL ChangedKeyboardLayout(HKEY_TYPE hkeyType);\r
+       static BYTE PrefixedScanCodeID2Code(int nPrefixedScanCodeID);\r
+       static DWORD GetScanCodeLength(HKEY_TYPE hkeyType);\r
+       static int PrefixedScanCode2ID(BYTE nPrefixedScanCode);\r
+       static ScanCode_t m_CurrentScanCodeMap[MAX_HKEY_TYPE][4][256];\r
+       static ScanCode_t m_ScanCodeMap[MAX_HKEY_TYPE][4][256];\r
+       static int GetControlID(ScanCode_t scancode, BOOL bBase);\r
+       static void Item2AppName(CString *sz);\r
+       static int IsNotSameString(CComboBox *pApplication, CString szListItem);\r
+       static int CountSeparator(CString szMainString, CString szSeparator);\r
+       static void GetNthString(CString *szAppName, CString szWindowName, CString szSeparator, int n);\r
+       static void GetAppName(CString *szAppName, LPCTSTR pWindowName);\r
+       static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);\r
+       static BOOL IsTheString(CString sz, UINT nID);\r
+       static PPERF_DATA_BLOCK GetPerformanceData(CString szProcessName);\r
+       static BOOL GetProcessInfo(CString *szProcessName, DWORD *dwProcessId);\r
+       static LPBYTE GetCounters();\r
+       static void SetDllData();\r
+       static CXkeymacsData m_XkeymacsData[MAX_APP];\r
+       static void DeleteAllRegistryData();\r
+       static DWORD GetTaskListNT(PTASK_LIST pTask, DWORD dwNumTasks);\r
+       static DWORD GetTaskList(PTASK_LIST pTask, DWORD dwNumTasks);\r
+       static BOOL IsCommandType(int nCommandType, LPCTSTR szKeyBind);\r
+       static int KeyBind2Key(LPCTSTR szKey);\r
+       static int KeyBind2CommandType(LPCTSTR szKeyBind);\r
+       static CString WriteKeyBind(int nCommandType, int nKey);\r
+       static void UpdateRegistryData(BOOL bSaveAndValidate);\r
+};\r
+\r
+typedef struct CommandTypeName\r
+{\r
+       int nCommandType;\r
+       LPCTSTR szCommandTypeName;\r
+} CommandTypeName_t;\r
+\r
+static const CommandTypeName_t CommandTypes[] = {\r
+       {NONE,                                                  _T("")},\r
+       {SHIFT,                                                 _T("Shift+")},\r
+       {CONTROL,                                               _T("Ctrl+")},\r
+       {CONTROL+SHIFT,                                 _T("Ctrl+Shift+")},\r
+       {META,                                                  _T("Meta+")},\r
+       {META+SHIFT,                                    _T("Meta+Shift+")},\r
+       {CONTROL+META,                                  _T("Ctrl+Meta+")},\r
+       {CONTROL+META+SHIFT,                    _T("Ctrl+Meta+Shift+")},\r
+       {CONTROLX+NONE,                                 _T("Ctrl+X ")},\r
+       {CONTROLX+SHIFT,                                _T("Ctrl+X Shift+")},\r
+       {CONTROLX+CONTROL,                              _T("Ctrl+X Ctrl+")},\r
+       {CONTROLX+CONTROL+SHIFT,                _T("Ctrl+X Ctrl+Shift+")},\r
+       {CONTROLX+META,                                 _T("Ctrl+X Meta+")},\r
+       {CONTROLX+META+SHIFT,                   _T("Ctrl+X Meta+Shift+")},\r
+       {CONTROLX+CONTROL+META,                 _T("Ctrl+X Ctrl+Meta+")},\r
+       {CONTROLX+CONTROL+META+SHIFT,   _T("Ctrl+X Ctrl+Meta+Shift+")},\r
+};\r
+\r
+\r
+#endif // !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)\r
diff --git a/xkeymacs/properties.cpp b/xkeymacs/properties.cpp
new file mode 100644 (file)
index 0000000..b511057
--- /dev/null
@@ -0,0 +1,366 @@
+// Properties.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "Profile.h"\r
+#include "Properties.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CProperties dialog\r
+\r
+\r
+CProperties::CProperties(CWnd* pParent /*=NULL*/)\r
+       : CDialog(CProperties::IDD, pParent)\r
+{\r
+       m_nApplicationID = 0;\r
+       //{{AFX_DATA_INIT(CProperties)\r
+       m_nSettingStyle = -1;\r
+       m_nKillRingMax = 0;\r
+       //}}AFX_DATA_INIT\r
+}\r
+\r
+\r
+void CProperties::DoDataExchange(CDataExchange* pDX)\r
+{\r
+       CDialog::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(CProperties)\r
+       DDX_Control(pDX, IDC_WINDOW_TEXT, m_cWindowText);\r
+       DDX_Control(pDX, IDC_KILL_RING_MAX, m_cKillRingMax);\r
+       DDX_Control(pDX, IDC_USE_DIALOG_SETTING, m_cUseDialogSetting);\r
+       DDX_Control(pDX, IDC_SELECT_ALL, m_cSelectAll);\r
+       DDX_Control(pDX, IDC_CLEAR_ALL, m_cClearAll);\r
+       DDX_Control(pDX, IDC_LOAD_DEFAULT, m_cLoadDefault);\r
+       DDX_Control(pDX, IDC_APPLICATION, m_cApplication);\r
+       DDX_Radio(pDX, IDC_SETTING_DEFAULT, m_nSettingStyle);\r
+       DDX_Text(pDX, IDC_KILL_RING_MAX, m_nKillRingMax);\r
+       DDV_MinMaxInt(pDX, m_nKillRingMax, 0, 2147483647);\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CProperties, CDialog)\r
+       //{{AFX_MSG_MAP(CProperties)\r
+       ON_CBN_DROPDOWN(IDC_APPLICATION, OnDropdownApplication)\r
+       ON_CBN_SELCHANGE(IDC_APPLICATION, OnSelchangeApplication)\r
+       ON_BN_CLICKED(IDC_APPLY, OnApply)\r
+       ON_BN_CLICKED(IDC_LOAD_DEFAULT, OnLoadDefault)\r
+       ON_BN_CLICKED(IDC_SELECT_ALL, OnSelectAll)\r
+       ON_BN_CLICKED(IDC_CLEAR_ALL, OnClearAll)\r
+       ON_BN_CLICKED(IDC_SETTING_DEFAULT, OnSettingDefault)\r
+       ON_BN_CLICKED(IDC_SETTING_DISABLE, OnSettingDisable)\r
+       ON_BN_CLICKED(IDC_SETTING_SPECIFIC, OnSettingSpecific)\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CProperties message handlers\r
+\r
+BOOL CProperties::OnInitDialog() \r
+{\r
+       CDialog::OnInitDialog();\r
+       \r
+       // TODO: Add extra initialization here\r
+       while (m_sheet.GetPageCount()) {\r
+               m_sheet.RemovePage(0);\r
+       }\r
+\r
+       m_sheet.AddPage(&m_basic);\r
+       m_sheet.AddPage(&m_advanced);\r
+       m_sheet.AddPage(&m_list);\r
+\r
+       m_sheet.Create(this, WS_CHILD | WS_VISIBLE, 0);\r
+       m_sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);\r
+       m_sheet.ModifyStyle( 0, WS_TABSTOP );\r
+\r
+       CRect rcSheet;\r
+       GetDlgItem(IDC_TAB)->GetWindowRect(&rcSheet);\r
+       ScreenToClient(&rcSheet);\r
+       m_sheet.SetWindowPos(NULL, rcSheet.left - 11, rcSheet.top - 8, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);\r
+\r
+\r
+       SetForegroundWindow();\r
+\r
+       InitApplicationList();\r
+\r
+       CProfile::LoadRegistryData();\r
+       m_szCurrentApplication.LoadString(IDS_DEFAULT);\r
+       SetDialogData(m_szCurrentApplication);\r
+       EnableUseDefaultButton(FALSE);\r
+       EnableLoadDefaultButton(FALSE);\r
+\r
+       EnableControl(BASIC_TAB);\r
+\r
+       return TRUE;  // return TRUE unless you set the focus to a control\r
+                     // EXCEPTION: OCX Property Pages should return FALSE\r
+}\r
+\r
+void CProperties::OnDropdownApplication() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       InitApplicationList();\r
+\r
+       int nID = GetCurrentApplicationID();\r
+       if (nID != CB_ERR) {\r
+               m_cApplication.SetCurSel(nID);\r
+       } else {\r
+               GetDialogData();\r
+               m_szCurrentApplication.LoadString(IDS_DEFAULT_TITLE);\r
+               m_cApplication.SelectString(-1, m_szCurrentApplication);\r
+               SetDialogData(m_szCurrentApplication);\r
+       }\r
+}\r
+\r
+void CProperties::OnSelchangeApplication() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       GetDialogData();\r
+\r
+       CProfile::GetApplicationTitle(&m_cApplication, m_szCurrentApplication, m_cApplication.GetCurSel());\r
+       int nStart;\r
+       if ((nStart = m_szCurrentApplication.ReverseFind(_T('('))) != -1) {\r
+               ++nStart;\r
+               m_szCurrentApplication =\r
+                       m_szCurrentApplication.Mid(nStart, m_szCurrentApplication.GetLength() - nStart - 1);\r
+       }\r
+\r
+       SetDialogData(m_szCurrentApplication);\r
+       EnableControl(ACTIVE_TAB);\r
+}\r
+\r
+void CProperties::InitApplicationList()\r
+{\r
+       CProfile::InitApplicationList(&m_cApplication);\r
+}\r
+\r
+int CProperties::GetCurrentApplicationID()\r
+{\r
+       return CProfile::GetCurrentApplicationID(&m_cApplication, m_szCurrentApplication);\r
+}\r
+\r
+void CProperties::GetDialogData()\r
+{\r
+       if (m_nSettingStyle == SETTING_DEFAULT) {\r
+               CProfile::ClearData(m_szCurrentApplication);\r
+       } else {\r
+               UpdateDialogData(m_szCurrentApplication, TRUE);\r
+\r
+               if (m_sheet.GetActivePage() == &m_basic) {                      // FIXME\r
+                       m_basic.GetDialogData();\r
+               } else if (m_sheet.GetActivePage() == &m_advanced) {\r
+                       m_advanced.GetDialogData();\r
+               } else if (m_sheet.GetActivePage() ==  &m_list) {\r
+                       m_list.GetDialogData();\r
+               } else {\r
+                       ASSERT(0);\r
+               }\r
+       }\r
+}\r
+\r
+void CProperties::SetDialogData(CString szApplicationName)\r
+{\r
+       UpdateDialogData(szApplicationName, FALSE);\r
+\r
+       if (m_sheet.GetActivePage() == &m_basic) {                      // FIXME\r
+               m_basic.SetDialogData(szApplicationName);\r
+       } else if (m_sheet.GetActivePage() == &m_advanced) {\r
+               m_advanced.SetDialogData(szApplicationName);\r
+       } else if (m_sheet.GetActivePage() ==  &m_list) {\r
+               m_list.SetDialogData(szApplicationName);\r
+       } else {\r
+               ASSERT(0);\r
+       }\r
+}\r
+\r
+void CProperties::UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate)\r
+{\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               UpdateData();\r
+       }\r
+\r
+       m_nApplicationID = CProfile::GetApplicationIndex(szApplicationName, bSaveAndValidate, &m_nSettingStyle);\r
+\r
+       if (CProfile::IsDefault(szApplicationName)\r
+        || CProfile::IsDialog(szApplicationName)) {\r
+               EnableUseDefaultButton(FALSE);\r
+       } else {\r
+               EnableUseDefaultButton(TRUE);\r
+       }\r
+\r
+       // application title\r
+       CProfile::UpdateApplicationTitle(&m_cApplication, m_szCurrentApplication, m_nApplicationID, bSaveAndValidate);\r
+\r
+       // kill-ring-max\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               CProfile::SetKillRingMax(m_nApplicationID, m_nKillRingMax);\r
+       } else {                                // SetDialogData\r
+               m_nKillRingMax = CProfile::GetKillRingMax(m_nApplicationID);\r
+       }\r
+\r
+       // Use Dialog Setting\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               CProfile::SetUseDialogSetting(m_nApplicationID, m_cUseDialogSetting.GetCheck() == BST_CHECKED);\r
+       } else {                                // SetDialogData\r
+               m_cUseDialogSetting.SetCheck(CProfile::GetUseDialogSetting(m_nApplicationID) ? BST_CHECKED : BST_UNCHECKED);\r
+       }\r
+\r
+       // Check Window Title\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               CString szWindowText;\r
+               m_cWindowText.GetWindowText(szWindowText);\r
+               CProfile::SetWindowText(m_nApplicationID, szWindowText);\r
+       } else {                                // SetDialogData\r
+               m_cWindowText.SetWindowText(CProfile::GetWindowText(m_nApplicationID));\r
+       }\r
+\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               UpdateData(FALSE);\r
+       }\r
+}\r
+\r
+void CProperties::EnableControl(TAB_NAME tab)\r
+{\r
+       if (tab & ACTIVE_TAB) {\r
+               if (m_sheet.GetActivePage() == &m_basic) {      // FIXME\r
+                       tab = BASIC_TAB;\r
+               } else if (m_sheet.GetActivePage() == &m_advanced) {\r
+                       tab = ADVANCED_TAB;\r
+               } else if (m_sheet.GetActivePage() == &m_list) {\r
+                       tab = LIST_TAB;\r
+               }\r
+       }\r
+\r
+       BOOL bEnable = (m_nSettingStyle == SETTING_SPECIFIC);\r
+\r
+       m_cKillRingMax.EnableWindow(bEnable);\r
+       EnableLoadDefaultButton(bEnable);\r
+\r
+       m_cSelectAll.EnableWindow(bEnable && tab & BASIC_TAB);\r
+       m_cClearAll.EnableWindow(bEnable && tab & BASIC_TAB);\r
+\r
+       EnableUseDialogSettingButton(bEnable);\r
+\r
+       m_cWindowText.EnableWindow(bEnable);\r
+\r
+       if (tab & BASIC_TAB) {\r
+               m_basic.EnableControl();\r
+       }\r
+       if (tab & ADVANCED_TAB) {\r
+               m_advanced.EnableControl();\r
+       }\r
+       if (tab & LIST_TAB) {\r
+               m_list.EnableControl();\r
+       }\r
+}\r
+\r
+void CProperties::EnableUseDialogSettingButton(BOOL bEnable)\r
+{\r
+       m_cUseDialogSetting.EnableWindow(bEnable);\r
+       if (CProfile::IsDialog(m_szCurrentApplication)) {\r
+               m_cUseDialogSetting.EnableWindow(FALSE);\r
+       }\r
+}\r
+\r
+void CProperties::EnableLoadDefaultButton(BOOL bEnable)\r
+{\r
+       m_cLoadDefault.EnableWindow(bEnable);\r
+       if (CProfile::IsDefault(m_szCurrentApplication)) {\r
+               m_cLoadDefault.EnableWindow(FALSE);\r
+       }\r
+}\r
+\r
+void CProperties::EnableUseDefaultButton(BOOL bEnable)\r
+{\r
+       if (GetDlgItem(IDC_SETTING_DEFAULT)) {\r
+               GetDlgItem(IDC_SETTING_DEFAULT)->EnableWindow(bEnable);\r
+       }\r
+}\r
+\r
+void CProperties::OnOK() \r
+{\r
+       // TODO: Add extra validation here\r
+       OnApply();\r
+\r
+       CDialog::OnOK();\r
+}\r
+\r
+void CProperties::OnCancel() \r
+{\r
+       // TODO: Add extra cleanup here\r
+       CProfile::LoadRegistryData();\r
+\r
+       CDialog::OnCancel();\r
+}\r
+\r
+void CProperties::OnApply() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       GetDialogData();\r
+       CProfile::SaveRegistryData();\r
+}\r
+\r
+void CProperties::OnLoadDefault() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       CProfile::CopyData(m_szCurrentApplication, CString(MAKEINTRESOURCE(IDS_DEFAULT)));\r
+       SetDialogData(m_szCurrentApplication);\r
+}\r
+\r
+void CProperties::OnSelectAll() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       m_basic.SetAllDialogData(1, TRUE);\r
+}\r
+\r
+void CProperties::OnClearAll() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       m_basic.SetAllDialogData(0, TRUE);\r
+}\r
+\r
+int CProperties::GetApplicationID()\r
+{\r
+       return m_nApplicationID;\r
+}\r
+\r
+CString CProperties::GetCurrentApplication()\r
+{\r
+       return m_szCurrentApplication;\r
+}\r
+\r
+void CProperties::OnSettingDefault() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData();   // get data\r
+       EnableControl(ACTIVE_TAB);\r
+}\r
+\r
+void CProperties::OnSettingDisable() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData();\r
+       EnableControl(ACTIVE_TAB);\r
+}\r
+\r
+void CProperties::OnSettingSpecific() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData();\r
+       EnableControl(ACTIVE_TAB);\r
+\r
+       if (CProfile::GetApplicationIndex(m_szCurrentApplication) == MAX_APP) {\r
+               CProfile::CopyData(m_szCurrentApplication, CString(MAKEINTRESOURCE(IDS_DEFAULT)));\r
+               SetDialogData(m_szCurrentApplication);\r
+       }\r
+}\r
+\r
+BOOL CProperties::IsEnableControl()\r
+{\r
+       return m_nSettingStyle == SETTING_SPECIFIC;\r
+}\r
diff --git a/xkeymacs/properties.h b/xkeymacs/properties.h
new file mode 100644 (file)
index 0000000..c00cd61
--- /dev/null
@@ -0,0 +1,90 @@
+#if !defined(AFX_PROPERTIES_H__13ABBD97_6862_4CDA_86ED_4863B4845A1B__INCLUDED_)\r
+#define AFX_PROPERTIES_H__13ABBD97_6862_4CDA_86ED_4863B4845A1B__INCLUDED_\r
+\r
+#include "PropertiesBasic.h"   // Added by ClassView\r
+#include "PropertiesAdvanced.h"        // Added by ClassView\r
+#include "PropertiesList.h"    // Added by ClassView\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+enum TAB_NAME { BASIC_TAB = 1, ADVANCED_TAB = 2, LIST_TAB = 4, ACTIVE_TAB = 8 };\r
+\r
+// Properties.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CProperties dialog\r
+\r
+class CProperties : public CDialog\r
+{\r
+// Construction\r
+public:\r
+       CProperties(CWnd* pParent = NULL);   // standard constructor\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(CProperties)\r
+       enum { IDD = IDD_PROPERTIES };\r
+       CEdit   m_cWindowText;\r
+       CEdit   m_cKillRingMax;\r
+       CButton m_cUseDialogSetting;\r
+       CButton m_cSelectAll;\r
+       CButton m_cClearAll;\r
+       CButton m_cLoadDefault;\r
+       CComboBox       m_cApplication;\r
+       int             m_nSettingStyle;\r
+       int             m_nKillRingMax;\r
+       //}}AFX_DATA\r
+\r
+\r
+// Overrides\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(CProperties)\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+public:\r
+       BOOL IsEnableControl();\r
+       CString GetCurrentApplication();\r
+       int GetApplicationID();\r
+       void EnableControl(TAB_NAME tab = BASIC_TAB);\r
+protected:\r
+       // Generated message map functions\r
+       //{{AFX_MSG(CProperties)\r
+       virtual BOOL OnInitDialog();\r
+       afx_msg void OnDropdownApplication();\r
+       afx_msg void OnSelchangeApplication();\r
+       virtual void OnOK();\r
+       virtual void OnCancel();\r
+       afx_msg void OnApply();\r
+       afx_msg void OnLoadDefault();\r
+       afx_msg void OnSelectAll();\r
+       afx_msg void OnClearAll();\r
+       afx_msg void OnSettingDefault();\r
+       afx_msg void OnSettingDisable();\r
+       afx_msg void OnSettingSpecific();\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       int m_nApplicationID;\r
+       CPropertiesList m_list;\r
+       CPropertiesAdvanced m_advanced;\r
+       CPropertiesBasic m_basic;\r
+       CPropertySheet m_sheet;\r
+       CString m_szCurrentApplication;\r
+       void EnableLoadDefaultButton(BOOL bEnable);\r
+       void EnableUseDefaultButton(BOOL bEnable);\r
+       void EnableUseDialogSettingButton(BOOL bEnable);\r
+       int GetCurrentApplicationID();\r
+       void GetDialogData();\r
+       void InitApplicationList();\r
+       void SetDialogData(CString szApplicationName);\r
+       void UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate = TRUE);\r
+};\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_PROPERTIES_H__13ABBD97_6862_4CDA_86ED_4863B4845A1B__INCLUDED_)\r
diff --git a/xkeymacs/propertiesadvanced.cpp b/xkeymacs/propertiesadvanced.cpp
new file mode 100644 (file)
index 0000000..26d6564
--- /dev/null
@@ -0,0 +1,636 @@
+// PropertiesAdvanced.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "DotXkeymacs.h"\r
+#include "Profile.h"\r
+#include "Properties.h"\r
+#include "PropertiesAdvanced.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+#pragma data_seg(".xkmcs")\r
+       int     CPropertiesAdvanced::m_nApplicationID = 0;\r
+#pragma data_seg()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesAdvanced property page\r
+\r
+int CPropertiesAdvanced::m_nCommandID = 0;\r
+CEdit * CPropertiesAdvanced::m_pNewKey = NULL;\r
+CButton * CPropertiesAdvanced::m_pAssign = NULL;\r
+CStatic * CPropertiesAdvanced::m_pCurrentlyAssigned = NULL;\r
+CListBox * CPropertiesAdvanced::m_pCurrentKeys = NULL;\r
+HHOOK CPropertiesAdvanced::m_hKeyboardHook = NULL;\r
+BOOL CPropertiesAdvanced::m_bC_x = FALSE;\r
+BOOL CPropertiesAdvanced::m_bC = TRUE;\r
+BOOL CPropertiesAdvanced::m_bM = TRUE;\r
+BOOL CPropertiesAdvanced::m_bShift = TRUE;\r
+int CPropertiesAdvanced::m_nAssignCommandType = 0;\r
+int CPropertiesAdvanced::m_nAssignKey = 0;\r
+int CPropertiesAdvanced::m_nCommandIDs[MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
+\r
+IMPLEMENT_DYNCREATE(CPropertiesAdvanced, CPropertyPage)\r
+\r
+CPropertiesAdvanced::CPropertiesAdvanced() : CPropertyPage(CPropertiesAdvanced::IDD)\r
+{\r
+       //{{AFX_DATA_INIT(CPropertiesAdvanced)\r
+       m_bEnableCUA = FALSE;\r
+       //}}AFX_DATA_INIT\r
+}\r
+\r
+CPropertiesAdvanced::~CPropertiesAdvanced()\r
+{\r
+}\r
+\r
+void CPropertiesAdvanced::DoDataExchange(CDataExchange* pDX)\r
+{\r
+       CPropertyPage::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(CPropertiesAdvanced)\r
+       DDX_Control(pDX, IDC_CURRENTLY_ASSIGNED, m_cCurrentlyAssigned);\r
+       DDX_Control(pDX, IDC_RESET_ALL, m_cResetAll);\r
+       DDX_Control(pDX, IDC_REMOVE, m_cRemove);\r
+       DDX_Control(pDX, IDC_NEW_KEY, m_cNewKey);\r
+       DDX_Control(pDX, IDC_DESCRIPTION, m_cDescription);\r
+       DDX_Control(pDX, IDC_CURRENT_KEYS, m_cCurrentKeys);\r
+       DDX_Control(pDX, IDC_COMMANDS, m_cCommands);\r
+       DDX_Control(pDX, IDC_CATEGORY, m_cCategory);\r
+       DDX_Control(pDX, IDC_ASSIGN, m_cAssign);\r
+       DDX_Check(pDX, IDC_ENABLE_CUA, m_bEnableCUA);\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CPropertiesAdvanced, CPropertyPage)\r
+       //{{AFX_MSG_MAP(CPropertiesAdvanced)\r
+       ON_WM_CREATE()\r
+       ON_CBN_SELCHANGE(IDC_CATEGORY, OnSelchangeCategory)\r
+       ON_LBN_SELCHANGE(IDC_COMMANDS, OnSelchangeCommands)\r
+       ON_LBN_SELCHANGE(IDC_CURRENT_KEYS, OnSelchangeCurrentKeys)\r
+       ON_EN_SETFOCUS(IDC_NEW_KEY, OnSetfocusNewKey)\r
+       ON_BN_CLICKED(IDC_ASSIGN, OnAssign)\r
+       ON_BN_CLICKED(IDC_REMOVE, OnRemove)\r
+       ON_BN_CLICKED(IDC_RESET_ALL, OnResetAll)\r
+       ON_BN_CLICKED(IDC_C_X, OnCX)\r
+       ON_EN_KILLFOCUS(IDC_NEW_KEY, OnKillfocusNewKey)\r
+       ON_BN_CLICKED(IDC_ENABLE_CUA, OnEnableCua)\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesAdvanced message handlers\r
+\r
+BOOL CPropertiesAdvanced::OnSetActive() \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       m_pProperties->EnableControl(ADVANCED_TAB);\r
+       SetDialogData(m_pProperties->GetCurrentApplication());\r
+\r
+       return CPropertyPage::OnSetActive();\r
+}\r
+\r
+void CPropertiesAdvanced::SetDialogData(CString szApplicationName)\r
+{\r
+       UpdateDialogData(szApplicationName, FALSE);\r
+}\r
+\r
+void CPropertiesAdvanced::UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate)\r
+{\r
+       m_nApplicationID = m_pProperties->GetApplicationID();\r
+\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               UpdateData();\r
+       }\r
+\r
+       if (m_nApplicationID == MAX_APP) {      // FIXME\r
+               return;\r
+       }\r
+\r
+       InitCommandIDs();\r
+       m_bEnableCUA = CProfile::GetEnableCUA(m_nApplicationID);\r
+\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               SetCurrentKeys();\r
+       }\r
+\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               UpdateData(FALSE);\r
+       }\r
+}\r
+\r
+void CPropertiesAdvanced::GetDialogData()\r
+{\r
+       UpdateDialogData(m_pProperties->GetCurrentApplication(), TRUE);\r
+}\r
+\r
+int CPropertiesAdvanced::OnCreate(LPCREATESTRUCT lpCreateStruct) \r
+{\r
+       if (CPropertyPage::OnCreate(lpCreateStruct) == -1)\r
+               return -1;\r
+\r
+       // TODO: Add your specialized creation code here\r
+       m_pProperties = (CProperties *)GetParent()->GetParent();\r
+\r
+       return 0;\r
+}\r
+\r
+BOOL CPropertiesAdvanced::OnKillActive() \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       GetDialogData();\r
+\r
+       return CPropertyPage::OnKillActive();\r
+}\r
+\r
+void CPropertiesAdvanced::EnableControl()\r
+{\r
+       BOOL bEnable = m_pProperties->IsEnableControl();\r
+\r
+       m_cCategory.EnableWindow(bEnable);\r
+       m_cCommands.EnableWindow(bEnable);\r
+       m_cCurrentKeys.EnableWindow(bEnable);\r
+       m_cNewKey.EnableWindow(bEnable);\r
+\r
+       m_cAssign.EnableWindow(FALSE);\r
+       m_cRemove.EnableWindow(FALSE);\r
+       m_cResetAll.EnableWindow(bEnable);\r
+}\r
+\r
+BOOL CPropertiesAdvanced::OnInitDialog() \r
+{\r
+       CPropertyPage::OnInitDialog();\r
+\r
+       // TODO: Add extra initialization here\r
+       m_nApplicationID = m_pProperties->GetApplicationID();\r
+       InitCategoryList();\r
+       SetCommands();\r
+\r
+       SetDialogData(m_pProperties->GetCurrentApplication());\r
+\r
+       m_cAssign.EnableWindow(FALSE);\r
+       m_cRemove.EnableWindow(FALSE);\r
+\r
+       m_cCurrentlyAssigned.SetWindowText(_T(""));\r
+\r
+       return TRUE;  // return TRUE unless you set the focus to a control\r
+                     // EXCEPTION: OCX Property Pages should return FALSE\r
+}\r
+\r
+void CPropertiesAdvanced::InitCategoryList()\r
+{\r
+       int nCategoryIDs[128] = {'\0'};\r
+\r
+       // get all category type\r
+       m_cCategory.ResetContent();\r
+       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+               if (szCommandName.IsEmpty()) {\r
+                       break;\r
+               }\r
+               int nCategoryID = CXkeymacsData::GetCategoryID(nCommandID);\r
+               if (!nCategoryID) {\r
+                       continue;\r
+               }\r
+\r
+               BOOL bExist = FALSE;\r
+               for (int i = 0; nCategoryIDs[i]; ++i) {\r
+                       if (nCategoryIDs[i] == nCategoryID) {\r
+                               bExist = TRUE;\r
+                       }\r
+               }\r
+               if (!bExist) {\r
+                       nCategoryIDs[i] = nCategoryID;\r
+               }\r
+       }\r
+\r
+       // sort category type in combo box\r
+       int nMinimumID = 0;\r
+       for (int i = 0; nCategoryIDs[i]; ++i) {\r
+               int nID = 0;\r
+               for (int j = 0; nCategoryIDs[j]; ++j) {\r
+                       if (nMinimumID < nCategoryIDs[j]\r
+                        && (nID == 0 || nCategoryIDs[j] < nID)) {\r
+                               nID = nCategoryIDs[j];\r
+                       }\r
+               }\r
+               m_cCategory.InsertString(-1, CString(MAKEINTRESOURCE(nID)));\r
+               nMinimumID = nID;\r
+       }\r
+\r
+       if (CDotXkeymacs::GetFunctionNumber()) {\r
+               m_cCategory.InsertString(-1, CString(MAKEINTRESOURCE(IDS_ORIGINAL)));\r
+       }\r
+\r
+       m_cCategory.SetCurSel(0);\r
+}\r
+\r
+void CPropertiesAdvanced::SetCommands()\r
+{\r
+       m_cCommands.ResetContent();\r
+\r
+       CString szCategory;\r
+       m_cCategory.GetLBText(m_cCategory.GetCurSel(), szCategory);\r
+       if (szCategory.Compare(CString(MAKEINTRESOURCE(IDS_ORIGINAL)))) {\r
+               for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                       CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+                       if (szCommandName.IsEmpty()) {\r
+                               break;\r
+                       }\r
+\r
+                       if (szCategory == CString(MAKEINTRESOURCE(CXkeymacsData::GetCategoryID(nCommandID)))) {\r
+                               m_cCommands.AddString(szCommandName);\r
+                       }\r
+               }\r
+       } else {\r
+               for (int nFunctionID = 0; nFunctionID < CDotXkeymacs::GetFunctionNumber(); ++nFunctionID) {\r
+                       BOOL bOriginal = TRUE;\r
+                       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                               CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+                               if (szCommandName.IsEmpty()) {\r
+                                       break;\r
+                               }\r
+\r
+                               if (szCommandName == CDotXkeymacs::GetFunctionSymbol(nFunctionID)) {\r
+                                       bOriginal = FALSE;      // overwriting build-in keybindings\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if (bOriginal) {\r
+                               m_cCommands.AddString(CDotXkeymacs::GetFunctionSymbol(nFunctionID));\r
+                       }\r
+               }\r
+       }\r
+\r
+       m_cCommands.SetCurSel(0);\r
+       SetCurrentKeys();\r
+}\r
+\r
+void CPropertiesAdvanced::SetCurrentKeys()\r
+{\r
+       m_cCurrentKeys.ResetContent();\r
+       m_cRemove.EnableWindow(FALSE);\r
+\r
+       CString szCategory;\r
+       m_cCategory.GetLBText(m_cCategory.GetCurSel(), szCategory);\r
+\r
+       CString szCurrentCommandName;\r
+       m_cCommands.GetText(m_cCommands.GetCurSel(), szCurrentCommandName);\r
+\r
+       if (szCategory.Compare(CString(MAKEINTRESOURCE(IDS_ORIGINAL)))) {\r
+               for (int nCommandType = 0; nCommandType < MAX_COMMAND_TYPE; ++nCommandType) {\r
+                       for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
+                               if (CXkeymacsData::GetCommandName(CProfile::GetCommandID(m_nApplicationID, nCommandType, nKey)) == szCurrentCommandName) {\r
+                                       CString sz;\r
+                                       sz.Format(_T("%s%s"), CProfile::CommandType2String(nCommandType), CProfile::Key2String(nKey));\r
+                                       m_cCurrentKeys.AddString(sz);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               CString szCommandName;\r
+               for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                       szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+                       if (szCommandName.IsEmpty()) {\r
+                               break;\r
+                       }\r
+                       if (szCommandName == szCurrentCommandName) {\r
+                               m_nCommandID = nCommandID;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               m_cDescription.SetWindowText(CString(MAKEINTRESOURCE(CXkeymacsData::GetDescriptionID(m_nCommandID))));\r
+\r
+               // overwrite by original command's description if needed\r
+               for (int nFunctionID = 0; nFunctionID < CDotXkeymacs::GetFunctionNumber(); ++nFunctionID) {\r
+                       if (szCommandName == CDotXkeymacs::GetFunctionSymbol(nFunctionID)) {\r
+                               m_cDescription.SetWindowText(CDotXkeymacs::GetFunctionDefinition(szCurrentCommandName));\r
+                               break;\r
+                       }\r
+               }\r
+       } else {\r
+               const int nIndex = CDotXkeymacs::GetIndex(szCurrentCommandName);\r
+               for (int nKeyID = 0; nKeyID < CDotXkeymacs::GetKeyNumber(nIndex, m_nApplicationID); ++nKeyID) {\r
+                       int nCommandType = 0;\r
+                       int nKey = 0;\r
+                       CDotXkeymacs::GetKey(nIndex, m_nApplicationID, nKeyID, &nCommandType, &nKey);\r
+\r
+                       CString sz;\r
+                       sz.Format(_T("%s%s"), CProfile::CommandType2String(nCommandType), CProfile::Key2String(nKey));\r
+                       m_cCurrentKeys.AddString(sz);\r
+               }\r
+\r
+               m_cDescription.SetWindowText(CDotXkeymacs::GetFunctionDefinition(szCurrentCommandName));\r
+       }\r
+}\r
+\r
+void CPropertiesAdvanced::OnSelchangeCategory() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       SetCommands();\r
+       ClearNewKey();\r
+}\r
+\r
+void CPropertiesAdvanced::OnSelchangeCommands() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       BOOL bEnableWindow = FALSE;\r
+       CString szCurrentCommandName;\r
+       m_cCommands.GetText(m_cCommands.GetCurSel(), szCurrentCommandName);\r
+       if (szCurrentCommandName.CompareNoCase(_T("C-"))\r
+        && szCurrentCommandName.CompareNoCase(_T("Meta for Alt"))\r
+        && szCurrentCommandName.CompareNoCase(_T("Pass Through"))) {\r
+               bEnableWindow = TRUE;\r
+       }\r
+       GetDlgItem(IDC_C_X)->EnableWindow(bEnableWindow);\r
+       m_bC = bEnableWindow;\r
+       m_bM = bEnableWindow;\r
+       m_bShift = bEnableWindow;\r
+\r
+       SetCurrentKeys();\r
+       ClearNewKey();\r
+}\r
+\r
+void CPropertiesAdvanced::OnSelchangeCurrentKeys() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       TCHAR szKeyBind[128] = {'\0'};\r
+       m_cCurrentKeys.GetText(m_cCurrentKeys.GetCurSel(), szKeyBind);\r
+       CProfile::ReadKeyBind(&m_nRemoveCommandType, &m_nRemoveKey, szKeyBind);\r
+       m_cRemove.EnableWindow();\r
+}\r
+\r
+void CPropertiesAdvanced::OnSetfocusNewKey() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       m_pNewKey = &m_cNewKey;\r
+       m_pAssign = &m_cAssign;\r
+       m_pCurrentlyAssigned = &m_cCurrentlyAssigned;\r
+       m_pCurrentKeys = &m_cCurrentKeys;\r
+       m_hKeyboardHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)CPropertiesAdvanced::KeyboardProc, NULL, AfxGetApp()->m_nThreadID);\r
+\r
+       m_bC_x = IsDlgButtonChecked(IDC_C_X) && GetDlgItem(IDC_C_X)->IsWindowEnabled();\r
+}\r
+\r
+void CPropertiesAdvanced::OnAssign() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       // Remove Current Setting\r
+       CProfile::SetCommandID(m_nApplicationID, m_nAssignCommandType, m_nAssignKey, 0);\r
+       SetCommandID(m_nAssignCommandType, m_nAssignKey, 0);\r
+       CDotXkeymacs::RemoveKey(m_nApplicationID, m_nAssignCommandType, m_nAssignKey);\r
+\r
+       // Assign New Setting\r
+       CString szItem;\r
+       szItem.Format(_T("%s%s"), CProfile::CommandType2String(m_nAssignCommandType), CProfile::Key2String(m_nAssignKey));\r
+       if (m_cCurrentKeys.FindString(-1, szItem) == LB_ERR) {  // This key bind has not assignd to the same command yet.\r
+               CString szCategory;\r
+               m_cCategory.GetLBText(m_cCategory.GetCurSel(), szCategory);\r
+\r
+               if (szCategory.Compare(CString(MAKEINTRESOURCE(IDS_ORIGINAL)))) {\r
+                       CProfile::SetCommandID(m_nApplicationID, m_nAssignCommandType, m_nAssignKey, m_nCommandID);\r
+                       SetCommandID(m_nAssignCommandType, m_nAssignKey, m_nCommandID);\r
+               } else {\r
+                       CString szCurrentCommandName;\r
+                       m_cCommands.GetText(m_cCommands.GetCurSel(), szCurrentCommandName);\r
+                       CDotXkeymacs::SetKey(CDotXkeymacs::GetIndex(szCurrentCommandName), m_nApplicationID, m_nAssignCommandType, m_nAssignKey);\r
+               }\r
+               m_cCurrentKeys.AddString(szItem);\r
+       }\r
+\r
+       ClearNewKey();\r
+}\r
+\r
+void CPropertiesAdvanced::OnRemove() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       CString szCategory;\r
+       m_cCategory.GetLBText(m_cCategory.GetCurSel(), szCategory);\r
+\r
+       if (szCategory.Compare(CString(MAKEINTRESOURCE(IDS_ORIGINAL)))) {\r
+               CProfile::SetCommandID(m_nApplicationID, m_nRemoveCommandType, m_nRemoveKey, 0);\r
+               SetCommandID(m_nRemoveCommandType, m_nRemoveKey, 0);\r
+       } else {\r
+               CString szCurrentCommandName;\r
+               m_cCommands.GetText(m_cCommands.GetCurSel(), szCurrentCommandName);\r
+               CDotXkeymacs::RemoveKey(CDotXkeymacs::GetIndex(szCurrentCommandName), m_nApplicationID, m_nRemoveCommandType, m_nRemoveKey);\r
+       }\r
+\r
+       m_cCurrentKeys.DeleteString(m_cCurrentKeys.GetCurSel());\r
+       m_cRemove.EnableWindow(FALSE);\r
+       m_nRemoveCommandType = 0;\r
+       m_nRemoveKey = 0;\r
+}\r
+\r
+void CPropertiesAdvanced::OnResetAll() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       CProfile::LoadRegistryData();\r
+       InitCommandIDs();\r
+       SetCurrentKeys();\r
+}\r
+\r
+void CPropertiesAdvanced::ClearNewKey()\r
+{\r
+       m_cNewKey.SetWindowText(_T(""));\r
+       m_cAssign.EnableWindow(FALSE);\r
+       m_nAssignCommandType = 0;\r
+       m_nAssignKey = 0;\r
+       m_cCurrentlyAssigned.SetWindowText(_T(""));\r
+}\r
+\r
+LRESULT CALLBACK CPropertiesAdvanced::KeyboardProc(int code, WPARAM wParam, LPARAM lParam)\r
+{\r
+       if (code < 0 || code == HC_NOREMOVE) {\r
+               return ::CallNextHookEx(m_hKeyboardHook, code, wParam, lParam);\r
+       }\r
+\r
+       if (lParam & BEING_RELEASED) {  // Key Up\r
+       } else {                                                // Key Down\r
+               if (CProfile::IsNT()) {\r
+                       switch (wParam) {\r
+                       case VK_CONTROL:\r
+                               if (lParam & EXTENDED_KEY) {\r
+                                       wParam = VK_RCONTROL;\r
+                               } else {\r
+                                       wParam = VK_LCONTROL;\r
+                               }\r
+                               break;\r
+                       case VK_MENU:\r
+                               if (lParam & EXTENDED_KEY) {\r
+                                       wParam = VK_RMENU;\r
+                               } else {\r
+                                       wParam = VK_LMENU;\r
+                               }\r
+                               break;\r
+                       case VK_SHIFT:\r
+                               if (lParam & EXTENDED_KEY) {\r
+                                       wParam = VK_RSHIFT;\r
+                               } else {\r
+                                       wParam = VK_LSHIFT;\r
+                               }\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+               m_nAssignKey = wParam;\r
+               SetNewKey();\r
+       }\r
+\r
+       return TRUE;\r
+}\r
+\r
+void CPropertiesAdvanced::SetNewKey()\r
+{\r
+       CString szNewKey;\r
+       int nCommandType = NONE;\r
+\r
+       if (m_bC_x) {\r
+               szNewKey += _T("Ctrl+X ");\r
+               nCommandType += CONTROLX;\r
+       }\r
+       if (IsCtrlDown()) {\r
+               szNewKey += _T("Ctrl+");\r
+               nCommandType += CONTROL;\r
+       }\r
+       if (IsMetaDown()) {\r
+               szNewKey += _T("Meta+");\r
+               nCommandType += META;\r
+       }\r
+       if (IsShiftDown()) {\r
+               szNewKey += _T("Shift+");\r
+               nCommandType += SHIFT;\r
+       }\r
+\r
+       m_nAssignCommandType = nCommandType;\r
+\r
+       szNewKey += CProfile::Key2String(m_nAssignKey);\r
+       if (m_pNewKey) {\r
+               m_pNewKey->SetWindowText(szNewKey);\r
+       }\r
+\r
+       if (m_pAssign) {\r
+               BOOL bEnable = TRUE;\r
+               if (m_pCurrentKeys\r
+                && m_pCurrentKeys->FindString(-1, szNewKey) != LB_ERR) {       // This key bind is already assigned.\r
+                       bEnable = FALSE;\r
+               }\r
+               m_pAssign->EnableWindow(bEnable);\r
+       }\r
+\r
+       if (m_pCurrentlyAssigned) {\r
+               CString szCurrentlyAssigned(_T("Currently assigned to:\n"));\r
+\r
+               if (m_nCommandIDs[m_nAssignCommandType][m_nAssignKey] || CDotXkeymacs::GetIndex(m_nApplicationID, m_nAssignCommandType, m_nAssignKey) == -1) {\r
+                       szCurrentlyAssigned += CXkeymacsData::GetCommandName(m_nCommandIDs[m_nAssignCommandType][m_nAssignKey]);\r
+               } else {\r
+                       szCurrentlyAssigned += CDotXkeymacs::GetFunctionSymbol(CDotXkeymacs::GetIndex(m_nApplicationID, m_nAssignCommandType, m_nAssignKey));\r
+               }\r
+               m_pCurrentlyAssigned->SetWindowText(szCurrentlyAssigned);\r
+       }\r
+}\r
+\r
+void CPropertiesAdvanced::SetCommandID(int nCommandType, int nKey, int nCommandID)\r
+{\r
+       m_nCommandIDs[nCommandType][nKey] = nCommandID;\r
+\r
+       // Set C-x if it is needed.\r
+       if ((nCommandType & CONTROLX)) {\r
+               // Get CommandID of C-x.\r
+               for (int nCommandIDofC_x = 0; nCommandIDofC_x < sizeof(Commands) / sizeof(Commands[0]); ++nCommandIDofC_x) {\r
+                       if (!_tcsicmp(CXkeymacsData::GetCommandName(nCommandIDofC_x), _T("C-x"))) {\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (nCommandID) {\r
+                       m_nCommandIDs[CONTROL]['X'] = nCommandIDofC_x;\r
+               } else {\r
+                       for (int i = 0; i < MAX_COMMAND_TYPE; ++i) {    // i is command-type.\r
+                               if (!(i & CONTROLX)) {\r
+                                       continue;\r
+                               }\r
+                               for (int j = 0; j < MAX_KEY; ++j) {             // j is key.\r
+                                       if (m_nCommandIDs[i][j]) {\r
+                                               m_nCommandIDs[CONTROL]['X'] = nCommandIDofC_x;  // needless\r
+                                               return;\r
+                                       }\r
+                               }\r
+                       }\r
+                       m_nCommandIDs[CONTROL]['X'] = 0;\r
+               }\r
+       }\r
+}\r
+\r
+void CPropertiesAdvanced::InitCommandIDs()\r
+{\r
+       for (int nCommandType = 0; nCommandType < MAX_COMMAND_TYPE; ++nCommandType) {\r
+               for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
+                       SetCommandID(nCommandType, nKey, CProfile::GetCommandID(m_nApplicationID, nCommandType, nKey));\r
+               }\r
+       }\r
+}\r
+\r
+void CPropertiesAdvanced::OnCX() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       if (m_nAssignKey) {\r
+               OnSetfocusNewKey();\r
+               SetNewKey();\r
+       }\r
+}\r
+\r
+void CPropertiesAdvanced::OnKillfocusNewKey() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       if (m_hKeyboardHook) {\r
+               ::UnhookWindowsHookEx(m_hKeyboardHook);\r
+       }\r
+       m_hKeyboardHook = NULL;\r
+}\r
+\r
+void CPropertiesAdvanced::OnEnableCua() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData();\r
+       CProfile::SetEnableCUA(m_nApplicationID, m_bEnableCUA);\r
+}\r
+\r
+BOOL CPropertiesAdvanced::IsCtrlDown()\r
+{\r
+       return m_bC && IsFooDown(CString(_T("C-")));\r
+}\r
+\r
+BOOL CPropertiesAdvanced::IsMetaDown()\r
+{\r
+       return m_bM && IsFooDown(CString(_T("Meta for Alt")));\r
+}\r
+\r
+BOOL CPropertiesAdvanced::IsShiftDown()\r
+{\r
+       // temporary code\r
+       return m_bShift\r
+               && (GetKeyState(VK_SHIFT ) < 0\r
+                || GetKeyState(VK_LSHIFT) < 0\r
+                || GetKeyState(VK_RSHIFT) < 0);\r
+\r
+//     return m_bShift && IsFooDown(CString("Foo"));\r
+}\r
+\r
+BOOL CPropertiesAdvanced::IsFooDown(CString szCommandName)\r
+{\r
+       for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
+               if (CXkeymacsData::GetCommandName(CProfile::GetCommandID(0, NONE, nKey)) == szCommandName) {    // FIXME\r
+                       if (GetKeyState(nKey) < 0) {\r
+                               return TRUE;\r
+                       }\r
+               }\r
+       }\r
+       return FALSE;\r
+}\r
diff --git a/xkeymacs/propertiesadvanced.h b/xkeymacs/propertiesadvanced.h
new file mode 100644 (file)
index 0000000..cc1e250
--- /dev/null
@@ -0,0 +1,105 @@
+#if !defined(AFX_PROPERTIESADVANCED_H__41C61B2B_97BA_4015_8F1E_CA65AC628E42__INCLUDED_)\r
+#define AFX_PROPERTIESADVANCED_H__41C61B2B_97BA_4015_8F1E_CA65AC628E42__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+// PropertiesAdvanced.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesAdvanced dialog\r
+\r
+class CPropertiesAdvanced : public CPropertyPage\r
+{\r
+       DECLARE_DYNCREATE(CPropertiesAdvanced)\r
+\r
+// Construction\r
+public:\r
+       void EnableControl();\r
+       void GetDialogData();\r
+       void SetDialogData(CString szApplicationName);\r
+       CPropertiesAdvanced();\r
+       ~CPropertiesAdvanced();\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(CPropertiesAdvanced)\r
+       enum { IDD = IDD_PROPERTIES_ADVANCED };\r
+       CStatic m_cCurrentlyAssigned;\r
+       CButton m_cResetAll;\r
+       CButton m_cRemove;\r
+       CEdit   m_cNewKey;\r
+       CStatic m_cDescription;\r
+       CListBox        m_cCurrentKeys;\r
+       CListBox        m_cCommands;\r
+       CComboBox       m_cCategory;\r
+       CButton m_cAssign;\r
+       BOOL    m_bEnableCUA;\r
+       //}}AFX_DATA\r
+\r
+\r
+// Overrides\r
+       // ClassWizard generate virtual function overrides\r
+       //{{AFX_VIRTUAL(CPropertiesAdvanced)\r
+       public:\r
+       virtual BOOL OnSetActive();\r
+       virtual BOOL OnKillActive();\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+protected:\r
+       // Generated message map functions\r
+       //{{AFX_MSG(CPropertiesAdvanced)\r
+       afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);\r
+       virtual BOOL OnInitDialog();\r
+       afx_msg void OnSelchangeCategory();\r
+       afx_msg void OnSelchangeCommands();\r
+       afx_msg void OnSelchangeCurrentKeys();\r
+       afx_msg void OnSetfocusNewKey();\r
+       afx_msg void OnAssign();\r
+       afx_msg void OnRemove();\r
+       afx_msg void OnResetAll();\r
+       afx_msg void OnCX();\r
+       afx_msg void OnKillfocusNewKey();\r
+       afx_msg void OnEnableCua();\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       static int m_nApplicationID;\r
+       static BOOL IsFooDown(CString szCommandName);\r
+       static BOOL IsShiftDown();\r
+       static BOOL IsMetaDown();\r
+       static BOOL IsCtrlDown();\r
+       void InitCommandIDs();\r
+       static void SetCommandID(int nCommandType, int nKey, int nCommandID);\r
+       static int m_nCommandIDs[MAX_COMMAND_TYPE][MAX_KEY];\r
+       static void SetNewKey();\r
+       static int m_nAssignKey;\r
+       static int m_nAssignCommandType;\r
+       static BOOL m_bShift;\r
+       static BOOL m_bM;\r
+       static BOOL m_bC;\r
+       static BOOL m_bC_x;\r
+       static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);\r
+       static HHOOK m_hKeyboardHook;\r
+       static CListBox * m_pCurrentKeys;\r
+       static CStatic * m_pCurrentlyAssigned;\r
+       static CButton * m_pAssign;\r
+       static CEdit * m_pNewKey;\r
+       int m_nRemoveKey;\r
+       int m_nRemoveCommandType;\r
+       void ClearNewKey();\r
+       static int m_nCommandID;\r
+       void SetCurrentKeys();\r
+       void SetCommands();\r
+       void InitCategoryList();\r
+       CProperties* m_pProperties;\r
+       void UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate = TRUE);\r
+};\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_PROPERTIESADVANCED_H__41C61B2B_97BA_4015_8F1E_CA65AC628E42__INCLUDED_)\r
diff --git a/xkeymacs/propertiesbasic.cpp b/xkeymacs/propertiesbasic.cpp
new file mode 100644 (file)
index 0000000..a9604a6
--- /dev/null
@@ -0,0 +1,760 @@
+// PropertiesBasic.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "DotXkeymacs.h"\r
+#include "Profile.h"\r
+#include "Properties.h"\r
+#include "PropertiesBasic.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesBasic property page\r
+\r
+IMPLEMENT_DYNCREATE(CPropertiesBasic, CPropertyPage)\r
+\r
+CPropertiesBasic::CPropertiesBasic() : CPropertyPage(CPropertiesBasic::IDD)\r
+{\r
+       //{{AFX_DATA_INIT(CPropertiesBasic)\r
+       //}}AFX_DATA_INIT\r
+}\r
+\r
+CPropertiesBasic::~CPropertiesBasic()\r
+{\r
+}\r
+\r
+void CPropertiesBasic::DoDataExchange(CDataExchange* pDX)\r
+{\r
+       CPropertyPage::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(CPropertiesBasic)\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CPropertiesBasic, CPropertyPage)\r
+       //{{AFX_MSG_MAP(CPropertiesBasic)\r
+       ON_WM_CREATE()\r
+       ON_BN_CLICKED(IDC_ALT, OnAlt)\r
+       ON_BN_CLICKED(IDC_C_, OnC_)\r
+       ON_BN_CLICKED(IDC_CA, OnCa)\r
+       ON_BN_CLICKED(IDC_CB, OnCb)\r
+       ON_BN_CLICKED(IDC_CBACKSLASH, OnCbackslash)\r
+       ON_BN_CLICKED(IDC_CBACKSLASH_106, OnCbackslash106)\r
+       ON_BN_CLICKED(IDC_CD, OnCd)\r
+       ON_BN_CLICKED(IDC_CDIGIT, OnCdigit)\r
+       ON_BN_CLICKED(IDC_CE, OnCe)\r
+       ON_BN_CLICKED(IDC_CF, OnCf)\r
+       ON_BN_CLICKED(IDC_CG, OnCg)\r
+       ON_BN_CLICKED(IDC_CH, OnCh)\r
+       ON_BN_CLICKED(IDC_CI, OnCi)\r
+       ON_BN_CLICKED(IDC_CK, OnCk)\r
+       ON_BN_CLICKED(IDC_CL, OnCl)\r
+       ON_BN_CLICKED(IDC_CM, OnCm)\r
+       ON_BN_CLICKED(IDC_CMS5, OnCms5)\r
+       ON_BN_CLICKED(IDC_CN, OnCn)\r
+       ON_BN_CLICKED(IDC_CO, OnCo)\r
+       ON_BN_CLICKED(IDC_CO2, OnCo2)\r
+       ON_BN_CLICKED(IDC_CP, OnCp)\r
+       ON_BN_CLICKED(IDC_CQ, OnCq)\r
+       ON_BN_CLICKED(IDC_CR, OnCr)\r
+       ON_BN_CLICKED(IDC_CS, OnCs)\r
+       ON_BN_CLICKED(IDC_CSLASH, OnCslash)\r
+       ON_BN_CLICKED(IDC_CSPACE, OnCspace)\r
+       ON_BN_CLICKED(IDC_CT, OnCt)\r
+       ON_BN_CLICKED(IDC_CU, OnCu)\r
+       ON_BN_CLICKED(IDC_CV, OnCv)\r
+       ON_BN_CLICKED(IDC_CW, OnCw)\r
+       ON_BN_CLICKED(IDC_CXB, OnCxb)\r
+       ON_BN_CLICKED(IDC_CXCC, OnCxcc)\r
+       ON_BN_CLICKED(IDC_CXCF, OnCxcf)\r
+       ON_BN_CLICKED(IDC_CXCJ, OnCxcj)\r
+       ON_BN_CLICKED(IDC_CXCP, OnCxcp)\r
+       ON_BN_CLICKED(IDC_CXCS, OnCxcs)\r
+       ON_BN_CLICKED(IDC_CXCT, OnCxct)\r
+       ON_BN_CLICKED(IDC_CXCW, OnCxcw)\r
+       ON_BN_CLICKED(IDC_CXE, OnCxe)\r
+       ON_BN_CLICKED(IDC_CXH, OnCxh)\r
+       ON_BN_CLICKED(IDC_CXK, OnCxk)\r
+       ON_BN_CLICKED(IDC_CXS0, OnCxs0)\r
+       ON_BN_CLICKED(IDC_CXS9, OnCxs9)\r
+       ON_BN_CLICKED(IDC_CXU, OnCxu)\r
+       ON_BN_CLICKED(IDC_CY, OnCy)\r
+       ON_BN_CLICKED(IDC_CZ, OnCz)\r
+       ON_BN_CLICKED(IDC_LEFT_ALT, OnLeftAlt)\r
+       ON_BN_CLICKED(IDC_MB, OnMb)\r
+       ON_BN_CLICKED(IDC_MD, OnMd)\r
+       ON_BN_CLICKED(IDC_MF, OnMf)\r
+       ON_BN_CLICKED(IDC_MI, OnMi)\r
+       ON_BN_CLICKED(IDC_MS1, OnMs1)\r
+       ON_BN_CLICKED(IDC_MS5, OnMs5)\r
+       ON_BN_CLICKED(IDC_MSCOMMA, OnMscomma)\r
+       ON_BN_CLICKED(IDC_MSPERIOD, OnMsperiod)\r
+       ON_BN_CLICKED(IDC_MV, OnMv)\r
+       ON_BN_CLICKED(IDC_MW, OnMw)\r
+       ON_BN_CLICKED(IDC_MY, OnMy)\r
+       ON_BN_CLICKED(IDC_RIGHT_ALT, OnRightAlt)\r
+       ON_BN_CLICKED(IDC_ESCAPE, OnEscape)\r
+       ON_BN_CLICKED(IDC_SQUARE_BRA, OnSquareBra)\r
+       ON_BN_CLICKED(IDC_MDEL, OnMdel)\r
+       ON_BN_CLICKED(IDC_MF12, OnMf12)\r
+       ON_BN_CLICKED(IDC_MT, OnMt)\r
+       ON_BN_CLICKED(IDC_MC, OnMc)\r
+       ON_BN_CLICKED(IDC_ML, OnMl)\r
+       ON_BN_CLICKED(IDC_MU, OnMu)\r
+       ON_BN_CLICKED(IDC_MX, OnMx)\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesBasic message handlers\r
+\r
+BOOL CPropertiesBasic::OnSetActive() \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       m_pProperties->EnableControl(BASIC_TAB);\r
+       SetDialogData(m_pProperties->GetCurrentApplication());\r
+\r
+       return CPropertyPage::OnSetActive();\r
+}\r
+\r
+void CPropertiesBasic::SetAllDialogData(UINT nCheck, BOOL bChanged)\r
+{\r
+       for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+               if (szCommandName.IsEmpty()) {\r
+                       break;\r
+               }\r
+\r
+               for (int i = 0; ; ++i) {\r
+                       int nKey = CXkeymacsData::GetDefaultCommandKey(nCommandID, i);\r
+                       int nControlID = CXkeymacsData::GetDefaultControlID(nCommandID, i);\r
+                       if (nKey == 0) {\r
+                               break;\r
+                       }\r
+                       CheckDlgButton(nControlID, nCheck);\r
+               }\r
+       }\r
+       CheckDlgButton(IDC_CO2, BST_UNCHECKED);\r
+\r
+       InitChanged(bChanged);\r
+}\r
+\r
+void CPropertiesBasic::SetDialogData(CString szApplicationName)\r
+{\r
+       UpdateDialogData(szApplicationName, FALSE);\r
+}\r
+\r
+void CPropertiesBasic::UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate)\r
+{\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               UpdateData();\r
+       }\r
+\r
+       if (m_pProperties->GetApplicationID() == MAX_APP) {\r
+               if (!bSaveAndValidate) {\r
+                       SetAllDialogData(1, FALSE);     // FIXME\r
+               }\r
+               return;\r
+       }\r
+\r
+       // on/off\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               SetAllDialogData(1, FALSE);\r
+               CheckDlgButton(IDC_CO2, BST_CHECKED);\r
+       }\r
+       for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+               if (szCommandName.IsEmpty()) {\r
+                       break;\r
+               }\r
+\r
+               for (int i = 0; ; ++i) {\r
+                       int nCommandType = CXkeymacsData::GetDefaultCommandType(nCommandID, i);\r
+                       int nKey = CXkeymacsData::GetDefaultCommandKey(nCommandID, i);\r
+                       int nControlID = CXkeymacsData::GetDefaultControlID(nCommandID, i);\r
+                       if (nKey == 0) {\r
+                               break;\r
+                       }\r
+                       if (bSaveAndValidate) { // GetDialogData\r
+                               if (nControlID == IDC_CO2) {\r
+                                       continue;\r
+                               }\r
+                               if (!m_bChanged[nCommandID]) {\r
+                                       continue;\r
+                               }\r
+                               if (IsDlgButtonChecked(nControlID)) {\r
+                                       CProfile::SetCommandID(m_pProperties->GetApplicationID(), nCommandType, nKey, nCommandID);\r
+                                       CDotXkeymacs::RemoveKey(m_pProperties->GetApplicationID(), nCommandType, nKey);\r
+                               } else {\r
+                                       CProfile::SetCommandID(m_pProperties->GetApplicationID(), nCommandType, nKey, 0);\r
+                               }\r
+                       } else {                                // SetDialogData\r
+                               if (nCommandID != CProfile::GetCommandID(m_pProperties->GetApplicationID(), nCommandType, nKey)) {\r
+                                       CheckDlgButton(nControlID, BST_UNCHECKED);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       // only for Toggle Imput Method Editor C-o: Canna mode\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               int nCommandType = CONTROL;\r
+               int nKey = 'O';\r
+               if (CProfile::GetCommandID(m_pProperties->GetApplicationID(), nCommandType, nKey) == 0) {\r
+                       if (IsDlgButtonChecked(IDC_CO2)) {\r
+                               for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                                       CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+                                       if (szCommandName.IsEmpty()) {\r
+                                               break;\r
+                                       }\r
+                                       if (!szCommandName.CompareNoCase(_T("toggle-input-method"))) {\r
+                                               CProfile::SetCommandID(m_pProperties->GetApplicationID(), nCommandType, nKey, nCommandID);\r
+                                               CProfile::SetCommandID(m_pProperties->GetApplicationID(), CONTROL+SHIFT, nKey, nCommandID);\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               UpdateData(FALSE);\r
+       }\r
+}\r
+\r
+void CPropertiesBasic::InitChanged(BOOL bChanged)\r
+{\r
+       for (int i = 0; i < sizeof(m_bChanged)/sizeof(m_bChanged[0]); ++i) {\r
+               if (CXkeymacsData::GetDefaultControlID(i, 0) || !bChanged) {\r
+                       m_bChanged[i] = bChanged;\r
+               }\r
+       }\r
+}\r
+\r
+int CPropertiesBasic::OnCreate(LPCREATESTRUCT lpCreateStruct) \r
+{\r
+       if (CPropertyPage::OnCreate(lpCreateStruct) == -1)\r
+               return -1;\r
+       \r
+       // TODO: Add your specialized creation code here\r
+       m_pProperties = (CProperties *)GetParent()->GetParent();\r
+\r
+       return 0;\r
+}\r
+\r
+void CPropertiesBasic::GetDialogData()\r
+{\r
+       UpdateDialogData(m_pProperties->GetCurrentApplication(), TRUE);\r
+}\r
+\r
+void CPropertiesBasic::OnAlt() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_ALT);\r
+}\r
+\r
+void CPropertiesBasic::OnC_() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_C_);\r
+}\r
+\r
+void CPropertiesBasic::OnCa() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CA);\r
+}\r
+\r
+void CPropertiesBasic::OnCb() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CB);\r
+}\r
+\r
+void CPropertiesBasic::OnCbackslash() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CBACKSLASH);\r
+}\r
+\r
+void CPropertiesBasic::OnCbackslash106() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CBACKSLASH_106);\r
+}\r
+\r
+void CPropertiesBasic::OnCd() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CD);\r
+}\r
+\r
+void CPropertiesBasic::OnCdigit() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CDIGIT);\r
+}\r
+\r
+void CPropertiesBasic::OnCe() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CE);\r
+}\r
+\r
+void CPropertiesBasic::OnCf() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CF);\r
+}\r
+\r
+void CPropertiesBasic::OnCg() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CG);\r
+}\r
+\r
+void CPropertiesBasic::OnCh() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CH);\r
+}\r
+\r
+void CPropertiesBasic::OnCi() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CI);\r
+}\r
+\r
+void CPropertiesBasic::OnCk() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CK);\r
+}\r
+\r
+void CPropertiesBasic::OnCl() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CL);\r
+}\r
+\r
+void CPropertiesBasic::OnCm() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CM);\r
+}\r
+\r
+void CPropertiesBasic::OnCms5() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CMS5);\r
+}\r
+\r
+void CPropertiesBasic::OnCn() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CN);\r
+}\r
+\r
+void CPropertiesBasic::OnCo() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CO);\r
+       if (IsDlgButtonChecked(IDC_CO) == BST_CHECKED) {\r
+               CheckDlgButton(IDC_CO2, BST_UNCHECKED);\r
+               Changed(IDC_CO2);\r
+       }\r
+}\r
+\r
+void CPropertiesBasic::OnCo2() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CO2);\r
+       if (IsDlgButtonChecked(IDC_CO2) == BST_CHECKED) {\r
+               CheckDlgButton(IDC_CO, BST_UNCHECKED);\r
+               Changed(IDC_CO);\r
+       }\r
+}\r
+\r
+void CPropertiesBasic::OnCp() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CP);\r
+}\r
+\r
+void CPropertiesBasic::OnCq() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CQ);\r
+}\r
+\r
+void CPropertiesBasic::OnCr() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CR);\r
+}\r
+\r
+void CPropertiesBasic::OnCs() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CS);\r
+}\r
+\r
+void CPropertiesBasic::OnCslash() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CSLASH);\r
+}\r
+\r
+void CPropertiesBasic::OnCspace() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CSPACE);\r
+}\r
+\r
+void CPropertiesBasic::OnCt() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CT);\r
+}\r
+\r
+void CPropertiesBasic::OnCu() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CU);\r
+}\r
+\r
+void CPropertiesBasic::OnCv() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CV);\r
+}\r
+\r
+void CPropertiesBasic::OnCw() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CW);\r
+}\r
+\r
+void CPropertiesBasic::OnCxb() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXB);\r
+}\r
+\r
+void CPropertiesBasic::OnCxcc() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXCC);\r
+}\r
+\r
+void CPropertiesBasic::OnCxcf() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXCF);\r
+}\r
+\r
+void CPropertiesBasic::OnCxcj() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXCJ);\r
+}\r
+\r
+void CPropertiesBasic::OnCxcp() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXCP);\r
+}\r
+\r
+void CPropertiesBasic::OnCxcs() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXCS);\r
+}\r
+\r
+void CPropertiesBasic::OnCxct() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXCT);\r
+}\r
+\r
+void CPropertiesBasic::OnCxcw() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXCW);\r
+}\r
+\r
+void CPropertiesBasic::OnCxe() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXE);\r
+}\r
+\r
+void CPropertiesBasic::OnCxh() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXH);\r
+}\r
+\r
+void CPropertiesBasic::OnCxk() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXK);\r
+}\r
+\r
+void CPropertiesBasic::OnCxs0() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXS0);\r
+}\r
+\r
+void CPropertiesBasic::OnCxs9() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXS9);\r
+}\r
+\r
+void CPropertiesBasic::OnCxu() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CXU);\r
+}\r
+\r
+void CPropertiesBasic::OnCy() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CY);\r
+}\r
+\r
+void CPropertiesBasic::OnCz() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_CZ);\r
+}\r
+\r
+void CPropertiesBasic::OnEscape() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_ESCAPE);\r
+}\r
+\r
+void CPropertiesBasic::OnLeftAlt() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_LEFT_ALT);\r
+}\r
+\r
+void CPropertiesBasic::OnMb() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MB);\r
+}\r
+\r
+void CPropertiesBasic::OnMd() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MD);\r
+}\r
+\r
+void CPropertiesBasic::OnMf() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MF);\r
+}\r
+\r
+void CPropertiesBasic::OnMi() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MI);\r
+}\r
+\r
+void CPropertiesBasic::OnMs1() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MS1);\r
+}\r
+\r
+void CPropertiesBasic::OnMs5() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MS5);\r
+}\r
+\r
+void CPropertiesBasic::OnMscomma() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MSCOMMA);\r
+}\r
+\r
+void CPropertiesBasic::OnMsperiod() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MSPERIOD);\r
+}\r
+\r
+void CPropertiesBasic::OnMv() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MV);\r
+}\r
+\r
+void CPropertiesBasic::OnMw() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MW);\r
+}\r
+\r
+void CPropertiesBasic::OnMy() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MY);\r
+}\r
+\r
+void CPropertiesBasic::OnRightAlt() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_RIGHT_ALT);\r
+}\r
+\r
+void CPropertiesBasic::OnSquareBra() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_SQUARE_BRA);\r
+}\r
+\r
+void CPropertiesBasic::Changed(int nObjectID)\r
+{\r
+       for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+               if (szCommandName.IsEmpty()) {\r
+                       break;\r
+               }\r
+\r
+               for (int i = 0; ; ++i) {\r
+                       if (CXkeymacsData::GetDefaultCommandKey(nCommandID, i) == 0) {\r
+                               break;\r
+                       }\r
+\r
+                       int nControlID = CXkeymacsData::GetDefaultControlID(nCommandID, i);\r
+                       if ((nControlID == nObjectID)\r
+                        || ((nObjectID == IDC_CO) && (nControlID == IDC_CO2))\r
+                        || ((nObjectID == IDC_CO2) && (nControlID == IDC_CO))) {\r
+                               m_bChanged[nCommandID] = TRUE;\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+BOOL CPropertiesBasic::OnKillActive() \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       GetDialogData();\r
+\r
+       return CPropertyPage::OnKillActive();\r
+}\r
+\r
+void CPropertiesBasic::EnableControl()\r
+{\r
+       BOOL bEnable = m_pProperties->IsEnableControl();\r
+\r
+       for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+               if (szCommandName.IsEmpty()) {\r
+                       break;\r
+               }\r
+\r
+               for (int i = 0; ; ++i) {\r
+                       int nKey = CXkeymacsData::GetDefaultCommandKey(nCommandID, i);\r
+                       int nControlID = CXkeymacsData::GetDefaultControlID(nCommandID, i);\r
+                       if (nKey == 0) {\r
+                               break;\r
+                       }\r
+                       if (GetDlgItem(nControlID)) {\r
+                               GetDlgItem(nControlID)->EnableWindow(bEnable);\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+BOOL CPropertiesBasic::PreTranslateMessage(MSG* pMsg) \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       m_ToolTip.RelayEvent(pMsg);\r
+\r
+       return CPropertyPage::PreTranslateMessage(pMsg);\r
+}\r
+\r
+BOOL CPropertiesBasic::OnInitDialog() \r
+{\r
+       CPropertyPage::OnInitDialog();\r
+\r
+       // TODO: Add extra initialization here\r
+       if (m_ToolTip.Create(this)) {\r
+               for (int nCommandID = 0; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                       CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+                       if (szCommandName.IsEmpty()) {\r
+                               break;\r
+                       }\r
+\r
+                       for (int i = 0; ; ++i) {\r
+                               int nKey = CXkeymacsData::GetDefaultCommandKey(nCommandID, i);\r
+                               int nControlID = CXkeymacsData::GetDefaultControlID(nCommandID, i);\r
+                               if (nKey == 0) {\r
+                                       break;\r
+                               }\r
+                               if (GetDlgItem(nControlID)) {\r
+                                       m_ToolTip.AddTool(GetDlgItem(nControlID), CString(MAKEINTRESOURCE(CXkeymacsData::GetToolTipID(nCommandID))));\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return TRUE;  // return TRUE unless you set the focus to a control\r
+                     // EXCEPTION: OCX Property Pages should return FALSE\r
+}\r
+\r
+void CPropertiesBasic::OnMdel() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MDEL);\r
+}\r
+\r
+void CPropertiesBasic::OnMf12() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MF12);\r
+}\r
+\r
+void CPropertiesBasic::OnMt() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MT);\r
+}\r
+\r
+void CPropertiesBasic::OnMc() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MC);\r
+}\r
+\r
+void CPropertiesBasic::OnMl() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_ML);\r
+}\r
+\r
+void CPropertiesBasic::OnMu() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MU);\r
+}\r
+\r
+void CPropertiesBasic::OnMx() \r
+{\r
+       // TODO: Add your control notification handler code here\r
+       Changed(IDC_MX);\r
+}\r
diff --git a/xkeymacs/propertiesbasic.h b/xkeymacs/propertiesbasic.h
new file mode 100644 (file)
index 0000000..f1a7544
--- /dev/null
@@ -0,0 +1,132 @@
+#if !defined(AFX_PROPERTIESBASIC_H__04D80B48_2913_4D7C_86A4_3049877B6996__INCLUDED_)\r
+#define AFX_PROPERTIESBASIC_H__04D80B48_2913_4D7C_86A4_3049877B6996__INCLUDED_\r
+\r
+class CProperties;\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+// PropertiesBasic.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesBasic dialog\r
+\r
+class CPropertiesBasic : public CPropertyPage\r
+{\r
+       DECLARE_DYNCREATE(CPropertiesBasic)\r
+\r
+// Construction\r
+public:\r
+       void EnableControl();\r
+       void GetDialogData();\r
+       void InitChanged(BOOL bChanged);\r
+       void SetDialogData(CString szApplicationName);\r
+       void SetAllDialogData(UINT nCheck, BOOL bChanged);\r
+       CPropertiesBasic();\r
+       ~CPropertiesBasic();\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(CPropertiesBasic)\r
+       enum { IDD = IDD_PROPERTIES_BASIC };\r
+       //}}AFX_DATA\r
+\r
+\r
+// Overrides\r
+       // ClassWizard generate virtual function overrides\r
+       //{{AFX_VIRTUAL(CPropertiesBasic)\r
+       public:\r
+       virtual BOOL OnSetActive();\r
+       virtual BOOL OnKillActive();\r
+       virtual BOOL PreTranslateMessage(MSG* pMsg);\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+protected:\r
+       // Generated message map functions\r
+       //{{AFX_MSG(CPropertiesBasic)\r
+       afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);\r
+       afx_msg void OnAlt();\r
+       afx_msg void OnC_();\r
+       afx_msg void OnCa();\r
+       afx_msg void OnCb();\r
+       afx_msg void OnCbackslash();\r
+       afx_msg void OnCbackslash106();\r
+       afx_msg void OnCd();\r
+       afx_msg void OnCdigit();\r
+       afx_msg void OnCe();\r
+       afx_msg void OnCf();\r
+       afx_msg void OnCg();\r
+       afx_msg void OnCh();\r
+       afx_msg void OnCi();\r
+       afx_msg void OnCk();\r
+       afx_msg void OnCl();\r
+       afx_msg void OnCm();\r
+       afx_msg void OnCms5();\r
+       afx_msg void OnCn();\r
+       afx_msg void OnCo();\r
+       afx_msg void OnCo2();\r
+       afx_msg void OnCp();\r
+       afx_msg void OnCq();\r
+       afx_msg void OnCr();\r
+       afx_msg void OnCs();\r
+       afx_msg void OnCslash();\r
+       afx_msg void OnCspace();\r
+       afx_msg void OnCt();\r
+       afx_msg void OnCu();\r
+       afx_msg void OnCv();\r
+       afx_msg void OnCw();\r
+       afx_msg void OnCxb();\r
+       afx_msg void OnCxcc();\r
+       afx_msg void OnCxcf();\r
+       afx_msg void OnCxcj();\r
+       afx_msg void OnCxcp();\r
+       afx_msg void OnCxcs();\r
+       afx_msg void OnCxct();\r
+       afx_msg void OnCxcw();\r
+       afx_msg void OnCxe();\r
+       afx_msg void OnCxh();\r
+       afx_msg void OnCxk();\r
+       afx_msg void OnCxs0();\r
+       afx_msg void OnCxs9();\r
+       afx_msg void OnCxu();\r
+       afx_msg void OnCy();\r
+       afx_msg void OnCz();\r
+       afx_msg void OnLeftAlt();\r
+       afx_msg void OnMb();\r
+       afx_msg void OnMd();\r
+       afx_msg void OnMf();\r
+       afx_msg void OnMi();\r
+       afx_msg void OnMs1();\r
+       afx_msg void OnMs5();\r
+       afx_msg void OnMscomma();\r
+       afx_msg void OnMsperiod();\r
+       afx_msg void OnMv();\r
+       afx_msg void OnMw();\r
+       afx_msg void OnMy();\r
+       afx_msg void OnRightAlt();\r
+       afx_msg void OnEscape();\r
+       afx_msg void OnSquareBra();\r
+       virtual BOOL OnInitDialog();\r
+       afx_msg void OnMdel();\r
+       afx_msg void OnMf12();\r
+       afx_msg void OnMt();\r
+       afx_msg void OnMc();\r
+       afx_msg void OnMl();\r
+       afx_msg void OnMu();\r
+       afx_msg void OnMx();\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       CToolTipCtrl m_ToolTip;\r
+       void Changed(int nObjectID);\r
+       CProperties* m_pProperties;\r
+       BOOL m_bChanged[sizeof(Commands)/sizeof(Commands[0])];\r
+       void UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate = TRUE);\r
+};\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_PROPERTIESBASIC_H__04D80B48_2913_4D7C_86A4_3049877B6996__INCLUDED_)\r
diff --git a/xkeymacs/propertieslist.cpp b/xkeymacs/propertieslist.cpp
new file mode 100644 (file)
index 0000000..9345bab
--- /dev/null
@@ -0,0 +1,294 @@
+// PropertiesList.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "Profile.h"\r
+#include "Properties.h"\r
+#include "PropertiesList.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesList property page\r
+\r
+BOOL CPropertiesList::m_bSortAscending = TRUE;\r
+\r
+IMPLEMENT_DYNCREATE(CPropertiesList, CPropertyPage)\r
+\r
+CPropertiesList::CPropertiesList() : CPropertyPage(CPropertiesList::IDD)\r
+{\r
+       //{{AFX_DATA_INIT(CPropertiesList)\r
+               // NOTE: the ClassWizard will add member initialization here\r
+       //}}AFX_DATA_INIT\r
+}\r
+\r
+CPropertiesList::~CPropertiesList()\r
+{\r
+}\r
+\r
+void CPropertiesList::DoDataExchange(CDataExchange* pDX)\r
+{\r
+       CPropertyPage::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(CPropertiesList)\r
+       DDX_Control(pDX, IDC_PROPERTIES_LIST, m_cPropertiesList);\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CPropertiesList, CPropertyPage)\r
+       //{{AFX_MSG_MAP(CPropertiesList)\r
+       ON_WM_CREATE()\r
+       ON_NOTIFY(LVN_COLUMNCLICK, IDC_PROPERTIES_LIST, OnColumnclickPropertiesList)\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesList message handlers\r
+\r
+BOOL CPropertiesList::OnSetActive() \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       m_pProperties->EnableControl(LIST_TAB);\r
+       SetDialogData(m_pProperties->GetCurrentApplication());\r
+\r
+       return CPropertyPage::OnSetActive();\r
+}\r
+\r
+void CPropertiesList::SetDialogData(CString szApplicationName)\r
+{\r
+       UpdateDialogData(szApplicationName, FALSE);\r
+}\r
+\r
+void CPropertiesList::UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate)\r
+{\r
+       if (bSaveAndValidate) { // GetDialogData\r
+               UpdateData();\r
+       }\r
+\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               m_cPropertiesList.DeleteAllItems();\r
+               m_nCategoryWidth = 0;\r
+               m_nCommandWidth = 0;\r
+               m_nKeyWidth = 0;\r
+\r
+               for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+                       CString szCommandName = CXkeymacsData::GetCommandName(nCommandID);\r
+                       if (szCommandName.IsEmpty()) {\r
+                               break;\r
+                       }\r
+\r
+                       CString szCategory(MAKEINTRESOURCE(CXkeymacsData::GetCategoryID(nCommandID)));\r
+                       if (szCategory.IsEmpty()) {\r
+                               continue;\r
+                       }\r
+\r
+                       BOOL bInserted = FALSE;\r
+                       for (int nCommandType = 0; nCommandType < MAX_COMMAND_TYPE; ++nCommandType) {\r
+                               for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
+                                       if (nCommandID == CProfile::GetCommandID(m_pProperties->GetApplicationID(), nCommandType, nKey)) {\r
+                                               CString szKey;\r
+                                               szKey.Format(_T("%s%s"), CProfile::CommandType2String(nCommandType), CProfile::Key2String(nKey));\r
+\r
+                                               InsertItem(szCategory, szCommandName, szKey);\r
+\r
+                                               bInserted = TRUE;\r
+                                       }\r
+                               }\r
+                       }\r
+                       if (!bInserted) {\r
+                               InsertItem(szCategory, szCommandName, _T(""));\r
+                       }\r
+               }\r
+\r
+               SortItem(m_nSelectedColumn);\r
+               m_cPropertiesList.SetColumnWidth(0, m_nCategoryWidth + 0x20);\r
+               m_cPropertiesList.SetColumnWidth(1, m_nCommandWidth + 0x20);\r
+               m_cPropertiesList.SetColumnWidth(2, m_nKeyWidth + 0x20);\r
+       }\r
+\r
+       if (!bSaveAndValidate) {        // SetDialogData\r
+               UpdateData(FALSE);\r
+       }\r
+}\r
+\r
+void CPropertiesList::GetDialogData()\r
+{\r
+       UpdateDialogData(m_pProperties->GetCurrentApplication(), TRUE);\r
+}\r
+\r
+int CPropertiesList::OnCreate(LPCREATESTRUCT lpCreateStruct) \r
+{\r
+       if (CPropertyPage::OnCreate(lpCreateStruct) == -1)\r
+               return -1;\r
+\r
+       // TODO: Add your specialized creation code here\r
+       m_pProperties = (CProperties *)GetParent()->GetParent();\r
+\r
+       return 0;\r
+}\r
+\r
+BOOL CPropertiesList::OnKillActive() \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+       GetDialogData();\r
+\r
+       return CPropertyPage::OnKillActive();\r
+}\r
+\r
+void CPropertiesList::EnableControl()\r
+{\r
+       BOOL bEnable = m_pProperties->IsEnableControl();\r
+\r
+       m_cPropertiesList.EnableWindow(bEnable);\r
+}\r
+\r
+BOOL CPropertiesList::OnInitDialog() \r
+{\r
+       CPropertyPage::OnInitDialog();\r
+\r
+       // TODO: Add extra initialization here\r
+       DWORD dwStyle = m_cPropertiesList.GetExtendedStyle();\r
+       dwStyle |= LVS_EX_FULLROWSELECT;\r
+       m_cPropertiesList.SetExtendedStyle(dwStyle);\r
+\r
+       m_nSelectedColumn = 0;\r
+       m_bSortAscending = TRUE;\r
+\r
+       m_cPropertiesList.InsertColumn(0, CString(MAKEINTRESOURCE(IDS_CATEGORY)), LVCFMT_LEFT);\r
+       m_cPropertiesList.InsertColumn(1, CString(MAKEINTRESOURCE(IDS_COMMAND)), LVCFMT_LEFT);\r
+       m_cPropertiesList.InsertColumn(2, CString(MAKEINTRESOURCE(IDS_KEY)), LVCFMT_LEFT);\r
+\r
+       return TRUE;  // return TRUE unless you set the focus to a control\r
+                     // EXCEPTION: OCX Property Pages should return FALSE\r
+}\r
+\r
+int CALLBACK CPropertiesList::SortCategory(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+{\r
+       return Sort(lParam1, lParam2, lParamSort, SORT_CATEGORY);\r
+}\r
+\r
+int CALLBACK CPropertiesList::SortCommand(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+{\r
+       return Sort(lParam1, lParam2, lParamSort, SORT_COMMAND);\r
+}\r
+\r
+int CALLBACK CPropertiesList::SortKey(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+{\r
+       return Sort(lParam1, lParam2, lParamSort, SORT_KEY);\r
+}\r
+\r
+void CPropertiesList::OnColumnclickPropertiesList(NMHDR* pNMHDR, LRESULT* pResult) \r
+{\r
+       NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;\r
+       // TODO: Add your control notification handler code here\r
+       if (m_nSelectedColumn == pNMListView->iSubItem) {\r
+               m_bSortAscending = !m_bSortAscending;\r
+       } else {\r
+               m_nSelectedColumn = pNMListView->iSubItem;\r
+               m_bSortAscending = TRUE;\r
+       }\r
+\r
+       for (int nItem = 0; nItem < m_cPropertiesList.GetItemCount(); ++nItem) {\r
+               m_cPropertiesList.SetItemData(nItem, nItem);\r
+       }\r
+\r
+       SortItem(pNMListView->iSubItem);\r
+\r
+       *pResult = 0;\r
+}\r
+\r
+void CPropertiesList::DisplayIndicator()\r
+{\r
+       CHeaderCtrl *pHeaderCtrl = m_cPropertiesList.GetHeaderCtrl();\r
+\r
+       for (int nItemCount = 0; nItemCount < pHeaderCtrl->GetItemCount(); ++nItemCount) {\r
+               HDITEM hditem;\r
+               pHeaderCtrl->GetItem(nItemCount, &hditem);\r
+\r
+               if (nItemCount == m_nSelectedColumn) {\r
+                       hditem.mask = HDI_FORMAT | HDI_BITMAP;\r
+                       hditem.fmt |= HDF_BITMAP | HDF_BITMAP_ON_RIGHT;\r
+                       const int IDB_SORT = m_bSortAscending ? IDB_SORT_ASCENDING : IDB_SORT_DESCENDING;\r
+                       hditem.hbm = (HBITMAP)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_SORT), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);\r
+                       pHeaderCtrl->SetItem(nItemCount, &hditem);\r
+               } else {\r
+                       hditem.mask = HDI_FORMAT;\r
+                       hditem.fmt = HDF_STRING;\r
+                       hditem.hbm = NULL;\r
+                       pHeaderCtrl->SetItem(nItemCount, &hditem);\r
+               }\r
+       }\r
+}\r
+\r
+void CPropertiesList::SortItem(int nColumn)\r
+{\r
+       switch (nColumn) {\r
+       case 0:\r
+               m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);\r
+               break;\r
+       case 1:\r
+               m_cPropertiesList.SortItems(CPropertiesList::SortCommand, (LPARAM) &m_cPropertiesList);\r
+               break;\r
+       case 2:\r
+               m_cPropertiesList.SortItems(CPropertiesList::SortKey, (LPARAM) &m_cPropertiesList);\r
+               break;\r
+       default:\r
+               m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);\r
+               break;\r
+       }\r
+\r
+       DisplayIndicator();\r
+}\r
+\r
+void CPropertiesList::InsertItem(LPCTSTR szCategory, LPCTSTR szCommandName, LPCTSTR szKey)\r
+{\r
+       int nItem = m_cPropertiesList.InsertItem(m_cPropertiesList.GetItemCount(), szCategory);\r
+       m_cPropertiesList.SetItemData(nItem, nItem);\r
+       m_cPropertiesList.SetItemText(nItem, 1, szCommandName);\r
+       m_cPropertiesList.SetItemText(nItem, 2, szKey);\r
+\r
+       m_nCategoryWidth = __max(m_nCategoryWidth, m_cPropertiesList.GetStringWidth(szCategory));\r
+       m_nCommandWidth = __max(m_nCommandWidth, m_cPropertiesList.GetStringWidth(szCommandName));\r
+       m_nKeyWidth = __max(m_nKeyWidth, m_cPropertiesList.GetStringWidth(szKey));\r
+}\r
+\r
+int CPropertiesList::Sort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort, SORT_TYPE sortType)\r
+{\r
+       CListCtrl *pListCtrl = (CListCtrl *) lParamSort;\r
+\r
+       CString szCategory1 = pListCtrl->GetItemText(lParam1, 0);\r
+       CString szCommand1 = pListCtrl->GetItemText(lParam1, 1);\r
+       CString szKey1 = pListCtrl->GetItemText(lParam1, 2);\r
+\r
+       CString szCategory2 = pListCtrl->GetItemText(lParam2, 0);\r
+       CString szCommand2 = pListCtrl->GetItemText(lParam2, 1);\r
+       CString szKey2 = pListCtrl->GetItemText(lParam2, 2);\r
+\r
+       int rc = 0;\r
+       switch (sortType) {\r
+       case SORT_CATEGORY:\r
+               rc = rc ? rc : _tcscmp(szCategory1, szCategory2);\r
+               // Do NOT write break; here.\r
+       case SORT_COMMAND:\r
+               rc = rc ? rc : _tcscmp(szCommand1, szCommand2);\r
+               // Do NOT write break; here.\r
+       case SORT_KEY:\r
+               if (!rc) {\r
+                       rc = rc ? rc : _tcscmp(szKey1, szKey2);\r
+                       if (szKey1.IsEmpty() && !szKey2.IsEmpty()) {\r
+                               rc = 1;\r
+                       } else if (!szKey1.IsEmpty() && szKey2.IsEmpty()) {\r
+                               rc = -1;\r
+                       }\r
+               }\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+       return m_bSortAscending ? rc : rc * -1;\r
+}\r
diff --git a/xkeymacs/propertieslist.h b/xkeymacs/propertieslist.h
new file mode 100644 (file)
index 0000000..9cfd659
--- /dev/null
@@ -0,0 +1,74 @@
+#if !defined(AFX_PROPERTIESLIST_H__0BC352B3_8869_46D9_873B_D65D705F1228__INCLUDED_)\r
+#define AFX_PROPERTIESLIST_H__0BC352B3_8869_46D9_873B_D65D705F1228__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+enum SORT_TYPE { SORT_CATEGORY, SORT_COMMAND, SORT_KEY };\r
+\r
+// PropertiesList.h : header file\r
+//\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CPropertiesList dialog\r
+\r
+class CPropertiesList : public CPropertyPage\r
+{\r
+       DECLARE_DYNCREATE(CPropertiesList)\r
+\r
+// Construction\r
+public:\r
+       void EnableControl();\r
+       void GetDialogData();\r
+       void SetDialogData(CString szApplicationName);\r
+       CPropertiesList();\r
+       ~CPropertiesList();\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(CPropertiesList)\r
+       enum { IDD = IDD_PROPERTIES_LIST };\r
+       CListCtrl       m_cPropertiesList;\r
+       //}}AFX_DATA\r
+\r
+\r
+// Overrides\r
+       // ClassWizard generate virtual function overrides\r
+       //{{AFX_VIRTUAL(CPropertiesList)\r
+       public:\r
+       virtual BOOL OnSetActive();\r
+       virtual BOOL OnKillActive();\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+protected:\r
+       // Generated message map functions\r
+       //{{AFX_MSG(CPropertiesList)\r
+       afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);\r
+       virtual BOOL OnInitDialog();\r
+       afx_msg void OnColumnclickPropertiesList(NMHDR* pNMHDR, LRESULT* pResult);\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       int m_nKeyWidth;\r
+       int m_nCommandWidth;\r
+       int m_nCategoryWidth;\r
+       static int Sort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort, SORT_TYPE sortType);\r
+       void InsertItem(LPCTSTR szCategory, LPCTSTR szCommandName, LPCTSTR szKey);\r
+       void SortItem(int nColumn);\r
+       void DisplayIndicator();\r
+       static BOOL m_bSortAscending;\r
+       int m_nSelectedColumn;\r
+       static int CALLBACK SortKey(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);\r
+       static int CALLBACK SortCommand(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);\r
+       static int CALLBACK SortCategory(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);\r
+       CProperties* m_pProperties;\r
+       void UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate = TRUE);\r
+};\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_PROPERTIESLIST_H__0BC352B3_8869_46D9_873B_D65D705F1228__INCLUDED_)\r
diff --git a/xkeymacs/res/alt_off.ico b/xkeymacs/res/alt_off.ico
new file mode 100644 (file)
index 0000000..590584b
Binary files /dev/null and b/xkeymacs/res/alt_off.ico differ
diff --git a/xkeymacs/res/alt_on.ico b/xkeymacs/res/alt_on.ico
new file mode 100644 (file)
index 0000000..7d59ccc
Binary files /dev/null and b/xkeymacs/res/alt_on.ico differ
diff --git a/xkeymacs/res/ctrl_off.ico b/xkeymacs/res/ctrl_off.ico
new file mode 100644 (file)
index 0000000..db95d25
Binary files /dev/null and b/xkeymacs/res/ctrl_off.ico differ
diff --git a/xkeymacs/res/ctrl_on.ico b/xkeymacs/res/ctrl_on.ico
new file mode 100644 (file)
index 0000000..9ae2756
Binary files /dev/null and b/xkeymacs/res/ctrl_on.ico differ
diff --git a/xkeymacs/res/cx_off.ico b/xkeymacs/res/cx_off.ico
new file mode 100644 (file)
index 0000000..d853b48
Binary files /dev/null and b/xkeymacs/res/cx_off.ico differ
diff --git a/xkeymacs/res/cx_on.ico b/xkeymacs/res/cx_on.ico
new file mode 100644 (file)
index 0000000..6da3778
Binary files /dev/null and b/xkeymacs/res/cx_on.ico differ
diff --git a/xkeymacs/res/disable.ico b/xkeymacs/res/disable.ico
new file mode 100644 (file)
index 0000000..3b8acea
Binary files /dev/null and b/xkeymacs/res/disable.ico differ
diff --git a/xkeymacs/res/disable_.cur b/xkeymacs/res/disable_.cur
new file mode 100644 (file)
index 0000000..ccdd2ed
Binary files /dev/null and b/xkeymacs/res/disable_.cur differ
diff --git a/xkeymacs/res/disable_tmp.cur b/xkeymacs/res/disable_tmp.cur
new file mode 100644 (file)
index 0000000..6c79f3c
Binary files /dev/null and b/xkeymacs/res/disable_tmp.cur differ
diff --git a/xkeymacs/res/disable_wocq.cur b/xkeymacs/res/disable_wocq.cur
new file mode 100644 (file)
index 0000000..150bb30
Binary files /dev/null and b/xkeymacs/res/disable_wocq.cur differ
diff --git a/xkeymacs/res/disabletmp.ico b/xkeymacs/res/disabletmp.ico
new file mode 100644 (file)
index 0000000..9166e5f
Binary files /dev/null and b/xkeymacs/res/disabletmp.ico differ
diff --git a/xkeymacs/res/disablewocq.ico b/xkeymacs/res/disablewocq.ico
new file mode 100644 (file)
index 0000000..9916d14
Binary files /dev/null and b/xkeymacs/res/disablewocq.ico differ
diff --git a/xkeymacs/res/drag.cur b/xkeymacs/res/drag.cur
new file mode 100644 (file)
index 0000000..ccf62d6
Binary files /dev/null and b/xkeymacs/res/drag.cur differ
diff --git a/xkeymacs/res/hand.cur b/xkeymacs/res/hand.cur
new file mode 100644 (file)
index 0000000..b44c310
Binary files /dev/null and b/xkeymacs/res/hand.cur differ
diff --git a/xkeymacs/res/meta_off.ico b/xkeymacs/res/meta_off.ico
new file mode 100644 (file)
index 0000000..ba4ef0d
Binary files /dev/null and b/xkeymacs/res/meta_off.ico differ
diff --git a/xkeymacs/res/meta_on.ico b/xkeymacs/res/meta_on.ico
new file mode 100644 (file)
index 0000000..1103225
Binary files /dev/null and b/xkeymacs/res/meta_on.ico differ
diff --git a/xkeymacs/res/mx_off.ico b/xkeymacs/res/mx_off.ico
new file mode 100644 (file)
index 0000000..26e5483
Binary files /dev/null and b/xkeymacs/res/mx_off.ico differ
diff --git a/xkeymacs/res/mx_on.ico b/xkeymacs/res/mx_on.ico
new file mode 100644 (file)
index 0000000..8a4879e
Binary files /dev/null and b/xkeymacs/res/mx_on.ico differ
diff --git a/xkeymacs/res/shift_of.ico b/xkeymacs/res/shift_of.ico
new file mode 100644 (file)
index 0000000..88e64d8
Binary files /dev/null and b/xkeymacs/res/shift_of.ico differ
diff --git a/xkeymacs/res/shift_on.ico b/xkeymacs/res/shift_on.ico
new file mode 100644 (file)
index 0000000..341d225
Binary files /dev/null and b/xkeymacs/res/shift_on.ico differ
diff --git a/xkeymacs/res/sort_asc.bmp b/xkeymacs/res/sort_asc.bmp
new file mode 100644 (file)
index 0000000..c6090dd
Binary files /dev/null and b/xkeymacs/res/sort_asc.bmp differ
diff --git a/xkeymacs/res/sort_des.bmp b/xkeymacs/res/sort_des.bmp
new file mode 100644 (file)
index 0000000..c153536
Binary files /dev/null and b/xkeymacs/res/sort_des.bmp differ
diff --git a/xkeymacs/res/xkeymacs.ico b/xkeymacs/res/xkeymacs.ico
new file mode 100644 (file)
index 0000000..18b24b8
Binary files /dev/null and b/xkeymacs/res/xkeymacs.ico differ
diff --git a/xkeymacs/res/xkeymacs.rc2 b/xkeymacs/res/xkeymacs.rc2
new file mode 100644 (file)
index 0000000..9e6d9d4
--- /dev/null
@@ -0,0 +1,13 @@
+//\r
+// XKEYMACS.RC2 - resources Microsoft Visual C++ does not edit directly\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+       #error this file is not editable by Microsoft Visual C++\r
+#endif //APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Add manually edited resources here...\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
diff --git a/xkeymacs/resource.h b/xkeymacs/resource.h
new file mode 100644 (file)
index 0000000..1f85928
--- /dev/null
@@ -0,0 +1,907 @@
+//{{NO_DEPENDENCIES}}\r
+// Microsoft Developer Studio generated include file.\r
+// Used by xkeymacs.rc\r
+//\r
+#define IDS_DEFAULT                     1\r
+#define IDS_DEFAULT_TITLE               2\r
+#define IDS_DIALOG                      3\r
+#define IDS_DIALOG_TITLE                4\r
+#define IDS_KEYBOARD                    5\r
+#define IDS_REG_ENTRY_USE_DIALOG_SETTING 10\r
+#define IDS_REGISTRY_KEY                11\r
+#define IDS_REG_SECTION_APPLICATION     12\r
+#define IDS_REG_ENTRY_APPLICATION       13\r
+#define IDS_REG_ENTRY_NONE              14\r
+#define IDS_REG_ENTRY_CONTROL           15\r
+#define IDS_REG_ENTRY_CONTROLX          16\r
+#define IDS_REG_ENTRY_META              17\r
+#define IDS_REG_SUB_KEY                 18\r
+#define IDS_REGSUBKEY_DATA              18\r
+#define IDS_REG_ENTRY_APPLICATOIN_TITLE 19\r
+#define IDS_REGSUBKEY_AUTORUN           20\r
+#define IDS_APPLICATION_LIST_ITEM       21\r
+#define IDS_SEPARATE_CLASS_WINDOW       22\r
+#define IDS_SEPARATE_WINDOWTITLE        23\r
+#define IDS_REG_ENTRY_CONTROL_META      24\r
+#define IDS_REG_ENTRY_CONTROL_META_SHIFT 24\r
+#define IDS_REG_ENTRY_KILL_RING_MAX     25\r
+#define IDS_REG_ENTRY_CONTROL_SHIFT     26\r
+#define IDS_REG_ENTRY_META_SHIFT        27\r
+#define IDS_REG_ENTRY_DISABLE_XKEYMACS  28\r
+#define IDC_REG_ENTRY_IGNORE_META_CTRL  29\r
+#define IDC_REG_ENTRY_IGNORE_C_X        30\r
+#define IDS_ERR_SAVE_DATA               31\r
+#define IDS_ERR_WINDOWS_VERSION         32\r
+#define IDS_ERR_IMPORT                  33\r
+#define IDS_ERR_EXPORT                  34\r
+#define IDC_REG_ENTRY_ENABLE_CUA        35\r
+#define IDS_REG_SECTION_ORIGINAL        36\r
+#define IDS_REG_ORIGINAL_PREFIX         37\r
+#define IDS_REG_ENTRY_WINDOW_TEXT       38\r
+#define IDS_REG_ENTRY_WINDOW_TEXT_TYPE  39\r
+#define IDS_REG_ENTRY_326_COMPATIBLE    40\r
+#define IDS_PROCESS                     41\r
+#define IDS_PROCESSID                   42\r
+#define IDS_REGSUBKEY_PERF              43\r
+#define IDS_REGSUBKEY_COUNTERS          44\r
+#define IDS_UNKNOWN_TASK                45\r
+#define IDS_IME_FILE_NAME               46\r
+#define IDS_ERR_LOST_KEY                47\r
+#define IDS_FOR_LOGGED_ON_USER          48\r
+#define IDS_FOR_ANY_USER                49\r
+#define IDS_FOR                         50\r
+#define IDS_EXPLORER                    51\r
+#define IDS_PROJECT                     52\r
+#define IDS_EXCEL                       53\r
+#define IDS_MSDN                        54\r
+#define IDS_B2                          55\r
+#define IDS_MSIMN                       56\r
+#define IDS_UNKNOWN_APPLICATION         61\r
+#define IDS_PROGRAM_MANAGER             62\r
+#define IDS_EXTENSION_EXECUTABLE        63\r
+#define IDS_BECKY                       64\r
+#define IDS_OUTLOOK_EXPRESS             65\r
+#define IDS_VISUAL_SOURCESAFE_EXPLORER  66\r
+#define IDS_DISABLE                     71\r
+#define IDS_ENABLE                      72\r
+#define IDS_IMPORT                      73\r
+#define IDS_EXPORT                      74\r
+#define IDS_TIP_CX                      75\r
+#define IDS_TIP_CTRL                    76\r
+#define IDS_TIP_SHIFT                   77\r
+#define IDS_TIP_ALT                     78\r
+#define IDS_TIP_META                    79\r
+#define IDS_REGISTRATION_FILTER         80\r
+#define IDS_REGSUBKEY_KEYBOARD_LAYOUT   81\r
+#define IDS_SCANCODE_MAP                82\r
+#define IDS_REGSUBKEY_KEY_REMAP         83\r
+#define IDS_0                           84\r
+#define IDS_RESTART_OR_NOT              85\r
+#define IDS_RESTART_CAPTION             86\r
+#define IDS_REGSUBKEY_FILE_COMPLETION   87\r
+#define IDS_COMPLETION_CHAR             88\r
+#define IDS_REGSUBKEY_KEYBOARD_LAYOUT_ANY_USER 89\r
+#define IDS_URL                         91\r
+#define IDS_WINDOW_TEXT_IGNORE          91\r
+#define IDS_WINDOW_TEXT_MATCH           92\r
+#define IDS_WINDOW_TEXT_MATCH_FORWARD   93\r
+#define IDS_WINDOW_TEXT_MATCH_BACKWARD  94\r
+#define IDS_WINDOW_TEXT_MATCH_FULL      95\r
+#define IDS_TIP_MX                      96\r
+#define IDD_ABOUTBOX                    100\r
+#define IDS_VER_SUB_BLOCK               101\r
+#define IDR_MAINFRAME                   128\r
+#define IDR_XKEYMATYPE                  129\r
+#define IDR_RIGHT_MENU                  130\r
+#define IDR_STOP                        130\r
+#define IDR_MAIN_DISABLE_WOCQ           130\r
+#define IDD_XKEYMACS                    131\r
+#define IDD_OPTIONS                     132\r
+#define IDI_CTRL_ON                     133\r
+#define IDI_CTRL_OFF                    134\r
+#define IDI_CX_ON                       135\r
+#define IDI_CX_OFF                      136\r
+#define IDC_HAND_CURSOR                 137\r
+#define IDI_SHIFT_ON                    138\r
+#define IDI_SHIFT_OFF                   139\r
+#define IDI_ALT_ON                      140\r
+#define IDI_ALT_OFF                     141\r
+#define IDD_CUSTOMIZE                   142\r
+#define IDI_META_ON                     143\r
+#define IDI_META_OFF                    144\r
+#define IDR_MAIN_DISABLE                145\r
+#define IDD_104KEYBOARD                 145\r
+#define IDD_109KEYBOARD                 146\r
+#define IDC_DRAG_CURSOR                 146\r
+#define IDR_MAIN_DISABLE_TMP            147\r
+#define IDD_PROPERTIES                  148\r
+#define IDI_MX_ON                       148\r
+#define IDD_PROPERTIES_BASIC            149\r
+#define IDI_MX_OFF                      149\r
+#define IDD_PROPERTIES_ADVANCED         150\r
+#define IDB_SORT_ASCENDING              150\r
+#define IDD_PROPERTIES_LIST             151\r
+#define IDB_SORT_DESCENDING             151\r
+#define IDD_MACRO                       152\r
+#define IDC_DISABLE_CURSOR              154\r
+#define IDC_DISABLE_WOCQ_CURSOR         155\r
+#define IDC_DISABLE_TMP_CURSOR          156\r
+#define IDS_REG_ENTRY_ICON_META         255\r
+#define IDS_REG_ENTRY_NONE_FOO          256\r
+#define IDS_REG_ENTRY_NONE_SHIFT_FOO    257\r
+#define IDS_REG_ENTRY_CONTROL_FOO       258\r
+#define IDS_REG_ENTRY_CONTROL_SHIFT_FOO 259\r
+#define IDS_REG_ENTRY_CONTROLX_FOO      260\r
+#define IDS_REG_ENTRY_CONTROLX_SHIFT_FOO 261\r
+#define IDS_REG_ENTRY_CONTROLX_CONTROL_FOO 262\r
+#define IDS_REG_ENTRY_CONTROLX_CONTROL_SHIFT_FOO 263\r
+#define IDS_REG_ENTRY_META_FOO          264\r
+#define IDS_REG_ENTRY_META_SHIFT_FOO    265\r
+#define IDS_DISABLED                    266\r
+#define IDS_REG_ENTRY_CTRL              267\r
+#define IDS_REG_ENTRY_CX                268\r
+#define IDS_REG_ENTRY_MAIN              269\r
+#define IDS_REG_ENTRY_SHIFT             270\r
+#define IDS_REG_ENTRY_ALT               271\r
+#define IDS_REG_ENTRY_ACCELERATE        272\r
+#define IDS_REGSUBKEY_KEYBOARD          273\r
+#define IDS_KEYBOARD_SPEED              274\r
+#define IDS_REG_ENTRY_CHANGE_CURSOR     275\r
+#define IDS_REG_ENTRY_AT_IBEAM_CURSOR_ONLY 276\r
+#define IDS_REG_ENTRY_MX                277\r
+#define IDS_FILES                       401\r
+#define IDS_SEARCH                      402\r
+#define IDS_WINDOW                      403\r
+#define IDS_RECOVERY                    404\r
+#define IDS_MOTION                      405\r
+#define IDS_IME                         406\r
+#define IDS_KILL                        407\r
+#define IDS_OTHER                       408\r
+#define IDS_ORIGINAL                    409\r
+#define IDS_CATEGORY                    411\r
+#define IDS_COMMAND                     412\r
+#define IDS_KEY                         413\r
+#define IDS_MODIFIER                    414\r
+#define IDS_FSET                        451\r
+#define IDS_README                      461\r
+#define IDS_SET_MARK_COMMAND_D          500\r
+#define IDS_BEGINNING_OF_LINE_D         501\r
+#define IDS_BACKWARD_CHAR_D             502\r
+#define IDS_DELETE_CHAR_D               503\r
+#define IDS_END_OF_LINE_D               504\r
+#define IDS_FORWARD_CHAR_D              505\r
+#define IDS_KEYBOARD_QUIT_D             506\r
+#define IDS_HELP_COMMAND_D              507\r
+#define IDS_KILL_LINE_D                 508\r
+#define IDS_RECENTER_D                  509\r
+#define IDS_NEWLINE_D                   510\r
+#define IDS_NEXT_LINE_D                 511\r
+#define IDS_OPEN_LINE_D                 512\r
+#define IDS_PREVIOUS_LINE_D             513\r
+#define IDS_QUOTED_INSERT_D             514\r
+#define IDS_ISEARCH_BACKWARD_D          515\r
+#define IDS_ISEARCH_FORWARD_D           516\r
+#define IDS_TRANSPOSE_CHARS_D           517\r
+#define IDS_UNIVERSAL_ARGUMENT_D        518\r
+#define IDS_SCROLL_UP_D                 519\r
+#define IDS_KILL_REGION_D               520\r
+#define IDS_CONTROL_X_PREFIX_D          521\r
+#define IDS_YANK_D                      522\r
+#define IDS_ICONIFY_OR_DEICONIFY_FRAME_D 523\r
+#define IDS_QUAIL_MODE_D                524\r
+#define IDS_UNDO_D                      525\r
+#define IDS_TOGGLE_WIN32IME_MODE_D      526\r
+#define IDS_BACKWARD_WORD_D             527\r
+#define IDS_FORWARD_WORD_D              528\r
+#define IDS_DIGIT_ARGUMENT_D            529\r
+#define IDS_NEGATIVE_ARGUMENT_D         530\r
+#define IDS_SAVE_BUFFERS_KILL_EMACS_D   531\r
+#define IDS_FIND_FILE_D                 532\r
+#define IDS_MARK_PAGE_D                 533\r
+#define IDS_SAVE_BUFFER_D               534\r
+#define IDS_WRITE_FILE_D                535\r
+#define IDS_SHELL_COMMAND_D             536\r
+#define IDS_BEGINNING_OF_BUFFER_D       537\r
+#define IDS_END_OF_BUFFER_D             538\r
+#define IDS_SCROLL_DOWN_D               539\r
+#define IDS_KILL_RING_SAVE_D            540\r
+#define IDS_BACKWARD_DELETE_CHAR_D      541\r
+#define IDS_TAB_D                       542\r
+#define IDS_META_PREFIX_D               543\r
+#define IDS_META_D                      544\r
+#define IDS_DIGIT_ARGUMENT0_D           545\r
+#define IDS_DIGIT_ARGUMENT1_D           546\r
+#define IDS_DIGIT_ARGUMENT2_D           547\r
+#define IDS_DIGIT_ARGUMENT3_D           548\r
+#define IDS_DIGIT_ARGUMENT4_D           549\r
+#define IDS_DIGIT_ARGUMENT5_D           550\r
+#define IDS_DIGIT_ARGUMENT6_D           551\r
+#define IDS_DIGIT_ARGUMENT7_D           552\r
+#define IDS_DIGIT_ARGUMENT8_D           553\r
+#define IDS_DIGIT_ARGUMENT9_D           554\r
+#define IDS_META_PREFIX_AND_ORIGINAL_D  555\r
+#define IDS_KILL_BUFFER_D               556\r
+#define IDS_KILL_WORD_D                 557\r
+#define IDS_MARK_WHOLE_BUFFER_D         558\r
+#define IDS_DELETE_BACKWARD_CHAR_D      559\r
+#define IDS_QUERY_REPLACE_D             560\r
+#define IDS_QUERY_REPLACE_REGEXP_D      561\r
+#define IDS_YANK_POP_D                  562\r
+#define IDS_CLOSE_INPUT_METHOD_D        563\r
+#define IDS_ENABLE_OR_DISABLE_XKEYMACS_D 564\r
+#define IDS_ENTER_D                     565\r
+#define IDS_IGNORE_D                    566\r
+#define IDS_OPEN_INPUT_METHOD_D         567\r
+#define IDS_SELECT_ALL_D                568\r
+#define IDS_CALL_LAST_KBD_MACRO_D       569\r
+#define IDS_END_KBD_MACRO_D             570\r
+#define IDS_START_KBD_MACRO_D           571\r
+#define IDS_SWITCH_BETWEEN_INPUT_LOCALES_D 572\r
+#define IDS_SWITCH_TO_BUFFER_D          573\r
+#define IDS_CONTROL_D                   574\r
+#define IDS_CONTROL_PREFIX_D            575\r
+#define IDS_ESCAPE_D                    576\r
+#define IDS_TILDE_D                     577\r
+#define IDS_BACK_QUOTE_D                578\r
+#define IDS_RESTORE_D                   579\r
+#define IDS_MOVE_D                      580\r
+#define IDS_SIZE_D                      581\r
+#define IDS_MINIMIZE_D                  582\r
+#define IDS_MAXIMIZE_D                  583\r
+#define IDS_MAXIMIZE_VERTICALLY_D       584\r
+#define IDS_MAXIMIZE_HORIZONTALLY_D     585\r
+#define IDS_PASS_THROUGH_D              586\r
+#define IDS_REDO_D                      587\r
+#define IDS_TEMPORARILY_DISABLE_XKEYMACS_D 588\r
+#define IDS_COPY_D                      589\r
+#define IDS_PASTE_D                     590\r
+#define IDS_CUT_D                       591\r
+#define IDS_NEW_D                       592\r
+#define IDS_PRINT_D                     593\r
+#define IDS_FIND_D                      594\r
+#define IDS_FIND_NEXT_D                 595\r
+#define IDS_TRANSPOSE_LINES_D           596\r
+#define IDS_KILL_LINE_FOR_ALL_FORMAT_D  597\r
+#define IDS_BACKWARD_KILL_WORD_D        598\r
+#define IDS_ENABLE_XKEYMACS_D           599\r
+#define IDS_DISABLE_XKEYMACS_D          600\r
+#define IDS_CAPS_LOCK_D                 601\r
+#define IDS_COMPLETE_CLOSE_INPUT_METHOD_D 602\r
+#define IDS_COMPLETE_TOGGLE_INPUT_METHOD_D 603\r
+#define IDS_UNDERSCORE_D                604\r
+#define IDS_ROLL_UP_UNROLL_D            605\r
+#define IDS_RETOP_D                     606\r
+#define IDS_OSMODIFIER_SHIFT_D          607\r
+#define IDS_OSMODIFIER_SHIFT_REPEAT_D   608\r
+#define IDS_OSMODIFIER_CTRL_D           609\r
+#define IDS_OSMODIFIER_CTRL_REPEAT_D    610\r
+#define IDS_OSMODIFIER_ALT_D            611\r
+#define IDS_OSMODIFIER_ALT_REPEAT_D     612\r
+#define IDS_CYCLE_ITEMS_D               613\r
+#define IDS_CYCLE_ITEMS_INVERSELY_D     614\r
+#define IDS_TRANSPOSE_WORDS_D           615\r
+#define IDS_FILL_PARAGRAPH_D            616\r
+#define IDS_DOWNCASE_WORD_D             617\r
+#define IDS_UPCASE_WORD_D               618\r
+#define IDS_CAPITALIZE_WORD_D           619\r
+#define IDS_EXECUTE_EXTENDED_COMMAND_D  620\r
+#define IDS_ESC                         701\r
+#define IDS_1                           702\r
+#define IDS_2                           703\r
+#define IDS_3                           704\r
+#define IDS_4                           705\r
+#define IDS_5                           706\r
+#define IDS_6                           707\r
+#define IDS_7                           708\r
+#define IDS_8                           709\r
+#define IDS_9                           710\r
+#define IDS_0_                          711\r
+#define IDS_MINUS                       712\r
+#define IDS_EQUAL                       713\r
+#define IDS_BACKSPACE                   714\r
+#define IDS_TAB                         715\r
+#define IDS_Q                           716\r
+#define IDS_W                           717\r
+#define IDS_E                           718\r
+#define IDS_R                           719\r
+#define IDS_T                           720\r
+#define IDS_Y                           721\r
+#define IDS_U                           722\r
+#define IDS_I                           723\r
+#define IDS_O                           724\r
+#define IDS_P                           725\r
+#define IDS_SQUARE_BRA                  726\r
+#define IDS_SQUARE_CKET                 727\r
+#define IDS_ENTER                       728\r
+#define IDS_NUMPADENTER                 729\r
+#define IDS_LEFT_CTRL                   730\r
+#define IDS_RIGHT_CTRL                  731\r
+#define IDS_PAUSE                       732\r
+#define IDS_A                           733\r
+#define IDS_S                           734\r
+#define IDS_D                           735\r
+#define IDS_F                           736\r
+#define IDS_G                           737\r
+#define IDS_H                           738\r
+#define IDS_J                           739\r
+#define IDS_K                           740\r
+#define IDS_L                           741\r
+#define IDS_SEMICOLON                   742\r
+#define IDS_QUOTE                       743\r
+#define IDS_BACK_QUOTE                  744\r
+#define IDS_LEFT_SHIFT                  745\r
+#define IDS_BACKSLASH                   746\r
+#define IDS_Z                           747\r
+#define IDS_X                           748\r
+#define IDS_C                           749\r
+#define IDS_V                           750\r
+#define IDS_B                           751\r
+#define IDS_N                           752\r
+#define IDS_M                           753\r
+#define IDS_COMMA                       754\r
+#define IDS_PERIOD                      755\r
+#define IDS_SLASH                       756\r
+#define IDS_DIVIDE                      757\r
+#define IDS_RIGHT_SHIFT                 758\r
+#define IDS_MULTIPLY                    759\r
+#define IDS_PRINT_SCREEN                760\r
+#define IDS_LEFT_ALT                    761\r
+#define IDS_RIGHT_ALT                   762\r
+#define IDS_SPACE                       763\r
+#define IDS_CAPS_LOCK                   764\r
+#define IDS_F1                          765\r
+#define IDS_F2                          766\r
+#define IDS_F3                          767\r
+#define IDS_F4                          768\r
+#define IDS_F5                          769\r
+#define IDS_F6                          770\r
+#define IDS_F7                          771\r
+#define IDS_F8                          772\r
+#define IDS_F9                          773\r
+#define IDS_F10                         774\r
+#define IDS_NUM_LOCK                    775\r
+#define IDS_SCROLL_LOCK                 776\r
+#define IDS_NUMPAD7                     777\r
+#define IDS_HOME                        778\r
+#define IDS_NUMPAD8                     779\r
+#define IDS_UP                          780\r
+#define IDS_NUMPAD9                     781\r
+#define IDS_PAGE_UP                     782\r
+#define IDS_SUBTRACT                    783\r
+#define IDS_NUMPAD4                     784\r
+#define IDS_LEFT                        785\r
+#define IDS_NUMPAD5                     786\r
+#define IDS_NUMPAD6                     787\r
+#define IDS_RIGHT                       788\r
+#define IDS_ADD                         789\r
+#define IDS_NUMPAD1                     790\r
+#define IDS_END                         791\r
+#define IDS_NUMPAD2                     792\r
+#define IDS_DOWN                        793\r
+#define IDS_NUMPAD3                     794\r
+#define IDS_PAGE_DOWN                   795\r
+#define IDS_NUMPAD0                     796\r
+#define IDS_INSERT                      797\r
+#define IDS_NUMPADDELETE                798\r
+#define IDS_DELETE                      799\r
+#define IDS_F11                         800\r
+#define IDS_F12                         801\r
+#define IDS_LEFT_WINDOWS                802\r
+#define IDS_RIGHT_WINDOWS               803\r
+#define IDS_APPLICATION                 804\r
+#define IDS_KANA                        805\r
+#define IDS_BACKSLASH2                  806\r
+#define IDS_CONVERT                     807\r
+#define IDS_NONCONVERT                  808\r
+#define IDS_BACKSLASH1                  809\r
+#define IDS_CARET                       810\r
+#define IDS_AT_MARK                     811\r
+#define IDS_COLON                       812\r
+#define IDS_HANKAKU                     813\r
+#define IDS_ACPI_POWER                  814\r
+#define IDS_ACPI_SLEEP                  815\r
+#define IDS_ACPI_WAKE                   816\r
+#define IDS_CONTROL_X_PREFIX_T          900\r
+#define IDS_CONTROL_T                   901\r
+#define IDS_CONTROL_PREFIX_T            902\r
+#define IDS_CLOSE_INPUT_METHOD_T        903\r
+#define IDS_COPY_T                      904\r
+#define IDS_CUT_T                       905\r
+#define IDS_ENABLE_OR_DISABLE_XKEYMACS_T 906\r
+#define IDS_ENTER_T                     907\r
+#define IDS_NEWLINE_T                   907\r
+#define IDS_ESCAPE_T                    908\r
+#define IDS_FIND_T                      909\r
+#define IDS_FIND_NEXT_T                 910\r
+#define IDS_IGNORE_T                    911\r
+#define IDS_KILL_LINE_FOR_ALL_FORMAT_T  912\r
+#define IDS_MAXIMIZE_T                  913\r
+#define IDS_MAXIMIZE_HORIZONTALLY_T     914\r
+#define IDS_MAXIMIZE_VERTICALLY_T       915\r
+#define IDS_META_PREFIX_T               916\r
+#define IDS_META_T                      917\r
+#define IDS_META_PREFIX_AND_ORIGINAL_T  918\r
+#define IDS_MINIMIZE_T                  919\r
+#define IDS_MOVE_T                      920\r
+#define IDS_NEW_T                       921\r
+#define IDS_OPEN_INPUT_METHOD_T         922\r
+#define IDS_PASS_THROUGH_T              923\r
+#define IDS_PASTE_T                     924\r
+#define IDS_PRINT_T                     925\r
+#define IDS_REDO_T                      926\r
+#define IDS_RESTORE_T                   927\r
+#define IDS_SELECT_ALL_T                928\r
+#define IDS_SIZE_T                      929\r
+#define IDS_SWITCH_BETWEEN_INPUT_LOCALES_T 930\r
+#define IDS_TEMPORARILY_DISABLE_XKEYMACS_T 931\r
+#define IDS_TILDE_T                     932\r
+#define IDS_BACK_QUOTE_T                933\r
+#define IDS_BACKWARD_CHAR_T             934\r
+#define IDS_BACKWARD_WORD_T             935\r
+#define IDS_BEGINNING_OF_BUFFER_T       936\r
+#define IDS_BEGINNING_OF_LINE_T         937\r
+#define IDS_CALL_LAST_KBD_MACRO_T       938\r
+#define IDS_DELETE_BACKWARD_CHAR_T      939\r
+#define IDS_DELETE_CHAR_T               940\r
+#define IDS_END_KBD_MACRO_T             941\r
+#define IDS_END_OF_BUFFER_T             942\r
+#define IDS_END_OF_LINE_T               943\r
+#define IDS_FIND_FILE_T                 944\r
+#define IDS_FORWARD_CHAR_T              945\r
+#define IDS_FORWARD_WORD_T              946\r
+#define IDS_ICONIFY_OR_DEICONIFY_FRAME_T 947\r
+#define IDS_ISEARCH_BACKWARD_T          948\r
+#define IDS_ISEARCH_FORWARD_T           949\r
+#define IDS_KEYBOARD_QUIT_T             950\r
+#define IDS_KILL_BUFFER_T               951\r
+#define IDS_KILL_LINE_T                 952\r
+#define IDS_KILL_REGION_T               953\r
+#define IDS_KILL_RING_SAVE_T            954\r
+#define IDS_KILL_WORD_T                 955\r
+#define IDS_MARK_PAGE_T                 956\r
+#define IDS_MARK_WHOLE_BUFFER_T         957\r
+#define IDS_NEXT_LINE_T                 958\r
+#define IDS_DIGIT_ARGUMENT0_T           959\r
+#define IDS_DIGIT_ARGUMENT1_T           960\r
+#define IDS_DIGIT_ARGUMENT2_T           961\r
+#define IDS_DIGIT_ARGUMENT3_T           962\r
+#define IDS_DIGIT_ARGUMENT4_T           963\r
+#define IDS_DIGIT_ARGUMENT5_T           964\r
+#define IDS_DIGIT_ARGUMENT6_T           965\r
+#define IDS_DIGIT_ARGUMENT7_T           966\r
+#define IDS_DIGIT_ARGUMENT8_T           967\r
+#define IDS_DIGIT_ARGUMENT9_T           968\r
+#define IDS_NEGATIVE_ARGUMENT_T         969\r
+#define IDS_OPEN_LINE_T                 970\r
+#define IDS_PREVIOUS_LINE_T             971\r
+#define IDS_QUERY_REPLACE_T             972\r
+#define IDS_QUERY_REPLACE_REGEXP_T      973\r
+#define IDS_RECENTER_T                  974\r
+#define IDS_SAVE_BUFFER_T               975\r
+#define IDS_SAVE_BUFFERS_KILL_EMACS_T   976\r
+#define IDS_SCROLL_DOWN_T               977\r
+#define IDS_SCROLL_UP_T                 978\r
+#define IDS_SET_MARK_COMMAND_T          979\r
+#define IDS_SHELL_COMMAND_T             980\r
+#define IDS_START_KBD_MACRO_T           981\r
+#define IDS_SWITCH_TO_BUFFER_T          982\r
+#define IDS_TAB_T                       983\r
+#define IDS_TOGGLE_WIN32IME_MODE_T      984\r
+#define IDS_TRANSPOSE_CHARS_T           985\r
+#define IDS_TRANSPOSE_LINES_T           986\r
+#define IDS_UNDO_T                      987\r
+#define IDS_UNIVERSAL_ARGUMENT_T        988\r
+#define IDS_WRITE_FILE_T                989\r
+#define IDS_YANK_T                      990\r
+#define IDS_YANK_POP_T                  991\r
+#define IDS_BACKWARD_KILL_WORD_T        992\r
+#define IDS_ENABLE_XKEYMACS_T           993\r
+#define IDS_DISABLE_XKEYMACS_T          994\r
+#define IDS_CAPS_LOCK_T                 995\r
+#define IDS_COMPLETE_CLOSE_INPUT_METHOD_T 996\r
+#define IDS_COMPLETE_TOGGLE_INPUT_METHOD_T 997\r
+#define IDS_UNDERSCORE_T                998\r
+#define IDS_ROLL_UP_UNROLL_T            999\r
+#define IDC_APPLY                       1000\r
+#define IDS_RETOP_T                     1000\r
+#define IDC_LOAD_DEFAULT                1001\r
+#define IDS_OSMODIFIER_SHIFT_T          1001\r
+#define IDC_SELECT_ALL                  1002\r
+#define IDS_OSMODIFIER_SHIFT_REPEAT_T   1002\r
+#define IDC_CLEAR_ALL                   1003\r
+#define IDS_OSMODIFIER_CTRL_T           1003\r
+#define IDC_APPLICATION                 1004\r
+#define IDS_OSMODIFIER_CTRL_REPEAT_T    1004\r
+#define IDC_CP                          1005\r
+#define IDC_APPLICATION_                1005\r
+#define IDS_OSMODIFIER_ALT_T            1005\r
+#define IDC_CN                          1006\r
+#define IDS_OSMODIFIER_ALT_REPEAT_T     1006\r
+#define IDC_CF                          1007\r
+#define IDS_CYCLE_ITEMS_T               1007\r
+#define IDC_CB                          1008\r
+#define IDS_CYCLE_ITEMS_INVERSELY_T     1008\r
+#define IDC_CA                          1009\r
+#define IDS_TRANSPOSE_WORDS_T           1009\r
+#define IDC_CE                          1010\r
+#define IDS_FILL_PARAGRAPH_T            1010\r
+#define IDC_CV                          1011\r
+#define IDS_DOWNCASE_WORD_T             1011\r
+#define IDC_MV                          1012\r
+#define IDS_UPCASE_WORD_T               1012\r
+#define IDC_CD                          1013\r
+#define IDS_CAPITALIZE_WORD_T           1013\r
+#define IDC_CH                          1014\r
+#define IDS_EXECUTE_EXTENDED_COMMAND_T  1014\r
+#define IDC_CW                          1015\r
+#define IDC_MW                          1016\r
+#define IDC_CY                          1017\r
+#define IDC_CT                          1018\r
+#define IDC_CK                          1019\r
+#define IDC_CSPACE                      1020\r
+#define IDC_CI                          1021\r
+#define IDC_CM                          1022\r
+#define IDC_CG                          1023\r
+#define IDC_CDIGIT                      1024\r
+#define IDC_CSLASH                      1025\r
+#define IDC_CS                          1026\r
+#define IDC_CXCJ                        1027\r
+#define IDC_CXCC                        1028\r
+#define IDC_CXCF                        1029\r
+#define IDC_CXCS                        1030\r
+#define IDC_CXCW                        1031\r
+#define IDC_CXU                         1032\r
+#define IDC_CZ                          1033\r
+#define IDC_USE_DEFAULT                 1034\r
+#define IDC_MT                          1034\r
+#define IDC_CO                          1035\r
+#define IDC_CBACKSLASH                  1036\r
+#define IDC_CBACKSLASH_106              1038\r
+#define IDC_AUTO_RUN                    1039\r
+#define IDC_CL                          1040\r
+#define IDC_CR                          1042\r
+#define IDC_MS1                         1043\r
+#define IDC_SQUARE_BRA                  1046\r
+#define IDC_ESCAPE                      1047\r
+#define IDC_SQUARE_BRA_                 1047\r
+#define IDC_MSPERIOD                    1048\r
+#define IDC_MSCOMMA                     1049\r
+#define IDC_CXCP                        1052\r
+#define IDC_MB                          1053\r
+#define IDC_MF                          1054\r
+#define IDC_REMAP_CAPSLOCK_LEFTCTRL     1058\r
+#define IDC_REMAP_LEFTCTRL_CAPSLOCK     1059\r
+#define IDC_SWAP_ESC_BACKQUOTE          1060\r
+#define IDC_USAGE                       1061\r
+#define IDC_FILE_COMPLETION             1063\r
+#define IDC_VERSION_INFORMATION         1064\r
+#define IDC_LEFT_ALT                    1065\r
+#define IDC_RIGHT_ALT                   1066\r
+#define IDC_SPACE                       1067\r
+#define IDC_LEFT_ALT_                   1068\r
+#define IDC_ALT                         1069\r
+#define IDC_SPACE_                      1069\r
+#define IDC_RIGHT_ALT_                  1070\r
+#define IDC_URL                         1071\r
+#define IDC_CQ                          1073\r
+#define IDC_C_X_                        1075\r
+#define IDC_CTRL                        1076\r
+#define IDC_SHIFT                       1077\r
+#define IDC_M_X                         1078\r
+#define IDC_CU                          1081\r
+#define IDC_MS5                         1085\r
+#define IDC_CMS5                        1086\r
+#define IDC_MY                          1088\r
+#define IDC_EDIT1                       1091\r
+#define IDC_KILL_RING_MAX               1091\r
+#define IDC_NEW_KEY                     1091\r
+#define IDC_MACRO_NAME                  1091\r
+#define IDC_REMAP_LWINDOWS_LALT         1092\r
+#define IDC_REMAP_LEFTWINDOWS_LEFTALT   1092\r
+#define IDC_REMAP_LALT_LWINDOWS         1093\r
+#define IDC_REMAP_LEFTALT_LEFTWINDOWS   1093\r
+#define IDC_REMAP_RWINDOWS_RALT         1094\r
+#define IDC_REMAP_RIGHTWINDOWS_RIGHTALT 1094\r
+#define IDC_REMAP_RALT_RWINDOWS         1095\r
+#define IDC_REMAP_RIGHTALT_RIGHTWINDOWS 1095\r
+#define IDC_REMAP_NONCONVERT_LALT       1096\r
+#define IDC_REMAP_NONCONVERT_LEFTALT    1096\r
+#define IDC_REMAP_CONVERT_LALT          1097\r
+#define IDC_REMAP_CONVERT_LEFTALT       1097\r
+#define IDC_RCTRL_LALT                  1098\r
+#define IDC_REMAP_RIGHTCTRL_LEFTALT     1098\r
+#define IDC_CENTER                      1099\r
+#define IDC_C_                          1100\r
+#define IDC_CO2                         1102\r
+#define IDC_MI                          1106\r
+#define IDC_CATEGORY                    1108\r
+#define IDC_DESCRIPTION                 1111\r
+#define IDC_COMMANDS                    1113\r
+#define IDC_CURRENT_KEYS                1114\r
+#define IDC_ASSIGN                      1115\r
+#define IDC_REMOVE                      1116\r
+#define IDC_RESET_ALL                   1117\r
+#define IDC_SETTING_DEFAULT             1118\r
+#define IDC_SETTING_SPECIFIC            1119\r
+#define IDC_SETTING_DISABLE             1120\r
+#define IDC_FILES                       1128\r
+#define IDC_SEARCH                      1129\r
+#define IDC_WINDOW                      1130\r
+#define IDC_RECOVERY                    1131\r
+#define IDC_MOTION                      1132\r
+#define IDC_IME                         1133\r
+#define IDC_KILL                        1134\r
+#define IDC_OTHER                       1135\r
+#define IDC_CURRENTLY_ASSIGNED          1136\r
+#define IDC_M_                          1137\r
+#define IDC_KANA_                       1138\r
+#define IDC_CXK                         1139\r
+#define IDC_CONVERT_                    1139\r
+#define IDC_MD                          1141\r
+#define IDC_CXH                         1143\r
+#define IDC_USE_DIALOG_SETTING          1148\r
+#define IDC_CHECK1                      1149\r
+#define IDC_CXS9                        1149\r
+#define IDC_C_X                         1149\r
+#define IDC_EXTENDED_KEY                1149\r
+#define IDC_CHECK2                      1150\r
+#define IDC_CXS0                        1150\r
+#define IDC_REPEATED_KEY                1150\r
+#define IDC_ENABLE_CUA                  1150\r
+#define IDC_CXE                         1151\r
+#define IDC_CXB                         1152\r
+#define IDC_BACK_QUOTE                  1154\r
+#define IDC_1                           1155\r
+#define IDC_2                           1156\r
+#define IDC_3                           1157\r
+#define IDC_4                           1158\r
+#define IDC_5                           1159\r
+#define IDC_6                           1160\r
+#define IDC_7                           1161\r
+#define IDC_8                           1162\r
+#define IDC_9                           1163\r
+#define IDC_0                           1164\r
+#define IDC_MINUS                       1165\r
+#define IDC_EQUAL                       1166\r
+#define IDC_BACKSPACE                   1167\r
+#define IDC_TAB                         1168\r
+#define IDC_LEFT_CTRL                   1169\r
+#define IDC_ESC                         1170\r
+#define IDC_CAPS_LOCK                   1171\r
+#define IDC_F1                          1172\r
+#define IDC_F2                          1173\r
+#define IDC_LEFT_SHIFT                  1174\r
+#define IDC_F3                          1175\r
+#define IDC_Q                           1176\r
+#define IDC_W                           1177\r
+#define IDC_E                           1178\r
+#define IDC_R                           1179\r
+#define IDC_T                           1180\r
+#define IDC_Y                           1181\r
+#define IDC_U                           1182\r
+#define IDC_I                           1183\r
+#define IDC_O                           1184\r
+#define IDC_P                           1185\r
+#define IDC_CAPS_LOCK_                  1186\r
+#define IDC_SQUARE_CKET                 1187\r
+#define IDC_BACKSLASH                   1188\r
+#define IDC_A                           1189\r
+#define IDC_S                           1190\r
+#define IDC_D                           1191\r
+#define IDC_F                           1192\r
+#define IDC_G                           1193\r
+#define IDC_H                           1194\r
+#define IDC_J                           1195\r
+#define IDC_K                           1196\r
+#define IDC_L                           1197\r
+#define IDC_SEMICOLON                   1198\r
+#define IDC_QUOTE                       1199\r
+#define IDC_ENTER                       1200\r
+#define IDC_Z                           1201\r
+#define IDC_X                           1202\r
+#define IDC_C                           1203\r
+#define IDC_V                           1204\r
+#define IDC_B                           1205\r
+#define IDC_N                           1206\r
+#define IDC_M                           1207\r
+#define IDC_COMMA                       1208\r
+#define IDC_PERIOD                      1209\r
+#define IDC_SLASH                       1210\r
+#define IDC_RIGHT_SHIFT                 1211\r
+#define IDC_RIGHT_CTRL                  1212\r
+#define IDC_LEFT_WINDOWS                1213\r
+#define IDC_F4                          1214\r
+#define IDC_F5                          1215\r
+#define IDC_RIGHT_WINDOWS               1216\r
+#define IDC_F6                          1217\r
+#define IDC_F7                          1218\r
+#define IDC_F8                          1219\r
+#define IDC_F9                          1220\r
+#define IDC_F10                         1221\r
+#define IDC_F11                         1222\r
+#define IDC_F12                         1223\r
+#define IDC_INSERT                      1224\r
+#define IDC_HOME                        1225\r
+#define IDC_PAGE_UP                     1226\r
+#define IDC_DELETE                      1227\r
+#define IDC_END                         1228\r
+#define IDC_PAGE_DOWN                   1229\r
+#define IDC_UP                          1230\r
+#define IDC_LEFT                        1231\r
+#define IDC_DOWN                        1232\r
+#define IDC_RIGHT                       1233\r
+#define IDC_PRINT_SCREEN                1234\r
+#define IDC_SCROLL_LOCK                 1235\r
+#define IDC_PAUSE                       1236\r
+#define IDC_NUM_LOCK                    1237\r
+#define IDC_DIVIDE                      1238\r
+#define IDC_MULTIPLY                    1239\r
+#define IDC_SUBTRACT                    1240\r
+#define IDC_NUMPAD7                     1241\r
+#define IDC_NUMPAD8                     1242\r
+#define IDC_NUMPAD9                     1243\r
+#define IDC_NUMPAD4                     1244\r
+#define IDC_NUMPAD5                     1245\r
+#define IDC_NUMPAD6                     1246\r
+#define IDC_NUMPAD1                     1247\r
+#define IDC_NUMPAD2                     1248\r
+#define IDC_NUMPAD3                     1249\r
+#define IDC_NUMPAD0                     1250\r
+#define IDC_ADD                         1251\r
+#define IDC_NUMPADDELETE                1252\r
+#define IDC_NUMPADENTER                 1253\r
+#define IDC_ESC_                        1254\r
+#define IDC_F1_                         1255\r
+#define IDC_F2_                         1256\r
+#define IDC_F3_                         1257\r
+#define IDC_F4_                         1258\r
+#define IDC_F5_                         1259\r
+#define IDC_F6_                         1260\r
+#define IDC_F7_                         1261\r
+#define IDC_F8_                         1262\r
+#define IDC_F9_                         1263\r
+#define IDC_F10_                        1264\r
+#define IDC_F11_                        1265\r
+#define IDC_F12_                        1266\r
+#define IDC_PRINT_SCREEN_               1267\r
+#define IDC_SCROLL_LOCK_                1268\r
+#define IDC_PAUSE_                      1269\r
+#define IDC_BACK_QUOTE_                 1270\r
+#define IDC_1_                          1271\r
+#define IDC_2_                          1272\r
+#define IDC_3_                          1273\r
+#define IDC_4_                          1274\r
+#define IDC_5_                          1275\r
+#define IDC_6_                          1276\r
+#define IDC_7_                          1277\r
+#define IDC_8_                          1278\r
+#define IDC_9_                          1279\r
+#define IDC_0_                          1280\r
+#define IDC_MINUS_                      1281\r
+#define IDC_EQUAL_                      1282\r
+#define IDC_BACKSPACE_                  1283\r
+#define IDC_TAB_                        1284\r
+#define IDC_Q_                          1285\r
+#define IDC_W_                          1286\r
+#define IDC_E_                          1287\r
+#define IDC_R_                          1288\r
+#define IDC_T_                          1289\r
+#define IDC_Y_                          1290\r
+#define IDC_U_                          1291\r
+#define IDC_I_                          1292\r
+#define IDC_O_                          1293\r
+#define IDC_P_                          1294\r
+#define IDC_SQUARE_CKET_                1295\r
+#define IDC_BACKSLASH_                  1296\r
+#define IDC_A_                          1297\r
+#define IDC_S_                          1298\r
+#define IDC_D_                          1299\r
+#define IDC_F_                          1300\r
+#define IDC_G_                          1301\r
+#define IDC_H_                          1302\r
+#define IDC_J_                          1303\r
+#define IDC_K_                          1304\r
+#define IDC_L_                          1305\r
+#define IDC_SEMICOLON_                  1306\r
+#define IDC_QUOTE_                      1307\r
+#define IDC_ENTER_                      1308\r
+#define IDC_LEFT_SHIFT_                 1309\r
+#define IDC_Z_                          1310\r
+#define IDC_X_                          1311\r
+#define IDC_NONCONVERT                  1312\r
+#define IDC_V_                          1313\r
+#define IDC_B_                          1314\r
+#define IDC_N_                          1315\r
+#define IDC_CXCT                        1315\r
+#define IDC_BACKSLASH1                  1316\r
+#define IDC_COMMA_                      1317\r
+#define IDC_PROPERTIES_LIST             1317\r
+#define IDC_PERIOD_                     1318\r
+#define IDC_SUBSEQUENT_KEYBOARD_INPUT   1318\r
+#define IDC_SLASH_                      1319\r
+#define IDC_RIGHT_SHIFT_                1320\r
+#define IDC_NCODE                       1320\r
+#define IDC_LEFT_CTRL_                  1321\r
+#define IDC_WPARAM                      1321\r
+#define IDC_LEFT_WINDOWS_               1322\r
+#define IDC_LPARAM                      1322\r
+#define IDC_RIGHT_WINDOWS_              1323\r
+#define IDC_RIGHT_CTRL_                 1324\r
+#define IDC_EDIT                        1324\r
+#define IDC_INSERT_                     1325\r
+#define IDC_HOME_                       1326\r
+#define IDC_PAGE_UP_                    1327\r
+#define IDC_MACRO_NAMES                 1327\r
+#define IDC_DELETE_                     1328\r
+#define IDC_SAVE                        1328\r
+#define IDC_END_                        1329\r
+#define IDC_KEY                         1329\r
+#define IDC_PAGE_DOWN_                  1330\r
+#define IDC_STATE                       1330\r
+#define IDC_UP_                         1331\r
+#define IDC_RADIO1                      1331\r
+#define IDC_LEFT_                       1332\r
+#define IDC_DOWN_                       1333\r
+#define IDC_MDEL                        1333\r
+#define IDC_RIGHT_                      1334\r
+#define IDC_MF12                        1334\r
+#define IDC_NUM_LOCK_                   1335\r
+#define IDC_WINDOW_TEXT                 1335\r
+#define IDC_DIVIDE_                     1336\r
+#define IDC_MULTIPLY_                   1337\r
+#define IDC_LEGAL_COPYRIGHT             1337\r
+#define IDC_SUBTRACT_                   1338\r
+#define IDC_ML                          1338\r
+#define IDC_NUMPAD7_                    1339\r
+#define IDC_MU                          1339\r
+#define IDC_NUMPAD8_                    1340\r
+#define IDC_MC                          1340\r
+#define IDC_NUMPAD9_                    1341\r
+#define IDC_MX                          1341\r
+#define IDC_NUMPAD4_                    1342\r
+#define IDC_NUMPAD5_                    1343\r
+#define IDC_NUMPAD6_                    1344\r
+#define IDC_ADD_                        1345\r
+#define IDC_NUMPAD1_                    1346\r
+#define IDC_NUMPAD2_                    1347\r
+#define IDC_NUMPAD3_                    1348\r
+#define IDC_NUMPAD0_                    1349\r
+#define IDC_NUMPADDELETE_               1350\r
+#define IDC_NUMPADENTER_                1351\r
+#define IDC_BACKSLASH1_                 1352\r
+#define IDC_BACKSLASH2                  1353\r
+#define IDC_BACKSLASH2_                 1354\r
+#define IDC_KANA                        1355\r
+#define IDC_CONVERT                     1356\r
+#define IDC_NONCONVERT_                 1357\r
+#define IDC_ACPI_POWER                  1358\r
+#define IDC_ACPI_POWER_                 1359\r
+#define IDC_ACPI_SLEEP                  1360\r
+#define IDC_ACPI_SLEEP_                 1361\r
+#define IDC_ACPI_WAKE                   1362\r
+#define IDC_ACPI_WAKE_                  1363\r
+#define IDC_ABOUT                       32771\r
+#define IDC_QUIT                        32772\r
+#define IDC_STOP                        32773\r
+#define IDC_DISABLE                     32773\r
+#define IDC_PROPERTIES                  32774\r
+#define IDC_OPTIONS                     32775\r
+#define IDC_CUSTOMIZE                   32776\r
+#define IDC_KEYBOARD                    32777\r
+#define IDC_EXPORT                      32778\r
+#define IDC_IMPORT                      32779\r
+#define IDC_MACRO                       32780\r
+#define IDC_RESET                       32781\r
+#define IDC_KEYBOARD_ANY_USER           32784\r
+\r
+// Next default values for new objects\r
+// \r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+#define _APS_3D_CONTROLS                     1\r
+#define _APS_NEXT_RESOURCE_VALUE        157\r
+#define _APS_NEXT_COMMAND_VALUE         32785\r
+#define _APS_NEXT_CONTROL_VALUE         1342\r
+#define _APS_NEXT_SYMED_VALUE           101\r
+#endif\r
+#endif\r
diff --git a/xkeymacs/stdafx.cpp b/xkeymacs/stdafx.cpp
new file mode 100644 (file)
index 0000000..d8b2659
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes\r
+//     xkeymacs.pch will be the pre-compiled header\r
+//     stdafx.obj will contain the pre-compiled type information\r
+\r
+#include "stdafx.h"\r
+\r
+\r
+\r
diff --git a/xkeymacs/stdafx.h b/xkeymacs/stdafx.h
new file mode 100644 (file)
index 0000000..3dbe5d6
--- /dev/null
@@ -0,0 +1,33 @@
+// stdafx.h : include file for standard system include files,\r
+//  or project specific include files that are used frequently, but\r
+//      are changed infrequently\r
+//\r
+\r
+#if !defined(AFX_STDAFX_H__C7A72283_D846_468F_B48D_3C5A11DBAED2__INCLUDED_)\r
+#define AFX_STDAFX_H__C7A72283_D846_468F_B48D_3C5A11DBAED2__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#define VC_EXTRALEAN           // Exclude rarely-used stuff from Windows headers\r
+\r
+#include <afxwin.h>         // MFC core and standard components\r
+#include <afxext.h>         // MFC extensions\r
+// #include <afxdisp.h>        // MFC Automation classes\r
+#include <afxdtctl.h>          // MFC support for Internet Explorer 4 Common Controls\r
+#ifndef _AFX_NO_AFXCMN_SUPPORT\r
+#include <afxcmn.h>                    // MFC support for Windows Common Controls\r
+#endif // _AFX_NO_AFXCMN_SUPPORT\r
+\r
+#pragma comment(lib, "xkeymacs.lib")\r
+#include "../xkeymacsdll/xkeymacsdll.h"\r
+#include "../xkeymacsdll/Commands.h"\r
+#include "../xkeymacsdll/Utils.h"\r
+#include "../xkeymacsdll/FunctionDefinition.h"\r
+\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_STDAFX_H__C7A72283_D846_468F_B48D_3C5A11DBAED2__INCLUDED_)\r
diff --git a/xkeymacs/xkeymacs.cpp b/xkeymacs/xkeymacs.cpp
new file mode 100644 (file)
index 0000000..af4e18e
--- /dev/null
@@ -0,0 +1,269 @@
+// xkeymacs.cpp : Defines the class behaviors for the application.\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "xkeymacs.h"\r
+#include "Profile.h"\r
+#include "MainFrm.h"\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CXkeymacsApp\r
+\r
+BEGIN_MESSAGE_MAP(CXkeymacsApp, CWinApp)\r
+       //{{AFX_MSG_MAP(CXkeymacsApp)\r
+       ON_COMMAND(ID_APP_ABOUT, OnAppAbout)\r
+               // NOTE - the ClassWizard will add and remove mapping macros here.\r
+               //    DO NOT EDIT what you see in these blocks of generated code!\r
+       //}}AFX_MSG_MAP\r
+       // Standard file based document commands\r
+       ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)\r
+       ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)\r
+END_MESSAGE_MAP()\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CXkeymacsApp construction\r
+\r
+CXkeymacsApp::CXkeymacsApp()\r
+{\r
+       // TODO: add construction code here,\r
+       // Place all significant initialization in InitInstance\r
+\r
+       m_Instance = FirstInstance;\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// The one and only CXkeymacsApp object\r
+\r
+CXkeymacsApp theApp;\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CXkeymacsApp initialization\r
+\r
+BOOL CXkeymacsApp::InitInstance()\r
+{\r
+//     AfxEnableControlContainer();\r
+\r
+       // Standard initialization\r
+       // If you are not using these features and wish to reduce the size\r
+       //  of your final executable, you should remove from the following\r
+       //  the specific initialization routines you do not need.\r
+\r
+       m_hMutex = CreateMutex(FALSE, 0, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)));\r
+\r
+    if (::GetLastError() == ERROR_ALREADY_EXISTS) {\r
+               m_Instance = SecondInstance;\r
+        CloseHandle( m_hMutex );\r
+        return FALSE;\r
+    }\r
+\r
+#ifdef _AFXDLL\r
+       Enable3dControls();                     // Call this when using MFC in a shared DLL\r
+#else\r
+       Enable3dControlsStatic();       // Call this when linking to MFC statically\r
+#endif\r
+\r
+       // Change the registry key under which our settings are stored.\r
+       // TODO: You should modify this string to be something appropriate\r
+       // such as the name of your company or organization.\r
+//     SetRegistryKey(_T("Local AppWizard-Generated Applications"));\r
+       SetRegistryKey(IDS_REGISTRY_KEY);\r
+       free((void*)m_pszProfileName);\r
+       m_pszProfileName=_tcsdup(_T("XKeymacs2"));\r
+//\r
+//     LoadStdProfileSettings();  // Load standard INI file options (including MRU)\r
+\r
+       // Parse command line for standard shell commands, DDE, file open\r
+//     CCommandLineInfo cmdInfo;\r
+//     ParseCommandLine(cmdInfo);\r
+\r
+       // Dispatch commands specified on the command line\r
+//     if (!ProcessShellCommand(cmdInfo))\r
+//             return FALSE;\r
+\r
+       // The one and only window has been initialized, so show and update it.\r
+       m_pMainWnd = new CMainFrame;\r
+       m_pMainWnd->ShowWindow(SW_HIDE);\r
+       m_pMainWnd->UpdateWindow();\r
+       SetClassLong(m_pMainWnd->m_hWnd, GCL_HICON, (LONG)LoadIcon(IDR_MAINFRAME));\r
+\r
+       // set registry key\r
+//     CMainFrame *pMainWnd = (CMainFrame*)m_pMainWnd;\r
+       CProfile::InitDllData();\r
+\r
+       return TRUE;\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CAboutDlg dialog used for App About\r
+\r
+CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)\r
+{\r
+       //{{AFX_DATA_INIT(CAboutDlg)\r
+       m_szVersionInformation = _T("");\r
+       m_szLegalCopyright = _T("");\r
+       //}}AFX_DATA_INIT\r
+\r
+       m_szLegalCopyright.Format(_T("Copyright (C) 2001-2006"));       // rough\r
+\r
+       WORD wMajorVersion              = 0;\r
+       WORD wMinorVersion              = 0;\r
+       WORD wBuildVersion              = 0;\r
+       WORD wRevisionVersion   = 0;\r
+\r
+       TCHAR szFileName[MAX_PATH] = {'\0'};\r
+       GetModuleFileName(NULL, szFileName, sizeof(szFileName));\r
+       DWORD dwHandle = 0;\r
+\r
+       DWORD dwLen = GetFileVersionInfoSize(szFileName, &dwHandle);\r
+       if (dwLen) {\r
+               LPVOID lpData = new BYTE[dwLen];\r
+               if (GetFileVersionInfo(szFileName, dwHandle, dwLen, lpData)) {\r
+                       VS_FIXEDFILEINFO *pInfo;\r
+                       UINT uLen;\r
+                       if (VerQueryValue(lpData, _T("\\"), (LPVOID *)&pInfo, &uLen)) {\r
+                               wMajorVersion           = (WORD)((pInfo->dwProductVersionMS >> 16) & 0xffff);\r
+                               wMinorVersion           = (WORD)((pInfo->dwProductVersionMS      ) & 0xffff);\r
+                               wBuildVersion           = (WORD)((pInfo->dwProductVersionLS >> 16) & 0xffff);\r
+                               wRevisionVersion        = (WORD)((pInfo->dwProductVersionLS      ) & 0xffff);\r
+                       }\r
+\r
+                       Translate_t *lpTranslate = NULL;\r
+                       UINT cbTranslate = 0;\r
+                       if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslate, &cbTranslate) && sizeof(Translate_t) <= cbTranslate) {\r
+                               LPVOID lpLegalCopyright = NULL;\r
+                               UINT uLen = 0;\r
+                               CString SubBlock;\r
+\r
+                               SubBlock.Format(_T("\\StringFileInfo\\%04x%04x\\LegalCopyright"), lpTranslate->wLanguage, lpTranslate->wCodePage);\r
+                               if (VerQueryValue(lpData, SubBlock.GetBuffer(SubBlock.GetLength()), (LPVOID *)&lpLegalCopyright, &uLen) && uLen) {\r
+                                       m_szLegalCopyright.Format(_T("%s"), lpLegalCopyright);\r
+                               }\r
+                       }\r
+               }\r
+               delete[] lpData;\r
+               lpData = NULL;\r
+       }\r
+\r
+       m_szVersionInformation.Format(_T("%s Version %d.%d"), CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)), wMajorVersion, wMinorVersion);\r
+\r
+       if (wBuildVersion) {\r
+               CString sz;\r
+               sz.Format(_T(".%d"), wBuildVersion);\r
+               m_szVersionInformation += sz;\r
+\r
+               if (wRevisionVersion) {\r
+                       CString sz;\r
+                       sz.Format(_T(".%d"), wRevisionVersion);\r
+                       m_szVersionInformation += sz;\r
+               }\r
+       }\r
+}\r
+\r
+void CAboutDlg::DoDataExchange(CDataExchange *pDX)\r
+{\r
+       CDialog::DoDataExchange(pDX);\r
+       //{{AFX_DATA_MAP(CAboutDlg)\r
+       DDX_Control(pDX, IDC_URL, m_cURL);\r
+       DDX_Text(pDX, IDC_VERSION_INFORMATION, m_szVersionInformation);\r
+       DDX_Text(pDX, IDC_LEGAL_COPYRIGHT, m_szLegalCopyright);\r
+       //}}AFX_DATA_MAP\r
+}\r
+\r
+BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)\r
+       //{{AFX_MSG_MAP(CAboutDlg)\r
+       ON_WM_CLOSE()\r
+       ON_BN_CLICKED(IDC_URL, OnUrl)\r
+       ON_WM_CTLCOLOR()\r
+       ON_WM_SETCURSOR()\r
+       //}}AFX_MSG_MAP\r
+END_MESSAGE_MAP()\r
+\r
+// App command to run the dialog\r
+void CXkeymacsApp::OnAppAbout()\r
+{\r
+       CAboutDlg aboutDlg;\r
+       aboutDlg.DoModal();\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CXkeymacsApp message handlers\r
+\r
+\r
+int CXkeymacsApp::ExitInstance() \r
+{\r
+       // TODO: Add your specialized code here and/or call the base class\r
+\r
+       if (m_Instance == FirstInstance) {\r
+           ReleaseMutex( m_hMutex );\r
+               CloseHandle( m_hMutex );\r
+\r
+               m_pMainWnd->DestroyWindow();\r
+               delete m_pMainWnd;\r
+               m_pMainWnd = NULL;\r
+       }\r
+\r
+       return CWinApp::ExitInstance();\r
+}\r
+\r
+void CAboutDlg::OnOK() \r
+{\r
+       // TODO: Add extra validation here\r
+       CDialog::OnOK();\r
+}\r
+\r
+\r
+void CAboutDlg::OnClose() \r
+{\r
+       // TODO: Add your message handler code here and/or call default\r
+       CDialog::OnClose();\r
+}\r
+\r
+void CAboutDlg::OnUrl() \r
+{\r
+       // TODO: Add your message handler code here and/or call default\r
+       CString szURL;\r
+       m_cURL.GetWindowText(szURL);\r
+\r
+       ShellExecute(m_hWnd, NULL, szURL, NULL, NULL, SW_SHOWNORMAL);\r
+}\r
+\r
+HBRUSH CAboutDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor) \r
+{\r
+       HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);\r
+       \r
+       // TODO: Change any attributes of the DC here\r
+       COLORREF crBlue = RGB(0, 0, 0xff);\r
+\r
+       if (pWnd == &m_cURL) {\r
+               pDC->SetTextColor(crBlue);\r
+       }\r
+\r
+       // TODO: Return a different brush if the default is not desired\r
+       return hbr;\r
+}\r
+\r
+BOOL CAboutDlg::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message) \r
+{\r
+       // TODO: Add your message handler code here and/or call default\r
+       CRect rect;\r
+       m_cURL.GetWindowRect(rect);\r
+\r
+       POINT p;\r
+       ::GetCursorPos(&p);\r
+\r
+       if (rect.PtInRect(p)) {\r
+               HCURSOR hCursor = (HCURSOR)LoadImage(theApp.m_hInstance, MAKEINTRESOURCE(IDC_HAND_CURSOR),\r
+                                                                                        IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);\r
+               SetCursor(hCursor);\r
+               return TRUE;    \r
+       }\r
+\r
+       return CDialog::OnSetCursor(pWnd, nHitTest, message);\r
+}\r
diff --git a/xkeymacs/xkeymacs.dsp b/xkeymacs/xkeymacs.dsp
new file mode 100644 (file)
index 0000000..ec6d672
--- /dev/null
@@ -0,0 +1,316 @@
+# Microsoft Developer Studio Project File - Name="xkeymacs" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** \95Ò\8fW\82µ\82È\82¢\82Å\82­\82¾\82³\82¢ **\r
+\r
+# TARGTYPE "Win32 (x86) Application" 0x0101\r
+\r
+CFG=xkeymacs - Win32 Debug\r
+!MESSAGE \82±\82ê\82Í\97L\8cø\82ÈÒ²¸Ì§²Ù\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81\82±\82ÌÌßÛ¼Þª¸Ä\82ðËÞÙÄÞ\82·\82é\82½\82ß\82É\82Í NMAKE \82ð\8eg\97p\82µ\82Ä\82­\82¾\82³\82¢\81B\r
+!MESSAGE [Ò²¸Ì§²Ù\82Ì´¸½Îß°Ä] ºÏÝÄÞ\82ð\8eg\97p\82µ\82Ä\8eÀ\8ds\82µ\82Ä\82­\82¾\82³\82¢\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "xkeymacs.mak".\r
+!MESSAGE \r
+!MESSAGE NMAKE \82Ì\8eÀ\8ds\8e\9e\82É\8d\\90¬\82ð\8ew\92è\82Å\82«\82Ü\82·\r
+!MESSAGE ºÏÝÄޠײÝ\8fã\82ÅϸÛ\82Ì\90Ý\92è\82ð\92è\8b`\82µ\82Ü\82·\81B\97á:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "xkeymacs.mak" CFG="xkeymacs - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE \91I\91ð\89Â\94\\82ÈËÞÙÄÞ Ó°ÄÞ:\r
+!MESSAGE \r
+!MESSAGE "xkeymacs - Win32 Release" ("Win32 (x86) Application" \97p)\r
+!MESSAGE "xkeymacs - Win32 Debug" ("Win32 (x86) Application" \97p)\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""$/xkeymacs", WBAAAAAA"\r
+# PROP Scc_LocalPath "."\r
+CPP=cl.exe\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "xkeymacs - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 6\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 6\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c\r
+# ADD CPP /nologo /MD /W4 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR /Yu"stdafx.h" /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"\r
+# ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386\r
+# ADD LINK32 Version.lib imm32.lib Shlwapi.lib /nologo /subsystem:windows /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "xkeymacs - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 6\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 6\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\xkeymacs\Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W4 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR /Yu"stdafx.h" /FD /GZ /c\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"\r
+# ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 Version.lib imm32.lib Shlwapi.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "xkeymacs - Win32 Release"\r
+# Name "xkeymacs - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\104Keyboard.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\109Keyboard.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\DotXkeymacs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Key.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\MainFrm.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\OptionsDlg.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Profile.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Properties.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\PropertiesAdvanced.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\PropertiesBasic.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\PropertiesList.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\StdAfx.cpp\r
+# ADD CPP /Yc"stdafx.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xkeymacs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xkeymacs.rc\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\104Keyboard.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\109Keyboard.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\DotXkeymacs.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Key.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\MainFrm.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\OptionsDlg.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Profile.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Properties.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\PropertiesAdvanced.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\PropertiesBasic.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\PropertiesList.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Resource.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\StdAfx.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xkeymacs.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# Begin Source File\r
+\r
+SOURCE=.\res\alt_off.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\alt_on.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\ctrl_off.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\ctrl_on.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\cx_off.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\cx_on.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\disable.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\disable_.cur\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\disable_tmp.cur\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\disable_wocq.cur\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\disableTMP.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\disableWOCQ.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\drag.cur\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\hand.cur\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\meta_off.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\meta_on.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\mx_off.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\mx_on.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\shift_of.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\shift_on.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\sort_asc.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\sort_des.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\xkeymacs.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\xkeymacs.rc2\r
+# End Source File\r
+# End Group\r
+# Begin Source File\r
+\r
+SOURCE=.\ReadMe.txt\r
+# End Source File\r
+# End Target\r
+# End Project\r
diff --git a/xkeymacs/xkeymacs.dsw b/xkeymacs/xkeymacs.dsw
new file mode 100644 (file)
index 0000000..c75f2df
--- /dev/null
@@ -0,0 +1,56 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# \8cx\8d\90\82±\82ÌÜ°¸½Íß°½ Ì§²Ù \82ð\95Ò\8fW\82Ü\82½\82Í\8dí\8f\9c\82µ\82È\82¢\82Å\82­\82¾\82³\82¢!\r
+\r
+###############################################################################\r
+\r
+Project: "xkeymacs"=.\xkeymacs.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+    begin source code control\r
+    "$/xkeymacs", WBAAAAAA\r
+    .\r
+    end source code control\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name xkeymacsdll\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "xkeymacsdll"=..\xkeymacsdll\xkeymacsdll.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+    begin source code control\r
+    "$/xkeymacsdll", KDAAAAAA\r
+    ..\xkeymacsdll\r
+    end source code control\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+    begin source code control\r
+    "$/xkeymacs", WBAAAAAA\r
+    .\r
+    end source code control\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/xkeymacs/xkeymacs.h b/xkeymacs/xkeymacs.h
new file mode 100644 (file)
index 0000000..4d31a06
--- /dev/null
@@ -0,0 +1,360 @@
+// xkeymacs.h : main header file for the XKEYMACS application\r
+//\r
+\r
+#if !defined(AFX_XKEYMACS_H__2E65B9CB_5ADB_4C3B_891F_8EFE395FBB2D__INCLUDED_)\r
+#define AFX_XKEYMACS_H__2E65B9CB_5ADB_4C3B_891F_8EFE395FBB2D__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#ifndef __AFXWIN_H__\r
+       #error include 'stdafx.h' before including this file for PCH\r
+#endif\r
+\r
+#include "resource.h"       // main symbols\r
+\r
+enum Instance\r
+{\r
+       FirstInstance,\r
+       SecondInstance,\r
+};\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CXkeymacsApp:\r
+// See xkeymacs.cpp for the implementation of this class\r
+//\r
+\r
+class CXkeymacsApp : public CWinApp\r
+{\r
+public:\r
+       CXkeymacsApp();\r
+\r
+// Overrides\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(CXkeymacsApp)\r
+       public:\r
+       virtual BOOL InitInstance();\r
+       virtual int ExitInstance();\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+       //{{AFX_MSG(CXkeymacsApp)\r
+       afx_msg void OnAppAbout();\r
+               // NOTE - the ClassWizard will add and remove member functions here.\r
+               //    DO NOT EDIT what you see in these blocks of generated code !\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+private:\r
+       Instance m_Instance;\r
+       HANDLE m_hMutex;\r
+};\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// CAboutDlg dialog used for App About\r
+\r
+class CAboutDlg : public CDialog\r
+{\r
+public:\r
+       CAboutDlg();\r
+\r
+// Dialog Data\r
+       //{{AFX_DATA(CAboutDlg)\r
+       enum { IDD = IDD_ABOUTBOX };\r
+       CStatic m_cURL;\r
+       CString m_szVersionInformation;\r
+       CString m_szLegalCopyright;\r
+       //}}AFX_DATA\r
+\r
+       // ClassWizard generated virtual function overrides\r
+       //{{AFX_VIRTUAL(CAboutDlg)\r
+       protected:\r
+       virtual void DoDataExchange(CDataExchange *pDX);    // DDX/DDV support\r
+       //}}AFX_VIRTUAL\r
+\r
+// Implementation\r
+protected:\r
+       //{{AFX_MSG(CAboutDlg)\r
+       virtual void OnOK();\r
+       afx_msg void OnClose();\r
+       afx_msg void OnUrl();\r
+       afx_msg HBRUSH OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor);\r
+       afx_msg BOOL OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message);\r
+       //}}AFX_MSG\r
+       DECLARE_MESSAGE_MAP()\r
+};\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+static const KeyName_t KeyNames[] = {\r
+       {0,                             _T("")},\r
+       {VK_LBUTTON,    _T("Left mouse button")},\r
+       {VK_RBUTTON,    _T("Right mouse button")},\r
+       {VK_CANCEL,             _T("Break")},\r
+       {VK_MBUTTON,    _T("Middle mouse button")},\r
+       {0x05,                  _T("X1 mouse button")}, // VK_XBUTTON1\r
+       {0x06,                  _T("X2 mouse button")}, // VK_XBUTTON2\r
+       {0x07,                  _T("Undefined")},\r
+       {VK_BACK,               _T("Backspace")},\r
+       {VK_TAB,                _T("Tab")},\r
+       {0x0a,                  _T("Reserved")},\r
+       {0x0b,                  _T("Reserved")},\r
+       {VK_CLEAR,              _T("Clear")},\r
+       {VK_RETURN,             _T("Enter")},\r
+       {0x0e,                  _T("Undefined")},\r
+       {0x0f,                  _T("Undefined")},\r
+       {VK_SHIFT,              _T("Shift")},\r
+       {VK_CONTROL,    _T("Ctrl")},\r
+       {VK_MENU,               _T("Alt")},\r
+       {VK_PAUSE,              _T("Pause")},\r
+       {VK_CAPITAL,    _T("Caps Lock")},\r
+       {VK_KANA,               _T("Kana")},    //      {VK_HANGUEL,    "Hanguel"},     {VK_HANGUL,             "Hangul"},\r
+       {0x16,                  _T("Undefined")},\r
+       {VK_JUNJA,              _T("Junja")},\r
+       {VK_FINAL,              _T("Final")},\r
+       {VK_KANJI,              _T("Kanji")},   //      {VK_HANJA,              "Hanja"},\r
+       {0x1a,                  _T("Undefined")},\r
+       {VK_ESCAPE,             _T("Esc")},\r
+       {VK_CONVERT,    _T("Convert")},         // \95Ï\8a·\r
+       {VK_NONCONVERT, _T("Nonconvert")},      // \96³\95Ï\8a·\r
+       {VK_ACCEPT,             _T("Accept")},\r
+       {VK_MODECHANGE, _T("Mode change")},\r
+       {VK_SPACE,              _T("Space")},\r
+       {VK_PRIOR,              _T("Page Up")},\r
+       {VK_NEXT,               _T("Page Down")},\r
+       {VK_END,                _T("End")},\r
+       {VK_HOME,               _T("Home")},\r
+       {VK_LEFT,               _T("Left")},\r
+       {VK_UP,                 _T("Up")},\r
+       {VK_RIGHT,              _T("Right")},\r
+       {VK_DOWN,               _T("Down")},\r
+       {VK_SELECT,             _T("Select")},\r
+       {VK_PRINT,              _T("Print")},\r
+       {VK_EXECUTE,    _T("Execute")},\r
+       {VK_SNAPSHOT,   _T("Print Screen")},\r
+       {VK_INSERT,             _T("Ins")},\r
+       {VK_DELETE,             _T("Del")},\r
+       {VK_HELP,               _T("Help")},\r
+       {'0',                   _T("0")},\r
+       {'1',                   _T("1")},\r
+       {'2',                   _T("2")},\r
+       {'3',                   _T("3")},\r
+       {'4',                   _T("4")},\r
+       {'5',                   _T("5")},\r
+       {'6',                   _T("6")},\r
+       {'7',                   _T("7")},\r
+       {'8',                   _T("8")},\r
+       {'9',                   _T("9")},\r
+       {0x3a,                  _T("Undefined")},\r
+       {0x3b,                  _T("Undefined")},\r
+       {0x3c,                  _T("Undefined")},\r
+       {0x3d,                  _T("Undefined")},\r
+       {0x3e,                  _T("Undefined")},\r
+       {0x3f,                  _T("Undefined")},\r
+       {0x40,                  _T("Undefined")},\r
+       {'A',                   _T("A")},\r
+       {'B',                   _T("B")},\r
+       {'C',                   _T("C")},\r
+       {'D',                   _T("D")},\r
+       {'E',                   _T("E")},\r
+       {'F',                   _T("F")},\r
+       {'G',                   _T("G")},\r
+       {'H',                   _T("H")},\r
+       {'I',                   _T("I")},\r
+       {'J',                   _T("J")},\r
+       {'K',                   _T("K")},\r
+       {'L',                   _T("L")},\r
+       {'M',                   _T("M")},\r
+       {'N',                   _T("N")},\r
+       {'O',                   _T("O")},\r
+       {'P',                   _T("P")},\r
+       {'Q',                   _T("Q")},\r
+       {'R',                   _T("R")},\r
+       {'S',                   _T("S")},\r
+       {'T',                   _T("T")},\r
+       {'U',                   _T("U")},\r
+       {'V',                   _T("V")},\r
+       {'W',                   _T("W")},\r
+       {'X',                   _T("X")},\r
+       {'Y',                   _T("Y")},\r
+       {'Z',                   _T("Z")},\r
+       {VK_LWIN,               _T("Left Windows")},\r
+       {VK_RWIN,               _T("Right Windows")},\r
+       {VK_APPS,               _T("Application")},\r
+       {0x5e,                  _T("Reserved")},\r
+       {0x5f,                  _T("Sleep")},   // VK_SLEEP\r
+       {VK_NUMPAD0,    _T("Num 0")},\r
+       {VK_NUMPAD1,    _T("Num 1")},\r
+       {VK_NUMPAD2,    _T("Num 2")},\r
+       {VK_NUMPAD3,    _T("Num 3")},\r
+       {VK_NUMPAD4,    _T("Num 4")},\r
+       {VK_NUMPAD5,    _T("Num 5")},\r
+       {VK_NUMPAD6,    _T("Num 6")},\r
+       {VK_NUMPAD7,    _T("Num 7")},\r
+       {VK_NUMPAD8,    _T("Num 8")},\r
+       {VK_NUMPAD9,    _T("Num 9")},\r
+       {VK_MULTIPLY,   _T("Num *")},\r
+       {VK_ADD,                _T("Num +")},\r
+       {VK_SEPARATOR,  _T("Separator")},\r
+       {VK_SUBTRACT,   _T("Num -")},\r
+       {VK_DECIMAL,    _T("Num .")},\r
+       {VK_DIVIDE,             _T("Num /")},\r
+       {VK_F1,                 _T("F1")},\r
+       {VK_F2,                 _T("F2")},\r
+       {VK_F3,                 _T("F3")},\r
+       {VK_F4,                 _T("F4")},\r
+       {VK_F5,                 _T("F5")},\r
+       {VK_F6,                 _T("F6")},\r
+       {VK_F7,                 _T("F7")},\r
+       {VK_F8,                 _T("F8")},\r
+       {VK_F9,                 _T("F9")},\r
+       {VK_F10,                _T("F10")},\r
+       {VK_F11,                _T("F11")},\r
+       {VK_F12,                _T("F12")},\r
+       {VK_F13,                _T("F13")},\r
+       {VK_F14,                _T("F14")},\r
+       {VK_F15,                _T("F15")},\r
+       {VK_F16,                _T("F16")},\r
+       {VK_F17,                _T("F17")},\r
+       {VK_F18,                _T("F18")},\r
+       {VK_F19,                _T("F19")},\r
+       {VK_F20,                _T("F20")},\r
+       {VK_F21,                _T("F21")},\r
+       {VK_F22,                _T("F22")},\r
+       {VK_F23,                _T("F23")},\r
+       {VK_F24,                _T("F24")},\r
+       {0x88,                  _T("Unassigned")},\r
+       {0x89,                  _T("Unassigned")},\r
+       {0x8a,                  _T("Unassigned")},\r
+       {0x8b,                  _T("Unassigned")},\r
+       {0x8c,                  _T("Unassigned")},\r
+       {0x8d,                  _T("Unassigned")},\r
+       {0x8e,                  _T("Unassigned")},\r
+       {0x8f,                  _T("Unassigned")},\r
+       {VK_NUMLOCK,    _T("Num Lock")},\r
+       {VK_SCROLL,             _T("Scroll Lock")},\r
+       {0x92,                  _T("OEM specific")},\r
+       {0x93,                  _T("OEM specific")},\r
+       {0x94,                  _T("OEM specific")},\r
+       {0x95,                  _T("OEM specific")},\r
+       {0x96,                  _T("OEM specific")},\r
+       {0x97,                  _T("Unassigned")},\r
+       {0x98,                  _T("Unassigned")},\r
+       {0x99,                  _T("Unassigned")},\r
+       {0x9a,                  _T("Unassigned")},\r
+       {0x9b,                  _T("Unassigned")},\r
+       {0x9c,                  _T("Unassigned")},\r
+       {0x9d,                  _T("Unassigned")},\r
+       {0x9e,                  _T("Unassigned")},\r
+       {0x9f,                  _T("Unassigned")},\r
+       {VK_LSHIFT,             _T("Left Shift")},\r
+       {VK_RSHIFT,             _T("Right Shift")},\r
+       {VK_LCONTROL,   _T("Left Ctrl")},\r
+       {VK_RCONTROL,   _T("Right Ctrl")},\r
+       {VK_LMENU,              _T("Left Alt")},\r
+       {VK_RMENU,              _T("Right Alt")},\r
+       {0xa6,                  _T("Browser Back")},            // VK_BROWSER_BACK\r
+       {0xa7,                  _T("Browser Forward")},         // VK_BROWSER_FORWARD\r
+       {0xa8,                  _T("Browser Refresh")},         // VK_BROWSER_REFRESH\r
+       {0xa9,                  _T("Browser Stop")},            // VK_BROWSER_STOP\r
+       {0xaa,                  _T("Browser Search")},          // VK_BROWSER_SEARCH\r
+       {0xab,                  _T("Browser Favorites")},       // VK_BROWSER_FAVORITES\r
+       {0xac,                  _T("Browser Start")},           // VK_BROWSER_HOME\r
+       {0xad,                  _T("Volume Mute")},                     // VK_VOLUME_MUTE\r
+       {0xae,                  _T("Volume Down")},                     // VK_VOLUME_DOWN\r
+       {0xaf,                  _T("Volume Up")},                       // VK_VOLUME_UP\r
+       {0xb0,                  _T("Next Track")},                      // VK_MEDIA_NEXT_TRACK\r
+       {0xb1,                  _T("Previous Track")},          // VK_MEDIA_PREV_TRACK\r
+       {0xb2,                  _T("Stop Media")},                      // VK_MEDIA_STOP\r
+       {0xb3,                  _T("Play/Pause Media")},        // VK_MEDIA_PLAY_PAUSE\r
+       {0xb4,                  _T("Start Mail")},                      // VK_LAUNCH_MAIL\r
+       {0xb5,                  _T("Select Media")},            // VK_LAUNCH_MEDIA_SELECT\r
+       {0xb6,                  _T("Start Application 1")},     // VK_LAUNCH_APP1\r
+       {0xb7,                  _T("Start Application 2")},     // VK_LAUNCH_APP2\r
+       {0xb8,                  _T("Reserved")},\r
+       {0xb9,                  _T("Reserved")},\r
+       {0xba,                  _T(";")},                                       // VK_OEM_1\r
+//     {0xba,                  _T(":")},                                       // VK_OEM_1             // for Japanese keyboard\r
+       {0xbb,                  _T("+")},                                       // VK_OEM_PLUS\r
+//     {0xbb,                  _T(";")},                                       // VK_OEM_PLUS  // for Japanese keyboard\r
+       {0xbc,                  _T(",")},                                       // VK_OEM_COMMA\r
+       {0xbd,                  _T("-")},                                       // VK_OEM_MINUS\r
+       {0xbe,                  _T(".")},                                       // VK_OEM_PERIOD\r
+       {0xbf,                  _T("/")},                                       // VK_OEM_2\r
+       {0xc0,                  _T("`")},                                       // VK_OEM_3\r
+//     {0xc0,                  _T("@")},                                       // VK_OEM_3             // for Japanese keyboard\r
+       {0xc1,                  _T("Reserved")},\r
+       {0xc2,                  _T("Reserved")},\r
+       {0xc3,                  _T("Reserved")},\r
+       {0xc4,                  _T("Reserved")},\r
+       {0xc5,                  _T("Reserved")},\r
+       {0xc6,                  _T("Reserved")},\r
+       {0xc7,                  _T("Reserved")},\r
+       {0xc8,                  _T("Reserved")},\r
+       {0xc9,                  _T("Reserved")},\r
+       {0xca,                  _T("Reserved")},\r
+       {0xcb,                  _T("Reserved")},\r
+       {0xcc,                  _T("Reserved")},\r
+       {0xcd,                  _T("Reserved")},\r
+       {0xce,                  _T("Reserved")},\r
+       {0xcf,                  _T("Reserved")},\r
+       {0xd0,                  _T("Reserved")},\r
+       {0xd1,                  _T("Reserved")},\r
+       {0xd2,                  _T("Reserved")},\r
+       {0xd3,                  _T("Reserved")},\r
+       {0xd4,                  _T("Reserved")},\r
+       {0xd5,                  _T("Reserved")},\r
+       {0xd6,                  _T("Reserved")},\r
+       {0xd7,                  _T("Reserved")},\r
+       {0xd8,                  _T("Unassigned")},\r
+       {0xd9,                  _T("Unassigned")},\r
+       {0xda,                  _T("Unassigned")},\r
+       {0xdb,                  _T("[")},                                       // VK_OEM_4\r
+       {0xdc,                  _T("Backslash")},                       // VK_OEM_5\r
+       {0xdd,                  _T("]")},                                       // VK_OEM_6\r
+       {0xde,                  _T("'")},                                       // VK_OEM_7\r
+       {0xdf,                  _T("OEM specific")},            // VK_OEM_8\r
+       {0xe0,                  _T("Reserved")},\r
+       {0xe1,                  _T("OEM specific")},\r
+       {0xe2,                  _T("Backslash for 106 keyboard")},      // VK_OEM_102\r
+       {0xe3,                  _T("OEM specific")},\r
+       {0xe4,                  _T("OEM specific")},\r
+       {0xe5,                  _T("Process")},                         // VK_PROCESSKEY\r
+       {0xe6,                  _T("OEM specific")},\r
+       {0xe7,                  _T("Packet")},  // VK_PACKET\r
+       {0xe8,                  _T("Unassigned")},\r
+       {0xe9,                  _T("OEM specific")},\r
+       {0xea,                  _T("OEM specific")},\r
+       {0xeb,                  _T("OEM specific")},\r
+       {0xec,                  _T("OEM specific")},\r
+       {0xed,                  _T("OEM specific")},\r
+       {0xee,                  _T("OEM specific")},\r
+       {0xef,                  _T("OEM specific")},\r
+       {0xf0,                  _T("Eisu")},                                    // \89p\90\94\r
+       {0xf1,                  _T("OEM specific")},\r
+       {0xf2,                  _T("Hiragana")},                                // \82Ð\82ç\82ª\82È\r
+       {0xf3,                  _T("Hankaku/Zenkaku 0xf3")},    // "\94¼\8ap/\91S\8ap"\r
+       {0xf4,                  _T("Hankaku/Zenkaku 0xf4")},    // "\94¼\8ap/\91S\8ap"\r
+       {0xf5,                  _T("OEM specific")},\r
+       {VK_ATTN,               _T("Attn")},\r
+       {VK_CRSEL,              _T("CrSel")},\r
+       {VK_EXSEL,              _T("ExSel")},\r
+       {VK_EREOF,              _T("Erace EOF")},\r
+       {VK_PLAY,               _T("Play")},\r
+       {VK_ZOOM,               _T("Zoom")},\r
+       {VK_NONAME,             _T("Noname")},\r
+       {VK_PA1,                _T("PA1")},\r
+       {VK_OEM_CLEAR,  _T("OEM Clear")},\r
+       {0xff,                  _T("")},\r
+};\r
+\r
+typedef struct Translate {\r
+       WORD wLanguage;\r
+       WORD wCodePage;\r
+} Translate_t;\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_XKEYMACS_H__2E65B9CB_5ADB_4C3B_891F_8EFE395FBB2D__INCLUDED_)\r
diff --git a/xkeymacs/xkeymacs.rc b/xkeymacs/xkeymacs.rc
new file mode 100644 (file)
index 0000000..cbc21f4
--- /dev/null
@@ -0,0 +1,3504 @@
+//Microsoft Developer Studio generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#include "afxres.h"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// \93ú\96{\8cê resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT\r
+#pragma code_page(932)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+IDD_OPTIONS DIALOG DISCARDABLE  0, 0, 123, 178\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "\83I\83v\83V\83\87\83\93"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    GROUPBOX        "XKeymacs",IDC_STATIC,7,7,109,25\r
+    CONTROL         "\83\8d\83O\83I\83\93\8e\9e\82É\8eÀ\8ds",IDC_AUTO_RUN,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,15,17,65,10\r
+    GROUPBOX        "\83R\83}\83\93\83\83v\83\8d\83\93\83v\83g",IDC_STATIC,7,33,109,25\r
+    CONTROL         "\83t\83@\83C\83\8b\96¼\8e©\93®\95â\8a®",IDC_FILE_COMPLETION,"Button",\r
+                    BS_AUTOCHECKBOX | WS_TABSTOP,15,43,79,10\r
+    GROUPBOX        "\83^\83X\83N\83o\81[\82Ì\83X\83e\81[\83^\83X\97Ì\88æ",IDC_STATIC,7,59,109,90\r
+    CONTROL         "C-x-",IDC_C_X_,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    69,28,10\r
+    CONTROL         "M-x",IDC_M_X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    82,28,10\r
+    CONTROL         "Meta",IDC_M_,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    95,32,10\r
+    CONTROL         "Shift",IDC_SHIFT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,108,31,10\r
+    CONTROL         "Ctrl",IDC_CTRL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    121,26,10\r
+    CONTROL         "Alt",IDC_ALT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    134,25,10\r
+    DEFPUSHBUTTON   "OK",IDOK,7,157,50,14\r
+    PUSHBUTTON      "\83L\83\83\83\93\83Z\83\8b",IDCANCEL,66,157,50,14\r
+END\r
+\r
+IDD_ABOUTBOX DIALOG DISCARDABLE  0, 0, 235, 55\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "XKeymacs \82Ì\83o\81[\83W\83\87\83\93\8fî\95ñ"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20\r
+    LTEXT           "XKeymacs Version x.xx",IDC_VERSION_INFORMATION,40,10,\r
+                    119,8,SS_NOPREFIX\r
+    LTEXT           "Copyright (C) 2001-200x",IDC_LEGAL_COPYRIGHT,40,25,119,\r
+                    8\r
+    DEFPUSHBUTTON   "OK",IDOK,178,7,50,14,WS_GROUP\r
+    LTEXT           "http://www.cam.hi-ho.ne.jp/oishi/",IDC_URL,40,40,108,8,\r
+                    SS_NOTIFY\r
+END\r
+\r
+IDD_104KEYBOARD DIALOG DISCARDABLE  0, 0, 362, 303\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "\83L\81[\83{\81[\83h\83\8c\83C\83A\83E\83g"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    DEFPUSHBUTTON   "OK",IDOK,248,281,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,306,281,50,14\r
+    CONTROL         "Esc",IDC_ESC,"Button",BS_OWNERDRAW,13,21,14,16\r
+    CONTROL         "F1",IDC_F1,"Button",BS_OWNERDRAW,43,21,14,16\r
+    CONTROL         "F2",IDC_F2,"Button",BS_OWNERDRAW,58,21,14,16\r
+    CONTROL         "F3",IDC_F3,"Button",BS_OWNERDRAW,73,21,14,16\r
+    CONTROL         "F4",IDC_F4,"Button",BS_OWNERDRAW,88,21,14,16\r
+    CONTROL         "F5",IDC_F5,"Button",BS_OWNERDRAW,110,21,14,16\r
+    CONTROL         "F6",IDC_F6,"Button",BS_OWNERDRAW,125,21,14,16\r
+    CONTROL         "F7",IDC_F7,"Button",BS_OWNERDRAW,140,21,14,16\r
+    CONTROL         "F8",IDC_F8,"Button",BS_OWNERDRAW,155,21,14,16\r
+    CONTROL         "F9",IDC_F9,"Button",BS_OWNERDRAW,178,21,14,16\r
+    CONTROL         "F10",IDC_F10,"Button",BS_OWNERDRAW,193,21,14,16\r
+    CONTROL         "F11",IDC_F11,"Button",BS_OWNERDRAW,208,21,14,16\r
+    CONTROL         "F12",IDC_F12,"Button",BS_OWNERDRAW,223,21,14,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN,"Button",BS_OWNERDRAW,242,21,14,16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK,"Button",BS_OWNERDRAW,257,21,14,16\r
+    CONTROL         "Pau",IDC_PAUSE,"Button",BS_OWNERDRAW,272,21,14,16\r
+    CONTROL         "`",IDC_BACK_QUOTE,"Button",BS_OWNERDRAW,13,43,14,16\r
+    CONTROL         "1",IDC_1,"Button",BS_OWNERDRAW,28,43,14,16\r
+    CONTROL         "2",IDC_2,"Button",BS_OWNERDRAW,43,43,14,16\r
+    CONTROL         "3",IDC_3,"Button",BS_OWNERDRAW,58,43,14,16\r
+    CONTROL         "4",IDC_4,"Button",BS_OWNERDRAW,73,43,14,16\r
+    CONTROL         "5",IDC_5,"Button",BS_OWNERDRAW,88,43,14,16\r
+    CONTROL         "6",IDC_6,"Button",BS_OWNERDRAW,103,43,14,16\r
+    CONTROL         "7",IDC_7,"Button",BS_OWNERDRAW,118,43,14,16\r
+    CONTROL         "8",IDC_8,"Button",BS_OWNERDRAW,133,43,14,16\r
+    CONTROL         "9",IDC_9,"Button",BS_OWNERDRAW,148,43,14,16\r
+    CONTROL         "0",IDC_0,"Button",BS_OWNERDRAW,163,43,14,16\r
+    CONTROL         "-",IDC_MINUS,"Button",BS_OWNERDRAW,178,43,14,16\r
+    CONTROL         "=",IDC_EQUAL,"Button",BS_OWNERDRAW,193,43,14,16\r
+    CONTROL         "\\",IDC_BACKSLASH1,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,7,279,14,16\r
+    CONTROL         "BS",IDC_BACKSPACE,"Button",BS_OWNERDRAW,208,43,29,16\r
+    CONTROL         "Tab",IDC_TAB,"Button",BS_OWNERDRAW,13,60,22,16\r
+    CONTROL         "Q",IDC_Q,"Button",BS_OWNERDRAW,36,60,14,16\r
+    CONTROL         "W",IDC_W,"Button",BS_OWNERDRAW,51,60,14,16\r
+    CONTROL         "E",IDC_E,"Button",BS_OWNERDRAW,66,60,14,16\r
+    CONTROL         "R",IDC_R,"Button",BS_OWNERDRAW,81,60,14,16\r
+    CONTROL         "T",IDC_T,"Button",BS_OWNERDRAW,96,60,14,16\r
+    CONTROL         "Y",IDC_Y,"Button",BS_OWNERDRAW,111,60,14,16\r
+    CONTROL         "U",IDC_U,"Button",BS_OWNERDRAW,126,60,14,16\r
+    CONTROL         "I",IDC_I,"Button",BS_OWNERDRAW,141,60,14,16\r
+    CONTROL         "O",IDC_O,"Button",BS_OWNERDRAW,156,60,14,16\r
+    CONTROL         "P",IDC_P,"Button",BS_OWNERDRAW,171,60,14,16\r
+    CONTROL         "[",IDC_SQUARE_BRA,"Button",BS_OWNERDRAW,186,60,14,16\r
+    CONTROL         "]",IDC_SQUARE_CKET,"Button",BS_OWNERDRAW,201,60,14,16\r
+    CONTROL         "\\",IDC_BACKSLASH,"Button",BS_OWNERDRAW,216,60,21,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK,"Button",BS_OWNERDRAW,13,77,25,16\r
+    CONTROL         "A",IDC_A,"Button",BS_OWNERDRAW,39,77,14,16\r
+    CONTROL         "S",IDC_S,"Button",BS_OWNERDRAW,54,77,14,16\r
+    CONTROL         "D",IDC_D,"Button",BS_OWNERDRAW,69,77,14,16\r
+    CONTROL         "F",IDC_F,"Button",BS_OWNERDRAW,84,77,14,16\r
+    CONTROL         "G",IDC_G,"Button",BS_OWNERDRAW,99,77,14,16\r
+    CONTROL         "H",IDC_H,"Button",BS_OWNERDRAW,114,77,14,16\r
+    CONTROL         "J",IDC_J,"Button",BS_OWNERDRAW,129,77,14,16\r
+    CONTROL         "K",IDC_K,"Button",BS_OWNERDRAW,144,77,14,16\r
+    CONTROL         "L",IDC_L,"Button",BS_OWNERDRAW,159,77,14,16\r
+    CONTROL         ";",IDC_SEMICOLON,"Button",BS_OWNERDRAW,174,77,14,16\r
+    CONTROL         "'",IDC_QUOTE,"Button",BS_OWNERDRAW,189,77,14,16\r
+    CONTROL         "Enter",IDC_ENTER,"Button",BS_OWNERDRAW,204,77,33,16\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT,"Button",BS_OWNERDRAW,13,94,33,16\r
+    CONTROL         "Z",IDC_Z,"Button",BS_OWNERDRAW,47,94,14,16\r
+    CONTROL         "X",IDC_X,"Button",BS_OWNERDRAW,62,94,14,16\r
+    CONTROL         "C",IDC_C,"Button",BS_OWNERDRAW,77,94,14,16\r
+    CONTROL         "V",IDC_V,"Button",BS_OWNERDRAW,92,94,14,16\r
+    CONTROL         "B",IDC_B,"Button",BS_OWNERDRAW,107,94,14,16\r
+    CONTROL         "N",IDC_N,"Button",BS_OWNERDRAW,121,94,14,16\r
+    CONTROL         "M",IDC_M,"Button",BS_OWNERDRAW,136,94,14,16\r
+    CONTROL         ",",IDC_COMMA,"Button",BS_OWNERDRAW,151,94,14,16\r
+    CONTROL         ".",IDC_PERIOD,"Button",BS_OWNERDRAW,166,94,14,16\r
+    CONTROL         "/",IDC_SLASH,"Button",BS_OWNERDRAW,181,94,14,16\r
+    CONTROL         "\81_",IDC_BACKSLASH2,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,26,279,14,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT,"Button",BS_OWNERDRAW,196,94,41,\r
+                    16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL,"Button",BS_OWNERDRAW,13,111,22,16\r
+    CONTROL         "\83~\93c",IDC_LEFT_WINDOWS,"Button",BS_OWNERDRAW,36,111,22,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT,"Button",BS_OWNERDRAW,59,111,22,16\r
+    CONTROL         "\96³",IDC_NONCONVERT,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,83,279,14,16\r
+    CONTROL         "Space",IDC_SPACE,"Button",BS_OWNERDRAW,82,111,63,16\r
+    CONTROL         "\95Ï",IDC_CONVERT,"Button",BS_OWNERDRAW | NOT WS_VISIBLE,\r
+                    44,279,14,16\r
+    CONTROL         "\82Ð",IDC_KANA,"Button",BS_OWNERDRAW | NOT WS_VISIBLE,63,\r
+                    279,14,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT,"Button",BS_OWNERDRAW,146,111,22,16\r
+    CONTROL         "R\83~\93c",IDC_RIGHT_WINDOWS,"Button",BS_OWNERDRAW,169,111,\r
+                    22,16\r
+    CONTROL         "\96Ú\81A",IDC_APPLICATION,"Button",BS_OWNERDRAW,192,111,22,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL,"Button",BS_OWNERDRAW,215,111,22,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT,"Button",BS_OWNERDRAW,242,43,14,16\r
+    CONTROL         "Hm",IDC_HOME,"Button",BS_OWNERDRAW,257,43,14,16\r
+    CONTROL         "PU",IDC_PAGE_UP,"Button",BS_OWNERDRAW,272,43,14,16\r
+    CONTROL         "Del",IDC_DELETE,"Button",BS_OWNERDRAW,242,60,14,16\r
+    CONTROL         "End",IDC_END,"Button",BS_OWNERDRAW,257,60,14,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN,"Button",BS_OWNERDRAW,272,60,14,16\r
+    CONTROL         "Up",IDC_UP,"Button",BS_OWNERDRAW,257,94,14,16\r
+    CONTROL         "<-",IDC_LEFT,"Button",BS_OWNERDRAW,242,111,14,16\r
+    CONTROL         "Dn",IDC_DOWN,"Button",BS_OWNERDRAW,257,111,14,16\r
+    CONTROL         "->",IDC_RIGHT,"Button",BS_OWNERDRAW,272,111,14,16\r
+    CONTROL         "NL",IDC_NUM_LOCK,"Button",BS_OWNERDRAW,290,43,14,16\r
+    CONTROL         "(/)",IDC_DIVIDE,"Button",BS_OWNERDRAW,305,43,14,16\r
+    CONTROL         "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,320,43,14,16\r
+    CONTROL         "(-)",IDC_SUBTRACT,"Button",BS_OWNERDRAW,335,43,14,16\r
+    CONTROL         "(7)",IDC_NUMPAD7,"Button",BS_OWNERDRAW,290,60,14,16\r
+    CONTROL         "(8)",IDC_NUMPAD8,"Button",BS_OWNERDRAW,305,60,14,16\r
+    CONTROL         "(9)",IDC_NUMPAD9,"Button",BS_OWNERDRAW,320,60,14,16\r
+    CONTROL         "(4)",IDC_NUMPAD4,"Button",BS_OWNERDRAW,290,77,14,16\r
+    CONTROL         "(5)",IDC_NUMPAD5,"Button",BS_OWNERDRAW,305,77,14,16\r
+    CONTROL         "(6)",IDC_NUMPAD6,"Button",BS_OWNERDRAW,320,77,14,16\r
+    CONTROL         "+",IDC_ADD,"Button",BS_OWNERDRAW,335,60,14,33\r
+    CONTROL         "(1)",IDC_NUMPAD1,"Button",BS_OWNERDRAW,290,94,14,16\r
+    CONTROL         "(2)",IDC_NUMPAD2,"Button",BS_OWNERDRAW,305,94,14,16\r
+    CONTROL         "(3)",IDC_NUMPAD3,"Button",BS_OWNERDRAW,320,94,14,16\r
+    CONTROL         "(0)",IDC_NUMPAD0,"Button",BS_OWNERDRAW,290,111,29,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE,"Button",BS_OWNERDRAW,320,111,14,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER,"Button",BS_OWNERDRAW,335,94,14,33\r
+    CONTROL         "Esc",IDC_ESC_,"Button",BS_OWNERDRAW,13,158,14,16\r
+    CONTROL         "F1",IDC_F1_,"Button",BS_OWNERDRAW,43,158,14,16\r
+    CONTROL         "F2",IDC_F2_,"Button",BS_OWNERDRAW,58,158,14,16\r
+    CONTROL         "F3",IDC_F3_,"Button",BS_OWNERDRAW,73,158,14,16\r
+    CONTROL         "F4",IDC_F4_,"Button",BS_OWNERDRAW,88,158,14,16\r
+    CONTROL         "F5",IDC_F5_,"Button",BS_OWNERDRAW,110,158,14,16\r
+    CONTROL         "F6",IDC_F6_,"Button",BS_OWNERDRAW,125,158,14,16\r
+    CONTROL         "F7",IDC_F7_,"Button",BS_OWNERDRAW,140,158,14,16\r
+    CONTROL         "F8",IDC_F8_,"Button",BS_OWNERDRAW,155,158,14,16\r
+    CONTROL         "F9",IDC_F9_,"Button",BS_OWNERDRAW,178,158,14,16\r
+    CONTROL         "F10",IDC_F10_,"Button",BS_OWNERDRAW,193,158,14,16\r
+    CONTROL         "F11",IDC_F11_,"Button",BS_OWNERDRAW,208,158,14,16\r
+    CONTROL         "F12",IDC_F12_,"Button",BS_OWNERDRAW,223,158,14,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN_,"Button",BS_OWNERDRAW,242,158,14,\r
+                    16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK_,"Button",BS_OWNERDRAW,257,158,14,\r
+                    16\r
+    CONTROL         "Pau",IDC_PAUSE_,"Button",BS_OWNERDRAW,272,158,14,16\r
+    CONTROL         "`",IDC_BACK_QUOTE_,"Button",BS_OWNERDRAW,13,180,14,16\r
+    CONTROL         "1",IDC_1_,"Button",BS_OWNERDRAW,28,180,14,16\r
+    CONTROL         "2",IDC_2_,"Button",BS_OWNERDRAW,43,180,14,16\r
+    CONTROL         "3",IDC_3_,"Button",BS_OWNERDRAW,58,180,14,16\r
+    CONTROL         "4",IDC_4_,"Button",BS_OWNERDRAW,73,180,14,16\r
+    CONTROL         "5",IDC_5_,"Button",BS_OWNERDRAW,88,180,14,16\r
+    CONTROL         "6",IDC_6_,"Button",BS_OWNERDRAW,103,180,14,16\r
+    CONTROL         "7",IDC_7_,"Button",BS_OWNERDRAW,118,180,14,16\r
+    CONTROL         "8",IDC_8_,"Button",BS_OWNERDRAW,133,180,14,16\r
+    CONTROL         "9",IDC_9_,"Button",BS_OWNERDRAW,148,180,14,16\r
+    CONTROL         "0",IDC_0_,"Button",BS_OWNERDRAW,163,180,14,16\r
+    CONTROL         "-",IDC_MINUS_,"Button",BS_OWNERDRAW,178,180,14,16\r
+    CONTROL         "=",IDC_EQUAL_,"Button",BS_OWNERDRAW,193,180,14,16\r
+    CONTROL         "\\",IDC_BACKSLASH1_,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,151,279,14,16\r
+    CONTROL         "BS",IDC_BACKSPACE_,"Button",BS_OWNERDRAW,208,180,29,16\r
+    CONTROL         "Tab",IDC_TAB_,"Button",BS_OWNERDRAW,13,197,22,16\r
+    CONTROL         "Q",IDC_Q_,"Button",BS_OWNERDRAW,36,197,14,16\r
+    CONTROL         "W",IDC_W_,"Button",BS_OWNERDRAW,51,197,14,16\r
+    CONTROL         "E",IDC_E_,"Button",BS_OWNERDRAW,66,197,14,16\r
+    CONTROL         "R",IDC_R_,"Button",BS_OWNERDRAW,81,197,14,16\r
+    CONTROL         "T",IDC_T_,"Button",BS_OWNERDRAW,96,197,14,16\r
+    CONTROL         "Y",IDC_Y_,"Button",BS_OWNERDRAW,111,197,14,16\r
+    CONTROL         "U",IDC_U_,"Button",BS_OWNERDRAW,126,197,14,16\r
+    CONTROL         "I",IDC_I_,"Button",BS_OWNERDRAW,141,197,14,16\r
+    CONTROL         "O",IDC_O_,"Button",BS_OWNERDRAW,156,197,14,16\r
+    CONTROL         "P",IDC_P_,"Button",BS_OWNERDRAW,171,197,14,16\r
+    CONTROL         "[",IDC_SQUARE_BRA_,"Button",BS_OWNERDRAW,186,197,14,16\r
+    CONTROL         "]",IDC_SQUARE_CKET_,"Button",BS_OWNERDRAW,201,197,14,16\r
+    CONTROL         "\\",IDC_BACKSLASH_,"Button",BS_OWNERDRAW,216,197,21,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK_,"Button",BS_OWNERDRAW,13,214,25,16\r
+    CONTROL         "A",IDC_A_,"Button",BS_OWNERDRAW,39,214,14,16\r
+    CONTROL         "S",IDC_S_,"Button",BS_OWNERDRAW,54,214,14,16\r
+    CONTROL         "D",IDC_D_,"Button",BS_OWNERDRAW,69,214,14,16\r
+    CONTROL         "F",IDC_F_,"Button",BS_OWNERDRAW,84,214,14,16\r
+    CONTROL         "G",IDC_G_,"Button",BS_OWNERDRAW,99,214,14,16\r
+    CONTROL         "H",IDC_H_,"Button",BS_OWNERDRAW,114,214,14,16\r
+    CONTROL         "J",IDC_J_,"Button",BS_OWNERDRAW,129,214,14,16\r
+    CONTROL         "K",IDC_K_,"Button",BS_OWNERDRAW,144,214,14,16\r
+    CONTROL         "L",IDC_L_,"Button",BS_OWNERDRAW,159,214,14,16\r
+    CONTROL         ";",IDC_SEMICOLON_,"Button",BS_OWNERDRAW,174,214,14,16\r
+    CONTROL         "'",IDC_QUOTE_,"Button",BS_OWNERDRAW,189,214,14,16\r
+    CONTROL         "Enter",IDC_ENTER_,"Button",BS_OWNERDRAW,204,214,33,16\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT_,"Button",BS_OWNERDRAW,13,231,33,\r
+                    16\r
+    CONTROL         "Z",IDC_Z_,"Button",BS_OWNERDRAW,47,231,14,16\r
+    CONTROL         "X",IDC_X_,"Button",BS_OWNERDRAW,62,231,14,16\r
+    CONTROL         "C",IDC_C_,"Button",BS_OWNERDRAW,77,231,14,16\r
+    CONTROL         "V",IDC_V_,"Button",BS_OWNERDRAW,92,231,14,16\r
+    CONTROL         "B",IDC_B_,"Button",BS_OWNERDRAW,107,231,14,16\r
+    CONTROL         "N",IDC_N_,"Button",BS_OWNERDRAW,121,231,14,16\r
+    CONTROL         "M",IDC_M_,"Button",BS_OWNERDRAW,136,231,14,16\r
+    CONTROL         ",",IDC_COMMA_,"Button",BS_OWNERDRAW,151,231,14,16\r
+    CONTROL         ".",IDC_PERIOD_,"Button",BS_OWNERDRAW,166,231,14,16\r
+    CONTROL         "/",IDC_SLASH_,"Button",BS_OWNERDRAW,181,231,14,16\r
+    CONTROL         "\81_",IDC_BACKSLASH2_,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,168,279,14,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT_,"Button",BS_OWNERDRAW,196,231,\r
+                    41,16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL_,"Button",BS_OWNERDRAW,13,248,22,16\r
+    CONTROL         "\83~\93c",IDC_LEFT_WINDOWS_,"Button",BS_OWNERDRAW,36,248,22,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT_,"Button",BS_OWNERDRAW,59,248,22,16\r
+    CONTROL         "\96³",IDC_NONCONVERT_,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,226,279,14,16\r
+    CONTROL         "Space",IDC_SPACE_,"Button",BS_OWNERDRAW,82,248,63,16\r
+    CONTROL         "\95Ï",IDC_CONVERT_,"Button",BS_OWNERDRAW | NOT WS_VISIBLE,\r
+                    187,279,14,16\r
+    CONTROL         "\82Ð",IDC_KANA_,"Button",BS_OWNERDRAW | NOT WS_VISIBLE,\r
+                    207,279,14,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT_,"Button",BS_OWNERDRAW,146,248,22,\r
+                    16\r
+    CONTROL         "R\83~\93c",IDC_RIGHT_WINDOWS_,"Button",BS_OWNERDRAW,169,248,\r
+                    22,16\r
+    CONTROL         "\96Ú\81A",IDC_APPLICATION_,"Button",BS_OWNERDRAW,192,248,22,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL_,"Button",BS_OWNERDRAW,215,248,22,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT_,"Button",BS_OWNERDRAW,242,180,14,16\r
+    CONTROL         "Hm",IDC_HOME_,"Button",BS_OWNERDRAW,257,180,14,16\r
+    CONTROL         "PU",IDC_PAGE_UP_,"Button",BS_OWNERDRAW,272,180,14,16\r
+    CONTROL         "Del",IDC_DELETE_,"Button",BS_OWNERDRAW,242,197,14,16\r
+    CONTROL         "End",IDC_END_,"Button",BS_OWNERDRAW,257,197,14,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN_,"Button",BS_OWNERDRAW,272,197,14,16\r
+    CONTROL         "Up",IDC_UP_,"Button",BS_OWNERDRAW,257,231,14,16\r
+    CONTROL         "<-",IDC_LEFT_,"Button",BS_OWNERDRAW,242,248,14,16\r
+    CONTROL         "Dn",IDC_DOWN_,"Button",BS_OWNERDRAW,257,248,14,16\r
+    CONTROL         "->",IDC_RIGHT_,"Button",BS_OWNERDRAW,272,248,14,16\r
+    CONTROL         "NL",IDC_NUM_LOCK_,"Button",BS_OWNERDRAW,290,180,14,16\r
+    CONTROL         "(/)",IDC_DIVIDE_,"Button",BS_OWNERDRAW,305,180,14,16\r
+    CONTROL         "*",IDC_MULTIPLY_,"Button",BS_OWNERDRAW,320,180,14,16\r
+    CONTROL         "(-)",IDC_SUBTRACT_,"Button",BS_OWNERDRAW,335,180,14,16\r
+    CONTROL         "(7)",IDC_NUMPAD7_,"Button",BS_OWNERDRAW,290,197,14,16\r
+    CONTROL         "(8)",IDC_NUMPAD8_,"Button",BS_OWNERDRAW,305,197,14,16\r
+    CONTROL         "(9)",IDC_NUMPAD9_,"Button",BS_OWNERDRAW,320,197,14,16\r
+    CONTROL         "(4)",IDC_NUMPAD4_,"Button",BS_OWNERDRAW,290,214,14,16\r
+    CONTROL         "(5)",IDC_NUMPAD5_,"Button",BS_OWNERDRAW,305,214,14,16\r
+    CONTROL         "(6)",IDC_NUMPAD6_,"Button",BS_OWNERDRAW,320,214,14,16\r
+    CONTROL         "+",IDC_ADD_,"Button",BS_OWNERDRAW,335,197,14,33\r
+    CONTROL         "(1)",IDC_NUMPAD1_,"Button",BS_OWNERDRAW,290,231,14,16\r
+    CONTROL         "(2)",IDC_NUMPAD2_,"Button",BS_OWNERDRAW,305,231,14,16\r
+    CONTROL         "(3)",IDC_NUMPAD3_,"Button",BS_OWNERDRAW,320,231,14,16\r
+    CONTROL         "(0)",IDC_NUMPAD0_,"Button",BS_OWNERDRAW,290,248,29,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE_,"Button",BS_OWNERDRAW,320,248,14,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER_,"Button",BS_OWNERDRAW,335,231,14,\r
+                    33\r
+    GROUPBOX        "\83x\81[\83X\83L\81[\83{\81[\83h",IDC_STATIC,7,7,349,130\r
+    GROUPBOX        "\83\8a\83}\83b\83v\83L\81[\83{\81[\83h",IDC_STATIC,7,144,349,130\r
+    CONTROL         "Pw",IDC_ACPI_POWER,"Button",BS_OWNERDRAW,335,21,14,16\r
+    CONTROL         "Pw",IDC_ACPI_POWER_,"Button",BS_OWNERDRAW,335,158,14,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP,"Button",BS_OWNERDRAW,320,21,14,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP_,"Button",BS_OWNERDRAW,320,158,14,\r
+                    16\r
+    CONTROL         "Wk",IDC_ACPI_WAKE,"Button",BS_OWNERDRAW,305,21,14,16\r
+    CONTROL         "Wk",IDC_ACPI_WAKE_,"Button",BS_OWNERDRAW,305,158,14,16\r
+END\r
+\r
+IDD_109KEYBOARD DIALOG DISCARDABLE  0, 0, 362, 303\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "\83L\81[\83{\81[\83h\83\8c\83C\83A\83E\83g"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    DEFPUSHBUTTON   "OK",IDOK,248,281,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,306,281,50,14\r
+    CONTROL         "Esc",IDC_ESC,"Button",BS_OWNERDRAW,13,21,14,16\r
+    CONTROL         "F1",IDC_F1,"Button",BS_OWNERDRAW,43,21,14,16\r
+    CONTROL         "F2",IDC_F2,"Button",BS_OWNERDRAW,58,21,14,16\r
+    CONTROL         "F3",IDC_F3,"Button",BS_OWNERDRAW,73,21,14,16\r
+    CONTROL         "F4",IDC_F4,"Button",BS_OWNERDRAW,88,21,14,16\r
+    CONTROL         "F5",IDC_F5,"Button",BS_OWNERDRAW,110,21,14,16\r
+    CONTROL         "F6",IDC_F6,"Button",BS_OWNERDRAW,125,21,14,16\r
+    CONTROL         "F7",IDC_F7,"Button",BS_OWNERDRAW,140,21,14,16\r
+    CONTROL         "F8",IDC_F8,"Button",BS_OWNERDRAW,155,21,14,16\r
+    CONTROL         "F9",IDC_F9,"Button",BS_OWNERDRAW,178,21,14,16\r
+    CONTROL         "F10",IDC_F10,"Button",BS_OWNERDRAW,193,21,14,16\r
+    CONTROL         "F11",IDC_F11,"Button",BS_OWNERDRAW,208,21,14,16\r
+    CONTROL         "F12",IDC_F12,"Button",BS_OWNERDRAW,223,21,14,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN,"Button",BS_OWNERDRAW,242,21,14,16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK,"Button",BS_OWNERDRAW,257,21,14,16\r
+    CONTROL         "Pau",IDC_PAUSE,"Button",BS_OWNERDRAW,272,21,14,16\r
+    CONTROL         "\94¼",IDC_BACK_QUOTE,"Button",BS_OWNERDRAW,13,43,14,16\r
+    CONTROL         "1",IDC_1,"Button",BS_OWNERDRAW,28,43,14,16\r
+    CONTROL         "2",IDC_2,"Button",BS_OWNERDRAW,43,43,14,16\r
+    CONTROL         "3",IDC_3,"Button",BS_OWNERDRAW,58,43,14,16\r
+    CONTROL         "4",IDC_4,"Button",BS_OWNERDRAW,73,43,14,16\r
+    CONTROL         "5",IDC_5,"Button",BS_OWNERDRAW,88,43,14,16\r
+    CONTROL         "6",IDC_6,"Button",BS_OWNERDRAW,103,43,14,16\r
+    CONTROL         "7",IDC_7,"Button",BS_OWNERDRAW,118,43,14,16\r
+    CONTROL         "8",IDC_8,"Button",BS_OWNERDRAW,133,43,14,16\r
+    CONTROL         "9",IDC_9,"Button",BS_OWNERDRAW,148,43,14,16\r
+    CONTROL         "0",IDC_0,"Button",BS_OWNERDRAW,163,43,14,16\r
+    CONTROL         "-",IDC_MINUS,"Button",BS_OWNERDRAW,178,43,14,16\r
+    CONTROL         "^",IDC_EQUAL,"Button",BS_OWNERDRAW,193,43,14,16\r
+    CONTROL         "\\",IDC_BACKSLASH1,"Button",BS_OWNERDRAW,208,43,14,16\r
+    CONTROL         "BS",IDC_BACKSPACE,"Button",BS_OWNERDRAW,223,43,14,16\r
+    CONTROL         "Tab",IDC_TAB,"Button",BS_OWNERDRAW,13,60,22,16\r
+    CONTROL         "Q",IDC_Q,"Button",BS_OWNERDRAW,36,60,14,16\r
+    CONTROL         "W",IDC_W,"Button",BS_OWNERDRAW,51,60,14,16\r
+    CONTROL         "E",IDC_E,"Button",BS_OWNERDRAW,66,60,14,16\r
+    CONTROL         "R",IDC_R,"Button",BS_OWNERDRAW,81,60,14,16\r
+    CONTROL         "T",IDC_T,"Button",BS_OWNERDRAW,96,60,14,16\r
+    CONTROL         "Y",IDC_Y,"Button",BS_OWNERDRAW,111,60,14,16\r
+    CONTROL         "U",IDC_U,"Button",BS_OWNERDRAW,126,60,14,16\r
+    CONTROL         "I",IDC_I,"Button",BS_OWNERDRAW,141,60,14,16\r
+    CONTROL         "O",IDC_O,"Button",BS_OWNERDRAW,156,60,14,16\r
+    CONTROL         "P",IDC_P,"Button",BS_OWNERDRAW,171,60,14,16\r
+    CONTROL         "@",IDC_SQUARE_BRA,"Button",BS_OWNERDRAW,186,60,14,16\r
+    CONTROL         "[",IDC_SQUARE_CKET,"Button",BS_OWNERDRAW,201,60,16,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK,"Button",BS_OWNERDRAW,13,77,25,16\r
+    CONTROL         "A",IDC_A,"Button",BS_OWNERDRAW,39,77,14,16\r
+    CONTROL         "S",IDC_S,"Button",BS_OWNERDRAW,54,77,14,16\r
+    CONTROL         "D",IDC_D,"Button",BS_OWNERDRAW,69,77,14,16\r
+    CONTROL         "F",IDC_F,"Button",BS_OWNERDRAW,84,77,14,16\r
+    CONTROL         "G",IDC_G,"Button",BS_OWNERDRAW,99,77,14,16\r
+    CONTROL         "H",IDC_H,"Button",BS_OWNERDRAW,114,77,14,16\r
+    CONTROL         "J",IDC_J,"Button",BS_OWNERDRAW,129,77,14,16\r
+    CONTROL         "K",IDC_K,"Button",BS_OWNERDRAW,144,77,14,16\r
+    CONTROL         "L",IDC_L,"Button",BS_OWNERDRAW,159,77,14,16\r
+    CONTROL         ";",IDC_SEMICOLON,"Button",BS_OWNERDRAW,174,77,14,16\r
+    CONTROL         ":",IDC_QUOTE,"Button",BS_OWNERDRAW,189,77,14,16\r
+    CONTROL         "]",IDC_BACKSLASH,"Button",BS_OWNERDRAW,204,77,14,16\r
+    CONTROL         "Enter",IDC_ENTER,"Button",BS_OWNERDRAW,219,60,18,33\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT,"Button",BS_OWNERDRAW,13,94,33,16\r
+    CONTROL         "Z",IDC_Z,"Button",BS_OWNERDRAW,47,94,14,16\r
+    CONTROL         "X",IDC_X,"Button",BS_OWNERDRAW,62,94,14,16\r
+    CONTROL         "C",IDC_C,"Button",BS_OWNERDRAW,77,94,14,16\r
+    CONTROL         "V",IDC_V,"Button",BS_OWNERDRAW,92,94,14,16\r
+    CONTROL         "B",IDC_B,"Button",BS_OWNERDRAW,107,94,14,16\r
+    CONTROL         "N",IDC_N,"Button",BS_OWNERDRAW,121,94,14,16\r
+    CONTROL         "M",IDC_M,"Button",BS_OWNERDRAW,136,94,14,16\r
+    CONTROL         ",",IDC_COMMA,"Button",BS_OWNERDRAW,151,94,14,16\r
+    CONTROL         ".",IDC_PERIOD,"Button",BS_OWNERDRAW,166,94,14,16\r
+    CONTROL         "/",IDC_SLASH,"Button",BS_OWNERDRAW,181,94,14,16\r
+    CONTROL         "\81_",IDC_BACKSLASH2,"Button",BS_OWNERDRAW,196,94,14,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT,"Button",BS_OWNERDRAW,211,94,26,\r
+                    16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL,"Button",BS_OWNERDRAW,13,111,18,16\r
+    CONTROL         "\83~\93c",IDC_LEFT_WINDOWS,"Button",BS_OWNERDRAW,32,111,14,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT,"Button",BS_OWNERDRAW,47,111,18,16\r
+    CONTROL         "\96³",IDC_NONCONVERT,"Button",BS_OWNERDRAW,66,111,14,16\r
+    CONTROL         "Space",IDC_SPACE,"Button",BS_OWNERDRAW,81,111,57,16\r
+    CONTROL         "\95Ï",IDC_CONVERT,"Button",BS_OWNERDRAW,139,111,14,16\r
+    CONTROL         "\82Ð",IDC_KANA,"Button",BS_OWNERDRAW,154,111,14,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT,"Button",BS_OWNERDRAW,170,111,18,16\r
+    CONTROL         "R\93c",IDC_RIGHT_WINDOWS,"Button",BS_OWNERDRAW,189,111,14,\r
+                    16\r
+    CONTROL         "\96Ú\81A",IDC_APPLICATION,"Button",BS_OWNERDRAW,204,111,14,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL,"Button",BS_OWNERDRAW,219,111,18,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT,"Button",BS_OWNERDRAW,242,43,14,16\r
+    CONTROL         "Hm",IDC_HOME,"Button",BS_OWNERDRAW,257,43,14,16\r
+    CONTROL         "PU",IDC_PAGE_UP,"Button",BS_OWNERDRAW,272,43,14,16\r
+    CONTROL         "Del",IDC_DELETE,"Button",BS_OWNERDRAW,242,60,14,16\r
+    CONTROL         "End",IDC_END,"Button",BS_OWNERDRAW,257,60,14,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN,"Button",BS_OWNERDRAW,272,60,14,16\r
+    CONTROL         "Up",IDC_UP,"Button",BS_OWNERDRAW,257,94,14,16\r
+    CONTROL         "<-",IDC_LEFT,"Button",BS_OWNERDRAW,242,111,14,16\r
+    CONTROL         "Dn",IDC_DOWN,"Button",BS_OWNERDRAW,257,111,14,16\r
+    CONTROL         "->",IDC_RIGHT,"Button",BS_OWNERDRAW,272,111,14,16\r
+    CONTROL         "NL",IDC_NUM_LOCK,"Button",BS_OWNERDRAW,290,43,14,16\r
+    CONTROL         "(/)",IDC_DIVIDE,"Button",BS_OWNERDRAW,305,43,14,16\r
+    CONTROL         "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,320,43,14,16\r
+    CONTROL         "(-)",IDC_SUBTRACT,"Button",BS_OWNERDRAW,335,43,14,16\r
+    CONTROL         "(7)",IDC_NUMPAD7,"Button",BS_OWNERDRAW,290,60,14,16\r
+    CONTROL         "(8)",IDC_NUMPAD8,"Button",BS_OWNERDRAW,305,60,14,16\r
+    CONTROL         "(9)",IDC_NUMPAD9,"Button",BS_OWNERDRAW,320,60,14,16\r
+    CONTROL         "(4)",IDC_NUMPAD4,"Button",BS_OWNERDRAW,290,77,14,16\r
+    CONTROL         "(5)",IDC_NUMPAD5,"Button",BS_OWNERDRAW,305,77,14,16\r
+    CONTROL         "(6)",IDC_NUMPAD6,"Button",BS_OWNERDRAW,320,77,14,16\r
+    CONTROL         "+",IDC_ADD,"Button",BS_OWNERDRAW,335,60,14,33\r
+    CONTROL         "(1)",IDC_NUMPAD1,"Button",BS_OWNERDRAW,290,94,14,16\r
+    CONTROL         "(2)",IDC_NUMPAD2,"Button",BS_OWNERDRAW,305,94,14,16\r
+    CONTROL         "(3)",IDC_NUMPAD3,"Button",BS_OWNERDRAW,320,94,14,16\r
+    CONTROL         "(0)",IDC_NUMPAD0,"Button",BS_OWNERDRAW,290,111,29,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE,"Button",BS_OWNERDRAW,320,111,14,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER,"Button",BS_OWNERDRAW,335,94,14,33\r
+    CONTROL         "Esc",IDC_ESC_,"Button",BS_OWNERDRAW,13,158,14,16\r
+    CONTROL         "F1",IDC_F1_,"Button",BS_OWNERDRAW,43,158,14,16\r
+    CONTROL         "F2",IDC_F2_,"Button",BS_OWNERDRAW,58,158,14,16\r
+    CONTROL         "F3",IDC_F3_,"Button",BS_OWNERDRAW,73,158,14,16\r
+    CONTROL         "F4",IDC_F4_,"Button",BS_OWNERDRAW,88,158,14,16\r
+    CONTROL         "F5",IDC_F5_,"Button",BS_OWNERDRAW,110,158,14,16\r
+    CONTROL         "F6",IDC_F6_,"Button",BS_OWNERDRAW,125,158,14,16\r
+    CONTROL         "F7",IDC_F7_,"Button",BS_OWNERDRAW,140,158,14,16\r
+    CONTROL         "F8",IDC_F8_,"Button",BS_OWNERDRAW,155,158,14,16\r
+    CONTROL         "F9",IDC_F9_,"Button",BS_OWNERDRAW,178,158,14,16\r
+    CONTROL         "F10",IDC_F10_,"Button",BS_OWNERDRAW,193,158,14,16\r
+    CONTROL         "F11",IDC_F11_,"Button",BS_OWNERDRAW,208,158,14,16\r
+    CONTROL         "F12",IDC_F12_,"Button",BS_OWNERDRAW,223,158,14,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN_,"Button",BS_OWNERDRAW,242,158,14,\r
+                    16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK_,"Button",BS_OWNERDRAW,257,158,14,\r
+                    16\r
+    CONTROL         "Pau",IDC_PAUSE_,"Button",BS_OWNERDRAW,272,158,14,16\r
+    CONTROL         "\94¼",IDC_BACK_QUOTE_,"Button",BS_OWNERDRAW,13,180,14,16\r
+    CONTROL         "1",IDC_1_,"Button",BS_OWNERDRAW,28,180,14,16\r
+    CONTROL         "2",IDC_2_,"Button",BS_OWNERDRAW,43,180,14,16\r
+    CONTROL         "3",IDC_3_,"Button",BS_OWNERDRAW,58,180,14,16\r
+    CONTROL         "4",IDC_4_,"Button",BS_OWNERDRAW,73,180,14,16\r
+    CONTROL         "5",IDC_5_,"Button",BS_OWNERDRAW,88,180,14,16\r
+    CONTROL         "6",IDC_6_,"Button",BS_OWNERDRAW,103,180,14,16\r
+    CONTROL         "7",IDC_7_,"Button",BS_OWNERDRAW,118,180,14,16\r
+    CONTROL         "8",IDC_8_,"Button",BS_OWNERDRAW,133,180,14,16\r
+    CONTROL         "9",IDC_9_,"Button",BS_OWNERDRAW,148,180,14,16\r
+    CONTROL         "0",IDC_0_,"Button",BS_OWNERDRAW,163,180,14,16\r
+    CONTROL         "-",IDC_MINUS_,"Button",BS_OWNERDRAW,178,180,14,16\r
+    CONTROL         "^",IDC_EQUAL_,"Button",BS_OWNERDRAW,193,180,14,16\r
+    CONTROL         "\\",IDC_BACKSLASH1_,"Button",BS_OWNERDRAW,208,180,14,16\r
+    CONTROL         "BS",IDC_BACKSPACE_,"Button",BS_OWNERDRAW,223,180,14,16\r
+    CONTROL         "Tab",IDC_TAB_,"Button",BS_OWNERDRAW,13,197,22,16\r
+    CONTROL         "Q",IDC_Q_,"Button",BS_OWNERDRAW,36,197,14,16\r
+    CONTROL         "W",IDC_W_,"Button",BS_OWNERDRAW,51,197,14,16\r
+    CONTROL         "E",IDC_E_,"Button",BS_OWNERDRAW,66,197,14,16\r
+    CONTROL         "R",IDC_R_,"Button",BS_OWNERDRAW,81,197,14,16\r
+    CONTROL         "T",IDC_T_,"Button",BS_OWNERDRAW,96,197,14,16\r
+    CONTROL         "Y",IDC_Y_,"Button",BS_OWNERDRAW,111,197,14,16\r
+    CONTROL         "U",IDC_U_,"Button",BS_OWNERDRAW,126,197,14,16\r
+    CONTROL         "I",IDC_I_,"Button",BS_OWNERDRAW,141,197,14,16\r
+    CONTROL         "O",IDC_O_,"Button",BS_OWNERDRAW,156,197,14,16\r
+    CONTROL         "P",IDC_P_,"Button",BS_OWNERDRAW,171,197,14,16\r
+    CONTROL         "@",IDC_SQUARE_BRA_,"Button",BS_OWNERDRAW,186,197,14,16\r
+    CONTROL         "[",IDC_SQUARE_CKET_,"Button",BS_OWNERDRAW,201,197,16,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK_,"Button",BS_OWNERDRAW,13,214,25,16\r
+    CONTROL         "A",IDC_A_,"Button",BS_OWNERDRAW,39,214,14,16\r
+    CONTROL         "S",IDC_S_,"Button",BS_OWNERDRAW,54,214,14,16\r
+    CONTROL         "D",IDC_D_,"Button",BS_OWNERDRAW,69,214,14,16\r
+    CONTROL         "F",IDC_F_,"Button",BS_OWNERDRAW,84,214,14,16\r
+    CONTROL         "G",IDC_G_,"Button",BS_OWNERDRAW,99,214,14,16\r
+    CONTROL         "H",IDC_H_,"Button",BS_OWNERDRAW,114,214,14,16\r
+    CONTROL         "J",IDC_J_,"Button",BS_OWNERDRAW,129,214,14,16\r
+    CONTROL         "K",IDC_K_,"Button",BS_OWNERDRAW,144,214,14,16\r
+    CONTROL         "L",IDC_L_,"Button",BS_OWNERDRAW,159,214,14,16\r
+    CONTROL         ";",IDC_SEMICOLON_,"Button",BS_OWNERDRAW,174,214,14,16\r
+    CONTROL         ":",IDC_QUOTE_,"Button",BS_OWNERDRAW,189,214,14,16\r
+    CONTROL         "]",IDC_BACKSLASH_,"Button",BS_OWNERDRAW,204,214,14,16\r
+    CONTROL         "Enter",IDC_ENTER_,"Button",BS_OWNERDRAW,219,197,18,33\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT_,"Button",BS_OWNERDRAW,13,231,33,\r
+                    16\r
+    CONTROL         "Z",IDC_Z_,"Button",BS_OWNERDRAW,47,231,14,16\r
+    CONTROL         "X",IDC_X_,"Button",BS_OWNERDRAW,62,231,14,16\r
+    CONTROL         "C",IDC_C_,"Button",BS_OWNERDRAW,77,231,14,16\r
+    CONTROL         "V",IDC_V_,"Button",BS_OWNERDRAW,92,231,14,16\r
+    CONTROL         "B",IDC_B_,"Button",BS_OWNERDRAW,107,231,14,16\r
+    CONTROL         "N",IDC_N_,"Button",BS_OWNERDRAW,121,231,14,16\r
+    CONTROL         "M",IDC_M_,"Button",BS_OWNERDRAW,136,231,14,16\r
+    CONTROL         ",",IDC_COMMA_,"Button",BS_OWNERDRAW,151,231,14,16\r
+    CONTROL         ".",IDC_PERIOD_,"Button",BS_OWNERDRAW,166,231,14,16\r
+    CONTROL         "/",IDC_SLASH_,"Button",BS_OWNERDRAW,181,231,14,16\r
+    CONTROL         "\81_",IDC_BACKSLASH2_,"Button",BS_OWNERDRAW,196,231,14,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT_,"Button",BS_OWNERDRAW,211,231,\r
+                    26,16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL_,"Button",BS_OWNERDRAW,13,248,18,16\r
+    CONTROL         "\83~\93c",IDC_LEFT_WINDOWS_,"Button",BS_OWNERDRAW,32,248,14,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT_,"Button",BS_OWNERDRAW,47,248,18,16\r
+    CONTROL         "\96³",IDC_NONCONVERT_,"Button",BS_OWNERDRAW,66,248,14,16\r
+    CONTROL         "Space",IDC_SPACE_,"Button",BS_OWNERDRAW,81,248,57,16\r
+    CONTROL         "\95Ï",IDC_CONVERT_,"Button",BS_OWNERDRAW,139,248,14,16\r
+    CONTROL         "\82Ð",IDC_KANA_,"Button",BS_OWNERDRAW,154,248,14,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT_,"Button",BS_OWNERDRAW,170,248,18,\r
+                    16\r
+    CONTROL         "R\93c",IDC_RIGHT_WINDOWS_,"Button",BS_OWNERDRAW,189,248,\r
+                    14,16\r
+    CONTROL         "\96Ú\81A",IDC_APPLICATION_,"Button",BS_OWNERDRAW,204,248,14,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL_,"Button",BS_OWNERDRAW,219,248,18,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT_,"Button",BS_OWNERDRAW,242,180,14,16\r
+    CONTROL         "Hm",IDC_HOME_,"Button",BS_OWNERDRAW,257,180,14,16\r
+    CONTROL         "PU",IDC_PAGE_UP_,"Button",BS_OWNERDRAW,272,180,14,16\r
+    CONTROL         "Del",IDC_DELETE_,"Button",BS_OWNERDRAW,242,197,14,16\r
+    CONTROL         "End",IDC_END_,"Button",BS_OWNERDRAW,257,197,14,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN_,"Button",BS_OWNERDRAW,272,197,14,16\r
+    CONTROL         "Up",IDC_UP_,"Button",BS_OWNERDRAW,257,231,14,16\r
+    CONTROL         "<-",IDC_LEFT_,"Button",BS_OWNERDRAW,242,248,14,16\r
+    CONTROL         "Dn",IDC_DOWN_,"Button",BS_OWNERDRAW,257,248,14,16\r
+    CONTROL         "->",IDC_RIGHT_,"Button",BS_OWNERDRAW,272,248,14,16\r
+    CONTROL         "NL",IDC_NUM_LOCK_,"Button",BS_OWNERDRAW,290,180,14,16\r
+    CONTROL         "(/)",IDC_DIVIDE_,"Button",BS_OWNERDRAW,305,180,14,16\r
+    CONTROL         "*",IDC_MULTIPLY_,"Button",BS_OWNERDRAW,320,180,14,16\r
+    CONTROL         "(-)",IDC_SUBTRACT_,"Button",BS_OWNERDRAW,335,180,14,16\r
+    CONTROL         "(7)",IDC_NUMPAD7_,"Button",BS_OWNERDRAW,290,197,14,16\r
+    CONTROL         "(8)",IDC_NUMPAD8_,"Button",BS_OWNERDRAW,305,197,14,16\r
+    CONTROL         "(9)",IDC_NUMPAD9_,"Button",BS_OWNERDRAW,320,197,14,16\r
+    CONTROL         "(4)",IDC_NUMPAD4_,"Button",BS_OWNERDRAW,290,214,14,16\r
+    CONTROL         "(5)",IDC_NUMPAD5_,"Button",BS_OWNERDRAW,305,214,14,16\r
+    CONTROL         "(6)",IDC_NUMPAD6_,"Button",BS_OWNERDRAW,320,214,14,16\r
+    CONTROL         "+",IDC_ADD_,"Button",BS_OWNERDRAW,335,197,14,33\r
+    CONTROL         "(1)",IDC_NUMPAD1_,"Button",BS_OWNERDRAW,290,231,14,16\r
+    CONTROL         "(2)",IDC_NUMPAD2_,"Button",BS_OWNERDRAW,305,231,14,16\r
+    CONTROL         "(3)",IDC_NUMPAD3_,"Button",BS_OWNERDRAW,320,231,14,16\r
+    CONTROL         "(0)",IDC_NUMPAD0_,"Button",BS_OWNERDRAW,290,248,29,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE_,"Button",BS_OWNERDRAW,320,248,14,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER_,"Button",BS_OWNERDRAW,335,231,14,\r
+                    33\r
+    GROUPBOX        "\83x\81[\83X\83L\81[\83{\81[\83h",IDC_STATIC,7,7,349,130\r
+    GROUPBOX        "\83\8a\83}\83b\83v\83L\81[\83{\81[\83h",IDC_STATIC,7,144,349,130\r
+    CONTROL         "Pw",IDC_ACPI_POWER,"Button",BS_OWNERDRAW,335,21,14,16\r
+    CONTROL         "Pw",IDC_ACPI_POWER_,"Button",BS_OWNERDRAW,335,158,14,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP,"Button",BS_OWNERDRAW,320,21,14,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP_,"Button",BS_OWNERDRAW,320,158,14,\r
+                    16\r
+    CONTROL         "Wk",IDC_ACPI_WAKE,"Button",BS_OWNERDRAW,305,21,14,16\r
+    CONTROL         "Wk",IDC_ACPI_WAKE_,"Button",BS_OWNERDRAW,305,158,14,16\r
+END\r
+\r
+IDD_PROPERTIES DIALOGEX 0, 0, 362, 304\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "\83v\83\8d\83p\83e\83B"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+    COMBOBOX        IDC_APPLICATION,7,7,253,246,CBS_DROPDOWNLIST | CBS_SORT | \r
+                    WS_VSCROLL | WS_TABSTOP\r
+    CONTROL         "\95W\8f\80\82Ì\90Ý\92è\82ð\8eg\97p\82·\82é",IDC_SETTING_DEFAULT,"Button",\r
+                    BS_AUTORADIOBUTTON | WS_GROUP,267,7,83,10\r
+    CONTROL         "\93Æ\8e©\82Ì\90Ý\92è\82ð\8eg\97p\82·\82é",IDC_SETTING_SPECIFIC,"Button",\r
+                    BS_AUTORADIOBUTTON,267,17,80,10\r
+    CONTROL         "XKeymacs \82ð\96³\8cø\82É\82·\82é",IDC_SETTING_DISABLE,"Button",\r
+                    BS_AUTORADIOBUTTON,267,27,80,10\r
+    CONTROL         "",IDC_TAB,"Static",SS_BLACKFRAME | WS_GROUP,9,45,342,\r
+                    233\r
+    CONTROL         "\83_\83C\83A\83\8d\83O\82É\82Í\83_\83C\83A\83\8d\83O\90ê\97p\82Ì\90Ý\92è\82ð\97\98\97p\82·\82é",\r
+                    IDC_USE_DIALOG_SETTING,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,15,27,148,10\r
+    PUSHBUTTON      "Load Default",IDC_LOAD_DEFAULT,7,283,50,14\r
+    PUSHBUTTON      "Select All",IDC_SELECT_ALL,63,283,50,14\r
+    PUSHBUTTON      "Clear All",IDC_CLEAR_ALL,120,283,50,14\r
+    DEFPUSHBUTTON   "OK",IDOK,193,283,50,14\r
+    PUSHBUTTON      "\83L\83\83\83\93\83Z\83\8b",IDCANCEL,249,283,50,14\r
+    PUSHBUTTON      "\93K\97p(&A)",IDC_APPLY,305,283,50,14\r
+    LTEXT           "kill-ring-max: ",IDC_STATIC,196,28,41,8\r
+    EDITTEXT        IDC_KILL_RING_MAX,240,26,20,12,ES_AUTOHSCROLL | \r
+                    ES_NUMBER,WS_EX_RIGHT\r
+    EDITTEXT        IDC_WINDOW_TEXT,109,33,40,14,ES_AUTOHSCROLL | NOT \r
+                    WS_VISIBLE\r
+    LTEXT           "\82Ì\82Æ\82«\82Ì\82Ý\93K\97p",IDC_STATIC,157,38,44,8,NOT WS_VISIBLE\r
+    LTEXT           "\83^\83C\83g\83\8b\82ª",IDC_STATIC,63,39,29,8,NOT WS_VISIBLE\r
+END\r
+\r
+IDD_PROPERTIES_BASIC DIALOG DISCARDABLE  0, 0, 344, 215\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "\8aî\96{"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    GROUPBOX        "\8fÁ\8b\8e\81A\95Ò\8fW",IDC_KILL,140,7,91,84\r
+    GROUPBOX        "\83G\83\89\81[\83\8a\83J\83o\83\8a\81[",IDC_RECOVERY,140,92,91,69\r
+    CONTROL         "C-x C-f",IDC_CXCF,"Button",BS_AUTOCHECKBOX | WS_GROUP | \r
+                    WS_TABSTOP,15,17,37,10\r
+    CONTROL         "C-x k",IDC_CXK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    29,34,10\r
+    CONTROL         "C-x C-s",IDC_CXCS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,41,38,10\r
+    CONTROL         "C-x C-w",IDC_CXCW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,53,40,10\r
+    GROUPBOX        "\83t\83@\83C\83\8b",IDC_FILES,7,7,54,71\r
+    CONTROL         "C-s",IDC_CS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,89,\r
+                    26,10\r
+    CONTROL         "C-r",IDC_CR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    101,25,10\r
+    CONTROL         "M-%",IDC_MS5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    113,29,10\r
+    CONTROL         "C-M-%",IDC_CMS5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,125,36,10\r
+    GROUPBOX        "\8c\9f\8dõ\81A\92u\8a·",IDC_SEARCH,7,79,54,82\r
+    CONTROL         "C-z",IDC_CZ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    173,26,10\r
+    CONTROL         "C-x C-c",IDC_CXCC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    73,173,39,10\r
+    CONTROL         "M-F12",IDC_MF12,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,185,37,10\r
+    GROUPBOX        "\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82©\82ç\97£\82ê\82é",IDC_WINDOW,7,163,128,45\r
+    CONTROL         "C-b",IDC_CB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73,17,\r
+                    27,10\r
+    CONTROL         "C-f",IDC_CF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,106,\r
+                    17,25,10\r
+    CONTROL         "M-b",IDC_MB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73,29,\r
+                    26,10\r
+    CONTROL         "M-f",IDC_MF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,106,\r
+                    29,26,10\r
+    CONTROL         "C-p",IDC_CP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73,41,\r
+                    27,10\r
+    CONTROL         "C-n",IDC_CN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,106,\r
+                    41,27,10\r
+    CONTROL         "C-a",IDC_CA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73,53,\r
+                    27,10\r
+    CONTROL         "C-e",IDC_CE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,106,\r
+                    53,27,10\r
+    CONTROL         "M-<",IDC_MSCOMMA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    73,65,28,10\r
+    CONTROL         "M->",IDC_MSPERIOD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    73,77,28,10\r
+    CONTROL         "M-v",IDC_MV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73,89,\r
+                    28,10\r
+    CONTROL         "C-v",IDC_CV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,106,\r
+                    89,27,10\r
+    CONTROL         "C-l",IDC_CL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73,\r
+                    101,24,10\r
+    GROUPBOX        "\88Ú\93®",IDC_MOTION,65,7,70,154\r
+    CONTROL         "C-d",IDC_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,\r
+                    17,27,10\r
+    CONTROL         "C-h",IDC_CH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,\r
+                    17,26,10\r
+    CONTROL         "C-w",IDC_CW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,\r
+                    29,28,10\r
+    CONTROL         "M-w",IDC_MW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,\r
+                    29,29,10\r
+    CONTROL         "C-k",IDC_CK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,\r
+                    41,27,10\r
+    CONTROL         "M-t",IDC_MT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,\r
+                    41,29,10\r
+    CONTROL         "M-DEL",IDC_MDEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    148,53,35,10\r
+    CONTROL         "M-d",IDC_MD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,\r
+                    53,28,10\r
+    CONTROL         "C-y",IDC_CY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,\r
+                    65,26,10\r
+    CONTROL         "M-y",IDC_MY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,\r
+                    65,27,10\r
+    CONTROL         "C-t",IDC_CT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,\r
+                    77,24,10\r
+    CONTROL         "C-x C-t",IDC_CXCT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    188,77,35,10\r
+    CONTROL         "C-x u",IDC_CXU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    148,101,32,10\r
+    CONTROL         "C-/",IDC_CSLASH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    148,113,26,10\r
+    CONTROL         "C-_",IDC_C_,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,\r
+                    125,46,10\r
+    CONTROL         "C-g",IDC_CG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,\r
+                    137,27,10\r
+    CONTROL         "C-x C-j",IDC_CXCJ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    148,173,36,10\r
+    CONTROL         "C-o",IDC_CO2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,\r
+                    173,25,10\r
+    CONTROL         "C-\\",IDC_CBACKSLASH,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,188,185,24,10\r
+    CONTROL         "C-\81_",IDC_CBACKSLASH_106,"Button",BS_AUTOCHECKBOX | \r
+                    BS_MULTILINE | WS_TABSTOP,148,185,32,9\r
+    GROUPBOX        "IME \82Ì\90Ø\91Ö\82¦",IDC_IME,140,163,90,45\r
+    CONTROL         "C-Space",IDC_CSPACE,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,243,17,43,10\r
+    CONTROL         "C-x h",IDC_CXH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    243,29,32,10\r
+    CONTROL         "C-x C-p",IDC_CXCP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    289,30,39,10\r
+    CONTROL         "C-u",IDC_CU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,\r
+                    41,26,10\r
+    CONTROL         "C-0 ... C-9",IDC_CDIGIT,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,289,41,45,10\r
+    CONTROL         "Left Alt",IDC_LEFT_ALT,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,243,53,38,10\r
+    CONTROL         "Right Alt",IDC_RIGHT_ALT,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,289,53,41,10\r
+    CONTROL         "Alt",IDC_ALT,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | \r
+                    WS_TABSTOP,243,53,37,10\r
+    CONTROL         "Esc",IDC_ESCAPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    243,65,28,10\r
+    CONTROL         "C-[",IDC_SQUARE_BRA,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,289,65,25,10\r
+    CONTROL         "C-m",IDC_CM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,\r
+                    77,28,10\r
+    CONTROL         "C-o",IDC_CO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,289,\r
+                    77,27,10\r
+    CONTROL         "C-i",IDC_CI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,\r
+                    89,24,10\r
+    CONTROL         "M-i",IDC_MI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,289,\r
+                    89,25,10\r
+    CONTROL         "M-!",IDC_MS1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,\r
+                    101,26,10\r
+    CONTROL         "M-x",IDC_MX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,289,\r
+                    101,29,10\r
+    CONTROL         "C-q",IDC_CQ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,\r
+                    113,28,10\r
+    CONTROL         "C-x (",IDC_CXS9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    243,125,30,10\r
+    CONTROL         "C-x )",IDC_CXS0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    243,137,31,10\r
+    CONTROL         "C-x e",IDC_CXE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    243,149,32,10\r
+    GROUPBOX        "\82»\82Ì\91¼",IDC_OTHER,235,7,102,201\r
+    CONTROL         "C-x b",IDC_CXB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    243,161,33,10\r
+    CONTROL         "M-l",IDC_ML,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,\r
+                    173,27,10\r
+    CONTROL         "M-u",IDC_MU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,289,\r
+                    173,29,10\r
+    CONTROL         "M-c",IDC_MC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,\r
+                    185,29,10\r
+END\r
+\r
+IDD_PROPERTIES_ADVANCED DIALOG DISCARDABLE  0, 0, 344, 215\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "\8fÚ\8d×"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    LTEXT           "\83J\83e\83S\83\8a(&C):",IDC_STATIC,7,7,31,8\r
+    COMBOBOX        IDC_CATEGORY,7,17,106,132,CBS_DROPDOWNLIST | CBS_SORT | \r
+                    WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "\83R\83}\83\93\83h(&O):",IDC_STATIC,7,31,38,8\r
+    LISTBOX         IDC_COMMANDS,7,41,180,116,LBS_SORT | \r
+                    LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "\90à\96¾:",IDC_STATIC,7,160,17,8\r
+    LTEXT           "brank",IDC_DESCRIPTION,7,169,180,39\r
+    LTEXT           "\8c»\8dÝ\82Ì\83L\81[(&U):",IDC_STATIC,194,31,45,8\r
+    LISTBOX         IDC_CURRENT_KEYS,194,41,143,32,LBS_SORT | \r
+                    LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "\90V\82µ\82¢\83V\83\87\81[\83g\83J\83b\83g\83L\81[\82Ì\93ü\97Í(&N):",IDC_STATIC,194,100,\r
+                    99,8\r
+    CONTROL         "Ctrl+X",IDC_C_X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    194,111,31,10\r
+    EDITTEXT        IDC_NEW_KEY,194,123,142,14,ES_AUTOHSCROLL\r
+    LTEXT           "Currently assigned to:\n[unassigned]",\r
+                    IDC_CURRENTLY_ASSIGNED,194,158,142,32\r
+    PUSHBUTTON      "\8a\84\82è\93\96\82Ä(&A)",IDC_ASSIGN,287,142,50,14\r
+    PUSHBUTTON      "\8dí\8f\9c(&R)",IDC_REMOVE,287,78,50,14\r
+    PUSHBUTTON      "\82·\82×\82Ä\83\8a\83Z\83b\83g(&S)",IDC_RESET_ALL,197,142,50,14,NOT \r
+                    WS_VISIBLE\r
+    CONTROL         "CUA-mode \82ð\97L\8cø\82É\82·\82é",IDC_ENABLE_CUA,"Button",\r
+                    BS_AUTOCHECKBOX | WS_TABSTOP,255,17,82,10\r
+END\r
+\r
+IDD_PROPERTIES_LIST DIALOG DISCARDABLE  0, 0, 344, 215\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "\88ê\97\97"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    CONTROL         "List1",IDC_PROPERTIES_LIST,"SysListView32",LVS_REPORT | \r
+                    LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,330,201\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// DESIGNINFO\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+GUIDELINES DESIGNINFO DISCARDABLE \r
+BEGIN\r
+    IDD_OPTIONS, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 116\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 171\r
+    END\r
+\r
+    IDD_ABOUTBOX, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 228\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 48\r
+    END\r
+\r
+    IDD_104KEYBOARD, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 356\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 295\r
+    END\r
+\r
+    IDD_109KEYBOARD, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 356\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 295\r
+    END\r
+\r
+    IDD_PROPERTIES, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 355\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 297\r
+    END\r
+\r
+    IDD_PROPERTIES_BASIC, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 337\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 208\r
+    END\r
+\r
+    IDD_PROPERTIES_ADVANCED, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 337\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 208\r
+    END\r
+\r
+    IDD_PROPERTIES_LIST, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 337\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 208\r
+    END\r
+END\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Menu\r
+//\r
+\r
+IDR_RIGHT_MENU MENU DISCARDABLE \r
+BEGIN\r
+    POPUP "Right Menu"\r
+    BEGIN\r
+        MENUITEM "\83v\83\8d\83p\83e\83B(&P)...",           IDC_PROPERTIES\r
+        MENUITEM "\90Ý\92è\82Ì\8eæ\82è\8d\9e\82Ý(&I)...",       IDC_IMPORT\r
+        MENUITEM "\90Ý\92è\82Ì\8f\91\82«\8fo\82µ(&E)...",       IDC_EXPORT\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "\83I\83v\83V\83\87\83\93(&O)...",           IDC_OPTIONS\r
+        POPUP "\83L\81[\83{\81[\83h\83\8c\83C\83A\83E\83g(&K)"\r
+        BEGIN\r
+            MENUITEM "\83\8d\83O\83I\83\93\83\86\81[\83U\81[\97p(&L)...",   IDC_KEYBOARD\r
+            MENUITEM "\82·\82×\82Ä\82Ì\83\86\81[\83U\81[\97p(&A)...",   IDC_KEYBOARD_ANY_USER\r
+        END\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "&Disable",                    IDC_DISABLE\r
+        MENUITEM "\83\8a\83Z\83b\83g(&R)",                IDC_RESET\r
+        MENUITEM "\8fI\97¹(&X)",                    IDC_QUIT\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "\83w\83\8b\83v(&H)",                  ID_HELP_FINDER\r
+        MENUITEM "\83o\81[\83W\83\87\83\93\8fî\95ñ(&A)",          IDC_ABOUT\r
+    END\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// String Table\r
+//\r
+\r
+STRINGTABLE PRELOAD DISCARDABLE \r
+BEGIN\r
+    IDR_MAINFRAME           "xkeymacs\n\nXkeyma\n\n\nXkeymacs.Document\nXkeyma Document"\r
+END\r
+\r
+STRINGTABLE PRELOAD DISCARDABLE \r
+BEGIN\r
+    AFX_IDS_APP_TITLE       "XKeymacs"\r
+    AFX_IDS_IDLEMESSAGE     "Ready"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_INDICATOR_EXT        "EXT"\r
+    ID_INDICATOR_CAPS       "CAP"\r
+    ID_INDICATOR_NUM        "NUM"\r
+    ID_INDICATOR_SCRL       "SCRL"\r
+    ID_INDICATOR_OVR        "OVR"\r
+    ID_INDICATOR_REC        "REC"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_FILE_NEW             "Create a new document\nNew"\r
+    ID_FILE_OPEN            "Open an existing document\nOpen"\r
+    ID_FILE_CLOSE           "Close the active document\nClose"\r
+    ID_FILE_SAVE            "Save the active document\nSave"\r
+    ID_FILE_SAVE_AS         "Save the active document with a new name\nSave As"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_APP_ABOUT            "Display program information, version number and copyright\nAbout"\r
+    ID_APP_EXIT             "Quit the application; prompts to save documents\nExit"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_FILE_MRU_FILE1       "Open this document"\r
+    ID_FILE_MRU_FILE2       "Open this document"\r
+    ID_FILE_MRU_FILE3       "Open this document"\r
+    ID_FILE_MRU_FILE4       "Open this document"\r
+    ID_FILE_MRU_FILE5       "Open this document"\r
+    ID_FILE_MRU_FILE6       "Open this document"\r
+    ID_FILE_MRU_FILE7       "Open this document"\r
+    ID_FILE_MRU_FILE8       "Open this document"\r
+    ID_FILE_MRU_FILE9       "Open this document"\r
+    ID_FILE_MRU_FILE10      "Open this document"\r
+    ID_FILE_MRU_FILE11      "Open this document"\r
+    ID_FILE_MRU_FILE12      "Open this document"\r
+    ID_FILE_MRU_FILE13      "Open this document"\r
+    ID_FILE_MRU_FILE14      "Open this document"\r
+    ID_FILE_MRU_FILE15      "Open this document"\r
+    ID_FILE_MRU_FILE16      "Open this document"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_NEXT_PANE            "Switch to the next window pane\nNext Pane"\r
+    ID_PREV_PANE            "Switch back to the previous window pane\nPrevious Pane"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_WINDOW_SPLIT         "Split the active window into panes\nSplit"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_EDIT_CLEAR           "Erase the selection\nErase"\r
+    ID_EDIT_CLEAR_ALL       "Erase everything\nErase All"\r
+    ID_EDIT_COPY            "Copy the selection and put it on the Clipboard\nCopy"\r
+    ID_EDIT_CUT             "Cut the selection and put it on the Clipboard\nCut"\r
+    ID_EDIT_FIND            "Find the specified text\nFind"\r
+    ID_EDIT_PASTE           "Insert Clipboard contents\nPaste"\r
+    ID_EDIT_REPEAT          "Repeat the last action\nRepeat"\r
+    ID_EDIT_REPLACE         "Replace specific text with different text\nReplace"\r
+    ID_EDIT_SELECT_ALL      "Select the entire document\nSelect All"\r
+    ID_EDIT_UNDO            "Undo the last action\nUndo"\r
+    ID_EDIT_REDO            "Redo the previously undone action\nRedo"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    AFX_IDS_SCSIZE          "Change the window size"\r
+    AFX_IDS_SCMOVE          "Change the window position"\r
+    AFX_IDS_SCMINIMIZE      "Reduce the window to an icon"\r
+    AFX_IDS_SCMAXIMIZE      "Enlarge the window to full size"\r
+    AFX_IDS_SCNEXTWINDOW    "Switch to the next document window"\r
+    AFX_IDS_SCPREVWINDOW    "Switch to the previous document window"\r
+    AFX_IDS_SCCLOSE         "Close the active window and prompts to save the documents"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    AFX_IDS_SCRESTORE       "Restore the window to normal size"\r
+    AFX_IDS_SCTASKLIST      "Activate Task List"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_DEFAULT             "Default"\r
+    IDS_DEFAULT_TITLE       "\95W\8f\80"\r
+    IDS_DIALOG              "Dialog"\r
+    IDS_DIALOG_TITLE        "\83_\83C\83A\83\8d\83O"\r
+    IDS_KEYBOARD            "%s \97p(&L)..."\r
+    IDS_REG_ENTRY_USE_DIALOG_SETTING "Use Dialog Setting"\r
+    IDS_REGISTRY_KEY        "Oishi"\r
+    IDS_REG_SECTION_APPLICATION "ApplicationName"\r
+    IDS_REG_ENTRY_APPLICATION "%02d"\r
+    IDS_REG_ENTRY_NONE      "C-X %c"\r
+    IDS_REG_ENTRY_CONTROL   "C-%c"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_CONTROLX  "C-X C-%c"\r
+    IDS_REG_ENTRY_META      "M-%c"\r
+    IDS_REGSUBKEY_DATA      "Software\\Oishi\\XKeymacs2"\r
+    IDS_REG_ENTRY_APPLICATOIN_TITLE "ApplicationTitle"\r
+    IDS_REGSUBKEY_AUTORUN   "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"\r
+    IDS_APPLICATION_LIST_ITEM "%s (%s)"\r
+    IDS_SEPARATE_CLASS_WINDOW " ("\r
+    IDS_SEPARATE_WINDOWTITLE " - "\r
+    IDS_REG_ENTRY_CONTROL_META_SHIFT "C-M-%c"\r
+    IDS_REG_ENTRY_KILL_RING_MAX "kill-ring-max"\r
+    IDS_REG_ENTRY_CONTROL_SHIFT "C-S-%c"\r
+    IDS_REG_ENTRY_META_SHIFT "M-S-%c"\r
+    IDS_REG_ENTRY_DISABLE_XKEYMACS "Disable XKeymacs"\r
+    IDC_REG_ENTRY_IGNORE_META_CTRL "Ignore undefined Meta Ctrl+?"\r
+    IDC_REG_ENTRY_IGNORE_C_X "Ignore undefined C-x ?"\r
+    IDS_ERR_SAVE_DATA       "XKeymacs \82Í %d \8eí\97Þ\82µ\82©\90Ý\92è\82ð\95Û\91\82Å\82«\82Ü\82¹\82ñ\81B\95s\97v\82È\90Ý\92è\82ð\91I\91ð\82µ ""Use Default Setting""\82ð\83`\83F\83b\83N\82·\82é\82±\82Æ\82É\82æ\82è\81A\90V\82½\82É\95Û\91\82Å\82«\82é\82æ\82¤\82É\82È\82è\82Ü\82·\81B"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ERR_WINDOWS_VERSION "XKeymacs \82Í\82±\82Ì\83o\81[\83W\83\87\83\93\82Ì Windows \82ð\83T\83|\81[\83g\82µ\82Ä\82¨\82è\82Ü\82¹\82ñ\81B"\r
+    IDS_ERR_IMPORT          "%s\n\83t\83@\83C\83\8b\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B\n\8ew\92è\82µ\82½\83t\83@\83C\83\8b\96¼\82ª\90³\82µ\82¢\82©\82Ç\82¤\82©\8am\94F\82µ\82Ä\82­\82¾\82³\82¢\81B"\r
+    IDS_ERR_EXPORT          "\90Ý\92è\82Ì\8f\91\82«\8fo\82µ\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B"\r
+    IDC_REG_ENTRY_ENABLE_CUA "Enable CUA"\r
+    IDS_REG_SECTION_ORIGINAL "OriginalCommand"\r
+    IDS_REG_ORIGINAL_PREFIX "zzz-"\r
+    IDS_REG_ENTRY_WINDOW_TEXT "WindowText"\r
+    IDS_REG_ENTRY_WINDOW_TEXT_TYPE "WindowTextType"\r
+    IDS_REG_ENTRY_326_COMPATIBLE "3.26 compatible"\r
+    IDS_PROCESS             "process"\r
+    IDS_PROCESSID           "id process"\r
+    IDS_REGSUBKEY_PERF      "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\%03x"\r
+    IDS_REGSUBKEY_COUNTERS  "Counters"\r
+    IDS_UNKNOWN_TASK        "unknown"\r
+    IDS_IME_FILE_NAME       "IME"\r
+    IDS_ERR_LOST_KEY        "[%s] \83L\81[\82Í\97\98\97p\82Å\82«\82È\82­\82È\82è\82Ü\82·\81B\n"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FOR_LOGGED_ON_USER  " (\83\8d\83O\83I\83\93\83\86\81[\83U\81[\97p)"\r
+    IDS_FOR_ANY_USER        " (\82·\82×\82Ä\82Ì\83\86\81[\83U\81[\97p)"\r
+    IDS_FOR                 " (%s \97p)"\r
+    IDS_EXPLORER            "explorer.exe"\r
+    IDS_PROJECT             "winproj.exe"\r
+    IDS_EXCEL               "excel.exe"\r
+    IDS_MSDN                "hh.exe"\r
+    IDS_B2                  "b2.exe"\r
+    IDS_MSIMN               "msimn.exe"\r
+    IDS_UNKNOWN_APPLICATION "\95s\96¾\82È\83A\83v\83\8a\83P\81[\83V\83\87\83\93"\r
+    IDS_PROGRAM_MANAGER     "Program Manager"\r
+    IDS_EXTENSION_EXECUTABLE ".exe"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_BECKY               "Becky!"\r
+    IDS_OUTLOOK_EXPRESS     "Outlook Express"\r
+    IDS_VISUAL_SOURCESAFE_EXPLORER "Visual SourceSafe \83G\83N\83X\83v\83\8d\81[\83\89"\r
+    IDS_DISABLE             "\96³\8cø\82É\82·\82é(&D)"\r
+    IDS_ENABLE              "\97L\8cø\82É\82·\82é(&E)"\r
+    IDS_IMPORT              "\90Ý\92è\82Ì\8eæ\82è\8d\9e\82Ý"\r
+    IDS_EXPORT              "\90Ý\92è\82Ì\8f\91\82«\8fo\82µ"\r
+    IDS_TIP_CX              "C-x- LED"\r
+    IDS_TIP_CTRL            "Ctrl LED"\r
+    IDS_TIP_SHIFT           "Shift LED"\r
+    IDS_TIP_ALT             "Alt LED"\r
+    IDS_TIP_META            "Meta LED"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REGISTRATION_FILTER "\83\8c\83W\83X\83g\83\8a \83t\83@\83C\83\8b|*.reg|\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)|*.*||"\r
+    IDS_REGSUBKEY_KEYBOARD_LAYOUT "Keyboard Layout"\r
+    IDS_SCANCODE_MAP        "Scancode Map"\r
+    IDS_REGSUBKEY_KEY_REMAP "Software\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\Keyboard\\shellex\\PropertySheetHandlers\\Key Remap"\r
+    IDS_0                   "0"\r
+    IDS_RESTART_OR_NOT      "\90V\82µ\82¢\90Ý\92è\82ð\97L\8cø\82É\82·\82é\82É\82Í\81A\83R\83\93\83s\83\85\81[\83^\82ð\8dÄ\8bN\93®\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B\n\n\8d¡\82·\82®\8dÄ\8bN\93®\82µ\82Ü\82·\82©\81H"\r
+    IDS_RESTART_CAPTION     "\83V\83X\83e\83\80\90Ý\92è\82Ì\95Ï\8dX"\r
+    IDS_REGSUBKEY_FILE_COMPLETION "Software\\Microsoft\\Command Processor"\r
+    IDS_COMPLETION_CHAR     "CompletionChar"\r
+    IDS_REGSUBKEY_KEYBOARD_LAYOUT_ANY_USER \r
+                            "SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout"\r
+    IDS_WINDOW_TEXT_IGNORE  "Ignore"\r
+    IDS_WINDOW_TEXT_MATCH   "Match"\r
+    IDS_WINDOW_TEXT_MATCH_FORWARD "Forward Match"\r
+    IDS_WINDOW_TEXT_MATCH_BACKWARD "Backward Match"\r
+    IDS_WINDOW_TEXT_MATCH_FULL "Macth Full"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_TIP_MX              "M-x LED"\r
+    IDS_VER_SUB_BLOCK       "\\"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_NONE_FOO  "N-0x%02x (%c)"\r
+    IDS_REG_ENTRY_NONE_SHIFT_FOO "N-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROL_FOO "C-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROL_SHIFT_FOO "C-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_FOO "C-X N-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_SHIFT_FOO "C-X N-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_CONTROL_FOO "C-X C-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_CONTROL_SHIFT_FOO "C-X C-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_META_FOO  "M-0x%02x (%c)"\r
+    IDS_REG_ENTRY_META_SHIFT_FOO "M-S-0x%02x (%c)"\r
+    IDS_DISABLED            "disabled"\r
+    IDS_REG_ENTRY_CTRL      "ctrl_icon"\r
+    IDS_REG_ENTRY_CX        "cx_icon"\r
+    IDS_REG_ENTRY_MAIN      "main_icon"\r
+    IDS_REG_ENTRY_SHIFT     "shift_icon"\r
+    IDS_REG_ENTRY_ALT       "alt_icon"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FILES               "\83t\83@\83C\83\8b"\r
+    IDS_SEARCH              "\8c\9f\8dõ\81A\92u\8a·"\r
+    IDS_WINDOW              "\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82©\82ç\97£\82ê\82é"\r
+    IDS_RECOVERY            "\83G\83\89\81[\83\8a\83J\83o\83\8a\81["\r
+    IDS_MOTION              "\88Ú\93®"\r
+    IDS_IME                 "IME \82Ì\90Ø\91Ö\82¦"\r
+    IDS_KILL                "\8fÁ\8b\8e\81A\95Ò\8fW"\r
+    IDS_OTHER               "\82»\82Ì\91¼"\r
+    IDS_ORIGINAL            "\83I\83\8a\83W\83i\83\8b\83R\83}\83\93\83h"\r
+    IDS_CATEGORY            "\83J\83e\83S\83\8a"\r
+    IDS_COMMAND             "\83R\83}\83\93\83h"\r
+    IDS_KEY                 "\83L\81["\r
+    IDS_MODIFIER            "One Shot \83\82\83f\83B\83t\83@\83C\83\84"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_ICON_META "meta_icon"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_SET_MARK_COMMAND_D  "\83}\81[\83N\82ð\83L\83\83\83\8c\83b\83g\82Ì\88Ê\92u\82É\92u\82­\81B"\r
+    IDS_BEGINNING_OF_LINE_D "\8ds\93ª\82É\88Ú\93®\82·\82é\81B"\r
+    IDS_BACKWARD_CHAR_D     "1 \95\8e\9a\8d\82Ö\88Ú\93®\82·\82é\81B"\r
+    IDS_DELETE_CHAR_D       "\83L\83\83\83\8c\83b\83g\82Ì\89E\91¤\82Ì\95\8e\9a\82ð\8dí\8f\9c\82·\82é\81B"\r
+    IDS_END_OF_LINE_D       "\8ds\96\96\82É\88Ú\93®\82·\82é\81B"\r
+    IDS_FORWARD_CHAR_D      "1 \95\8e\9a\89E\82Ö\88Ú\93®\82·\82é\81B"\r
+    IDS_KEYBOARD_QUIT_D     "\93ü\97Í\92\86\82Ì\83R\83}\83\93\83h\82ð\83L\83\83\83\93\83Z\83\8b\82·\82é\81B"\r
+    IDS_HELP_COMMAND_D      "Prefix command (definition is a keymap associating keystrokes with commands)."\r
+    IDS_KILL_LINE_D         "\8ds\96\96\82Ü\82Å\82ð\83L\83\8b\82·\82é\81B"\r
+    IDS_RECENTER_D          "\89æ\96Ê\82ð\83N\83\8a\83A\82µ\82Ä\8dÄ\95\\8e¦\82µ\81A\91I\91ð\82³\82ê\82½\83E\83B\83\93\83h\83E\82Å\82Í\83|\83C\83\93\83g\82ª\8fc\95û\8cü\82Ì\92\86\89\9b\82É\88Ê\92u\82·\82é\82æ\82¤\82É\83X\83N\83\8d\81[\83\8b\82·\82é\81B"\r
+    IDS_NEWLINE_D           "\83J\81[\83\\83\8b\82Ì\92¼\91O\82É 1 \8ds\88È\8fã\82Ì\8bó\8ds\82ð\91}\93ü\82·\82é\81B"\r
+    IDS_NEXT_LINE_D         "\90\82\92¼\82É 1 \8ds\89º\82Ö\88Ú\93®\82·\82é\81B"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_OPEN_LINE_D         "1 \8ds\88È\8fã\82Ì\8bó\8ds\82ð\83L\83\83\83\8c\83b\83g\82Ì\89E\91¤\82É\91}\93ü\82·\82é\81B"\r
+    IDS_PREVIOUS_LINE_D     "\90\82\92¼\82É 1 \8ds\8fã\82Ö\88Ú\93®\82·\82é\81B"\r
+    IDS_QUOTED_INSERT_D     "Read next input character and insert it."\r
+    IDS_ISEARCH_BACKWARD_D  "\8cã\8cü\82«\82É\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82·\82é\81B"\r
+    IDS_ISEARCH_FORWARD_D   "\91O\8cü\82«\82É\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82·\82é\81B"\r
+    IDS_TRANSPOSE_CHARS_D   "2 \82Â\82Ì\95\8e\9a\82ð\93ü\82ê\91Ö\82¦\82é\81B"\r
+    IDS_UNIVERSAL_ARGUMENT_D "\88ø\90\94\82ð\8ew\92è\82·\82é\81B"\r
+    IDS_SCROLL_UP_D         "(\83E\83B\83\93\83h\83E 1 \96Ê\95ª\82©\8ew\92è\82µ\82½\8ds\90\94\82¾\82¯) \91O\8cü\82«\82É\83X\83N\83\8d\81[\83\8b\82·\82é\81B"\r
+    IDS_KILL_REGION_D       "\83\8a\81[\83W\83\87\83\93 (\83|\83C\83\93\83g\82©\82ç\83}\81[\83N\82Ü\82Å) \82ð\83L\83\8b\82·\82é\81B"\r
+    IDS_CONTROL_X_PREFIX_D  "foo"\r
+    IDS_YANK_D              "\8dÅ\8cã\82É\83L\83\8b\82µ\82½\83e\83L\83X\83g\82ð\83\84\83\93\83N\82·\82é\81B"\r
+    IDS_ICONIFY_OR_DEICONIFY_FRAME_D "\83E\83B\83\93\83h\83E\82ð\8dÅ\8f¬\89»\82·\82é\81B"\r
+    IDS_QUAIL_MODE_D        "foo"\r
+    IDS_UNDO_D              "\8c³\82É\96ß\82·\81B"\r
+    IDS_TOGGLE_WIN32IME_MODE_D \r
+                            "\83C\83\93\83v\83b\83g\83\81\83\\83b\83h\82ª\97L\8cø\82È\82ç\82Î\96³\8cø\82É\81A\96³\8cø\82È\82ç\82Î\97L\8cø\82É\82·\82é\81B"\r
+    IDS_BACKWARD_WORD_D     "1 \8cê\8d\82Ö\88Ú\93®\82·\82é\81B"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FORWARD_WORD_D      "1 \8cê\89E\82Ö\88Ú\93®\82·\82é\81B"\r
+    IDS_DIGIT_ARGUMENT_D    "Part of the numeric argument for the next command."\r
+    IDS_NEGATIVE_ARGUMENT_D "\88ø\90\94\82Ì\95\84\8d\87\82ð\95Ï\8dX\82·\82é\81B"\r
+    IDS_SAVE_BUFFERS_KILL_EMACS_D "\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\8fI\97¹\82·\82é\81B"\r
+    IDS_FIND_FILE_D         "\83t\83@\83C\83\8b\82ð\8aJ\82­\81B"\r
+    IDS_MARK_PAGE_D         "\83t\83@\83C\83\8b\91S\91Ì\82ð\83\8a\81[\83W\83\87\83\93\82Æ\82·\82é\81B"\r
+    IDS_SAVE_BUFFER_D       "\83t\83@\83C\83\8b\82ð\8fã\8f\91\82«\95Û\91\82·\82é\81B"\r
+    IDS_WRITE_FILE_D        "\83t\83@\83C\83\8b\82ð\96¼\91O\82ð\95t\82¯\82Ä\95Û\91\82·\82é\81B"\r
+    IDS_SHELL_COMMAND_D     "\83R\83}\83\93\83h\83v\83\8d\83\93\83v\83g/MS-DOS \83v\83\8d\83\93\83v\83g\82ð\8bN\93®\82·\82é\81B"\r
+    IDS_BEGINNING_OF_BUFFER_D "\83o\83b\83t\83@\82Ì\90æ\93ª\82É\88Ú\93®\82·\82é\81B"\r
+    IDS_END_OF_BUFFER_D     "\83o\83b\83t\83@\82Ì\96\96\94ö\82É\88Ú\93®\82·\82é\81B"\r
+    IDS_SCROLL_DOWN_D       "(\83E\83B\83\93\83h\83E 1 \96Ê\95ª\82©\8ew\92è\82µ\82½\8ds\90\94\82¾\82¯) \8cã\8cü\82«\82É\83X\83N\83\8d\81[\83\8b\82·\82é\81B"\r
+    IDS_KILL_RING_SAVE_D    "\83\8a\81[\83W\83\87\83\93\82ð\8eÀ\8dÛ\82É\82Í\83L\83\8b\82¹\82¸\82É\81A\8dÅ\8cã\82É\83L\83\8b\82µ\82½\83e\83L\83X\83g\82Æ\82µ\82Ä\95Û\91\82·\82é\81B"\r
+    IDS_BACKWARD_DELETE_CHAR_D \r
+                            "Delete the previous N characters (following if N is negative)."\r
+    IDS_TAB_D               "\83|\83C\83\93\83g\88Ê\92u\82©\82ç\82 \82ç\82©\82\82ß\90Ý\92è\82µ\82½\82Â\82¬\82Ì\83^\83u\83X\83g\83b\83v\88Ê\92u\82Ü\82Å\8e\9a\89º\82°\82·\82é\81B"\r
+    IDS_META_PREFIX_D       "Meta \82Ì\83v\83\8c\83t\83B\83b\83N\83X\83L\81[\81B"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_META_D              "Meta"\r
+    IDS_DIGIT_ARGUMENT0_D   "\88ø\90\94\82ð 10 \94{\82µ 0 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT1_D   "\88ø\90\94\82ð 10 \94{\82µ 1 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT2_D   "\88ø\90\94\82ð 10 \94{\82µ 2 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT3_D   "\88ø\90\94\82ð 10 \94{\82µ 3 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT4_D   "\88ø\90\94\82ð 10 \94{\82µ 4 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT5_D   "\88ø\90\94\82ð 10 \94{\82µ 5 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT6_D   "\88ø\90\94\82ð 10 \94{\82µ 6 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT7_D   "\88ø\90\94\82ð 10 \94{\82µ 7 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT8_D   "\88ø\90\94\82ð 10 \94{\82µ 8 \82ð\89Á\82¦\82é\81B"\r
+    IDS_DIGIT_ARGUMENT9_D   "\88ø\90\94\82ð 10 \94{\82µ 9 \82ð\89Á\82¦\82é\81B"\r
+    IDS_META_PREFIX_AND_ORIGINAL_D \r
+                            "\96{\97\88\82Ì\8b@\94\\82ð\90\82©\82µ\82½\82Ü\82Ü Meta \82Ì\83v\83\8c\83t\83B\83b\83N\83X\83L\81[\82Æ\82µ\82Ä\82à\8b@\94\\82·\82é\81B"\r
+    IDS_KILL_BUFFER_D       "\83t\83@\83C\83\8b\82ð\95Â\82\82é\81B"\r
+    IDS_KILL_WORD_D         "\92P\8cê\82Ì\96\96\94ö\82Ü\82Å\83L\83\8b\82·\82é\81B"\r
+    IDS_MARK_WHOLE_BUFFER_D "\83t\83@\83C\83\8b\91S\91Ì\82ð\83\8a\81[\83W\83\87\83\93\82Æ\82·\82é\81B"\r
+    IDS_DELETE_BACKWARD_CHAR_D "\83L\83\83\83\8c\83b\83g\82Ì\8d\91¤\82Ì\95\8e\9a\82ð\8dí\8f\9c\82·\82é\81B"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_QUERY_REPLACE_D     "\92u\8a·\83_\83C\83A\83\8d\83O\82ð\8aJ\82­\81B"\r
+    IDS_QUERY_REPLACE_REGEXP_D "\92u\8a·\83_\83C\83A\83\8d\83O\82ð\8aJ\82­\81B"\r
+    IDS_YANK_POP_D          "\83\84\83\93\83N\82µ\82½\83e\83L\83X\83g\82ð\81A\82»\82ê\82æ\82è\91O\82É\83L\83\8b\82µ\82½\83e\83L\83X\83g\82Å\92u\82«\8a·\82¦\82é\81B"\r
+    IDS_CLOSE_INPUT_METHOD_D "\83C\83\93\83v\83b\83g\83\81\83\\83b\83h\82ð\96³\8cø\82É\82·\82é\81B"\r
+    IDS_ENABLE_OR_DISABLE_XKEYMACS_D \r
+                            "XKeymacs \82ª\97L\8cø\82È\82ç\82Î\96³\8cø\82É\81A\96³\8cø\82È\82ç\82Î\97L\8cø\82É\82·\82é\81B"\r
+    IDS_ENTER_D             "Enter"\r
+    IDS_IGNORE_D            "\83L\81[\82ð\96³\8e\8b\82·\82é\81B"\r
+    IDS_OPEN_INPUT_METHOD_D "\83C\83\93\83v\83b\83g\83\81\83\\83b\83h\82ð\97L\8cø\82É\82·\82é\81B"\r
+    IDS_SELECT_ALL_D        "\82·\82×\82Ä\91I\91ð"\r
+    IDS_CALL_LAST_KBD_MACRO_D "\82à\82Á\82Æ\82à\8dÅ\8bß\82Ì\83L\81[\83{\81[\83h\83}\83N\83\8d\82ð\8eÀ\8ds\82·\82é\81B"\r
+    IDS_END_KBD_MACRO_D     "\83L\81[\83{\81[\83h\83}\83N\83\8d\82Ì\92è\8b`\82ð\8fI\97¹\82·\82é\81B"\r
+    IDS_START_KBD_MACRO_D   "\83L\81[\83{\81[\83h\83}\83N\83\8d\82Ì\92è\8b`\82ð\8aJ\8en\82·\82é\81B"\r
+    IDS_SWITCH_BETWEEN_INPUT_LOCALES_D "\93ü\97Í\83\8d\83P\81[\83\8b\82ð\90Ø\82è\91Ö\82¦\82é\81B"\r
+    IDS_SWITCH_TO_BUFFER_D  "\8e\9f\82Ì\83^\83u\81A\82Ü\82½\82Í\81A\8eq\83E\83B\83\93\83h\83E (MDI) \82ð\95\\8e¦\82·\82é\81B"\r
+    IDS_CONTROL_D           "C-"\r
+    IDS_CONTROL_PREFIX_D    "C-"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ESCAPE_D            "Esc"\r
+    IDS_TILDE_D             "~"\r
+    IDS_BACK_QUOTE_D        "`"\r
+    IDS_RESTORE_D           "\83E\83B\83\93\83h\83E\82ð\8c³\82Ì\83T\83C\83Y\82É\96ß\82·\81B"\r
+    IDS_MOVE_D              "\83E\83B\83\93\83h\83E\82ð\88Ú\93®\82·\82é\81B"\r
+    IDS_SIZE_D              "\83E\83B\83\93\83h\83E\82Ì\83T\83C\83Y\82ð\95Ï\8dX\82·\82é\81B"\r
+    IDS_MINIMIZE_D          "\83E\83B\83\93\83h\83E\82ð\8dÅ\8f¬\89»\82·\82é\81B"\r
+    IDS_MAXIMIZE_D          "\83E\83B\83\93\83h\83E\82ð\8dÅ\91å\89»\82·\82é\81B"\r
+    IDS_MAXIMIZE_VERTICALLY_D "\83E\83B\83\93\83h\83E\82ð\8fc\8cü\82«\82É\8dÅ\91å\89»\82·\82é\81B"\r
+    IDS_MAXIMIZE_HORIZONTALLY_D "\83E\83B\83\93\83h\83E\82ð\89¡\8cü\82«\82É\8dÅ\91å\89»\82·\82é\81B"\r
+    IDS_PASS_THROUGH_D      "\82±\82Ì\83R\83}\83\93\83h\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é\83L\81[\82ª\89\9f\82³\82ê\82Ä\82¢\82é\8aÔ\81AXKeymacs \82Í\91S\82Ä\82Ì\93ü\97Í\82ð\82»\82Ì\82Ü\82Ü\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ö\93n\82·\81B"\r
+    IDS_REDO_D              "Redo"\r
+    IDS_TEMPORARILY_DISABLE_XKEYMACS_D \r
+                            "\8e\9f\82Ì\83R\83}\83\93\83h\82ð\81A\92¼\90Ú\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ö\93n\82·\81B"\r
+    IDS_COPY_D              "\83R\83s\81["\r
+    IDS_PASTE_D             "\93\\82è\95t\82¯"\r
+    IDS_CUT_D               "\90Ø\82è\8eæ\82è"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ESC                 "Esc"\r
+    IDS_1                   "1"\r
+    IDS_2                   "2"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_3                   "3"\r
+    IDS_4                   "4"\r
+    IDS_5                   "5"\r
+    IDS_6                   "6"\r
+    IDS_7                   "7"\r
+    IDS_8                   "8"\r
+    IDS_9                   "9"\r
+    IDS_0_                  "0"\r
+    IDS_MINUS               "-"\r
+    IDS_EQUAL               "="\r
+    IDS_BACKSPACE           "Backspace"\r
+    IDS_TAB                 "Tab"\r
+    IDS_Q                   "Q"\r
+    IDS_W                   "W"\r
+    IDS_E                   "E"\r
+    IDS_R                   "R"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_T                   "T"\r
+    IDS_Y                   "Y"\r
+    IDS_U                   "U"\r
+    IDS_I                   "I"\r
+    IDS_O                   "O"\r
+    IDS_P                   "P"\r
+    IDS_SQUARE_BRA          "["\r
+    IDS_SQUARE_CKET         "]"\r
+    IDS_ENTER               "Enter"\r
+    IDS_NUMPADENTER         "Numeric Enter"\r
+    IDS_LEFT_CTRL           "Ctrl"\r
+    IDS_RIGHT_CTRL          "Right Ctrl"\r
+    IDS_PAUSE               "Pause"\r
+    IDS_A                   "A"\r
+    IDS_S                   "S"\r
+    IDS_D                   "D"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_F                   "F"\r
+    IDS_G                   "G"\r
+    IDS_H                   "H"\r
+    IDS_J                   "J"\r
+    IDS_K                   "K"\r
+    IDS_L                   "L"\r
+    IDS_SEMICOLON           ";"\r
+    IDS_QUOTE               "'"\r
+    IDS_BACK_QUOTE          "`"\r
+    IDS_LEFT_SHIFT          "Shift"\r
+    IDS_BACKSLASH           "\\"\r
+    IDS_Z                   "Z"\r
+    IDS_X                   "X"\r
+    IDS_C                   "C"\r
+    IDS_V                   "V"\r
+    IDS_B                   "B"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_N                   "N"\r
+    IDS_M                   "M"\r
+    IDS_COMMA               ","\r
+    IDS_PERIOD              "."\r
+    IDS_SLASH               "/"\r
+    IDS_DIVIDE              "Numeric /"\r
+    IDS_RIGHT_SHIFT         "Right Shift"\r
+    IDS_MULTIPLY            "Numeric *"\r
+    IDS_PRINT_SCREEN        "Print\nScreen"\r
+    IDS_LEFT_ALT            "Alt"\r
+    IDS_RIGHT_ALT           "Right Alt"\r
+    IDS_SPACE               "Space"\r
+    IDS_CAPS_LOCK           "Caps Lock\n\89p\90\94"\r
+    IDS_F1                  "F1"\r
+    IDS_F2                  "F2"\r
+    IDS_F3                  "F3"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_F4                  "F4"\r
+    IDS_F5                  "F5"\r
+    IDS_F6                  "F6"\r
+    IDS_F7                  "F7"\r
+    IDS_F8                  "F8"\r
+    IDS_F9                  "F9"\r
+    IDS_F10                 "F10"\r
+    IDS_NUM_LOCK            "Num\nLock"\r
+    IDS_SCROLL_LOCK         "Scroll\nLock"\r
+    IDS_NUMPAD7             "Numeric 7"\r
+    IDS_HOME                "Home"\r
+    IDS_NUMPAD8             "Numeric 8"\r
+    IDS_UP                  "Up Arrow"\r
+    IDS_NUMPAD9             "Numeric 9"\r
+    IDS_PAGE_UP             "Page\nUp"\r
+    IDS_SUBTRACT            "Numeric -"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_NUMPAD4             "Numeric 4"\r
+    IDS_LEFT                "Left Arrow"\r
+    IDS_NUMPAD5             "Numeric 5"\r
+    IDS_NUMPAD6             "Numeric 6"\r
+    IDS_RIGHT               "Right Arrow"\r
+    IDS_ADD                 "Numeric +"\r
+    IDS_NUMPAD1             "Numeric 1"\r
+    IDS_END                 "End"\r
+    IDS_NUMPAD2             "Numeric 2"\r
+    IDS_DOWN                "Down Arrow"\r
+    IDS_NUMPAD3             "Numeric 3"\r
+    IDS_PAGE_DOWN           "Page\nDown"\r
+    IDS_NUMPAD0             "Numeric 0"\r
+    IDS_INSERT              "Insert"\r
+    IDS_NUMPADDELETE        "Numeric Delete"\r
+    IDS_DELETE              "Delete"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_F11                 "F11"\r
+    IDS_F12                 "F12"\r
+    IDS_LEFT_WINDOWS        "Windows"\r
+    IDS_RIGHT_WINDOWS       "Right Windows"\r
+    IDS_APPLICATION         "Application"\r
+    IDS_KANA                "\83J\83^\83J\83i\n\82Ð\82ç\82ª\82È"\r
+    IDS_BACKSLASH2          "\81_"\r
+    IDS_CONVERT             "\95Ï\8a·"\r
+    IDS_NONCONVERT          "\96³\95Ï\8a·"\r
+    IDS_BACKSLASH1          "\\"\r
+    IDS_CARET               "^"\r
+    IDS_AT_MARK             "@"\r
+    IDS_COLON               ":"\r
+    IDS_HANKAKU             "\94¼\8ap/\91S\8ap"\r
+    IDS_ACPI_POWER          "Power off"\r
+    IDS_ACPI_SLEEP          "Sleep"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ACPI_WAKE           "Wake up"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_NEW_D               "\90V\8bK"\r
+    IDS_PRINT_D             "\88ó\8dü..."\r
+    IDS_FIND_D              "\8c\9f\8dõ..."\r
+    IDS_FIND_NEXT_D         "\8e\9f\82ð\8c\9f\8dõ"\r
+    IDS_TRANSPOSE_LINES_D   "2 \82Â\82Ì\8ds\82ð\93ü\82ê\91Ö\82¦\82é\81B"\r
+    IDS_KILL_LINE_FOR_ALL_FORMAT_D "\8ds\96\96\82Ü\82Å\82ð\83L\83\8b\82·\82é\81B"\r
+    IDS_BACKWARD_KILL_WORD_D "\83|\83C\83\93\83g\82Ì\92¼\91O\82Ì\92P\8cê\82ð\83L\83\8b\82·\82é\81B"\r
+    IDS_ENABLE_XKEYMACS_D   "XKeymacs \82ð\97L\8cø\82É\82·\82é\81B"\r
+    IDS_DISABLE_XKEYMACS_D  "XKeymacs \82ð\96³\8cø\82É\82·\82é\81B"\r
+    IDS_CAPS_LOCK_D         "Caps Lock"\r
+    IDS_COMPLETE_CLOSE_INPUT_METHOD_D \r
+                            "\8c»\8dÝ\82Ì\95\8e\9a\97ñ\82ð\95Ï\8a·\8c\8b\89Ê\82Æ\82µ\82Ä\8am\92è\82µ\81A\83C\83\93\83v\83b\83g\83\81\83\\83b\83h\82ð\96³\8cø\82É\82·\82é\81B"\r
+    IDS_COMPLETE_TOGGLE_INPUT_METHOD_D \r
+                            "\8c»\8dÝ\82Ì\95\8e\9a\97ñ\82ð\95Ï\8a·\8c\8b\89Ê\82Æ\82µ\82Ä\8am\92è\82µ\81A\83C\83\93\83v\83b\83g\83\81\83\\83b\83h\82ª\97L\8cø\82È\82ç\82Î\96³\8cø\82É\81A\96³\8cø\82È\82ç\82Î\97L\8cø\82É\82·\82é\81B"\r
+    IDS_UNDERSCORE_D        "_"\r
+    IDS_ROLL_UP_UNROLL_D    "\82 \82½\82©\82à\8aª\82«\8fã\82°\82½\82©\82Ì\82æ\82¤\82É\81A\83E\83B\83\93\83h\83E\82Ì\83^\83C\83g\83\8b\83o\81[\82¾\82¯\95\\8e¦\82·\82é\81B"\r
+    IDS_RETOP_D             "\89æ\96Ê\82ð\83N\83\8a\83A\82µ\82Ä\8dÄ\95\\8e¦\82µ\81A\91I\91ð\82³\82ê\82½\83E\83B\83\93\83h\83E\82Å\82Í\83|\83C\83\93\83g\82ª\96`\93ª\82É\88Ê\92u\82·\82é\82æ\82¤\82É\83X\83N\83\8d\81[\83\8b\82·\82é\81B"\r
+    IDS_OSMODIFIER_SHIFT_D  "One Shot Modifier Shift"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FSET                "(fset "\r
+    IDS_README              "Readme_J"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_CONTROL_X_PREFIX_T  " "\r
+    IDS_CONTROL_T           " "\r
+    IDS_CONTROL_PREFIX_T    " "\r
+    IDS_CLOSE_INPUT_METHOD_T " "\r
+    IDS_COPY_T              " "\r
+    IDS_CUT_T               " "\r
+    IDS_ENABLE_OR_DISABLE_XKEYMACS_T "Enable/Disable XKeymacs"\r
+    IDS_NEWLINE_T           "newline"\r
+    IDS_ESCAPE_T            " "\r
+    IDS_FIND_T              " "\r
+    IDS_FIND_NEXT_T         " "\r
+    IDS_IGNORE_T            " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_KILL_LINE_FOR_ALL_FORMAT_T " "\r
+    IDS_MAXIMIZE_T          " "\r
+    IDS_MAXIMIZE_HORIZONTALLY_T " "\r
+    IDS_MAXIMIZE_VERTICALLY_T " "\r
+    IDS_META_PREFIX_T       "Meta"\r
+    IDS_META_T              "Meta"\r
+    IDS_META_PREFIX_AND_ORIGINAL_T "Meta"\r
+    IDS_MINIMIZE_T          " "\r
+    IDS_MOVE_T              " "\r
+    IDS_NEW_T               " "\r
+    IDS_OPEN_INPUT_METHOD_T " "\r
+    IDS_PASS_THROUGH_T      " "\r
+    IDS_PASTE_T             " "\r
+    IDS_PRINT_T             " "\r
+    IDS_REDO_T              " "\r
+    IDS_RESTORE_T           " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_SELECT_ALL_T        " "\r
+    IDS_SIZE_T              " "\r
+    IDS_SWITCH_BETWEEN_INPUT_LOCALES_T " "\r
+    IDS_TEMPORARILY_DISABLE_XKEYMACS_T " "\r
+    IDS_TILDE_T             " "\r
+    IDS_BACK_QUOTE_T        " "\r
+    IDS_BACKWARD_CHAR_T     "backward-char"\r
+    IDS_BACKWARD_WORD_T     "backward-word"\r
+    IDS_BEGINNING_OF_BUFFER_T "beginning-of-buffer"\r
+    IDS_BEGINNING_OF_LINE_T "beginning-of-line"\r
+    IDS_CALL_LAST_KBD_MACRO_T "call-last-kbd-macro"\r
+    IDS_DELETE_BACKWARD_CHAR_T "delete-backward-char"\r
+    IDS_DELETE_CHAR_T       "delete-char"\r
+    IDS_END_KBD_MACRO_T     "end-kbd-macro"\r
+    IDS_END_OF_BUFFER_T     "end-of-buffer"\r
+    IDS_END_OF_LINE_T       "end-of-line"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FIND_FILE_T         "find-file"\r
+    IDS_FORWARD_CHAR_T      "forward-char"\r
+    IDS_FORWARD_WORD_T      "forward-word"\r
+    IDS_ICONIFY_OR_DEICONIFY_FRAME_T "iconify-or-deiconify-frame"\r
+    IDS_ISEARCH_BACKWARD_T  "isearch-backward"\r
+    IDS_ISEARCH_FORWARD_T   "isearch-forward"\r
+    IDS_KEYBOARD_QUIT_T     "keyboard-quit"\r
+    IDS_KILL_BUFFER_T       "kill-buffer"\r
+    IDS_KILL_LINE_T         "kill-line"\r
+    IDS_KILL_REGION_T       "kill-region"\r
+    IDS_KILL_RING_SAVE_T    "kill-ring-save"\r
+    IDS_KILL_WORD_T         "kill-word"\r
+    IDS_MARK_PAGE_T         "mark-page"\r
+    IDS_MARK_WHOLE_BUFFER_T "mark-whole-buffer"\r
+    IDS_NEXT_LINE_T         "next-line"\r
+    IDS_DIGIT_ARGUMENT0_T   " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_DIGIT_ARGUMENT1_T   " "\r
+    IDS_DIGIT_ARGUMENT2_T   " "\r
+    IDS_DIGIT_ARGUMENT3_T   " "\r
+    IDS_DIGIT_ARGUMENT4_T   " "\r
+    IDS_DIGIT_ARGUMENT5_T   " "\r
+    IDS_DIGIT_ARGUMENT6_T   " "\r
+    IDS_DIGIT_ARGUMENT7_T   " "\r
+    IDS_DIGIT_ARGUMENT8_T   " "\r
+    IDS_DIGIT_ARGUMENT9_T   " "\r
+    IDS_NEGATIVE_ARGUMENT_T "digit-argument"\r
+    IDS_OPEN_LINE_T         "open-line"\r
+    IDS_PREVIOUS_LINE_T     "previous-line"\r
+    IDS_QUERY_REPLACE_T     "query-replace"\r
+    IDS_QUERY_REPLACE_REGEXP_T "query-replace-regexp"\r
+    IDS_RECENTER_T          "recenter"\r
+    IDS_SAVE_BUFFER_T       "save-buffer"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_SAVE_BUFFERS_KILL_EMACS_T "save-buffers-kill-emacs"\r
+    IDS_SCROLL_DOWN_T       "scroll-down"\r
+    IDS_SCROLL_UP_T         "scroll-up"\r
+    IDS_SET_MARK_COMMAND_T  "set-mark-command"\r
+    IDS_SHELL_COMMAND_T     "shell-command"\r
+    IDS_START_KBD_MACRO_T   "start-kbd-macro"\r
+    IDS_SWITCH_TO_BUFFER_T  "switch-to-buffer"\r
+    IDS_TAB_T               "tab-to-tab-stop"\r
+    IDS_TOGGLE_WIN32IME_MODE_T "toggle-input-method"\r
+    IDS_TRANSPOSE_CHARS_T   "transpose-chars"\r
+    IDS_TRANSPOSE_LINES_T   "transpose-lines"\r
+    IDS_UNDO_T              "undo"\r
+    IDS_UNIVERSAL_ARGUMENT_T "universal-argument"\r
+    IDS_WRITE_FILE_T        "write-file"\r
+    IDS_YANK_T              "yank"\r
+    IDS_YANK_POP_T          "yank-pop"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_BACKWARD_KILL_WORD_T "backward-kill-word"\r
+    IDS_ENABLE_XKEYMACS_T   "Enable XKeymacs"\r
+    IDS_DISABLE_XKEYMACS_T  "Disable XKeymacs"\r
+    IDS_CAPS_LOCK_T         "Caps Lock"\r
+    IDS_COMPLETE_CLOSE_INPUT_METHOD_T " "\r
+    IDS_COMPLETE_TOGGLE_INPUT_METHOD_T " "\r
+    IDS_UNDERSCORE_T        " "\r
+    IDS_ROLL_UP_UNROLL_T    "Roll-up/Unroll"\r
+    IDS_RETOP_T             "Retop"\r
+    IDS_OSMODIFIER_SHIFT_T  "One Shot Modifier Shift"\r
+    IDS_OSMODIFIER_SHIFT_REPEAT_T "One Shot Modifier Shift with Repeat"\r
+    IDS_OSMODIFIER_CTRL_T   "One Shot Modifier Ctrl"\r
+    IDS_OSMODIFIER_CTRL_REPEAT_T "One Shot Modifier Ctrl with Repeat"\r
+    IDS_OSMODIFIER_ALT_T    "One Shot Modifier Alt"\r
+    IDS_OSMODIFIER_ALT_REPEAT_T "One Shot Modifier Alt with Repeat"\r
+    IDS_CYCLE_ITEMS_T       " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_OSMODIFIER_SHIFT_REPEAT_D "One Shot Modifier Shift with Repeat"\r
+    IDS_OSMODIFIER_CTRL_D   "One Shot Modifier Ctrl"\r
+    IDS_OSMODIFIER_CTRL_REPEAT_D "One Shot Modifier Ctrl with Repeat"\r
+    IDS_OSMODIFIER_ALT_D    "One Shot Modifier Alt"\r
+    IDS_OSMODIFIER_ALT_REPEAT_D "One Shot Modifier Alt with Repeat"\r
+    IDS_CYCLE_ITEMS_D       "\83I\81[\83v\83\93\82µ\82½\8f\87\94Ô\82É\81A\8d\80\96Ú\82ð\8fz\8aÂ"\r
+    IDS_CYCLE_ITEMS_INVERSELY_D "\83I\81[\83v\83\93\82µ\82½\8f\87\94Ô\82Æ\82Í\8bt\82Ì\8f\87\94Ô\82É\81A\8d\80\96Ú\82ð\8fz\8aÂ"\r
+    IDS_TRANSPOSE_WORDS_D   "2 \82Â\82Ì\92P\8cê\82ð\93ü\82ê\91Ö\82¦\82é"\r
+    IDS_FILL_PARAGRAPH_D    "\8c»\8dÝ\82Ì\92i\97\8e\82ð\8bl\82ß\82é"\r
+    IDS_DOWNCASE_WORD_D     "\8cã\91±\82Ì\92P\8cê\82ð\8f¬\95\8e\9a\82É\95Ï\8a·\82·\82é"\r
+    IDS_UPCASE_WORD_D       "\8cã\91±\82Ì\92P\8cê\82ð\91å\95\8e\9a\82É\95Ï\8a·\82·\82é"\r
+    IDS_CAPITALIZE_WORD_D   "\8cã\91±\82Ì\92P\8cê\82Ì 1 \95\8e\9a\96Ú\82¾\82¯\82ð\91å\95\8e\9a\82É\82·\82é"\r
+    IDS_EXECUTE_EXTENDED_COMMAND_D "\83R\83}\83\93\83h\96¼\82ð\93Ç\82Ý\8d\9e\82Ý\81A\82»\82ê\82ð\8eÀ\8ds\82·\82é"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_CYCLE_ITEMS_INVERSELY_T " "\r
+    IDS_TRANSPOSE_WORDS_T   "transpose-words"\r
+    IDS_FILL_PARAGRAPH_T    "fill-paragraph"\r
+    IDS_DOWNCASE_WORD_T     "downcase-word"\r
+    IDS_UPCASE_WORD_T       "upcase-word"\r
+    IDS_CAPITALIZE_WORD_T   "capitalize-word"\r
+    IDS_EXECUTE_EXTENDED_COMMAND_T "execute-extended-command"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_ACCELERATE "accelerate"\r
+    IDS_REGSUBKEY_KEYBOARD  "Control Panel\\Keyboard"\r
+    IDS_KEYBOARD_SPEED      "KeyboardSpeed"\r
+    IDS_REG_ENTRY_CHANGE_CURSOR "change_cursor"\r
+    IDS_REG_ENTRY_AT_IBEAM_CURSOR_ONLY "at ibeam cursor only"\r
+    IDS_REG_ENTRY_MX        "mx_icon"\r
+END\r
+\r
+#endif    // \93ú\96{\8cê resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// \89p\8cê (±Òض) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+IDD_ABOUTBOX DIALOG DISCARDABLE  0, 0, 235, 55\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "About XKeymacs"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20\r
+    LTEXT           "XKeymacs Version x.xx",IDC_VERSION_INFORMATION,40,10,\r
+                    119,8,SS_NOPREFIX\r
+    LTEXT           "Copyright (C) 2001-200x",IDC_LEGAL_COPYRIGHT,40,25,119,\r
+                    8\r
+    DEFPUSHBUTTON   "OK",IDOK,178,7,50,14,WS_GROUP\r
+    LTEXT           "http://www.cam.hi-ho.ne.jp/oishi/indexen.html",IDC_URL,\r
+                    40,40,148,8,SS_NOTIFY\r
+END\r
+\r
+IDD_OPTIONS DIALOG DISCARDABLE  0, 0, 152, 251\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Options"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    GROUPBOX        "XKeymacs",IDC_STATIC,7,7,138,33\r
+    CONTROL         "Auto Run",IDC_AUTO_RUN,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,17,22,46,10\r
+    GROUPBOX        "Command Prompt",IDC_STATIC,7,47,138,33\r
+    CONTROL         "File and Directory Name Completion",IDC_FILE_COMPLETION,\r
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,62,126,10\r
+    GROUPBOX        "Taskbar's Status Area",IDC_STATIC,7,87,138,133\r
+    CONTROL         "C-x-",IDC_C_X_,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,\r
+                    102,28,10\r
+    CONTROL         "M-x",IDC_M_X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,\r
+                    122,28,10\r
+    CONTROL         "Meta",IDC_M_,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,\r
+                    142,32,10\r
+    CONTROL         "Shift",IDC_SHIFT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    17,162,30,10\r
+    CONTROL         "Ctrl",IDC_CTRL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,\r
+                    182,26,10\r
+    CONTROL         "Alt",IDC_ALT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,\r
+                    202,24,10\r
+    DEFPUSHBUTTON   "OK",IDOK,7,230,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,95,230,50,14\r
+END\r
+\r
+IDD_104KEYBOARD DIALOG DISCARDABLE  0, 0, 422, 280\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Keyboard Layout"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    DEFPUSHBUTTON   "OK",IDOK,311,258,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,366,258,50,14\r
+    CONTROL         "Esc",IDC_ESC,"Button",BS_OWNERDRAW,12,16,17,16\r
+    CONTROL         "F1",IDC_F1,"Button",BS_OWNERDRAW,48,16,17,16\r
+    CONTROL         "F2",IDC_F2,"Button",BS_OWNERDRAW,66,16,17,16\r
+    CONTROL         "F3",IDC_F3,"Button",BS_OWNERDRAW,84,16,17,16\r
+    CONTROL         "F4",IDC_F4,"Button",BS_OWNERDRAW,102,16,17,16\r
+    CONTROL         "F5",IDC_F5,"Button",BS_OWNERDRAW,128,16,17,16\r
+    CONTROL         "F6",IDC_F6,"Button",BS_OWNERDRAW,146,16,17,16\r
+    CONTROL         "F7",IDC_F7,"Button",BS_OWNERDRAW,164,16,17,16\r
+    CONTROL         "F8",IDC_F8,"Button",BS_OWNERDRAW,182,16,17,16\r
+    CONTROL         "F9",IDC_F9,"Button",BS_OWNERDRAW,210,16,17,16\r
+    CONTROL         "F10",IDC_F10,"Button",BS_OWNERDRAW,228,16,17,16\r
+    CONTROL         "F11",IDC_F11,"Button",BS_OWNERDRAW,246,16,17,16\r
+    CONTROL         "F12",IDC_F12,"Button",BS_OWNERDRAW,264,16,17,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN,"Button",BS_OWNERDRAW,284,16,17,16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK,"Button",BS_OWNERDRAW,302,16,17,16\r
+    CONTROL         "Pau",IDC_PAUSE,"Button",BS_OWNERDRAW,320,16,17,16\r
+    CONTROL         "`",IDC_BACK_QUOTE,"Button",BS_OWNERDRAW,12,36,17,16\r
+    CONTROL         "1",IDC_1,"Button",BS_OWNERDRAW,30,36,17,16\r
+    CONTROL         "2",IDC_2,"Button",BS_OWNERDRAW,48,36,17,16\r
+    CONTROL         "3",IDC_3,"Button",BS_OWNERDRAW,66,36,17,16\r
+    CONTROL         "4",IDC_4,"Button",BS_OWNERDRAW,84,36,17,16\r
+    CONTROL         "5",IDC_5,"Button",BS_OWNERDRAW,102,36,17,16\r
+    CONTROL         "6",IDC_6,"Button",BS_OWNERDRAW,120,36,17,16\r
+    CONTROL         "7",IDC_7,"Button",BS_OWNERDRAW,138,36,17,16\r
+    CONTROL         "8",IDC_8,"Button",BS_OWNERDRAW,156,36,17,16\r
+    CONTROL         "9",IDC_9,"Button",BS_OWNERDRAW,174,36,17,16\r
+    CONTROL         "0",IDC_0,"Button",BS_OWNERDRAW,192,36,17,16\r
+    CONTROL         "-",IDC_MINUS,"Button",BS_OWNERDRAW,210,36,17,16\r
+    CONTROL         "=",IDC_EQUAL,"Button",BS_OWNERDRAW,228,36,17,16\r
+    CONTROL         "(\\)",IDC_BACKSLASH1,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,7,256,17,16\r
+    CONTROL         "BS",IDC_BACKSPACE,"Button",BS_OWNERDRAW,246,36,35,16\r
+    CONTROL         "Tab",IDC_TAB,"Button",BS_OWNERDRAW,12,53,26,16\r
+    CONTROL         "Q",IDC_Q,"Button",BS_OWNERDRAW,39,53,17,16\r
+    CONTROL         "W",IDC_W,"Button",BS_OWNERDRAW,57,53,17,16\r
+    CONTROL         "E",IDC_E,"Button",BS_OWNERDRAW,75,53,17,16\r
+    CONTROL         "R",IDC_R,"Button",BS_OWNERDRAW,93,53,17,16\r
+    CONTROL         "T",IDC_T,"Button",BS_OWNERDRAW,111,53,17,16\r
+    CONTROL         "Y",IDC_Y,"Button",BS_OWNERDRAW,129,53,17,16\r
+    CONTROL         "U",IDC_U,"Button",BS_OWNERDRAW,147,53,17,16\r
+    CONTROL         "I",IDC_I,"Button",BS_OWNERDRAW,165,53,17,16\r
+    CONTROL         "O",IDC_O,"Button",BS_OWNERDRAW,183,53,17,16\r
+    CONTROL         "P",IDC_P,"Button",BS_OWNERDRAW,201,53,17,16\r
+    CONTROL         "[",IDC_SQUARE_BRA,"Button",BS_OWNERDRAW,219,53,17,16\r
+    CONTROL         "]",IDC_SQUARE_CKET,"Button",BS_OWNERDRAW,237,53,17,16\r
+    CONTROL         "\\",IDC_BACKSLASH,"Button",BS_OWNERDRAW,255,53,26,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK,"Button",BS_OWNERDRAW,12,70,30,16\r
+    CONTROL         "A",IDC_A,"Button",BS_OWNERDRAW,43,70,17,16\r
+    CONTROL         "S",IDC_S,"Button",BS_OWNERDRAW,61,70,17,16\r
+    CONTROL         "D",IDC_D,"Button",BS_OWNERDRAW,79,70,17,16\r
+    CONTROL         "F",IDC_F,"Button",BS_OWNERDRAW,97,70,17,16\r
+    CONTROL         "G",IDC_G,"Button",BS_OWNERDRAW,115,70,17,16\r
+    CONTROL         "H",IDC_H,"Button",BS_OWNERDRAW,133,70,17,16\r
+    CONTROL         "J",IDC_J,"Button",BS_OWNERDRAW,151,70,17,16\r
+    CONTROL         "K",IDC_K,"Button",BS_OWNERDRAW,169,70,17,16\r
+    CONTROL         "L",IDC_L,"Button",BS_OWNERDRAW,187,70,17,16\r
+    CONTROL         ";",IDC_SEMICOLON,"Button",BS_OWNERDRAW,205,70,17,16\r
+    CONTROL         "'",IDC_QUOTE,"Button",BS_OWNERDRAW,223,70,17,16\r
+    CONTROL         "Enter",IDC_ENTER,"Button",BS_OWNERDRAW,241,70,40,16\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT,"Button",BS_OWNERDRAW,12,87,39,16\r
+    CONTROL         "Z",IDC_Z,"Button",BS_OWNERDRAW,52,87,17,16\r
+    CONTROL         "X",IDC_X,"Button",BS_OWNERDRAW,70,87,17,16\r
+    CONTROL         "C",IDC_C,"Button",BS_OWNERDRAW,88,87,17,16\r
+    CONTROL         "V",IDC_V,"Button",BS_OWNERDRAW,106,87,17,16\r
+    CONTROL         "B",IDC_B,"Button",BS_OWNERDRAW,124,87,17,16\r
+    CONTROL         "N",IDC_N,"Button",BS_OWNERDRAW,142,87,17,16\r
+    CONTROL         "M",IDC_M,"Button",BS_OWNERDRAW,160,87,17,16\r
+    CONTROL         ",",IDC_COMMA,"Button",BS_OWNERDRAW,178,87,17,16\r
+    CONTROL         ".",IDC_PERIOD,"Button",BS_OWNERDRAW,196,87,17,16\r
+    CONTROL         "/",IDC_SLASH,"Button",BS_OWNERDRAW,214,87,17,16\r
+    CONTROL         "\\",IDC_BACKSLASH2,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,29,256,17,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT,"Button",BS_OWNERDRAW,232,87,49,\r
+                    16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL,"Button",BS_OWNERDRAW,12,104,27,16\r
+    CONTROL         "Win",IDC_LEFT_WINDOWS,"Button",BS_OWNERDRAW,40,104,27,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT,"Button",BS_OWNERDRAW,68,104,27,16\r
+    CONTROL         "NCn",IDC_NONCONVERT,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,97,256,17,16\r
+    CONTROL         "Space",IDC_SPACE,"Button",BS_OWNERDRAW,96,104,73,16\r
+    CONTROL         "Cnv",IDC_CONVERT,"Button",BS_OWNERDRAW | NOT WS_VISIBLE,\r
+                    52,256,17,16\r
+    CONTROL         "Kna",IDC_KANA,"Button",BS_OWNERDRAW | NOT WS_VISIBLE,75,\r
+                    256,17,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT,"Button",BS_OWNERDRAW,170,104,27,16\r
+    CONTROL         "RWin",IDC_RIGHT_WINDOWS,"Button",BS_OWNERDRAW,198,104,\r
+                    27,16\r
+    CONTROL         "App",IDC_APPLICATION,"Button",BS_OWNERDRAW,226,104,27,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL,"Button",BS_OWNERDRAW,254,104,27,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT,"Button",BS_OWNERDRAW,284,36,17,16\r
+    CONTROL         "Hm",IDC_HOME,"Button",BS_OWNERDRAW,302,36,17,16\r
+    CONTROL         "PU",IDC_PAGE_UP,"Button",BS_OWNERDRAW,320,36,17,16\r
+    CONTROL         "Del",IDC_DELETE,"Button",BS_OWNERDRAW,284,53,17,16\r
+    CONTROL         "End",IDC_END,"Button",BS_OWNERDRAW,302,53,17,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN,"Button",BS_OWNERDRAW,320,53,17,16\r
+    CONTROL         "Up",IDC_UP,"Button",BS_OWNERDRAW,302,87,17,16\r
+    CONTROL         "<-",IDC_LEFT,"Button",BS_OWNERDRAW,284,104,17,16\r
+    CONTROL         "Dn",IDC_DOWN,"Button",BS_OWNERDRAW,302,104,17,16\r
+    CONTROL         "->",IDC_RIGHT,"Button",BS_OWNERDRAW,320,104,17,16\r
+    CONTROL         "NL",IDC_NUM_LOCK,"Button",BS_OWNERDRAW,340,36,17,16\r
+    CONTROL         "(/)",IDC_DIVIDE,"Button",BS_OWNERDRAW,358,36,17,16\r
+    CONTROL         "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,376,36,17,16\r
+    CONTROL         "(-)",IDC_SUBTRACT,"Button",BS_OWNERDRAW,394,36,17,16\r
+    CONTROL         "(7)",IDC_NUMPAD7,"Button",BS_OWNERDRAW,340,53,17,16\r
+    CONTROL         "(8)",IDC_NUMPAD8,"Button",BS_OWNERDRAW,358,53,17,16\r
+    CONTROL         "(9)",IDC_NUMPAD9,"Button",BS_OWNERDRAW,376,53,17,16\r
+    CONTROL         "(4)",IDC_NUMPAD4,"Button",BS_OWNERDRAW,340,70,17,16\r
+    CONTROL         "(5)",IDC_NUMPAD5,"Button",BS_OWNERDRAW,358,70,17,16\r
+    CONTROL         "(6)",IDC_NUMPAD6,"Button",BS_OWNERDRAW,376,70,17,16\r
+    CONTROL         "+",IDC_ADD,"Button",BS_OWNERDRAW,394,53,17,33\r
+    CONTROL         "(1)",IDC_NUMPAD1,"Button",BS_OWNERDRAW,340,87,17,16\r
+    CONTROL         "(2)",IDC_NUMPAD2,"Button",BS_OWNERDRAW,358,87,17,16\r
+    CONTROL         "(3)",IDC_NUMPAD3,"Button",BS_OWNERDRAW,376,87,17,16\r
+    CONTROL         "(0)",IDC_NUMPAD0,"Button",BS_OWNERDRAW,340,104,35,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE,"Button",BS_OWNERDRAW,376,104,17,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER,"Button",BS_OWNERDRAW,394,87,17,33\r
+    CONTROL         "Esc",IDC_ESC_,"Button",BS_OWNERDRAW,12,142,17,16\r
+    CONTROL         "F1",IDC_F1_,"Button",BS_OWNERDRAW,48,142,17,16\r
+    CONTROL         "F2",IDC_F2_,"Button",BS_OWNERDRAW,66,142,17,16\r
+    CONTROL         "F3",IDC_F3_,"Button",BS_OWNERDRAW,84,142,17,16\r
+    CONTROL         "F4",IDC_F4_,"Button",BS_OWNERDRAW,102,142,17,16\r
+    CONTROL         "F5",IDC_F5_,"Button",BS_OWNERDRAW,128,142,17,16\r
+    CONTROL         "F6",IDC_F6_,"Button",BS_OWNERDRAW,146,142,17,16\r
+    CONTROL         "F7",IDC_F7_,"Button",BS_OWNERDRAW,164,142,17,16\r
+    CONTROL         "F8",IDC_F8_,"Button",BS_OWNERDRAW,182,142,17,16\r
+    CONTROL         "F9",IDC_F9_,"Button",BS_OWNERDRAW,210,142,17,16\r
+    CONTROL         "F10",IDC_F10_,"Button",BS_OWNERDRAW,228,142,17,16\r
+    CONTROL         "F11",IDC_F11_,"Button",BS_OWNERDRAW,246,142,17,16\r
+    CONTROL         "F12",IDC_F12_,"Button",BS_OWNERDRAW,264,142,17,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN_,"Button",BS_OWNERDRAW,284,142,17,\r
+                    16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK_,"Button",BS_OWNERDRAW,302,142,17,\r
+                    16\r
+    CONTROL         "Pau",IDC_PAUSE_,"Button",BS_OWNERDRAW,320,142,17,16\r
+    CONTROL         "`",IDC_BACK_QUOTE_,"Button",BS_OWNERDRAW,12,162,17,16\r
+    CONTROL         "1",IDC_1_,"Button",BS_OWNERDRAW,30,162,17,16\r
+    CONTROL         "2",IDC_2_,"Button",BS_OWNERDRAW,48,162,17,16\r
+    CONTROL         "3",IDC_3_,"Button",BS_OWNERDRAW,66,162,17,16\r
+    CONTROL         "4",IDC_4_,"Button",BS_OWNERDRAW,84,162,17,16\r
+    CONTROL         "5",IDC_5_,"Button",BS_OWNERDRAW,102,162,17,16\r
+    CONTROL         "6",IDC_6_,"Button",BS_OWNERDRAW,120,162,17,16\r
+    CONTROL         "7",IDC_7_,"Button",BS_OWNERDRAW,138,162,17,16\r
+    CONTROL         "8",IDC_8_,"Button",BS_OWNERDRAW,156,162,17,16\r
+    CONTROL         "9",IDC_9_,"Button",BS_OWNERDRAW,174,162,17,16\r
+    CONTROL         "0",IDC_0_,"Button",BS_OWNERDRAW,192,162,17,16\r
+    CONTROL         "-",IDC_MINUS_,"Button",BS_OWNERDRAW,210,162,17,16\r
+    CONTROL         "=",IDC_EQUAL_,"Button",BS_OWNERDRAW,228,162,17,16\r
+    CONTROL         "(\\)",IDC_BACKSLASH1_,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,205,256,17,16\r
+    CONTROL         "BS",IDC_BACKSPACE_,"Button",BS_OWNERDRAW,246,162,35,16\r
+    CONTROL         "Tab",IDC_TAB_,"Button",BS_OWNERDRAW,12,179,26,16\r
+    CONTROL         "Q",IDC_Q_,"Button",BS_OWNERDRAW,39,179,17,16\r
+    CONTROL         "W",IDC_W_,"Button",BS_OWNERDRAW,57,179,17,16\r
+    CONTROL         "E",IDC_E_,"Button",BS_OWNERDRAW,75,179,17,16\r
+    CONTROL         "R",IDC_R_,"Button",BS_OWNERDRAW,93,179,17,16\r
+    CONTROL         "T",IDC_T_,"Button",BS_OWNERDRAW,111,179,17,16\r
+    CONTROL         "Y",IDC_Y_,"Button",BS_OWNERDRAW,129,179,17,16\r
+    CONTROL         "U",IDC_U_,"Button",BS_OWNERDRAW,147,179,17,16\r
+    CONTROL         "I",IDC_I_,"Button",BS_OWNERDRAW,165,179,17,16\r
+    CONTROL         "O",IDC_O_,"Button",BS_OWNERDRAW,183,179,17,16\r
+    CONTROL         "P",IDC_P_,"Button",BS_OWNERDRAW,201,179,17,16\r
+    CONTROL         "[",IDC_SQUARE_BRA_,"Button",BS_OWNERDRAW,219,179,17,16\r
+    CONTROL         "]",IDC_SQUARE_CKET_,"Button",BS_OWNERDRAW,237,179,17,16\r
+    CONTROL         "\\",IDC_BACKSLASH_,"Button",BS_OWNERDRAW,255,179,26,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK_,"Button",BS_OWNERDRAW,12,196,30,16\r
+    CONTROL         "A",IDC_A_,"Button",BS_OWNERDRAW,43,196,17,16\r
+    CONTROL         "S",IDC_S_,"Button",BS_OWNERDRAW,61,196,17,16\r
+    CONTROL         "D",IDC_D_,"Button",BS_OWNERDRAW,79,196,17,16\r
+    CONTROL         "F",IDC_F_,"Button",BS_OWNERDRAW,97,196,17,16\r
+    CONTROL         "G",IDC_G_,"Button",BS_OWNERDRAW,115,196,17,16\r
+    CONTROL         "H",IDC_H_,"Button",BS_OWNERDRAW,133,196,17,16\r
+    CONTROL         "J",IDC_J_,"Button",BS_OWNERDRAW,151,196,17,16\r
+    CONTROL         "K",IDC_K_,"Button",BS_OWNERDRAW,169,196,17,16\r
+    CONTROL         "L",IDC_L_,"Button",BS_OWNERDRAW,187,196,17,16\r
+    CONTROL         ";",IDC_SEMICOLON_,"Button",BS_OWNERDRAW,205,196,17,16\r
+    CONTROL         "'",IDC_QUOTE_,"Button",BS_OWNERDRAW,223,196,17,16\r
+    CONTROL         "Enter",IDC_ENTER_,"Button",BS_OWNERDRAW,241,196,40,16\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT_,"Button",BS_OWNERDRAW,12,213,39,\r
+                    16\r
+    CONTROL         "Z",IDC_Z_,"Button",BS_OWNERDRAW,52,213,17,16\r
+    CONTROL         "X",IDC_X_,"Button",BS_OWNERDRAW,70,213,17,16\r
+    CONTROL         "C",IDC_C_,"Button",BS_OWNERDRAW,88,213,17,16\r
+    CONTROL         "V",IDC_V_,"Button",BS_OWNERDRAW,106,213,17,16\r
+    CONTROL         "B",IDC_B_,"Button",BS_OWNERDRAW,124,213,17,16\r
+    CONTROL         "N",IDC_N_,"Button",BS_OWNERDRAW,142,213,17,16\r
+    CONTROL         "M",IDC_M_,"Button",BS_OWNERDRAW,160,213,17,16\r
+    CONTROL         ",",IDC_COMMA_,"Button",BS_OWNERDRAW,178,213,17,16\r
+    CONTROL         ".",IDC_PERIOD_,"Button",BS_OWNERDRAW,196,213,17,16\r
+    CONTROL         "/",IDC_SLASH_,"Button",BS_OWNERDRAW,214,213,17,16\r
+    CONTROL         "\\",IDC_BACKSLASH2_,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,225,256,17,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT_,"Button",BS_OWNERDRAW,232,213,\r
+                    49,16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL_,"Button",BS_OWNERDRAW,12,230,27,16\r
+    CONTROL         "Win",IDC_LEFT_WINDOWS_,"Button",BS_OWNERDRAW,40,230,27,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT_,"Button",BS_OWNERDRAW,68,230,27,16\r
+    CONTROL         "NCn",IDC_NONCONVERT_,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,287,256,17,16\r
+    CONTROL         "Space",IDC_SPACE_,"Button",BS_OWNERDRAW,96,230,73,16\r
+    CONTROL         "Cnv",IDC_CONVERT_,"Button",BS_OWNERDRAW | NOT \r
+                    WS_VISIBLE,245,256,17,16\r
+    CONTROL         "Kna",IDC_KANA_,"Button",BS_OWNERDRAW | NOT WS_VISIBLE,\r
+                    266,256,17,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT_,"Button",BS_OWNERDRAW,170,230,27,\r
+                    16\r
+    CONTROL         "RWin",IDC_RIGHT_WINDOWS_,"Button",BS_OWNERDRAW,198,230,\r
+                    27,16\r
+    CONTROL         "App",IDC_APPLICATION_,"Button",BS_OWNERDRAW,226,230,27,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL_,"Button",BS_OWNERDRAW,254,230,27,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT_,"Button",BS_OWNERDRAW,284,162,17,16\r
+    CONTROL         "Hm",IDC_HOME_,"Button",BS_OWNERDRAW,302,162,17,16\r
+    CONTROL         "PU",IDC_PAGE_UP_,"Button",BS_OWNERDRAW,320,162,17,16\r
+    CONTROL         "Del",IDC_DELETE_,"Button",BS_OWNERDRAW,284,179,17,16\r
+    CONTROL         "End",IDC_END_,"Button",BS_OWNERDRAW,302,179,17,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN_,"Button",BS_OWNERDRAW,320,179,17,16\r
+    CONTROL         "Up",IDC_UP_,"Button",BS_OWNERDRAW,302,213,17,16\r
+    CONTROL         "<-",IDC_LEFT_,"Button",BS_OWNERDRAW,284,230,17,16\r
+    CONTROL         "Dn",IDC_DOWN_,"Button",BS_OWNERDRAW,302,230,17,16\r
+    CONTROL         "->",IDC_RIGHT_,"Button",BS_OWNERDRAW,320,230,17,16\r
+    CONTROL         "NL",IDC_NUM_LOCK_,"Button",BS_OWNERDRAW,340,162,17,16\r
+    CONTROL         "(/)",IDC_DIVIDE_,"Button",BS_OWNERDRAW,358,162,17,16\r
+    CONTROL         "*",IDC_MULTIPLY_,"Button",BS_OWNERDRAW,376,162,17,16\r
+    CONTROL         "(-)",IDC_SUBTRACT_,"Button",BS_OWNERDRAW,394,162,17,16\r
+    CONTROL         "(7)",IDC_NUMPAD7_,"Button",BS_OWNERDRAW,340,179,17,16\r
+    CONTROL         "(8)",IDC_NUMPAD8_,"Button",BS_OWNERDRAW,358,179,17,16\r
+    CONTROL         "(9)",IDC_NUMPAD9_,"Button",BS_OWNERDRAW,376,179,17,16\r
+    CONTROL         "(4)",IDC_NUMPAD4_,"Button",BS_OWNERDRAW,340,196,17,16\r
+    CONTROL         "(5)",IDC_NUMPAD5_,"Button",BS_OWNERDRAW,358,196,17,16\r
+    CONTROL         "(6)",IDC_NUMPAD6_,"Button",BS_OWNERDRAW,376,196,17,16\r
+    CONTROL         "+",IDC_ADD_,"Button",BS_OWNERDRAW,394,179,17,33\r
+    CONTROL         "(1)",IDC_NUMPAD1_,"Button",BS_OWNERDRAW,340,213,17,16\r
+    CONTROL         "(2)",IDC_NUMPAD2_,"Button",BS_OWNERDRAW,358,213,17,16\r
+    CONTROL         "(3)",IDC_NUMPAD3_,"Button",BS_OWNERDRAW,376,213,17,16\r
+    CONTROL         "(0)",IDC_NUMPAD0_,"Button",BS_OWNERDRAW,340,230,35,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE_,"Button",BS_OWNERDRAW,376,230,17,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER_,"Button",BS_OWNERDRAW,394,213,17,\r
+                    33\r
+    GROUPBOX        "Base keyboard",IDC_STATIC,7,7,409,120\r
+    GROUPBOX        "Remapped keyboard",IDC_STATIC,7,132,409,120\r
+    CONTROL         "Wk",IDC_ACPI_WAKE,"Button",BS_OWNERDRAW,358,16,17,16\r
+    CONTROL         "Wk",IDC_ACPI_WAKE_,"Button",BS_OWNERDRAW,358,142,17,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP,"Button",BS_OWNERDRAW,376,16,17,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP_,"Button",BS_OWNERDRAW,376,142,17,\r
+                    16\r
+    CONTROL         "Pw",IDC_ACPI_POWER,"Button",BS_OWNERDRAW,394,16,17,16\r
+    CONTROL         "Pw",IDC_ACPI_POWER_,"Button",BS_OWNERDRAW,394,142,17,16\r
+END\r
+\r
+IDD_109KEYBOARD DIALOG DISCARDABLE  0, 0, 422, 280\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Keyboard Layout"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    DEFPUSHBUTTON   "OK",IDOK,311,258,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,366,258,50,14\r
+    CONTROL         "Esc",IDC_ESC,"Button",BS_OWNERDRAW,12,16,17,16\r
+    CONTROL         "F1",IDC_F1,"Button",BS_OWNERDRAW,48,16,17,16\r
+    CONTROL         "F2",IDC_F2,"Button",BS_OWNERDRAW,66,16,17,16\r
+    CONTROL         "F3",IDC_F3,"Button",BS_OWNERDRAW,84,16,17,16\r
+    CONTROL         "F4",IDC_F4,"Button",BS_OWNERDRAW,102,16,17,16\r
+    CONTROL         "F5",IDC_F5,"Button",BS_OWNERDRAW,128,16,17,16\r
+    CONTROL         "F6",IDC_F6,"Button",BS_OWNERDRAW,146,16,17,16\r
+    CONTROL         "F7",IDC_F7,"Button",BS_OWNERDRAW,164,16,17,16\r
+    CONTROL         "F8",IDC_F8,"Button",BS_OWNERDRAW,182,16,17,16\r
+    CONTROL         "F9",IDC_F9,"Button",BS_OWNERDRAW,210,16,17,16\r
+    CONTROL         "F10",IDC_F10,"Button",BS_OWNERDRAW,228,16,17,16\r
+    CONTROL         "F11",IDC_F11,"Button",BS_OWNERDRAW,246,16,17,16\r
+    CONTROL         "F12",IDC_F12,"Button",BS_OWNERDRAW,264,16,17,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN,"Button",BS_OWNERDRAW,284,16,17,16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK,"Button",BS_OWNERDRAW,302,16,17,16\r
+    CONTROL         "Pau",IDC_PAUSE,"Button",BS_OWNERDRAW,320,16,17,16\r
+    CONTROL         "H/Z",IDC_BACK_QUOTE,"Button",BS_OWNERDRAW,12,36,17,16\r
+    CONTROL         "1",IDC_1,"Button",BS_OWNERDRAW,30,36,17,16\r
+    CONTROL         "2",IDC_2,"Button",BS_OWNERDRAW,48,36,17,16\r
+    CONTROL         "3",IDC_3,"Button",BS_OWNERDRAW,66,36,17,16\r
+    CONTROL         "4",IDC_4,"Button",BS_OWNERDRAW,84,36,17,16\r
+    CONTROL         "5",IDC_5,"Button",BS_OWNERDRAW,102,36,17,16\r
+    CONTROL         "6",IDC_6,"Button",BS_OWNERDRAW,120,36,17,16\r
+    CONTROL         "7",IDC_7,"Button",BS_OWNERDRAW,138,36,17,16\r
+    CONTROL         "8",IDC_8,"Button",BS_OWNERDRAW,156,36,17,16\r
+    CONTROL         "9",IDC_9,"Button",BS_OWNERDRAW,174,36,17,16\r
+    CONTROL         "0",IDC_0,"Button",BS_OWNERDRAW,192,36,17,16\r
+    CONTROL         "-",IDC_MINUS,"Button",BS_OWNERDRAW,210,36,17,16\r
+    CONTROL         "^",IDC_EQUAL,"Button",BS_OWNERDRAW,228,36,17,16\r
+    CONTROL         "(\\)",IDC_BACKSLASH1,"Button",BS_OWNERDRAW,246,36,17,16\r
+    CONTROL         "BS",IDC_BACKSPACE,"Button",BS_OWNERDRAW,264,36,17,16\r
+    CONTROL         "Tab",IDC_TAB,"Button",BS_OWNERDRAW,12,53,26,16\r
+    CONTROL         "Q",IDC_Q,"Button",BS_OWNERDRAW,39,53,17,16\r
+    CONTROL         "W",IDC_W,"Button",BS_OWNERDRAW,57,53,17,16\r
+    CONTROL         "E",IDC_E,"Button",BS_OWNERDRAW,75,53,17,16\r
+    CONTROL         "R",IDC_R,"Button",BS_OWNERDRAW,93,53,17,16\r
+    CONTROL         "T",IDC_T,"Button",BS_OWNERDRAW,111,53,17,16\r
+    CONTROL         "Y",IDC_Y,"Button",BS_OWNERDRAW,129,53,17,16\r
+    CONTROL         "U",IDC_U,"Button",BS_OWNERDRAW,147,53,17,16\r
+    CONTROL         "I",IDC_I,"Button",BS_OWNERDRAW,165,53,17,16\r
+    CONTROL         "O",IDC_O,"Button",BS_OWNERDRAW,183,53,17,16\r
+    CONTROL         "P",IDC_P,"Button",BS_OWNERDRAW,201,53,17,16\r
+    CONTROL         "@",IDC_SQUARE_BRA,"Button",BS_OWNERDRAW,219,53,17,16\r
+    CONTROL         "[",IDC_SQUARE_CKET,"Button",BS_OWNERDRAW,237,53,21,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK,"Button",BS_OWNERDRAW,12,70,30,16\r
+    CONTROL         "A",IDC_A,"Button",BS_OWNERDRAW,43,70,17,16\r
+    CONTROL         "S",IDC_S,"Button",BS_OWNERDRAW,61,70,17,16\r
+    CONTROL         "D",IDC_D,"Button",BS_OWNERDRAW,79,70,17,16\r
+    CONTROL         "F",IDC_F,"Button",BS_OWNERDRAW,97,70,17,16\r
+    CONTROL         "G",IDC_G,"Button",BS_OWNERDRAW,115,70,17,16\r
+    CONTROL         "H",IDC_H,"Button",BS_OWNERDRAW,133,70,17,16\r
+    CONTROL         "J",IDC_J,"Button",BS_OWNERDRAW,151,70,17,16\r
+    CONTROL         "K",IDC_K,"Button",BS_OWNERDRAW,169,70,17,16\r
+    CONTROL         "L",IDC_L,"Button",BS_OWNERDRAW,187,70,17,16\r
+    CONTROL         ";",IDC_SEMICOLON,"Button",BS_OWNERDRAW,205,70,17,16\r
+    CONTROL         ":",IDC_QUOTE,"Button",BS_OWNERDRAW,223,70,17,16\r
+    CONTROL         "]",IDC_BACKSLASH,"Button",BS_OWNERDRAW,241,70,17,16\r
+    CONTROL         "Enter",IDC_ENTER,"Button",BS_OWNERDRAW,259,53,22,33\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT,"Button",BS_OWNERDRAW,12,87,39,16\r
+    CONTROL         "Z",IDC_Z,"Button",BS_OWNERDRAW,52,87,17,16\r
+    CONTROL         "X",IDC_X,"Button",BS_OWNERDRAW,70,87,17,16\r
+    CONTROL         "C",IDC_C,"Button",BS_OWNERDRAW,88,87,17,16\r
+    CONTROL         "V",IDC_V,"Button",BS_OWNERDRAW,106,87,17,16\r
+    CONTROL         "B",IDC_B,"Button",BS_OWNERDRAW,124,87,17,16\r
+    CONTROL         "N",IDC_N,"Button",BS_OWNERDRAW,142,87,17,16\r
+    CONTROL         "M",IDC_M,"Button",BS_OWNERDRAW,160,87,17,16\r
+    CONTROL         ",",IDC_COMMA,"Button",BS_OWNERDRAW,178,87,17,16\r
+    CONTROL         ".",IDC_PERIOD,"Button",BS_OWNERDRAW,196,87,17,16\r
+    CONTROL         "/",IDC_SLASH,"Button",BS_OWNERDRAW,214,87,17,16\r
+    CONTROL         "\\",IDC_BACKSLASH2,"Button",BS_OWNERDRAW,232,87,17,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT,"Button",BS_OWNERDRAW,250,87,31,\r
+                    16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL,"Button",BS_OWNERDRAW,12,104,23,16\r
+    CONTROL         "Win",IDC_LEFT_WINDOWS,"Button",BS_OWNERDRAW,36,104,17,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT,"Button",BS_OWNERDRAW,54,104,23,16\r
+    CONTROL         "NCn",IDC_NONCONVERT,"Button",BS_OWNERDRAW,78,104,17,16\r
+    CONTROL         "Space",IDC_SPACE,"Button",BS_OWNERDRAW,96,104,65,16\r
+    CONTROL         "Cnv",IDC_CONVERT,"Button",BS_OWNERDRAW,162,104,17,16\r
+    CONTROL         "Kna",IDC_KANA,"Button",BS_OWNERDRAW,180,104,17,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT,"Button",BS_OWNERDRAW,198,104,23,16\r
+    CONTROL         "RW",IDC_RIGHT_WINDOWS,"Button",BS_OWNERDRAW,222,104,17,\r
+                    16\r
+    CONTROL         "App",IDC_APPLICATION,"Button",BS_OWNERDRAW,240,104,17,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL,"Button",BS_OWNERDRAW,258,104,23,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT,"Button",BS_OWNERDRAW,284,36,17,16\r
+    CONTROL         "Hm",IDC_HOME,"Button",BS_OWNERDRAW,302,36,17,16\r
+    CONTROL         "PU",IDC_PAGE_UP,"Button",BS_OWNERDRAW,320,36,17,16\r
+    CONTROL         "Del",IDC_DELETE,"Button",BS_OWNERDRAW,284,53,17,16\r
+    CONTROL         "End",IDC_END,"Button",BS_OWNERDRAW,302,53,17,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN,"Button",BS_OWNERDRAW,320,53,17,16\r
+    CONTROL         "Up",IDC_UP,"Button",BS_OWNERDRAW,302,87,17,16\r
+    CONTROL         "<-",IDC_LEFT,"Button",BS_OWNERDRAW,284,104,17,16\r
+    CONTROL         "Dn",IDC_DOWN,"Button",BS_OWNERDRAW,302,104,17,16\r
+    CONTROL         "->",IDC_RIGHT,"Button",BS_OWNERDRAW,320,104,17,16\r
+    CONTROL         "NL",IDC_NUM_LOCK,"Button",BS_OWNERDRAW,340,36,17,16\r
+    CONTROL         "(/)",IDC_DIVIDE,"Button",BS_OWNERDRAW,358,36,17,16\r
+    CONTROL         "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,376,36,17,16\r
+    CONTROL         "(-)",IDC_SUBTRACT,"Button",BS_OWNERDRAW,394,36,17,16\r
+    CONTROL         "(7)",IDC_NUMPAD7,"Button",BS_OWNERDRAW,340,53,17,16\r
+    CONTROL         "(8)",IDC_NUMPAD8,"Button",BS_OWNERDRAW,358,53,17,16\r
+    CONTROL         "(9)",IDC_NUMPAD9,"Button",BS_OWNERDRAW,376,53,17,16\r
+    CONTROL         "(4)",IDC_NUMPAD4,"Button",BS_OWNERDRAW,340,70,17,16\r
+    CONTROL         "(5)",IDC_NUMPAD5,"Button",BS_OWNERDRAW,358,70,17,16\r
+    CONTROL         "(6)",IDC_NUMPAD6,"Button",BS_OWNERDRAW,376,70,17,16\r
+    CONTROL         "+",IDC_ADD,"Button",BS_OWNERDRAW,394,53,17,33\r
+    CONTROL         "(1)",IDC_NUMPAD1,"Button",BS_OWNERDRAW,340,87,17,16\r
+    CONTROL         "(2)",IDC_NUMPAD2,"Button",BS_OWNERDRAW,358,87,17,16\r
+    CONTROL         "(3)",IDC_NUMPAD3,"Button",BS_OWNERDRAW,376,87,17,16\r
+    CONTROL         "(0)",IDC_NUMPAD0,"Button",BS_OWNERDRAW,340,104,35,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE,"Button",BS_OWNERDRAW,376,104,17,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER,"Button",BS_OWNERDRAW,394,87,17,33\r
+    CONTROL         "Esc",IDC_ESC_,"Button",BS_OWNERDRAW,12,142,17,16\r
+    CONTROL         "F1",IDC_F1_,"Button",BS_OWNERDRAW,48,142,17,16\r
+    CONTROL         "F2",IDC_F2_,"Button",BS_OWNERDRAW,66,142,17,16\r
+    CONTROL         "F3",IDC_F3_,"Button",BS_OWNERDRAW,84,142,17,16\r
+    CONTROL         "F4",IDC_F4_,"Button",BS_OWNERDRAW,102,142,17,16\r
+    CONTROL         "F5",IDC_F5_,"Button",BS_OWNERDRAW,128,142,17,16\r
+    CONTROL         "F6",IDC_F6_,"Button",BS_OWNERDRAW,146,142,17,16\r
+    CONTROL         "F7",IDC_F7_,"Button",BS_OWNERDRAW,164,142,17,16\r
+    CONTROL         "F8",IDC_F8_,"Button",BS_OWNERDRAW,182,142,17,16\r
+    CONTROL         "F9",IDC_F9_,"Button",BS_OWNERDRAW,210,142,17,16\r
+    CONTROL         "F10",IDC_F10_,"Button",BS_OWNERDRAW,228,142,17,16\r
+    CONTROL         "F11",IDC_F11_,"Button",BS_OWNERDRAW,246,142,17,16\r
+    CONTROL         "F12",IDC_F12_,"Button",BS_OWNERDRAW,264,142,17,16\r
+    CONTROL         "PS",IDC_PRINT_SCREEN_,"Button",BS_OWNERDRAW,284,142,17,\r
+                    16\r
+    CONTROL         "SL",IDC_SCROLL_LOCK_,"Button",BS_OWNERDRAW,302,142,17,\r
+                    16\r
+    CONTROL         "Pau",IDC_PAUSE_,"Button",BS_OWNERDRAW,320,142,17,16\r
+    CONTROL         "H/Z",IDC_BACK_QUOTE_,"Button",BS_OWNERDRAW,12,162,17,16\r
+    CONTROL         "1",IDC_1_,"Button",BS_OWNERDRAW,30,162,17,16\r
+    CONTROL         "2",IDC_2_,"Button",BS_OWNERDRAW,48,162,17,16\r
+    CONTROL         "3",IDC_3_,"Button",BS_OWNERDRAW,66,162,17,16\r
+    CONTROL         "4",IDC_4_,"Button",BS_OWNERDRAW,84,162,17,16\r
+    CONTROL         "5",IDC_5_,"Button",BS_OWNERDRAW,102,162,17,16\r
+    CONTROL         "6",IDC_6_,"Button",BS_OWNERDRAW,120,162,17,16\r
+    CONTROL         "7",IDC_7_,"Button",BS_OWNERDRAW,138,162,17,16\r
+    CONTROL         "8",IDC_8_,"Button",BS_OWNERDRAW,156,162,17,16\r
+    CONTROL         "9",IDC_9_,"Button",BS_OWNERDRAW,174,162,17,16\r
+    CONTROL         "0",IDC_0_,"Button",BS_OWNERDRAW,192,162,17,16\r
+    CONTROL         "-",IDC_MINUS_,"Button",BS_OWNERDRAW,210,162,17,16\r
+    CONTROL         "^",IDC_EQUAL_,"Button",BS_OWNERDRAW,228,162,17,16\r
+    CONTROL         "(\\)",IDC_BACKSLASH1_,"Button",BS_OWNERDRAW,246,162,17,\r
+                    16\r
+    CONTROL         "BS",IDC_BACKSPACE_,"Button",BS_OWNERDRAW,264,162,17,16\r
+    CONTROL         "Tab",IDC_TAB_,"Button",BS_OWNERDRAW,12,179,26,16\r
+    CONTROL         "Q",IDC_Q_,"Button",BS_OWNERDRAW,39,179,17,16\r
+    CONTROL         "W",IDC_W_,"Button",BS_OWNERDRAW,57,179,17,16\r
+    CONTROL         "E",IDC_E_,"Button",BS_OWNERDRAW,75,179,17,16\r
+    CONTROL         "R",IDC_R_,"Button",BS_OWNERDRAW,93,179,17,16\r
+    CONTROL         "T",IDC_T_,"Button",BS_OWNERDRAW,111,179,17,16\r
+    CONTROL         "Y",IDC_Y_,"Button",BS_OWNERDRAW,129,179,17,16\r
+    CONTROL         "U",IDC_U_,"Button",BS_OWNERDRAW,147,179,17,16\r
+    CONTROL         "I",IDC_I_,"Button",BS_OWNERDRAW,165,179,17,16\r
+    CONTROL         "O",IDC_O_,"Button",BS_OWNERDRAW,183,179,17,16\r
+    CONTROL         "P",IDC_P_,"Button",BS_OWNERDRAW,201,179,17,16\r
+    CONTROL         "@",IDC_SQUARE_BRA_,"Button",BS_OWNERDRAW,219,179,17,16\r
+    CONTROL         "[",IDC_SQUARE_CKET_,"Button",BS_OWNERDRAW,237,179,21,16\r
+    CONTROL         "Caps",IDC_CAPS_LOCK_,"Button",BS_OWNERDRAW,12,196,30,16\r
+    CONTROL         "A",IDC_A_,"Button",BS_OWNERDRAW,43,196,17,16\r
+    CONTROL         "S",IDC_S_,"Button",BS_OWNERDRAW,61,196,17,16\r
+    CONTROL         "D",IDC_D_,"Button",BS_OWNERDRAW,79,196,17,16\r
+    CONTROL         "F",IDC_F_,"Button",BS_OWNERDRAW,97,196,17,16\r
+    CONTROL         "G",IDC_G_,"Button",BS_OWNERDRAW,115,196,17,16\r
+    CONTROL         "H",IDC_H_,"Button",BS_OWNERDRAW,133,196,17,16\r
+    CONTROL         "J",IDC_J_,"Button",BS_OWNERDRAW,151,196,17,16\r
+    CONTROL         "K",IDC_K_,"Button",BS_OWNERDRAW,169,196,17,16\r
+    CONTROL         "L",IDC_L_,"Button",BS_OWNERDRAW,187,196,17,16\r
+    CONTROL         ";",IDC_SEMICOLON_,"Button",BS_OWNERDRAW,205,196,17,16\r
+    CONTROL         ":",IDC_QUOTE_,"Button",BS_OWNERDRAW,223,196,17,16\r
+    CONTROL         "]",IDC_BACKSLASH_,"Button",BS_OWNERDRAW,241,196,17,16\r
+    CONTROL         "Enter",IDC_ENTER_,"Button",BS_OWNERDRAW,259,179,22,33\r
+    CONTROL         "Shift",IDC_LEFT_SHIFT_,"Button",BS_OWNERDRAW,12,213,39,\r
+                    16\r
+    CONTROL         "Z",IDC_Z_,"Button",BS_OWNERDRAW,52,213,17,16\r
+    CONTROL         "X",IDC_X_,"Button",BS_OWNERDRAW,70,213,17,16\r
+    CONTROL         "C",IDC_C_,"Button",BS_OWNERDRAW,88,213,17,16\r
+    CONTROL         "V",IDC_V_,"Button",BS_OWNERDRAW,106,213,17,16\r
+    CONTROL         "B",IDC_B_,"Button",BS_OWNERDRAW,124,213,17,16\r
+    CONTROL         "N",IDC_N_,"Button",BS_OWNERDRAW,142,213,17,16\r
+    CONTROL         "M",IDC_M_,"Button",BS_OWNERDRAW,160,213,17,16\r
+    CONTROL         ",",IDC_COMMA_,"Button",BS_OWNERDRAW,178,213,17,16\r
+    CONTROL         ".",IDC_PERIOD_,"Button",BS_OWNERDRAW,196,213,17,16\r
+    CONTROL         "/",IDC_SLASH_,"Button",BS_OWNERDRAW,214,213,17,16\r
+    CONTROL         "\\",IDC_BACKSLASH2_,"Button",BS_OWNERDRAW,232,213,17,16\r
+    CONTROL         "RShift",IDC_RIGHT_SHIFT_,"Button",BS_OWNERDRAW,250,213,\r
+                    31,16\r
+    CONTROL         "Ctrl",IDC_LEFT_CTRL_,"Button",BS_OWNERDRAW,12,230,23,16\r
+    CONTROL         "Win",IDC_LEFT_WINDOWS_,"Button",BS_OWNERDRAW,36,230,17,\r
+                    16\r
+    CONTROL         "Alt",IDC_LEFT_ALT_,"Button",BS_OWNERDRAW,54,230,23,16\r
+    CONTROL         "NCn",IDC_NONCONVERT_,"Button",BS_OWNERDRAW,78,230,17,16\r
+    CONTROL         "Space",IDC_SPACE_,"Button",BS_OWNERDRAW,96,230,65,16\r
+    CONTROL         "Cnv",IDC_CONVERT_,"Button",BS_OWNERDRAW,162,230,17,16\r
+    CONTROL         "Kna",IDC_KANA_,"Button",BS_OWNERDRAW,180,230,17,16\r
+    CONTROL         "RAlt",IDC_RIGHT_ALT_,"Button",BS_OWNERDRAW,198,230,23,\r
+                    16\r
+    CONTROL         "RW",IDC_RIGHT_WINDOWS_,"Button",BS_OWNERDRAW,222,230,17,\r
+                    16\r
+    CONTROL         "App",IDC_APPLICATION_,"Button",BS_OWNERDRAW,240,230,17,\r
+                    16\r
+    CONTROL         "RCtrl",IDC_RIGHT_CTRL_,"Button",BS_OWNERDRAW,258,230,23,\r
+                    16\r
+    CONTROL         "Ins",IDC_INSERT_,"Button",BS_OWNERDRAW,284,162,17,16\r
+    CONTROL         "Hm",IDC_HOME_,"Button",BS_OWNERDRAW,302,162,17,16\r
+    CONTROL         "PU",IDC_PAGE_UP_,"Button",BS_OWNERDRAW,320,162,17,16\r
+    CONTROL         "Del",IDC_DELETE_,"Button",BS_OWNERDRAW,284,179,17,16\r
+    CONTROL         "End",IDC_END_,"Button",BS_OWNERDRAW,302,179,17,16\r
+    CONTROL         "PD",IDC_PAGE_DOWN_,"Button",BS_OWNERDRAW,320,179,17,16\r
+    CONTROL         "Up",IDC_UP_,"Button",BS_OWNERDRAW,302,213,17,16\r
+    CONTROL         "<-",IDC_LEFT_,"Button",BS_OWNERDRAW,284,230,17,16\r
+    CONTROL         "Dn",IDC_DOWN_,"Button",BS_OWNERDRAW,302,230,17,16\r
+    CONTROL         "->",IDC_RIGHT_,"Button",BS_OWNERDRAW,320,230,17,16\r
+    CONTROL         "NL",IDC_NUM_LOCK_,"Button",BS_OWNERDRAW,340,162,17,16\r
+    CONTROL         "(/)",IDC_DIVIDE_,"Button",BS_OWNERDRAW,358,162,17,16\r
+    CONTROL         "*",IDC_MULTIPLY_,"Button",BS_OWNERDRAW,376,162,17,16\r
+    CONTROL         "(-)",IDC_SUBTRACT_,"Button",BS_OWNERDRAW,394,162,17,16\r
+    CONTROL         "(7)",IDC_NUMPAD7_,"Button",BS_OWNERDRAW,340,179,17,16\r
+    CONTROL         "(8)",IDC_NUMPAD8_,"Button",BS_OWNERDRAW,358,179,17,16\r
+    CONTROL         "(9)",IDC_NUMPAD9_,"Button",BS_OWNERDRAW,376,179,17,16\r
+    CONTROL         "(4)",IDC_NUMPAD4_,"Button",BS_OWNERDRAW,340,196,17,16\r
+    CONTROL         "(5)",IDC_NUMPAD5_,"Button",BS_OWNERDRAW,358,196,17,16\r
+    CONTROL         "(6)",IDC_NUMPAD6_,"Button",BS_OWNERDRAW,376,196,17,16\r
+    CONTROL         "+",IDC_ADD_,"Button",BS_OWNERDRAW,394,179,17,33\r
+    CONTROL         "(1)",IDC_NUMPAD1_,"Button",BS_OWNERDRAW,340,213,17,16\r
+    CONTROL         "(2)",IDC_NUMPAD2_,"Button",BS_OWNERDRAW,358,213,17,16\r
+    CONTROL         "(3)",IDC_NUMPAD3_,"Button",BS_OWNERDRAW,376,213,17,16\r
+    CONTROL         "(0)",IDC_NUMPAD0_,"Button",BS_OWNERDRAW,340,230,35,16\r
+    CONTROL         "Dl",IDC_NUMPADDELETE_,"Button",BS_OWNERDRAW,376,230,17,\r
+                    16\r
+    CONTROL         "Ent",IDC_NUMPADENTER_,"Button",BS_OWNERDRAW,394,213,17,\r
+                    33\r
+    GROUPBOX        "Base keyboard",IDC_STATIC,7,7,409,120\r
+    GROUPBOX        "Remapped keyboard",IDC_STATIC,7,132,409,120\r
+    CONTROL         "Pw",IDC_ACPI_POWER,"Button",BS_OWNERDRAW,394,16,17,16\r
+    CONTROL         "Pw",IDC_ACPI_POWER_,"Button",BS_OWNERDRAW,394,142,17,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP,"Button",BS_OWNERDRAW,376,16,17,16\r
+    CONTROL         "Slp",IDC_ACPI_SLEEP_,"Button",BS_OWNERDRAW,376,142,17,\r
+                    16\r
+    CONTROL         "Wk",IDC_ACPI_WAKE,"Button",BS_OWNERDRAW,358,16,17,16\r
+    CONTROL         "Wk",IDC_ACPI_WAKE_,"Button",BS_OWNERDRAW,358,142,17,16\r
+END\r
+\r
+IDD_PROPERTIES DIALOGEX 0, 0, 422, 279\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Properties"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+    COMBOBOX        IDC_APPLICATION,7,7,320,246,CBS_DROPDOWNLIST | CBS_SORT | \r
+                    WS_VSCROLL | WS_TABSTOP\r
+    CONTROL         "Use Default Setting",IDC_SETTING_DEFAULT,"Button",\r
+                    BS_AUTORADIOBUTTON | WS_GROUP,338,7,77,10\r
+    CONTROL         "Use Specific Setting",IDC_SETTING_SPECIFIC,"Button",\r
+                    BS_AUTORADIOBUTTON,338,16,80,10\r
+    CONTROL         "Disable XKeymacs",IDC_SETTING_DISABLE,"Button",\r
+                    BS_AUTORADIOBUTTON,338,25,75,10\r
+    CONTROL         "",IDC_TAB,"Static",SS_BLACKFRAME | WS_GROUP,7,39,411,\r
+                    213\r
+    CONTROL         "Use Dialog setting for all dialogs",\r
+                    IDC_USE_DIALOG_SETTING,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,15,25,112,10\r
+    PUSHBUTTON      "Load Default",IDC_LOAD_DEFAULT,3,260,50,14\r
+    PUSHBUTTON      "Select All",IDC_SELECT_ALL,59,260,50,14\r
+    PUSHBUTTON      "Clear All",IDC_CLEAR_ALL,116,260,50,14\r
+    DEFPUSHBUTTON   "OK",IDOK,254,260,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,311,260,50,14\r
+    PUSHBUTTON      "&Apply",IDC_APPLY,368,260,50,14\r
+    LTEXT           "kill-ring-max: ",IDC_STATIC,262,26,41,8\r
+    EDITTEXT        IDC_KILL_RING_MAX,306,24,20,12,ES_AUTOHSCROLL | \r
+                    ES_NUMBER,WS_EX_RIGHT\r
+    EDITTEXT        IDC_WINDOW_TEXT,150,25,40,14,ES_AUTOHSCROLL | NOT \r
+                    WS_VISIBLE\r
+    LTEXT           "Use if the window title is ",IDC_STATIC,67,32,78,8,NOT \r
+                    WS_VISIBLE\r
+END\r
+\r
+IDD_PROPERTIES_BASIC DIALOG DISCARDABLE  0, 0, 408, 202\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Basic"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    CONTROL         "C-x C-f",IDC_CXCF,"Button",BS_AUTOCHECKBOX | WS_GROUP | \r
+                    WS_TABSTOP,15,17,37,10\r
+    CONTROL         "C-x k",IDC_CXK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    29,34,10\r
+    CONTROL         "C-x C-s",IDC_CXCS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,41,38,10\r
+    CONTROL         "C-x C-w",IDC_CXCW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,53,40,10\r
+    GROUPBOX        "Files",IDC_FILES,7,7,88,59\r
+    CONTROL         "C-s",IDC_CS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,77,\r
+                    26,10\r
+    CONTROL         "C-r",IDC_CR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,89,\r
+                    25,10\r
+    CONTROL         "M-%",IDC_MS5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    101,29,10\r
+    CONTROL         "C-M-%",IDC_CMS5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,113,36,10\r
+    GROUPBOX        "Search",IDC_SEARCH,7,67,88,59\r
+    CONTROL         "C-z",IDC_CZ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,\r
+                    137,26,10\r
+    CONTROL         "C-x C-c",IDC_CXCC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,149,39,10\r
+    CONTROL         "M-F12",IDC_MF12,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    15,161,37,10\r
+    GROUPBOX        "Leaving Active Window",IDC_WINDOW,7,127,88,68\r
+    CONTROL         "C-b",IDC_CB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,\r
+                    17,27,10\r
+    CONTROL         "C-f",IDC_CF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,149,\r
+                    17,25,10\r
+    CONTROL         "M-b",IDC_MB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,\r
+                    29,26,10\r
+    CONTROL         "M-f",IDC_MF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,149,\r
+                    29,26,10\r
+    CONTROL         "C-p",IDC_CP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,\r
+                    41,27,10\r
+    CONTROL         "C-n",IDC_CN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,149,\r
+                    41,27,10\r
+    CONTROL         "C-a",IDC_CA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,\r
+                    53,27,10\r
+    CONTROL         "C-e",IDC_CE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,149,\r
+                    53,27,10\r
+    CONTROL         "M-<",IDC_MSCOMMA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    110,65,28,10\r
+    CONTROL         "M->",IDC_MSPERIOD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    110,77,28,10\r
+    CONTROL         "M-v",IDC_MV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,\r
+                    89,28,10\r
+    CONTROL         "C-v",IDC_CV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,149,\r
+                    89,27,10\r
+    CONTROL         "C-l",IDC_CL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,\r
+                    101,24,10\r
+    GROUPBOX        "Motion",IDC_MOTION,102,7,83,141\r
+    CONTROL         "C-d",IDC_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,\r
+                    17,27,10\r
+    CONTROL         "C-h",IDC_CH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,240,\r
+                    17,26,10\r
+    CONTROL         "C-w",IDC_CW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,\r
+                    29,28,10\r
+    CONTROL         "M-w",IDC_MW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,240,\r
+                    29,29,10\r
+    CONTROL         "C-k",IDC_CK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,\r
+                    41,27,10\r
+    CONTROL         "M-t",IDC_MT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,240,\r
+                    41,29,10\r
+    CONTROL         "M-DEL",IDC_MDEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    200,53,35,10\r
+    CONTROL         "M-d",IDC_MD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,240,\r
+                    53,28,10\r
+    CONTROL         "C-y",IDC_CY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,\r
+                    65,26,10\r
+    CONTROL         "M-y",IDC_MY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,240,\r
+                    65,27,10\r
+    CONTROL         "C-t",IDC_CT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,\r
+                    77,24,10\r
+    CONTROL         "C-x C-t",IDC_CXCT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    240,77,35,10\r
+    GROUPBOX        "Killing and Deleting",IDC_KILL,192,7,91,84\r
+    CONTROL         "C-x u",IDC_CXU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    200,101,32,10\r
+    CONTROL         "C-/",IDC_CSLASH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    200,113,26,10\r
+    CONTROL         "C-_",IDC_C_,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,\r
+                    125,46,10\r
+    CONTROL         "C-g",IDC_CG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,\r
+                    137,27,10\r
+    GROUPBOX        "Error Recovery",IDC_RECOVERY,192,92,91,56\r
+    CONTROL         "C-x C-j",IDC_CXCJ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    109,161,36,10\r
+    CONTROL         "C-o",IDC_CO2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,165,\r
+                    161,25,10\r
+    CONTROL         "C-\\",IDC_CBACKSLASH,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,216,161,24,10\r
+    CONTROL         "C-BACKSLASH of 106/109 keyboard",IDC_CBACKSLASH_106,\r
+                    "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,109,\r
+                    173,132,9\r
+    GROUPBOX        "Toggle Input Method Editor",IDC_IME,102,150,181,45\r
+    CONTROL         "C-Space",IDC_CSPACE,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,298,17,43,10\r
+    CONTROL         "C-x h",IDC_CXH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    298,29,32,10\r
+    CONTROL         "C-x C-p",IDC_CXCP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    350,30,39,10\r
+    CONTROL         "C-u",IDC_CU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,298,\r
+                    41,26,10\r
+    CONTROL         "C-0 ... C-9",IDC_CDIGIT,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,350,41,45,10\r
+    CONTROL         "Left Alt",IDC_LEFT_ALT,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,298,53,38,10\r
+    CONTROL         "Right Alt",IDC_RIGHT_ALT,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,350,53,41,10\r
+    CONTROL         "Alt",IDC_ALT,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | \r
+                    WS_TABSTOP,298,53,37,10\r
+    CONTROL         "Esc",IDC_ESCAPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    298,65,28,10\r
+    CONTROL         "C-[",IDC_SQUARE_BRA,"Button",BS_AUTOCHECKBOX | \r
+                    WS_TABSTOP,350,65,25,10\r
+    CONTROL         "C-m",IDC_CM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,298,\r
+                    77,28,10\r
+    CONTROL         "C-o",IDC_CO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,350,\r
+                    77,27,10\r
+    CONTROL         "C-i",IDC_CI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,298,\r
+                    89,24,10\r
+    CONTROL         "M-i",IDC_MI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,350,\r
+                    89,25,10\r
+    CONTROL         "M-!",IDC_MS1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,298,\r
+                    101,26,10\r
+    CONTROL         "M-x",IDC_MX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,350,\r
+                    101,29,10\r
+    CONTROL         "C-q",IDC_CQ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,298,\r
+                    113,28,10\r
+    CONTROL         "C-x (",IDC_CXS9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    298,125,30,10\r
+    CONTROL         "C-x )",IDC_CXS0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    350,125,31,10\r
+    CONTROL         "C-x e",IDC_CXE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    298,137,32,10\r
+    GROUPBOX        "Other",IDC_OTHER,290,7,111,188\r
+    CONTROL         "C-x b",IDC_CXB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    298,149,33,10\r
+    CONTROL         "M-l",IDC_ML,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,298,\r
+                    161,27,10\r
+    CONTROL         "M-u",IDC_MU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,350,\r
+                    161,29,10\r
+    CONTROL         "M-c",IDC_MC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,298,\r
+                    173,29,10\r
+END\r
+\r
+IDD_PROPERTIES_ADVANCED DIALOG DISCARDABLE  0, 0, 408, 202\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Advanced"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    LTEXT           "&Category:",IDC_STATIC,7,7,31,8\r
+    COMBOBOX        IDC_CATEGORY,7,17,106,132,CBS_DROPDOWNLIST | CBS_SORT | \r
+                    WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "C&ommands:",IDC_STATIC,7,31,38,8\r
+    LISTBOX         IDC_COMMANDS,7,41,242,116,LBS_SORT | \r
+                    LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "Description:",IDC_STATIC,7,160,38,8\r
+    LTEXT           "brank",IDC_DESCRIPTION,7,169,242,26\r
+    LTEXT           "C&urrent keys:",IDC_STATIC,258,31,42,8\r
+    LISTBOX         IDC_CURRENT_KEYS,258,41,143,32,LBS_SORT | \r
+                    LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "Press &new shortcut key:",IDC_STATIC,258,100,76,8\r
+    CONTROL         "Ctrl+X",IDC_C_X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,\r
+                    258,111,31,10\r
+    EDITTEXT        IDC_NEW_KEY,258,123,142,14,ES_AUTOHSCROLL\r
+    LTEXT           "Currently assigned to:\n[unassigned]",\r
+                    IDC_CURRENTLY_ASSIGNED,258,158,142,32\r
+    PUSHBUTTON      "&Assign",IDC_ASSIGN,351,142,50,14\r
+    PUSHBUTTON      "&Remove",IDC_REMOVE,351,79,50,14\r
+    PUSHBUTTON      "Re&set All",IDC_RESET_ALL,263,142,50,14,NOT WS_VISIBLE\r
+    CONTROL         "Enable CUA-mode",IDC_ENABLE_CUA,"Button",\r
+                    BS_AUTOCHECKBOX | WS_TABSTOP,327,17,74,10\r
+END\r
+\r
+IDD_PROPERTIES_LIST DIALOG DISCARDABLE  0, 0, 408, 202\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "List"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+    CONTROL         "List1",IDC_PROPERTIES_LIST,"SysListView32",LVS_REPORT | \r
+                    LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,394,188\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// DESIGNINFO\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+GUIDELINES DESIGNINFO DISCARDABLE \r
+BEGIN\r
+    IDD_ABOUTBOX, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 228\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 48\r
+    END\r
+\r
+    IDD_OPTIONS, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 145\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 244\r
+    END\r
+\r
+    IDD_104KEYBOARD, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 416\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 272\r
+    END\r
+\r
+    IDD_109KEYBOARD, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 416\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 272\r
+    END\r
+\r
+    IDD_PROPERTIES, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 418\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 274\r
+    END\r
+\r
+    IDD_PROPERTIES_BASIC, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 401\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 195\r
+    END\r
+\r
+    IDD_PROPERTIES_ADVANCED, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 401\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 195\r
+    END\r
+\r
+    IDD_PROPERTIES_LIST, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 401\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 195\r
+    END\r
+END\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Menu\r
+//\r
+\r
+IDR_MAINFRAME MENU PRELOAD DISCARDABLE \r
+BEGIN\r
+    POPUP "&File"\r
+    BEGIN\r
+        MENUITEM "&New\tCtrl+N",                ID_FILE_NEW\r
+        MENUITEM "&Open...\tCtrl+O",            ID_FILE_OPEN\r
+        MENUITEM "&Save\tCtrl+S",               ID_FILE_SAVE\r
+        MENUITEM "Save &As...",                 ID_FILE_SAVE_AS\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "Recent File",                 ID_FILE_MRU_FILE1, GRAYED\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "E&xit",                       ID_APP_EXIT\r
+    END\r
+    POPUP "&Edit"\r
+    BEGIN\r
+        MENUITEM "&Undo\tCtrl+Z",               ID_EDIT_UNDO\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "Cu&t\tCtrl+X",                ID_EDIT_CUT\r
+        MENUITEM "&Copy\tCtrl+C",               ID_EDIT_COPY\r
+        MENUITEM "&Paste\tCtrl+V",              ID_EDIT_PASTE\r
+    END\r
+    POPUP "&Help"\r
+    BEGIN\r
+        MENUITEM "&About Xkeymacs...",          ID_APP_ABOUT\r
+    END\r
+END\r
+\r
+IDR_RIGHT_MENU MENU DISCARDABLE \r
+BEGIN\r
+    POPUP "Right Menu"\r
+    BEGIN\r
+        MENUITEM "&Properties...",              IDC_PROPERTIES\r
+        MENUITEM "&Import Properties...",       IDC_IMPORT\r
+        MENUITEM "&Export Properties...",       IDC_EXPORT\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "&Options...",                 IDC_OPTIONS\r
+        POPUP "&Keyboard Layout"\r
+        BEGIN\r
+            MENUITEM "for the &Logged on User...",  IDC_KEYBOARD\r
+            MENUITEM "for &Any User...",            IDC_KEYBOARD_ANY_USER\r
+        END\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "&Disable",                    IDC_DISABLE\r
+        MENUITEM "&Reset",                      IDC_RESET\r
+        MENUITEM "E&xit",                       IDC_QUIT\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "&Help",                       ID_HELP_FINDER\r
+        MENUITEM "&About XKeymacs",             IDC_ABOUT\r
+    END\r
+END\r
+\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "#include ""afxres.h""\r\n"\r
+    "\0"\r
+END\r
+\r
+3 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"\r
+    "#define _AFX_NO_OLE_RESOURCES\r\n"\r
+    "#define _AFX_NO_TRACKER_RESOURCES\r\n"\r
+    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"\r
+    "\r\n"\r
+    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"\r
+    "#ifdef _WIN32\r\n"\r
+    "LANGUAGE 9, 1\r\n"\r
+    "#pragma code_page(1252)\r\n"\r
+    "#endif //_WIN32\r\n"\r
+    "#include ""res\\xkeymacs.rc2""  // non-Microsoft Visual C++ edited resources\r\n"\r
+    "#include ""afxres.rc""         // Standard components\r\n"\r
+    "#endif\r\n"\r
+    "\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Icon\r
+//\r
+\r
+// Icon with lowest ID value placed first to ensure application icon\r
+// remains consistent on all systems.\r
+IDR_MAINFRAME           ICON    DISCARDABLE     "res\\xkeymacs.ico"\r
+IDR_MAIN_DISABLE_WOCQ   ICON    DISCARDABLE     "res\\disableWOCQ.ico"\r
+IDI_CTRL_ON             ICON    DISCARDABLE     "res\\ctrl_on.ico"\r
+IDI_CTRL_OFF            ICON    DISCARDABLE     "res\\ctrl_off.ico"\r
+IDI_CX_ON               ICON    DISCARDABLE     "res\\cx_on.ico"\r
+IDI_CX_OFF              ICON    DISCARDABLE     "res\\cx_off.ico"\r
+IDI_SHIFT_ON            ICON    DISCARDABLE     "res\\shift_on.ico"\r
+IDI_SHIFT_OFF           ICON    DISCARDABLE     "res\\shift_of.ico"\r
+IDI_ALT_ON              ICON    DISCARDABLE     "res\\alt_on.ico"\r
+IDI_ALT_OFF             ICON    DISCARDABLE     "res\\alt_off.ico"\r
+IDI_META_ON             ICON    DISCARDABLE     "res\\meta_on.ico"\r
+IDI_META_OFF            ICON    DISCARDABLE     "res\\meta_off.ico"\r
+IDR_MAIN_DISABLE        ICON    DISCARDABLE     "res\\disable.ico"\r
+IDR_MAIN_DISABLE_TMP    ICON    DISCARDABLE     "res\\disableTMP.ico"\r
+IDI_MX_ON               ICON    DISCARDABLE     "res\\mx_on.ico"\r
+IDI_MX_OFF              ICON    DISCARDABLE     "res\\mx_off.ico"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Accelerator\r
+//\r
+\r
+IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE \r
+BEGIN\r
+    "N",            ID_FILE_NEW,            VIRTKEY, CONTROL\r
+    "O",            ID_FILE_OPEN,           VIRTKEY, CONTROL\r
+    "S",            ID_FILE_SAVE,           VIRTKEY, CONTROL\r
+    "Z",            ID_EDIT_UNDO,           VIRTKEY, CONTROL\r
+    "X",            ID_EDIT_CUT,            VIRTKEY, CONTROL\r
+    "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL\r
+    "V",            ID_EDIT_PASTE,          VIRTKEY, CONTROL\r
+    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT\r
+    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT\r
+    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL\r
+    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT\r
+    VK_F6,          ID_NEXT_PANE,           VIRTKEY \r
+    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT\r
+END\r
+\r
+\r
+#ifndef _MAC\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Version\r
+//\r
+\r
+VS_VERSION_INFO VERSIONINFO\r
+ FILEVERSION 3,47,0,0\r
+ PRODUCTVERSION 3,47,0,0\r
+ FILEFLAGSMASK 0x3fL\r
+#ifdef _DEBUG\r
+ FILEFLAGS 0x1L\r
+#else\r
+ FILEFLAGS 0x0L\r
+#endif\r
+ FILEOS 0x4L\r
+ FILETYPE 0x1L\r
+ FILESUBTYPE 0x0L\r
+BEGIN\r
+    BLOCK "StringFileInfo"\r
+    BEGIN\r
+        BLOCK "040904b0"\r
+        BEGIN\r
+            VALUE "Comments", "\0"\r
+            VALUE "CompanyName", "\0"\r
+            VALUE "FileDescription", "XKeymacs MFC Application\0"\r
+            VALUE "FileVersion", "3, 47, 0, 0\0"\r
+            VALUE "InternalName", "xkeymacs\0"\r
+            VALUE "LegalCopyright", "Copyright (C) 2001-2008\0"\r
+            VALUE "LegalTrademarks", "\0"\r
+            VALUE "OriginalFilename", "xkeymacs.exe\0"\r
+            VALUE "PrivateBuild", "\0"\r
+            VALUE "ProductName", "XKeymacs Application\0"\r
+            VALUE "ProductVersion", "3, 47, 0, 0\0"\r
+            VALUE "SpecialBuild", "\0"\r
+        END\r
+    END\r
+    BLOCK "VarFileInfo"\r
+    BEGIN\r
+        VALUE "Translation", 0x409, 1200\r
+    END\r
+END\r
+\r
+#endif    // !_MAC\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Cursor\r
+//\r
+\r
+IDC_HAND_CURSOR         CURSOR  DISCARDABLE     "res\\hand.cur"\r
+IDC_DRAG_CURSOR         CURSOR  DISCARDABLE     "res\\drag.cur"\r
+IDC_DISABLE_CURSOR      CURSOR  DISCARDABLE     "res\\disable_.cur"\r
+IDC_DISABLE_WOCQ_CURSOR CURSOR  DISCARDABLE     "res\\disable_wocq.cur"\r
+IDC_DISABLE_TMP_CURSOR  CURSOR  DISCARDABLE     "res\\disable_tmp.cur"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Bitmap\r
+//\r
+\r
+IDB_SORT_ASCENDING      BITMAP  DISCARDABLE     "res\\sort_asc.bmp"\r
+IDB_SORT_DESCENDING     BITMAP  DISCARDABLE     "res\\sort_des.bmp"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// String Table\r
+//\r
+\r
+STRINGTABLE PRELOAD DISCARDABLE \r
+BEGIN\r
+    IDR_MAINFRAME           "xkeymacs\n\nXkeyma\n\n\nXkeymacs.Document\nXkeyma Document"\r
+END\r
+\r
+STRINGTABLE PRELOAD DISCARDABLE \r
+BEGIN\r
+    AFX_IDS_APP_TITLE       "XKeymacs"\r
+    AFX_IDS_IDLEMESSAGE     "Ready"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_INDICATOR_EXT        "EXT"\r
+    ID_INDICATOR_CAPS       "CAP"\r
+    ID_INDICATOR_NUM        "NUM"\r
+    ID_INDICATOR_SCRL       "SCRL"\r
+    ID_INDICATOR_OVR        "OVR"\r
+    ID_INDICATOR_REC        "REC"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_FILE_NEW             "Create a new document\nNew"\r
+    ID_FILE_OPEN            "Open an existing document\nOpen"\r
+    ID_FILE_CLOSE           "Close the active document\nClose"\r
+    ID_FILE_SAVE            "Save the active document\nSave"\r
+    ID_FILE_SAVE_AS         "Save the active document with a new name\nSave As"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_APP_ABOUT            "Display program information, version number and copyright\nAbout"\r
+    ID_APP_EXIT             "Quit the application; prompts to save documents\nExit"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_FILE_MRU_FILE1       "Open this document"\r
+    ID_FILE_MRU_FILE2       "Open this document"\r
+    ID_FILE_MRU_FILE3       "Open this document"\r
+    ID_FILE_MRU_FILE4       "Open this document"\r
+    ID_FILE_MRU_FILE5       "Open this document"\r
+    ID_FILE_MRU_FILE6       "Open this document"\r
+    ID_FILE_MRU_FILE7       "Open this document"\r
+    ID_FILE_MRU_FILE8       "Open this document"\r
+    ID_FILE_MRU_FILE9       "Open this document"\r
+    ID_FILE_MRU_FILE10      "Open this document"\r
+    ID_FILE_MRU_FILE11      "Open this document"\r
+    ID_FILE_MRU_FILE12      "Open this document"\r
+    ID_FILE_MRU_FILE13      "Open this document"\r
+    ID_FILE_MRU_FILE14      "Open this document"\r
+    ID_FILE_MRU_FILE15      "Open this document"\r
+    ID_FILE_MRU_FILE16      "Open this document"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_NEXT_PANE            "Switch to the next window pane\nNext Pane"\r
+    ID_PREV_PANE            "Switch back to the previous window pane\nPrevious Pane"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_WINDOW_SPLIT         "Split the active window into panes\nSplit"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    ID_EDIT_CLEAR           "Erase the selection\nErase"\r
+    ID_EDIT_CLEAR_ALL       "Erase everything\nErase All"\r
+    ID_EDIT_COPY            "Copy the selection and put it on the Clipboard\nCopy"\r
+    ID_EDIT_CUT             "Cut the selection and put it on the Clipboard\nCut"\r
+    ID_EDIT_FIND            "Find the specified text\nFind"\r
+    ID_EDIT_PASTE           "Insert Clipboard contents\nPaste"\r
+    ID_EDIT_REPEAT          "Repeat the last action\nRepeat"\r
+    ID_EDIT_REPLACE         "Replace specific text with different text\nReplace"\r
+    ID_EDIT_SELECT_ALL      "Select the entire document\nSelect All"\r
+    ID_EDIT_UNDO            "Undo the last action\nUndo"\r
+    ID_EDIT_REDO            "Redo the previously undone action\nRedo"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    AFX_IDS_SCSIZE          "Change the window size"\r
+    AFX_IDS_SCMOVE          "Change the window position"\r
+    AFX_IDS_SCMINIMIZE      "Reduce the window to an icon"\r
+    AFX_IDS_SCMAXIMIZE      "Enlarge the window to full size"\r
+    AFX_IDS_SCNEXTWINDOW    "Switch to the next document window"\r
+    AFX_IDS_SCPREVWINDOW    "Switch to the previous document window"\r
+    AFX_IDS_SCCLOSE         "Close the active window and prompts to save the documents"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    AFX_IDS_SCRESTORE       "Restore the window to normal size"\r
+    AFX_IDS_SCTASKLIST      "Activate Task List"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_DEFAULT             "Default"\r
+    IDS_DEFAULT_TITLE       "Default"\r
+    IDS_DIALOG              "Dialog"\r
+    IDS_DIALOG_TITLE        "Dialog"\r
+    IDS_KEYBOARD            "for %s (&L)..."\r
+    IDS_REG_ENTRY_USE_DIALOG_SETTING "Use Dialog Setting"\r
+    IDS_REGISTRY_KEY        "Oishi"\r
+    IDS_REG_SECTION_APPLICATION "ApplicationName"\r
+    IDS_REG_ENTRY_APPLICATION "%02d"\r
+    IDS_REG_ENTRY_NONE      "C-X %c"\r
+    IDS_REG_ENTRY_CONTROL   "C-%c"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_CONTROLX  "C-X C-%c"\r
+    IDS_REG_ENTRY_META      "M-%c"\r
+    IDS_REGSUBKEY_DATA      "Software\\Oishi\\XKeymacs2"\r
+    IDS_REG_ENTRY_APPLICATOIN_TITLE "ApplicationTitle"\r
+    IDS_REGSUBKEY_AUTORUN   "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"\r
+    IDS_APPLICATION_LIST_ITEM "%s (%s)"\r
+    IDS_SEPARATE_CLASS_WINDOW " ("\r
+    IDS_SEPARATE_WINDOWTITLE " - "\r
+    IDS_REG_ENTRY_CONTROL_META_SHIFT "C-M-%c"\r
+    IDS_REG_ENTRY_KILL_RING_MAX "kill-ring-max"\r
+    IDS_REG_ENTRY_CONTROL_SHIFT "C-S-%c"\r
+    IDS_REG_ENTRY_META_SHIFT "M-S-%c"\r
+    IDS_REG_ENTRY_DISABLE_XKEYMACS "Disable XKeymacs"\r
+    IDC_REG_ENTRY_IGNORE_META_CTRL "Ignore undefined Meta Ctrl+?"\r
+    IDC_REG_ENTRY_IGNORE_C_X "Ignore undefined C-x ?"\r
+    IDS_ERR_SAVE_DATA       "XKeymacs can save only %d settings. You have to delete a setting to select an application and check ""Use Default Setting""."\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ERR_WINDOWS_VERSION "XKeymacs does not support the Windows of this version."\r
+    IDS_ERR_IMPORT          "%s\nFile not found.\nPlease verify the correct file name was given."\r
+    IDS_ERR_EXPORT          "Failed to export properties."\r
+    IDC_REG_ENTRY_ENABLE_CUA "Enable CUA"\r
+    IDS_REG_SECTION_ORIGINAL "OriginalCommand"\r
+    IDS_REG_ORIGINAL_PREFIX "zzz-"\r
+    IDS_REG_ENTRY_WINDOW_TEXT "WindowText"\r
+    IDS_REG_ENTRY_WINDOW_TEXT_TYPE "WindowTextType"\r
+    IDS_REG_ENTRY_326_COMPATIBLE "3.26 compatible"\r
+    IDS_PROCESS             "process"\r
+    IDS_PROCESSID           "id process"\r
+    IDS_REGSUBKEY_PERF      "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\%03x"\r
+    IDS_REGSUBKEY_COUNTERS  "Counters"\r
+    IDS_UNKNOWN_TASK        "unknown"\r
+    IDS_IME_FILE_NAME       "IME"\r
+    IDS_ERR_LOST_KEY        "[%s] key will be turned off.\n"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FOR_LOGGED_ON_USER  " for the Logged on User"\r
+    IDS_FOR_ANY_USER        " for Any User"\r
+    IDS_FOR                 " for %s"\r
+    IDS_EXPLORER            "explorer.exe"\r
+    IDS_PROJECT             "winproj.exe"\r
+    IDS_EXCEL               "excel.exe"\r
+    IDS_MSDN                "hh.exe"\r
+    IDS_B2                  "b2.exe"\r
+    IDS_MSIMN               "msimn.exe"\r
+    IDS_UNKNOWN_APPLICATION "Unknown Application"\r
+    IDS_PROGRAM_MANAGER     "Program Manager"\r
+    IDS_EXTENSION_EXECUTABLE ".exe"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_BECKY               "Becky!"\r
+    IDS_OUTLOOK_EXPRESS     "Outlook Express"\r
+    IDS_VISUAL_SOURCESAFE_EXPLORER "Visual SourceSafe Explorer"\r
+    IDS_DISABLE             "&Disable"\r
+    IDS_ENABLE              "&Enable"\r
+    IDS_IMPORT              "Import Properties"\r
+    IDS_EXPORT              "Export Properties"\r
+    IDS_TIP_CX              "C-x- LED"\r
+    IDS_TIP_CTRL            "Ctrl LED"\r
+    IDS_TIP_SHIFT           "Shift LED"\r
+    IDS_TIP_ALT             "Alt LED"\r
+    IDS_TIP_META            "Meta LED"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REGISTRATION_FILTER "Registration Files|*.reg|All Files (*.*)|*.*||"\r
+    IDS_REGSUBKEY_KEYBOARD_LAYOUT "Keyboard Layout"\r
+    IDS_SCANCODE_MAP        "Scancode Map"\r
+    IDS_REGSUBKEY_KEY_REMAP "Software\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\Keyboard\\shellex\\PropertySheetHandlers\\Key Remap"\r
+    IDS_0                   "0"\r
+    IDS_RESTART_OR_NOT      "You must restart your computer before the new settings will take effect.\n\nDo you want to restart your computer now?"\r
+    IDS_RESTART_CAPTION     "System Settings Change"\r
+    IDS_REGSUBKEY_FILE_COMPLETION "Software\\Microsoft\\Command Processor"\r
+    IDS_COMPLETION_CHAR     "CompletionChar"\r
+    IDS_REGSUBKEY_KEYBOARD_LAYOUT_ANY_USER \r
+                            "SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout"\r
+    IDS_WINDOW_TEXT_IGNORE  "Ignore"\r
+    IDS_WINDOW_TEXT_MATCH   "Match"\r
+    IDS_WINDOW_TEXT_MATCH_FORWARD "Forward Match"\r
+    IDS_WINDOW_TEXT_MATCH_BACKWARD "Backward Match"\r
+    IDS_WINDOW_TEXT_MATCH_FULL "Macth Full"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_TIP_MX              "M-x LED"\r
+    IDS_VER_SUB_BLOCK       "\\"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_NONE_FOO  "N-0x%02x (%c)"\r
+    IDS_REG_ENTRY_NONE_SHIFT_FOO "N-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROL_FOO "C-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROL_SHIFT_FOO "C-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_FOO "C-X N-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_SHIFT_FOO "C-X N-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_CONTROL_FOO "C-X C-0x%02x (%c)"\r
+    IDS_REG_ENTRY_CONTROLX_CONTROL_SHIFT_FOO "C-X C-S-0x%02x (%c)"\r
+    IDS_REG_ENTRY_META_FOO  "M-0x%02x (%c)"\r
+    IDS_REG_ENTRY_META_SHIFT_FOO "M-S-0x%02x (%c)"\r
+    IDS_DISABLED            "disabled"\r
+    IDS_REG_ENTRY_CTRL      "ctrl_icon"\r
+    IDS_REG_ENTRY_CX        "cx_icon"\r
+    IDS_REG_ENTRY_MAIN      "main_icon"\r
+    IDS_REG_ENTRY_SHIFT     "shift_icon"\r
+    IDS_REG_ENTRY_ALT       "alt_icon"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FILES               "Files"\r
+    IDS_SEARCH              "Search"\r
+    IDS_WINDOW              "Leaving Active Window"\r
+    IDS_RECOVERY            "Error Recovery"\r
+    IDS_MOTION              "Motion"\r
+    IDS_IME                 "Toggle Input Method Editor"\r
+    IDS_KILL                "Killing and Deleting"\r
+    IDS_OTHER               "Other"\r
+    IDS_ORIGINAL            "Original Command"\r
+    IDS_CATEGORY            "Category"\r
+    IDS_COMMAND             "Command"\r
+    IDS_KEY                 "Key"\r
+    IDS_MODIFIER            "One Shot Modifier"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_ICON_META "meta_icon"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_SET_MARK_COMMAND_D  "Set mark at where point is, or jump to mark."\r
+    IDS_BEGINNING_OF_LINE_D "Move point to beginning of current line."\r
+    IDS_BACKWARD_CHAR_D     "Move point left N characters (right if N is negative)."\r
+    IDS_DELETE_CHAR_D       "Delete the following N characters (previous if N is negative)."\r
+    IDS_END_OF_LINE_D       "Move point to end of current line."\r
+    IDS_FORWARD_CHAR_D      "Move point right N characters (left if N is negative)."\r
+    IDS_KEYBOARD_QUIT_D     "Cancel the inputting command."\r
+    IDS_HELP_COMMAND_D      "Prefix command (definition is a keymap associating keystrokes with commands)."\r
+    IDS_KILL_LINE_D         "Kill the rest of the current line; if no nonblanks there, kill thru newline."\r
+    IDS_RECENTER_D          "Center point in window and redisplay frame."\r
+    IDS_NEWLINE_D           "Insert a newline, and move to left margin of the new line if it's blank."\r
+    IDS_NEXT_LINE_D         "Move cursor vertically down ARG lines."\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_OPEN_LINE_D         "Insert a newline and leave point before it."\r
+    IDS_PREVIOUS_LINE_D     "Move cursor vertically up ARG lines."\r
+    IDS_QUOTED_INSERT_D     "Read next input character and insert it."\r
+    IDS_ISEARCH_BACKWARD_D  "Do incremental search backward."\r
+    IDS_ISEARCH_FORWARD_D   "Do incremental search forward."\r
+    IDS_TRANSPOSE_CHARS_D   "Interchange characters around point, moving forward one character."\r
+    IDS_UNIVERSAL_ARGUMENT_D \r
+                            "Begin a numeric argument for the following command."\r
+    IDS_SCROLL_UP_D         "Scroll text of current window upward ARG lines; or near full screen if no ARG."\r
+    IDS_KILL_REGION_D       "Kill between point and mark."\r
+    IDS_CONTROL_X_PREFIX_D  "foo"\r
+    IDS_YANK_D              "Reinsert the last stretch of killed text."\r
+    IDS_ICONIFY_OR_DEICONIFY_FRAME_D "Minimize the selected window."\r
+    IDS_QUAIL_MODE_D        "foo"\r
+    IDS_UNDO_D              "Undo some previous changes."\r
+    IDS_TOGGLE_WIN32IME_MODE_D \r
+                            "Turn on or off a multilingual text input method for the current buffer."\r
+    IDS_BACKWARD_WORD_D     "Move backward until encountering the end of a word."\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FORWARD_WORD_D      "Move point forward ARG words (backward if ARG is negative)."\r
+    IDS_DIGIT_ARGUMENT_D    "Part of the numeric argument for the next command."\r
+    IDS_NEGATIVE_ARGUMENT_D "Begin a negative numeric argument for the next command."\r
+    IDS_SAVE_BUFFERS_KILL_EMACS_D "Exit the application."\r
+    IDS_FIND_FILE_D         "Open a file."\r
+    IDS_MARK_PAGE_D         "Put mark at end of page, point at beginning."\r
+    IDS_SAVE_BUFFER_D       "Save current file if modified."\r
+    IDS_WRITE_FILE_D        "Save current buffer into file FILENAME."\r
+    IDS_SHELL_COMMAND_D     "Execute string COMMAND in inferior shell; display output, if any."\r
+    IDS_BEGINNING_OF_BUFFER_D \r
+                            "Move point to the beginning of the buffer; leave mark at previous position."\r
+    IDS_END_OF_BUFFER_D     "Move point to the end of the buffer; leave mark at previous position."\r
+    IDS_SCROLL_DOWN_D       "Scroll text of current window down ARG lines; or near full screen if no ARG."\r
+    IDS_KILL_RING_SAVE_D    "Save the region as if killed, but don't kill it."\r
+    IDS_BACKWARD_DELETE_CHAR_D \r
+                            "Delete the previous N characters (following if N is negative)."\r
+    IDS_TAB_D               "Insert spaces or tabs to next defined tab-stop column."\r
+    IDS_META_PREFIX_D       "Prefix for typing Meta."\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_META_D              "Meta"\r
+    IDS_DIGIT_ARGUMENT0_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT1_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT2_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT3_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT4_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT5_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT6_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT7_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT8_D   "Part of the numeric argument for the next command."\r
+    IDS_DIGIT_ARGUMENT9_D   "Part of the numeric argument for the next command."\r
+    IDS_META_PREFIX_AND_ORIGINAL_D \r
+                            "Assigned key works as not only original key but also prefix for typing Meta."\r
+    IDS_KILL_BUFFER_D       "Close the current file."\r
+    IDS_KILL_WORD_D         "Kill characters forward until encountering the end of a word."\r
+    IDS_MARK_WHOLE_BUFFER_D "Put point at beginning and mark at end of buffer."\r
+    IDS_DELETE_BACKWARD_CHAR_D \r
+                            "Delete the previous N characters (following if N is negative)."\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_QUERY_REPLACE_D     "Replace some occurrences of FROM-STRING with TO-STRING."\r
+    IDS_QUERY_REPLACE_REGEXP_D \r
+                            "Replace some things after point matching REGEXP with TO-STRING."\r
+    IDS_YANK_POP_D          "Replace just-yanked stretch of killed text with a different stretch."\r
+    IDS_CLOSE_INPUT_METHOD_D "Close input method"\r
+    IDS_ENABLE_OR_DISABLE_XKEYMACS_D "Enable or disable XKeymacs"\r
+    IDS_ENTER_D             "Enter"\r
+    IDS_IGNORE_D            "Ignore"\r
+    IDS_OPEN_INPUT_METHOD_D "Open Input Method"\r
+    IDS_SELECT_ALL_D        "Select All"\r
+    IDS_CALL_LAST_KBD_MACRO_D \r
+                            "Call the last keyboard macro that you defined with C-x (."\r
+    IDS_END_KBD_MACRO_D     "Finish defining a keyboard macro."\r
+    IDS_START_KBD_MACRO_D   "Record subsequent keyboard input, defining a keyboard macro."\r
+    IDS_SWITCH_BETWEEN_INPUT_LOCALES_D "Switch Between Input Locales."\r
+    IDS_SWITCH_TO_BUFFER_D  "Display next tabbed page or child window (MDI)."\r
+    IDS_CONTROL_D           "C-"\r
+    IDS_CONTROL_PREFIX_D    "C-"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ESCAPE_D            "Esc"\r
+    IDS_TILDE_D             "~"\r
+    IDS_BACK_QUOTE_D        "`"\r
+    IDS_RESTORE_D           "Restore the window."\r
+    IDS_MOVE_D              "Move the window."\r
+    IDS_SIZE_D              "Change the size the window."\r
+    IDS_MINIMIZE_D          "Minimize the window."\r
+    IDS_MAXIMIZE_D          "Maximize the window."\r
+    IDS_MAXIMIZE_VERTICALLY_D "Maximize the window vertically."\r
+    IDS_MAXIMIZE_HORIZONTALLY_D "Maximize the window horizontally."\r
+    IDS_PASS_THROUGH_D      "If the key assigned this command is depressed, XKeymacs does nothing for any input."\r
+    IDS_REDO_D              "Redo"\r
+    IDS_TEMPORARILY_DISABLE_XKEYMACS_D \r
+                            "XKeymacs does nothing for the next command."\r
+    IDS_COPY_D              "Copy"\r
+    IDS_PASTE_D             "Paste"\r
+    IDS_CUT_D               "Cut"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ESC                 "Esc"\r
+    IDS_1                   "1"\r
+    IDS_2                   "2"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_3                   "3"\r
+    IDS_4                   "4"\r
+    IDS_5                   "5"\r
+    IDS_6                   "6"\r
+    IDS_7                   "7"\r
+    IDS_8                   "8"\r
+    IDS_9                   "9"\r
+    IDS_0_                  "0"\r
+    IDS_MINUS               "-"\r
+    IDS_EQUAL               "="\r
+    IDS_BACKSPACE           "Backspace"\r
+    IDS_TAB                 "Tab"\r
+    IDS_Q                   "Q"\r
+    IDS_W                   "W"\r
+    IDS_E                   "E"\r
+    IDS_R                   "R"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_T                   "T"\r
+    IDS_Y                   "Y"\r
+    IDS_U                   "U"\r
+    IDS_I                   "I"\r
+    IDS_O                   "O"\r
+    IDS_P                   "P"\r
+    IDS_SQUARE_BRA          "["\r
+    IDS_SQUARE_CKET         "]"\r
+    IDS_ENTER               "Enter"\r
+    IDS_NUMPADENTER         "Numeric Enter"\r
+    IDS_LEFT_CTRL           "Ctrl"\r
+    IDS_RIGHT_CTRL          "Right Ctrl"\r
+    IDS_PAUSE               "Pause"\r
+    IDS_A                   "A"\r
+    IDS_S                   "S"\r
+    IDS_D                   "D"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_F                   "F"\r
+    IDS_G                   "G"\r
+    IDS_H                   "H"\r
+    IDS_J                   "J"\r
+    IDS_K                   "K"\r
+    IDS_L                   "L"\r
+    IDS_SEMICOLON           ";"\r
+    IDS_QUOTE               "'"\r
+    IDS_BACK_QUOTE          "`"\r
+    IDS_LEFT_SHIFT          "Shift"\r
+    IDS_BACKSLASH           "\\"\r
+    IDS_Z                   "Z"\r
+    IDS_X                   "X"\r
+    IDS_C                   "C"\r
+    IDS_V                   "V"\r
+    IDS_B                   "B"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_N                   "N"\r
+    IDS_M                   "M"\r
+    IDS_COMMA               ","\r
+    IDS_PERIOD              "."\r
+    IDS_SLASH               "/"\r
+    IDS_DIVIDE              "Numeric /"\r
+    IDS_RIGHT_SHIFT         "Right Shift"\r
+    IDS_MULTIPLY            "Numeric *"\r
+    IDS_PRINT_SCREEN        "Print\nScreen"\r
+    IDS_LEFT_ALT            "Alt"\r
+    IDS_RIGHT_ALT           "Right Alt"\r
+    IDS_SPACE               "Space"\r
+    IDS_CAPS_LOCK           "Caps Lock"\r
+    IDS_F1                  "F1"\r
+    IDS_F2                  "F2"\r
+    IDS_F3                  "F3"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_F4                  "F4"\r
+    IDS_F5                  "F5"\r
+    IDS_F6                  "F6"\r
+    IDS_F7                  "F7"\r
+    IDS_F8                  "F8"\r
+    IDS_F9                  "F9"\r
+    IDS_F10                 "F10"\r
+    IDS_NUM_LOCK            "Num\nLock"\r
+    IDS_SCROLL_LOCK         "Scroll\nLock"\r
+    IDS_NUMPAD7             "Numeric 7"\r
+    IDS_HOME                "Home"\r
+    IDS_NUMPAD8             "Numeric 8"\r
+    IDS_UP                  "Up Arrow"\r
+    IDS_NUMPAD9             "Numeric 9"\r
+    IDS_PAGE_UP             "Page\nUp"\r
+    IDS_SUBTRACT            "Numeric -"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_NUMPAD4             "Numeric 4"\r
+    IDS_LEFT                "Left Arrow"\r
+    IDS_NUMPAD5             "Numeric 5"\r
+    IDS_NUMPAD6             "Numeric 6"\r
+    IDS_RIGHT               "Right Arrow"\r
+    IDS_ADD                 "Numeric +"\r
+    IDS_NUMPAD1             "Numeric 1"\r
+    IDS_END                 "End"\r
+    IDS_NUMPAD2             "Numeric 2"\r
+    IDS_DOWN                "Down Arrow"\r
+    IDS_NUMPAD3             "Numeric 3"\r
+    IDS_PAGE_DOWN           "Page\nDown"\r
+    IDS_NUMPAD0             "Numeric 0"\r
+    IDS_INSERT              "Insert"\r
+    IDS_NUMPADDELETE        "Numeric Delete"\r
+    IDS_DELETE              "Delete"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_F11                 "F11"\r
+    IDS_F12                 "F12"\r
+    IDS_LEFT_WINDOWS        "Windows"\r
+    IDS_RIGHT_WINDOWS       "Right Windows"\r
+    IDS_APPLICATION         "Application"\r
+    IDS_KANA                "Kana"\r
+    IDS_BACKSLASH2          "\\"\r
+    IDS_CONVERT             "Convert"\r
+    IDS_NONCONVERT          "Nonconvert"\r
+    IDS_BACKSLASH1          "(\\)"\r
+    IDS_CARET               "^"\r
+    IDS_AT_MARK             "@"\r
+    IDS_COLON               ":"\r
+    IDS_HANKAKU             "Hankaku/Zenkaku"\r
+    IDS_ACPI_POWER          "Power off"\r
+    IDS_ACPI_SLEEP          "Sleep"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_ACPI_WAKE           "Wake up"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_NEW_D               "New"\r
+    IDS_PRINT_D             "Print..."\r
+    IDS_FIND_D              "Find..."\r
+    IDS_FIND_NEXT_D         "Find Next"\r
+    IDS_TRANSPOSE_LINES_D   "Exchange current line and previous line, leaving point after both."\r
+    IDS_KILL_LINE_FOR_ALL_FORMAT_D \r
+                            "Kill the rest of the current line; if no nonblanks there, kill thru newline."\r
+    IDS_BACKWARD_KILL_WORD_D \r
+                            "Kill characters backward until encountering the end of a word."\r
+    IDS_ENABLE_XKEYMACS_D   "Enable XKeymacs"\r
+    IDS_DISABLE_XKEYMACS_D  "Disable XKeymacs"\r
+    IDS_CAPS_LOCK_D         "Caps Lock"\r
+    IDS_COMPLETE_CLOSE_INPUT_METHOD_D \r
+                            "Set the composition string as the result string and close input method."\r
+    IDS_COMPLETE_TOGGLE_INPUT_METHOD_D \r
+                            "Set the composition string as the result string and turn on or off a multilingual text input method for the current buffer."\r
+    IDS_UNDERSCORE_D        "_"\r
+    IDS_ROLL_UP_UNROLL_D    "Shows only the title bar of the window, as if it has been ""rolled up""."\r
+    IDS_RETOP_D             "Top point in window and redisplay frame."\r
+    IDS_OSMODIFIER_SHIFT_D  "One Shot Modifier Shift"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_CONTROL_X_PREFIX_T  " "\r
+    IDS_CONTROL_T           " "\r
+    IDS_CONTROL_PREFIX_T    " "\r
+    IDS_CLOSE_INPUT_METHOD_T " "\r
+    IDS_COPY_T              " "\r
+    IDS_CUT_T               " "\r
+    IDS_ENABLE_OR_DISABLE_XKEYMACS_T "Enable/Disable XKeymacs"\r
+    IDS_NEWLINE_T           "newline"\r
+    IDS_ESCAPE_T            " "\r
+    IDS_FIND_T              " "\r
+    IDS_FIND_NEXT_T         " "\r
+    IDS_IGNORE_T            " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_KILL_LINE_FOR_ALL_FORMAT_T " "\r
+    IDS_MAXIMIZE_T          " "\r
+    IDS_MAXIMIZE_HORIZONTALLY_T " "\r
+    IDS_MAXIMIZE_VERTICALLY_T " "\r
+    IDS_META_PREFIX_T       "Meta"\r
+    IDS_META_T              "Meta"\r
+    IDS_META_PREFIX_AND_ORIGINAL_T "Meta"\r
+    IDS_MINIMIZE_T          " "\r
+    IDS_MOVE_T              " "\r
+    IDS_NEW_T               " "\r
+    IDS_OPEN_INPUT_METHOD_T " "\r
+    IDS_PASS_THROUGH_T      " "\r
+    IDS_PASTE_T             " "\r
+    IDS_PRINT_T             " "\r
+    IDS_REDO_T              " "\r
+    IDS_RESTORE_T           " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_SELECT_ALL_T        " "\r
+    IDS_SIZE_T              " "\r
+    IDS_SWITCH_BETWEEN_INPUT_LOCALES_T " "\r
+    IDS_TEMPORARILY_DISABLE_XKEYMACS_T " "\r
+    IDS_TILDE_T             " "\r
+    IDS_BACK_QUOTE_T        " "\r
+    IDS_BACKWARD_CHAR_T     "backward-char"\r
+    IDS_BACKWARD_WORD_T     "backward-word"\r
+    IDS_BEGINNING_OF_BUFFER_T "beginning-of-buffer"\r
+    IDS_BEGINNING_OF_LINE_T "beginning-of-line"\r
+    IDS_CALL_LAST_KBD_MACRO_T "call-last-kbd-macro"\r
+    IDS_DELETE_BACKWARD_CHAR_T "delete-backward-char"\r
+    IDS_DELETE_CHAR_T       "delete-char"\r
+    IDS_END_KBD_MACRO_T     "end-kbd-macro"\r
+    IDS_END_OF_BUFFER_T     "end-of-buffer"\r
+    IDS_END_OF_LINE_T       "end-of-line"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FIND_FILE_T         "find-file"\r
+    IDS_FORWARD_CHAR_T      "forward-char"\r
+    IDS_FORWARD_WORD_T      "forward-word"\r
+    IDS_ICONIFY_OR_DEICONIFY_FRAME_T "iconify-or-deiconify-frame"\r
+    IDS_ISEARCH_BACKWARD_T  "isearch-backward"\r
+    IDS_ISEARCH_FORWARD_T   "isearch-forward"\r
+    IDS_KEYBOARD_QUIT_T     "keyboard-quit"\r
+    IDS_KILL_BUFFER_T       "kill-buffer"\r
+    IDS_KILL_LINE_T         "kill-line"\r
+    IDS_KILL_REGION_T       "kill-region"\r
+    IDS_KILL_RING_SAVE_T    "kill-ring-save"\r
+    IDS_KILL_WORD_T         "kill-word"\r
+    IDS_MARK_PAGE_T         "mark-page"\r
+    IDS_MARK_WHOLE_BUFFER_T "mark-whole-buffer"\r
+    IDS_NEXT_LINE_T         "next-line"\r
+    IDS_DIGIT_ARGUMENT0_T   " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_DIGIT_ARGUMENT1_T   " "\r
+    IDS_DIGIT_ARGUMENT2_T   " "\r
+    IDS_DIGIT_ARGUMENT3_T   " "\r
+    IDS_DIGIT_ARGUMENT4_T   " "\r
+    IDS_DIGIT_ARGUMENT5_T   " "\r
+    IDS_DIGIT_ARGUMENT6_T   " "\r
+    IDS_DIGIT_ARGUMENT7_T   " "\r
+    IDS_DIGIT_ARGUMENT8_T   " "\r
+    IDS_DIGIT_ARGUMENT9_T   " "\r
+    IDS_NEGATIVE_ARGUMENT_T "digit-argument"\r
+    IDS_OPEN_LINE_T         "open-line"\r
+    IDS_PREVIOUS_LINE_T     "previous-line"\r
+    IDS_QUERY_REPLACE_T     "query-replace"\r
+    IDS_QUERY_REPLACE_REGEXP_T "query-replace-regexp"\r
+    IDS_RECENTER_T          "recenter"\r
+    IDS_SAVE_BUFFER_T       "save-buffer"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_SAVE_BUFFERS_KILL_EMACS_T "save-buffers-kill-emacs"\r
+    IDS_SCROLL_DOWN_T       "scroll-down"\r
+    IDS_SCROLL_UP_T         "scroll-up"\r
+    IDS_SET_MARK_COMMAND_T  "set-mark-command"\r
+    IDS_SHELL_COMMAND_T     "shell-command"\r
+    IDS_START_KBD_MACRO_T   "start-kbd-macro"\r
+    IDS_SWITCH_TO_BUFFER_T  "switch-to-buffer"\r
+    IDS_TAB_T               "tab-to-tab-stop"\r
+    IDS_TOGGLE_WIN32IME_MODE_T "toggle-input-method"\r
+    IDS_TRANSPOSE_CHARS_T   "transpose-chars"\r
+    IDS_TRANSPOSE_LINES_T   "transpose-lines"\r
+    IDS_UNDO_T              "undo"\r
+    IDS_UNIVERSAL_ARGUMENT_T "universal-argument"\r
+    IDS_WRITE_FILE_T        "write-file"\r
+    IDS_YANK_T              "yank"\r
+    IDS_YANK_POP_T          "yank-pop"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_BACKWARD_KILL_WORD_T "backward-kill-word"\r
+    IDS_ENABLE_XKEYMACS_T   "Enable XKeymacs"\r
+    IDS_DISABLE_XKEYMACS_T  "Disable XKeymacs"\r
+    IDS_CAPS_LOCK_T         "Caps Lock"\r
+    IDS_COMPLETE_CLOSE_INPUT_METHOD_T " "\r
+    IDS_COMPLETE_TOGGLE_INPUT_METHOD_T " "\r
+    IDS_UNDERSCORE_T        " "\r
+    IDS_ROLL_UP_UNROLL_T    "Roll-up/Unroll"\r
+    IDS_RETOP_T             "Retop"\r
+    IDS_OSMODIFIER_SHIFT_T  "One Shot Modifier Shift"\r
+    IDS_OSMODIFIER_SHIFT_REPEAT_T "One Shot Modifier Shift with Repeat"\r
+    IDS_OSMODIFIER_CTRL_T   "One Shot Modifier Ctrl"\r
+    IDS_OSMODIFIER_CTRL_REPEAT_T "One Shot Modifier Ctrl with Repeat"\r
+    IDS_OSMODIFIER_ALT_T    "One Shot Modifier Alt"\r
+    IDS_OSMODIFIER_ALT_REPEAT_T "One Shot Modifier Alt with Repeat"\r
+    IDS_CYCLE_ITEMS_T       " "\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_FSET                "(fset "\r
+    IDS_README              "Readme"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_OSMODIFIER_SHIFT_REPEAT_D "One Shot Modifier Shift with Repeat"\r
+    IDS_OSMODIFIER_CTRL_D   "One Shot Modifier Ctrl"\r
+    IDS_OSMODIFIER_CTRL_REPEAT_D "One Shot Modifier Ctrl with Repeat"\r
+    IDS_OSMODIFIER_ALT_D    "One Shot Modifier Alt"\r
+    IDS_OSMODIFIER_ALT_REPEAT_D "One Shot Modifier Alt with Repeat"\r
+    IDS_CYCLE_ITEMS_D       "Cycle through items in the order they were opened."\r
+    IDS_CYCLE_ITEMS_INVERSELY_D \r
+                            "Cycle through items in the inverse order they were opened."\r
+    IDS_TRANSPOSE_WORDS_D   "Interchange words around point, leaving point after both words."\r
+    IDS_FILL_PARAGRAPH_D    "Fill current paragraph"\r
+    IDS_DOWNCASE_WORD_D     "Convert following word to lower case."\r
+    IDS_UPCASE_WORD_D       "Convert following word to upper case."\r
+    IDS_CAPITALIZE_WORD_D   "Capitalize the following word."\r
+    IDS_EXECUTE_EXTENDED_COMMAND_D \r
+                            "Read the name of another command and invoke it."\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_CYCLE_ITEMS_INVERSELY_T " "\r
+    IDS_TRANSPOSE_WORDS_T   "transpose-words"\r
+    IDS_FILL_PARAGRAPH_T    "fill-paragraph"\r
+    IDS_DOWNCASE_WORD_T     "downcase-word"\r
+    IDS_UPCASE_WORD_T       "upcase-word"\r
+    IDS_CAPITALIZE_WORD_T   "capitalize-word"\r
+    IDS_EXECUTE_EXTENDED_COMMAND_T "execute-extended-command"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+    IDS_REG_ENTRY_ACCELERATE "accelerate"\r
+    IDS_REGSUBKEY_KEYBOARD  "Control Panel\\Keyboard"\r
+    IDS_KEYBOARD_SPEED      "KeyboardSpeed"\r
+    IDS_REG_ENTRY_CHANGE_CURSOR "change_cursor"\r
+    IDS_REG_ENTRY_AT_IBEAM_CURSOR_ONLY "at ibeam cursor only"\r
+    IDS_REG_ENTRY_MX        "mx_icon"\r
+END\r
+\r
+#endif    // \89p\8cê (±Òض) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+#define _AFX_NO_SPLITTER_RESOURCES\r
+#define _AFX_NO_OLE_RESOURCES\r
+#define _AFX_NO_TRACKER_RESOURCES\r
+#define _AFX_NO_PROPERTY_RESOURCES\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE 9, 1\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+#include "res\xkeymacs.rc2"  // non-Microsoft Visual C++ edited resources\r
+#include "afxres.rc"         // Standard components\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif    // not APSTUDIO_INVOKED\r
+\r
diff --git a/xkeymacsdll/ClipboardFormatSnap.cpp b/xkeymacsdll/ClipboardFormatSnap.cpp
new file mode 100644 (file)
index 0000000..b3b71ba
--- /dev/null
@@ -0,0 +1,695 @@
+// ClipboardFormatSnap.cpp: CClipboardFormatSnap \83N\83\89\83X\82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "stdafx.h"\r
+#include "ClipboardFormatSnap.h"\r
+#include "Utils.h"\r
+\r
+#ifdef _DEBUG\r
+#undef THIS_FILE\r
+static char THIS_FILE[]=__FILE__;\r
+#define new DEBUG_NEW\r
+#endif\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \8d\\92z/\8fÁ\96Å\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CClipboardFormatSnap::CClipboardFormatSnap() :\r
+m_nFormat( 0 ), m_oData()\r
+{\r
+}\r
+\r
+CClipboardFormatSnap::~CClipboardFormatSnap()\r
+{\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \83R\83s\81[\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CClipboardFormatSnap::CClipboardFormatSnap( const CClipboardFormatSnap& rhs ) :\r
+m_nFormat( 0 ), m_oData()\r
+{\r
+       m_nFormat = rhs.m_nFormat;\r
+\r
+       int nLen = rhs.m_oData.GetSize();\r
+       m_oData.RemoveAll();\r
+       m_oData.SetSize( nLen );\r
+\r
+       for( int i = 0; i < nLen; i++ )\r
+       {\r
+               m_oData[ i ] = rhs.m_oData[ i ];\r
+       }\r
+}\r
+\r
+const BOOL CClipboardFormatSnap::operator==( const CClipboardFormatSnap& rhs )\r
+{\r
+       if( m_nFormat != rhs.m_nFormat ) return FALSE;\r
+\r
+       if( m_oData.GetSize() != rhs.m_oData.GetSize() ) return FALSE;\r
+\r
+       for( int i = 0; i < m_oData.GetSize(); ++i )\r
+       {\r
+               if( m_oData[ i ] != rhs.m_oData[ i ] ) return FALSE;\r
+       }\r
+\r
+       return TRUE;\r
+}\r
+\r
+const BOOL CClipboardFormatSnap::operator!=( const CClipboardFormatSnap& rhs )\r
+{\r
+       return !( *this == rhs );\r
+}\r
+\r
+const CClipboardFormatSnap& CClipboardFormatSnap::operator=( const CClipboardFormatSnap& rhs )\r
+{\r
+       m_nFormat = rhs.m_nFormat;\r
+\r
+       int nLen = rhs.m_oData.GetSize();\r
+       m_oData.RemoveAll();\r
+       m_oData.SetSize( nLen );\r
+\r
+       for( int i = 0; i < nLen; i++ )\r
+       {\r
+               m_oData[ i ] = rhs.m_oData[ i ];\r
+       }\r
+\r
+       return *this;\r
+}\r
+\r
+void CClipboardFormatSnap::MergeText( const CClipboardFormatSnap &rhs, const int nSizeOfNullTerminator )\r
+{\r
+       const int nOriginalTextLength = GetTextLength( nSizeOfNullTerminator );\r
+       if( 0 < nOriginalTextLength )\r
+       {\r
+               m_oData.SetSize( nOriginalTextLength + rhs.m_oData.GetSize() );\r
+               for( int i = 0; i < rhs.m_oData.GetSize(); ++i )\r
+               {\r
+                       m_oData[ nOriginalTextLength + i ] = rhs.m_oData[ i ];\r
+               }\r
+       }\r
+       else\r
+       {\r
+               *this = rhs;\r
+       }\r
+}\r
+\r
+void CClipboardFormatSnap::MergeRTF( const CClipboardFormatSnap& rhs )\r
+{\r
+       const int nOriginalHead = GetRTFBodyHead();\r
+       const int nOriginalLength = GetRTFBodyLength();\r
+       const int nRHSHead = rhs.GetRTFBodyHead();\r
+       const int nRHSLength = rhs.GetRTFBodyLength();\r
+\r
+       if( nRHSLength )\r
+       {\r
+               m_oData.SetSize( m_oData.GetSize() + nRHSLength );\r
+               for( int i = m_oData.GetSize() - 1; nOriginalHead + nOriginalLength <= i ; --i )\r
+               {\r
+                       m_oData[ i ] = m_oData[ i - nRHSLength ];\r
+               }\r
+               for( int j = 0; j < nRHSLength; ++j )\r
+               {\r
+                       m_oData[ nOriginalHead + nOriginalLength + j ] = rhs.m_oData[ nRHSHead + j ];\r
+               }\r
+       }\r
+}\r
+\r
+const CClipboardFormatSnap& CClipboardFormatSnap::operator+( const CClipboardFormatSnap& rhs )\r
+{\r
+       if( !rhs.m_oData.GetSize() ) return *this;\r
+\r
+       ASSERT( m_nFormat == rhs.m_nFormat );\r
+       m_nFormat = rhs.m_nFormat;\r
+\r
+       switch( m_nFormat )\r
+       {\r
+       case CF_TEXT:\r
+       case CF_OEMTEXT:\r
+               MergeText( rhs, 1 );\r
+               break;\r
+       case CF_UNICODETEXT:\r
+               MergeText( rhs, 2 );\r
+               break;\r
+       case CF_LOCALE:\r
+               *this = rhs;\r
+               break;\r
+       case 49310:     // Rich Text Format\r
+               MergeRTF( rhs );\r
+               break;\r
+       default:\r
+               ASSERT( 0 );\r
+               *this = rhs;\r
+               break;\r
+       }\r
+\r
+       return *this;\r
+}\r
+\r
+/*\r
+const CClipboardFormatSnap& CClipboardFormatSnap::Merge( CClipboardFormatSnap& lhs, CClipboardFormatSnap& rhs )\r
+{\r
+       ASSERT( m_nFormat == rhs.m_nFormat );\r
+       m_nFormat = lhs.m_nFormat;\r
+       m_oData.RemoveAll();\r
+\r
+       switch( m_nFormat )\r
+       {\r
+       case CF_TEXT:\r
+       case CF_OEMTEXT:\r
+               {\r
+                       const int nSizeOfNullTerminator = 1;\r
+                       if( lhs.m_oData.GetSize() && rhs.m_oData.GetSize() )\r
+                       {\r
+                               m_oData.SetSize( lhs.m_oData.GetSize() - nSizeOfNullTerminator + rhs.m_oData.GetSize() );\r
+\r
+                               int nLHS = 0;\r
+                               for( nLHS = 0; nLHS < lhs.m_oData.GetSize() - nSizeOfNullTerminator; ++nLHS )\r
+                               {\r
+                                       m_oData[ nLHS ] = lhs.m_oData[ nLHS ];\r
+                               }\r
+                               for( int nRHS = 0; nRHS < rhs.m_oData.GetSize(); ++nRHS )\r
+                               {\r
+                                       m_oData[ nLHS + nRHS ] = rhs.m_oData[ nRHS ];\r
+                               }\r
+                       }\r
+                       else if( lhs.m_oData.GetSize() )\r
+                       {\r
+                               *this = lhs;\r
+                       }\r
+                       else if( rhs.m_oData.GetSize() )\r
+                       {\r
+                               *this = rhs;\r
+                       }\r
+                       else\r
+                       {\r
+                               ASSERT( 0 );\r
+                       }\r
+               }\r
+               break;\r
+       case CF_UNICODETEXT:\r
+               {\r
+                       const int nSizeOfNullTerminator = 2;\r
+                       if( lhs.m_oData.GetSize() && rhs.m_oData.GetSize() )\r
+                       {\r
+                               m_oData.SetSize( lhs.m_oData.GetSize() - nSizeOfNullTerminator + rhs.m_oData.GetSize() );\r
+\r
+                               int nLHS = 0;\r
+                               for( nLHS = 0; nLHS < lhs.m_oData.GetSize() - nSizeOfNullTerminator; ++nLHS )\r
+                               {\r
+                                       m_oData[ nLHS ] = lhs.m_oData[ nLHS ];\r
+                               }\r
+                               for( int nRHS = 0; nRHS < rhs.m_oData.GetSize(); ++nRHS )\r
+                               {\r
+                                       m_oData[ nLHS + nRHS ] = rhs.m_oData[ nRHS ];\r
+                               }\r
+                       }\r
+                       else if( lhs.m_oData.GetSize() )\r
+                       {\r
+                               *this = lhs;\r
+                       }\r
+                       else if( rhs.m_oData.GetSize() )\r
+                       {\r
+                               *this = rhs;\r
+                       }\r
+                       else\r
+                       {\r
+                               ASSERT( 0 );\r
+                       }\r
+               }\r
+               break;\r
+       case CF_LOCALE:\r
+               *this = lhs;\r
+               break;\r
+       default:\r
+               ASSERT( 0 );\r
+               *this = lhs;\r
+               break;\r
+       }\r
+\r
+       return *this;\r
+}\r
+*/\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \91\80\8dì\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+BOOL CClipboardFormatSnap::Capture( int nFormat )\r
+{\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 0");\r
+       m_nFormat = nFormat;\r
+\r
+       //\r
+       // (0) DataObject\82Í\8eæ\82è\8f\9c\82­(4byte\82Ì\83|\83C\83\93\83^\82µ\82©\93¾\82ç\82ê\82È\82¢\82½\82ß)\r
+       //\r
+       if( GetFormatName( nFormat ) == _T("DataObject") ) return FALSE;\r
+\r
+       //\r
+       // (0.5) Excel \8fã\82Å CF_METAFILEPICT/CF_ENHMETAFILE \82É GetClipboardData \82·\82é\82Æ "\90}\82ª\91å\82«\82·\82¬\82Ü\82·\81B" \82Æ\82¢\82¤\83G\83\89\81[\82ª\95\\8e¦\82³\82ê\82é\81B\r
+       //\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 0.5");\r
+       if( CUtils::IsExcel() && ( nFormat == CF_METAFILEPICT || nFormat == CF_ENHMETAFILE ) ) return FALSE;\r
+\r
+       //\r
+       // (1) Clipboard\93à\82Ì\83\81\83\82\83\8a\83u\83\8d\83b\83N\8eæ\93¾\r
+       //\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 1");\r
+       HANDLE hData    = GetClipboardData( nFormat ); if( hData == NULL ) return FALSE;\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 1.1");\r
+       void *pData     = GlobalLock( hData );         if( pData == NULL ) return FALSE;\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 1.2");\r
+       size_t nLenData = GlobalSize( hData );         if( nLenData == 0 ) return FALSE;\r
+\r
+       //\r
+       // (2) \83\8d\81[\83J\83\8b\83I\83u\83W\83F\83N\83g\82Ö\83f\81[\83^\83R\83s\81[\r
+       //\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 2");\r
+       m_oData.RemoveAll();\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 2.1");\r
+       m_oData.SetSize( nLenData );\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 2.2");\r
+       CopyMemory( &m_oData[ 0 ], pData, nLenData );\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 2.3");\r
+       GlobalUnlock( hData );\r
+\r
+       // for debug\r
+//     CUtils::Log( "nFormat: %d (%s)", nFormat, GetFormatName( nFormat ) );\r
+///    if( nFormat == CF_OEMTEXT )\r
+//     if( nFormat == 49310 )  // Rich Text Format\r
+///    if( nFormat == 49360 )  // HTML Format\r
+///    if( nFormat == 49669 )  // Notes Editor Internal\r
+///    if( nFormat == 49742 )  // HPB HTML Format\r
+//     {\r
+///            for( int i = 0; i < m_oData.GetSize(); ++i )\r
+///            {\r
+///                    CUtils::Log( "%02x (%c)", m_oData[i], m_oData[ i ] );\r
+///            }\r
+///\r
+///            CUtils::Log( "size = %d", m_oData.GetSize() );\r
+//             char *sz = new char[ m_oData.GetSize() + 1 ];\r
+//             memset( sz, 0, m_oData.GetSize() + 1 );\r
+//             for( int i = 0; i < m_oData.GetSize(); ++i )\r
+//             {\r
+//                     *(sz + i) = m_oData[ i ];\r
+//             }\r
+//             CUtils::Log( "%s", sz );\r
+//             CUtils::Log( "length = %d", GetRTFBodyLength());\r
+//             delete[] sz;\r
+//     }\r
+\r
+//     CUtils::Log("CClipboardFormatSnap::Capture: 3");\r
+       return TRUE;\r
+}\r
+\r
+BOOL CClipboardFormatSnap::Restore()\r
+{\r
+       int nLenData = m_oData.GetSize() * sizeof(BYTE);\r
+       HANDLE hClip = GlobalAlloc( GMEM_MOVEABLE, nLenData );\r
+       void *pClip = GlobalLock( hClip );\r
+       CopyMemory( pClip, &m_oData[ 0 ], nLenData );\r
+\r
+       GlobalUnlock( hClip );\r
+       SetClipboardData( m_nFormat, hClip );\r
+       return TRUE;\r
+}\r
+\r
+BOOL CClipboardFormatSnap::IsSameFormat( const CClipboardFormatSnap *const pFormatSnap )\r
+{\r
+       return m_nFormat == pFormatSnap->m_nFormat;\r
+}\r
+\r
+BOOL CClipboardFormatSnap::IsMergeableFormat()\r
+{\r
+       return IsMergeableFormat( m_nFormat );\r
+}\r
+\r
+BOOL CClipboardFormatSnap::IsMergeableFormat( const int nFormat )\r
+{\r
+       switch( nFormat )\r
+       {\r
+       case CF_TEXT:\r
+       case CF_OEMTEXT:\r
+       case CF_UNICODETEXT:\r
+       case CF_LOCALE:\r
+//     case 49310:     // Rich Text Format\r
+               return TRUE;\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+\r
+       return FALSE;\r
+}\r
+\r
+int CClipboardFormatSnap::FindReturn()\r
+{\r
+//     CUtils::Log( "%s", GetFormatName( m_nFormat ) );\r
+       switch( m_nFormat )\r
+       {\r
+       case CF_TEXT:\r
+       case CF_OEMTEXT:\r
+               {\r
+                       for( int i = 0; i < m_oData.GetSize(); ++i )\r
+                       {\r
+//                             CUtils::Log( "%#02x (%c)", m_oData[ i ], m_oData[ i ] );\r
+                               if( m_oData[ i ] == VK_RETURN ) return i;       // CR\r
+                               if( !m_oData[ i ] ) break;                                      // NULL Terminator\r
+                       }\r
+               }\r
+               break;\r
+       case CF_UNICODETEXT:\r
+               {\r
+//                     for( int i = 0; i < m_oData.GetSize(); ++i )\r
+//                     {\r
+//                             CUtils::Log( "%#02x (%c)", m_oData[ i ], m_oData[ i ] );\r
+//                     }\r
+               }\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+\r
+       return -1;\r
+}\r
+\r
+const int CClipboardFormatSnap::GetTextLength( const int nSizeOfNullTerminator )\r
+{\r
+       try {\r
+               char *pNullTerminator = new char[ nSizeOfNullTerminator ];\r
+\r
+               if( !pNullTerminator ) return -1;\r
+               memset( pNullTerminator, 0, nSizeOfNullTerminator );\r
+\r
+               char *pCurrentCharactor = new char[ nSizeOfNullTerminator ];\r
+               if( !pCurrentCharactor )\r
+               {\r
+                       delete [] pNullTerminator;\r
+                       pNullTerminator = NULL;\r
+                       return -1;\r
+               }\r
+\r
+               for( int i = 0; i < m_oData.GetSize() - nSizeOfNullTerminator + 1; i += nSizeOfNullTerminator )\r
+               {\r
+                       for( int j = 0; j < nSizeOfNullTerminator; ++j ) pCurrentCharactor[ j ] = m_oData[ i + j ];\r
+\r
+                       if( !memcmp( pCurrentCharactor, pNullTerminator, nSizeOfNullTerminator ) )\r
+                       {\r
+                               delete [] pNullTerminator;\r
+                               pNullTerminator = NULL;\r
+                               delete [] pCurrentCharactor;\r
+                               pCurrentCharactor = NULL;\r
+                               return i;\r
+                       }\r
+               }\r
+\r
+               delete [] pNullTerminator;\r
+               pNullTerminator = NULL;\r
+               delete [] pCurrentCharactor;\r
+               pCurrentCharactor = NULL;\r
+       }\r
+       catch (CMemoryException* e) {\r
+               e->Delete();\r
+//             CUtils::Log("CClipboardFormatSnap::GetTextLength: 'new' threw an exception");\r
+       }\r
+\r
+       return -1;\r
+}\r
+\r
+const int CClipboardFormatSnap::GetRTFBodyHead() const\r
+{\r
+       int nBra = 0;\r
+\r
+       for( int i = 0; i < m_oData.GetSize(); ++i )\r
+       {\r
+               BOOL bBody = FALSE;\r
+\r
+               switch( m_oData[ i ] )\r
+               {\r
+               case '{':\r
+                       if( nBra++ )\r
+                       {\r
+                               for( ++i ; i < m_oData.GetSize(); ++i )\r
+                               {\r
+                                       switch( m_oData[ i ] )\r
+                                       {\r
+                                       case '{':\r
+                                               ++nBra;\r
+                                               break;\r
+                                       case '}':\r
+                                               --nBra;\r
+                                               break;\r
+                                       case '\\':\r
+//                                             // for Microsoft Word\r
+//                                             if( i < m_oData.GetSize() + 7 &&\r
+//                                                     m_oData[ i + 1 ] == 'i' &&\r
+//                                                     m_oData[ i + 2 ] == 'n' &&\r
+//                                                     m_oData[ i + 3 ] == 's' &&\r
+//                                                     m_oData[ i + 4 ] == 'r' &&\r
+//                                                     m_oData[ i + 5 ] == 's' &&\r
+//                                                     m_oData[ i + 6 ] == 'i' &&\r
+//                                                     m_oData[ i + 7 ] == 'd' )\r
+//                                             {\r
+//                                                     --i;\r
+//                                                     nBra = 1;\r
+//                                             }\r
+                                               break;\r
+                                       default:\r
+                                               break;\r
+                                       }\r
+\r
+                                       if( nBra == 1 ) break;\r
+                               }\r
+                       }\r
+                       break;\r
+\r
+               case '}':\r
+                       if( --nBra == 0 ) {\r
+                               i = m_oData.GetSize();\r
+                               bBody = TRUE;\r
+                       }\r
+                       break;\r
+\r
+               case '\\':      // tag\r
+                       for( ; i < m_oData.GetSize(); ++i )\r
+                       {\r
+                               BOOL bTagEnd = FALSE;\r
+                               switch( m_oData[ i ] )\r
+                               {\r
+                               case '{':\r
+                               case '}':\r
+                                       --i;\r
+                                       bTagEnd = TRUE;\r
+                                       break;\r
+                               case ' ':\r
+                                       bTagEnd = TRUE;\r
+                                       break;\r
+                               case '\\':\r
+                                       if( i < m_oData.GetSize() + 5 &&\r
+                                               m_oData[ i + 1 ] == 'p' &&\r
+                                               m_oData[ i + 2 ] == 'a' &&\r
+                                               m_oData[ i + 3 ] == 'r' &&\r
+                                               m_oData[ i + 4 ] == 0x0d &&\r
+                                               m_oData[ i + 5 ] == 0x0a )\r
+                                       {\r
+                                               bTagEnd = TRUE;\r
+                                               bBody = TRUE;\r
+                                       }\r
+                                       if( i < m_oData.GetSize() + 1 &&\r
+                                               ( m_oData[ i + 1 ] == '\\' ||\r
+                                                 m_oData[ i + 1 ] == '{' ||\r
+                                                 m_oData[ i + 1 ] == '}' ) )\r
+                                       {\r
+                                               bTagEnd = TRUE;\r
+                                               bBody = TRUE;\r
+                                       }\r
+                                       break;\r
+                               default:\r
+                                       break;\r
+                               }\r
+\r
+                               if( bTagEnd ) break;\r
+                       }\r
+                       break;\r
+\r
+               case 0x0d:\r
+                       if( i < m_oData.GetSize() + 5 &&\r
+                                       m_oData[ i + 1 ] == 0x0a &&\r
+                                       m_oData[ i + 2 ] == '\\' &&\r
+                                       m_oData[ i + 3 ] == 'p' &&\r
+                                       m_oData[ i + 4 ] == 'a' &&\r
+                                       m_oData[ i + 5 ] == 'r' )\r
+                       {\r
+                               bBody = TRUE;\r
+                       }\r
+                       break;\r
+               case 0x0a:\r
+                       break;\r
+\r
+               default:        // body\r
+                       bBody = TRUE;\r
+                       break;\r
+               }\r
+\r
+               if( bBody ) break;\r
+       }\r
+\r
+       return i;\r
+}\r
+\r
+const int CClipboardFormatSnap::GetRTFBodyLength() const\r
+{\r
+//     CUtils::Log("const int CClipboardFormatSnap::GetRTFBodyLength() const: GetRTFBodyHead() = %d, m_oData.GetSize() = %d", GetRTFBodyHead(), m_oData.GetSize());\r
+       int nLength  = 0;\r
+\r
+       for( int i = GetRTFBodyHead(); i < m_oData.GetSize(); ++i )\r
+       {\r
+               if( m_oData[ i ] == '}' ) break;\r
+               else if( m_oData[ i ] == '\\' )\r
+               {\r
+//                     CUtils::Log( "Body: %#04x (%c)", m_oData[ i ], m_oData[ i ] );\r
+//                     CUtils::Log( "Body: %#04x (%c)", m_oData[ i + 1 ], m_oData[ i + 1 ] );\r
+                       nLength += 2;\r
+                       ++i;\r
+               }\r
+               else\r
+               {\r
+//                     CUtils::Log( "Body: %#04x (%c)", m_oData[ i ], m_oData[ i ] );\r
+                       ++nLength;\r
+               }\r
+       }\r
+\r
+       return nLength;\r
+}\r
+\r
+BOOL CClipboardFormatSnap::IsEmpty()\r
+{\r
+       BOOL rc = TRUE;\r
+       switch( m_nFormat )\r
+       {\r
+       case CF_TEXT:\r
+       case CF_OEMTEXT:\r
+               if( ( 1 < m_oData.GetSize() ) && m_oData[ 0 ] ) rc = FALSE;\r
+               break;\r
+       case CF_UNICODETEXT:\r
+               if( ( 2 < m_oData.GetSize() ) && m_oData[ 0 ] && m_oData[ 1 ] ) rc = FALSE;\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+       return rc;\r
+}\r
+\r
+void CClipboardFormatSnap::Add( const char *const pAddedString, const BOOL bTop )\r
+{\r
+       switch( m_nFormat )\r
+       {\r
+       case CF_TEXT:\r
+       case CF_OEMTEXT:\r
+               Add( pAddedString, bTop, 1 );\r
+               break;\r
+       case CF_UNICODETEXT:\r
+               Add( pAddedString, bTop, 2 );\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+}\r
+\r
+void CClipboardFormatSnap::Add( const char *const pAddedString, const BOOL bTop, const int nSizeOfNullTerminator )\r
+{\r
+       int nOffset = GetTextLength( nSizeOfNullTerminator );\r
+       if( nOffset < 0 ) nOffset = 0;\r
+\r
+       if( m_oData.GetSize() < ( nOffset + nSizeOfNullTerminator * ( (int)strlen( pAddedString ) + 1 ) ) )\r
+       {\r
+               m_oData.SetSize( nOffset + nSizeOfNullTerminator * ( strlen( pAddedString ) + 1 ) );\r
+       }\r
+\r
+       if( bTop )\r
+       {\r
+               for( int i = nOffset + nSizeOfNullTerminator - 1; 0 <= i ; --i )\r
+               {\r
+                       m_oData[ nSizeOfNullTerminator * strlen(pAddedString) + i ] = m_oData[ i ];\r
+               }\r
+               for( i = 0; i < ( int )strlen( pAddedString ); ++i )\r
+               {\r
+                       for ( int j = 0; j < nSizeOfNullTerminator; ++j ) {\r
+                               if( j ) m_oData[ i * nSizeOfNullTerminator + j ] = 0;\r
+                               else    m_oData[ i * nSizeOfNullTerminator + j ] = *( pAddedString + i );\r
+                       }\r
+               }\r
+       }\r
+       else\r
+       {\r
+               for( unsigned int i = 0; i < strlen( pAddedString ); ++i )\r
+               {\r
+                       for( int j = 0; j < nSizeOfNullTerminator; ++j )\r
+                       {\r
+                               if( j ) m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = 0;\r
+                               else    m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = *( pAddedString + i );\r
+                       }\r
+               }\r
+\r
+               for( int j = 0; j < nSizeOfNullTerminator; ++j )\r
+               {\r
+                       m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = 0;\r
+               }\r
+       }\r
+}\r
+\r
+void CClipboardFormatSnap::DeleteLastReturn()\r
+{\r
+       switch( m_nFormat )\r
+       {\r
+       case CF_TEXT:\r
+       case CF_OEMTEXT:\r
+               DeleteLastReturn( 1 );\r
+               break;\r
+       case CF_UNICODETEXT:\r
+               DeleteLastReturn( 2 );\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+}\r
+\r
+void CClipboardFormatSnap::DeleteLastReturn(const int nSizeOfNullTerminator)\r
+{\r
+       if( GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 < 0 ) return;\r
+\r
+       try {\r
+               char *pCRLF = new char[ nSizeOfNullTerminator * 2 ];\r
+               if( !pCRLF ) return;\r
+               memset( pCRLF, 0, nSizeOfNullTerminator * 2 );\r
+               *pCRLF = '\r';\r
+               *(pCRLF + nSizeOfNullTerminator) = '\n';\r
+\r
+               BOOL bDelete = TRUE;\r
+               for( int i = 0; i < nSizeOfNullTerminator * 2; ++i )\r
+               {\r
+//                     CUtils::Log( "%#02x (%c) AA _%#02x_", m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], *( pCRLF + i ) );\r
+                       if( m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ] != *( pCRLF + i ) )\r
+                       {\r
+                               bDelete = FALSE;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if( bDelete )\r
+               {\r
+                       const int nOffset = GetTextLength( nSizeOfNullTerminator );\r
+                       for( int i = 0; i < nSizeOfNullTerminator * 2; ++i )\r
+                       {\r
+//                             CUtils::Log( "%#02x (%c) BB", m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ] );\r
+                               m_oData[ nOffset - nSizeOfNullTerminator * 2 + i ] = 0;\r
+                       }\r
+               }\r
+       }\r
+       catch (CMemoryException* e) {\r
+               e->Delete();\r
+//             CUtils::Log("CClipboardFormatSnap::DeleteLastReturn: 'new' threw an exception");\r
+       }\r
+}\r
diff --git a/xkeymacsdll/ClipboardFormatSnap.h b/xkeymacsdll/ClipboardFormatSnap.h
new file mode 100644 (file)
index 0000000..aa5b459
--- /dev/null
@@ -0,0 +1,103 @@
+// ClipboardFormatSnap.h: CClipboardFormatSnap \83N\83\89\83X\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_CLIPBOARDFORMATSNAP_H__75207F92_15D2_4D59_B413_730D8875976D__INCLUDED_)\r
+#define AFX_CLIPBOARDFORMATSNAP_H__75207F92_15D2_4D59_B413_730D8875976D__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#include <afxtempl.h>\r
+\r
+\r
+// \83\86\81[\83e\83B\83\8a\83e\83B\8aÖ\90\94\r
+\r
+inline CString GetFormatName( int nFormat )\r
+{\r
+       // \83t\83H\81[\83}\83b\83g\96¼\82ð\95Ô\82·\8aÖ\90\94\r
+       // \83f\83o\83b\83O\97p\82Å\82 \82è\81Awin2k\88È\8d~\82ð\91O\92ñ\82Æ\82µ\82Ä\82¢\82é\r
+       // \8cÃ\82¢OS\82Å\93\96\8aÖ\90\94\82ð\8eg\82¤\82Æ\82¤\82»\82Ì\96¼\91O\82ð\95Ô\82·\8fê\8d\87\82ª\82 \82é\r
+       // OWNEDDISPLAY\82È\82Ç\82ÌCF\82à\83t\83H\83\8d\81[\82µ\82Ä\82È\82¢\82Ì\82Åwin2k\82Å\82à\82¤\82»\82Â\82­\r
+\r
+       // 01-17\r
+       CString sDefaultName[] = {\r
+               _T("CF_TEXT"),\r
+               _T("CF_BITMAP"),\r
+               _T("CF_METAFILEPICT"),\r
+               _T("CF_SYLK"),\r
+               _T("CF_DIF"),\r
+               _T("CF_TIFF"),\r
+               _T("CF_OEMTEXT"),\r
+               _T("CF_DIB"),\r
+               _T("CF_PALETTE"),\r
+               _T("CF_PENDATA"),\r
+               _T("CF_RIFF"),\r
+               _T("CF_WAVE"),\r
+               _T("CF_UNICODETEXT"),\r
+               _T("CF_ENHMETAFILE"),\r
+               _T("CF_HDROP"),\r
+               _T("CF_LOCALE"),\r
+               _T("CF_DIBV5")\r
+       };\r
+\r
+       if( nFormat <= 0  ) return _T("");\r
+       if( nFormat <= 17 ) return sDefaultName[ nFormat - 1 ];\r
+\r
+       TCHAR sFormatName[ 10000 ];\r
+       if( !GetClipboardFormatName( nFormat, sFormatName, 10000 ) ) return _T("");\r
+       return sFormatName;\r
+}\r
+\r
+class CClipboardFormatSnap  \r
+{\r
+       //\r
+       // * Constructors\r
+       //\r
+public:\r
+       CClipboardFormatSnap();\r
+       virtual ~CClipboardFormatSnap();\r
+\r
+       //\r
+       // * Copy\r
+       //\r
+public:\r
+       CClipboardFormatSnap( const CClipboardFormatSnap& rhs );\r
+       const CClipboardFormatSnap& operator=( const CClipboardFormatSnap& rhs );\r
+       const BOOL operator==( const CClipboardFormatSnap& rhs );\r
+       const BOOL operator!=( const CClipboardFormatSnap& rhs );\r
+\r
+       //\r
+       // * Operations\r
+       //\r
+public:\r
+       BOOL Capture( int nFormat );\r
+       BOOL Restore();\r
+       BOOL IsSameFormat( const CClipboardFormatSnap* const pFormatSnap );\r
+       BOOL IsMergeableFormat();\r
+       static BOOL IsMergeableFormat( const int nFormat );\r
+       int FindReturn();\r
+       void DeleteLastReturn();\r
+       void Add( const char* const pAddedString, const BOOL bTop );\r
+       BOOL IsEmpty();\r
+       const CClipboardFormatSnap& operator+( const CClipboardFormatSnap& rhs );\r
+///    const CClipboardFormatSnap& Merge( CClipboardFormatSnap& lhs, CClipboardFormatSnap& rhs );\r
+protected:\r
+       void DeleteLastReturn( const int nSizeOfNullTerminator );\r
+       void Add( const char* const pAddedString, const BOOL bTop, const int nSizeOfNullTerminator );\r
+       const int GetTextLength( const int nSizeOfNullTerminator );\r
+       const int GetRTFBodyLength() const;\r
+       const int GetRTFBodyHead() const;\r
+       void MergeText( const CClipboardFormatSnap& rhs, const int nSizeOfNullTerminator );\r
+       void MergeRTF( const CClipboardFormatSnap& rhs );\r
+\r
+       //\r
+       // * Attributes\r
+       //\r
+private:\r
+       int m_nFormat;\r
+       CArray<BYTE, BYTE> m_oData;\r
+};\r
+\r
+#endif // !defined(AFX_CLIPBOARDFORMATSNAP_H__75207F92_15D2_4D59_B413_730D8875976D__INCLUDED_)\r
diff --git a/xkeymacsdll/ClipboardSnap.cpp b/xkeymacsdll/ClipboardSnap.cpp
new file mode 100644 (file)
index 0000000..b0ef73f
--- /dev/null
@@ -0,0 +1,321 @@
+// ClipboardSnap.cpp: CClipboardSnap \83N\83\89\83X\82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "stdafx.h"\r
+#include "ClipboardSnap.h"\r
+#include "Utils.h"\r
+\r
+#ifdef _DEBUG\r
+#undef THIS_FILE\r
+static char THIS_FILE[]=__FILE__;\r
+#define new DEBUG_NEW\r
+#endif\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \8d\\92z/\8fÁ\96Å\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CClipboardSnap::CClipboardSnap() :  m_oFormatSnaps()\r
+{\r
+       m_pNext = NULL;\r
+}\r
+\r
+CClipboardSnap::~CClipboardSnap()\r
+{\r
+       ClearFormatSnaps();\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \83R\83s\81[\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CClipboardSnap::CClipboardSnap( const CClipboardSnap& rhs ) : m_oFormatSnaps()\r
+{\r
+       m_pNext = NULL;\r
+       int nLen = rhs.m_oFormatSnaps.GetSize();\r
+       ClearFormatSnaps();\r
+       m_oFormatSnaps.SetSize( nLen );\r
+\r
+       for( int i = 0; i < nLen; i++ )\r
+       {\r
+               try {\r
+                       m_oFormatSnaps[ i ]  = new CClipboardFormatSnap;\r
+                       if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];\r
+               }\r
+               catch (CMemoryException* e) {\r
+                       e->Delete();\r
+//                     CUtils::Log("CClipboardSnap::CClipboardSnap: 'new' threw an exception");\r
+               }\r
+       }\r
+\r
+       if( m_pNext ) m_pNext->ClearFormatSnaps();\r
+       m_pNext = rhs.m_pNext;\r
+}\r
+\r
+const BOOL CClipboardSnap::operator==( const CClipboardSnap& rhs )\r
+{\r
+       if( m_oFormatSnaps.GetSize() != rhs.m_oFormatSnaps.GetSize() ) return FALSE;\r
+\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
+       {\r
+               if ( *m_oFormatSnaps[ i ] != *rhs.m_oFormatSnaps[ i ] ) return FALSE;\r
+       }\r
+\r
+       return TRUE;\r
+}\r
+\r
+const BOOL CClipboardSnap::operator!=( const CClipboardSnap& rhs )\r
+{\r
+       return !( *this == rhs );\r
+}\r
+\r
+const CClipboardSnap& CClipboardSnap::operator=( const CClipboardSnap& rhs )\r
+{\r
+       int nLen = rhs.m_oFormatSnaps.GetSize();\r
+       ClearFormatSnaps();\r
+       m_oFormatSnaps.SetSize( nLen );\r
+\r
+       for( int i = 0; i < nLen; i++ )\r
+       {\r
+               try {\r
+                       m_oFormatSnaps[ i ]  = new CClipboardFormatSnap;\r
+                       if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];\r
+               }\r
+               catch (CMemoryException* e) {\r
+                       e->Delete();\r
+//                     CUtils::Log("CClipboardSnap::operator=: 'new' threw an exception");\r
+               }\r
+       }\r
+\r
+       if( m_pNext ) m_pNext->ClearFormatSnaps();\r
+       m_pNext = rhs.m_pNext;\r
+\r
+       return *this;\r
+}\r
+\r
+const CClipboardSnap& CClipboardSnap::operator+=( const CClipboardSnap& rhs )\r
+{\r
+       const CClipboardSnap lhs = *this;\r
+\r
+       // count the number of mergeable clipboard format\r
+       int nMergeableClipboardFormatNumber = 0;\r
+       struct MergeableClipboardFormatPosition\r
+       {\r
+               int m_nLHS;\r
+               int m_nRHS;\r
+       };\r
+\r
+       const int nMergeableClipboardFormatPosition = lhs.m_oFormatSnaps.GetSize() + rhs.m_oFormatSnaps.GetSize();\r
+       try {\r
+               MergeableClipboardFormatPosition *const pMergeableClipboardFormatPosition = new MergeableClipboardFormatPosition[ nMergeableClipboardFormatPosition ];\r
+               if( !pMergeableClipboardFormatPosition ) return *this;\r
+\r
+               memset( pMergeableClipboardFormatPosition, -1, sizeof(MergeableClipboardFormatPosition) * nMergeableClipboardFormatPosition );\r
+\r
+               for( int nLHS = 0; nLHS < lhs.m_oFormatSnaps.GetSize(); ++nLHS )        // LHS: Left Hand Side\r
+               {\r
+                       if( lhs.m_oFormatSnaps[ nLHS ]->IsMergeableFormat() )\r
+                       {\r
+                               ( pMergeableClipboardFormatPosition + nMergeableClipboardFormatNumber )->m_nLHS = nLHS;\r
+                               ++nMergeableClipboardFormatNumber;\r
+                       }\r
+               }\r
+               for( int nRHS = 0; nRHS < rhs.m_oFormatSnaps.GetSize(); ++nRHS )        // RHS: Right Hand Side\r
+               {\r
+                       if( rhs.m_oFormatSnaps[ nRHS ]->IsMergeableFormat() )\r
+                       {\r
+                               for( int i = 0; i < nMergeableClipboardFormatNumber; ++i )\r
+                               {\r
+                                       if( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 ) continue;\r
+                                       if( rhs.m_oFormatSnaps[ nRHS ]->IsSameFormat( lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] ) ) break;\r
+                               }\r
+\r
+                               ( pMergeableClipboardFormatPosition + i )->m_nRHS = nRHS;\r
+                               if( i ==  nMergeableClipboardFormatNumber )\r
+                               {\r
+                                       ++nMergeableClipboardFormatNumber;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // clear current data\r
+               m_oFormatSnaps.RemoveAll();\r
+               m_oFormatSnaps.SetSize( nMergeableClipboardFormatNumber );\r
+\r
+               // set data\r
+               for( int i = 0; i < nMergeableClipboardFormatNumber; ++i )\r
+               {\r
+                       CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;\r
+                       if( pFormatSnap )\r
+                       {\r
+                               m_oFormatSnaps[ i ] = pFormatSnap;\r
+                               if( ( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 ) &&\r
+                                       ( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 ) )\r
+                               {\r
+                                       ASSERT( 0 );\r
+                               }\r
+                               else if( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 )\r
+                               {\r
+                                       *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];\r
+                               }\r
+                               else if( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 )\r
+                               {\r
+                                       *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ];\r
+                               }\r
+                               else\r
+                               {\r
+//                                     *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] += *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];\r
+//                                     *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ];\r
+                                       *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] +\r
+                                                                                  *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];\r
+//                                     m_oFormatSnaps[ i ]->Merge( *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ],\r
+//                                                                                             *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ] );\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       catch (CMemoryException* e) {\r
+               e->Delete();\r
+//             CUtils::Log("CClipboardSnap::operator+=: 'new' threw an exception");\r
+       }\r
+\r
+       return *this;\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \91\80\8dì\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+BOOL CClipboardSnap::Capture( const BOOL bTextOnly )\r
+{\r
+//     CUtils::Log( "CClipboardSnap::Capture(): start" );\r
+\r
+       ClearFormatSnaps();\r
+       if( !CUtils::OpenClipboard() ) return FALSE;\r
+\r
+       int nFormat = 0;\r
+       int nFormatCount = CountClipboardFormats();\r
+\r
+       for( int i = 0; i < nFormatCount; i++ )\r
+       {\r
+               nFormat = EnumClipboardFormats( nFormat );\r
+               if( nFormat == 0 ) break;\r
+//             CUtils::Log("CClipboardSnap::Capture(): i = %d, nFormat = %d (%s)", i, nFormat, GetFormatName(nFormat));\r
+\r
+               if( bTextOnly && !CClipboardFormatSnap::IsMergeableFormat( nFormat ) ) continue;\r
+\r
+               // for Microsoft Word\r
+               if( i && nFormat == 49163 ) continue;\r
+               if( i && nFormat == 49156 ) continue;\r
+\r
+               try {\r
+                       CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;\r
+\r
+                       if( pFormatSnap && !pFormatSnap->Capture( nFormat ) ) {\r
+//                             AfxMessageBox( _T("Capture Ignored or Failed:\n") + GetFormatName(nFormat) );\r
+//                             CUtils::Log( "CClipboardSnap::Capture(): Capture Ignored or Failed" );\r
+                       } else {\r
+//                             CUtils::Log( "CClipboardSnap::Capture(): add start" );\r
+                               m_oFormatSnaps.Add( pFormatSnap );\r
+//                             CUtils::Log( "CClipboardSnap::Capture(): add end" );\r
+                       }\r
+               }\r
+               catch (CMemoryException* e) {\r
+                       e->Delete();\r
+//                     CUtils::Log("CClipboardSnap::Capture: 'new' threw an exception");\r
+               }\r
+       }\r
+\r
+       CloseClipboard();\r
+//     CUtils::Log( "CClipboardSnap::Capture(): end" );\r
+       return TRUE;\r
+}\r
+\r
+BOOL CClipboardSnap::Restore()\r
+{\r
+       if( !CUtils::OpenClipboard() ) return FALSE;\r
+       EmptyClipboard();\r
+\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); i++ )\r
+       {\r
+               m_oFormatSnaps[ i ]->Restore();\r
+       }\r
+\r
+       CloseClipboard();\r
+       return TRUE;\r
+}\r
+\r
+void CClipboardSnap::ClearFormatSnaps()\r
+{\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); i++ )\r
+       {\r
+               delete m_oFormatSnaps[ i ];\r
+       }\r
+       m_oFormatSnaps.RemoveAll();\r
+\r
+       if( m_pNext ) m_pNext->ClearFormatSnaps();\r
+       m_pNext = NULL;\r
+}\r
+\r
+int CClipboardSnap::FindReturn()\r
+{\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
+       {\r
+               int rc = m_oFormatSnaps[ i ]->FindReturn();\r
+               if( rc != -1 ) return rc;\r
+       }\r
+       return -1;\r
+}\r
+\r
+BOOL CClipboardSnap::IsEmpty()\r
+{\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
+       {\r
+               if( !m_oFormatSnaps[ i ]->IsEmpty() ) return FALSE;\r
+       }\r
+       return TRUE;\r
+}\r
+\r
+void CClipboardSnap::Add( const char *const pAddedString, const BOOL bTop )\r
+{\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
+       {\r
+               m_oFormatSnaps[ i ]->Add( pAddedString, bTop );\r
+       }\r
+}\r
+\r
+void CClipboardSnap::DeleteLastReturn()\r
+{\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
+       {\r
+               m_oFormatSnaps[ i ]->DeleteLastReturn();\r
+       }\r
+}\r
+\r
+void CClipboardSnap::SetNext( CClipboardSnap* pNext )\r
+{\r
+       if( m_pNext ) m_pNext->ClearFormatSnaps();\r
+       m_pNext = pNext;\r
+}\r
+\r
+CClipboardSnap* CClipboardSnap::GetNext()\r
+{\r
+       return m_pNext;\r
+}\r
+\r
+BOOL CClipboardSnap::IsAllMergeableFormat()\r
+{\r
+       for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
+       {\r
+               if( !m_oFormatSnaps[ i ]->IsMergeableFormat() ) return FALSE;\r
+       }\r
+       return TRUE;\r
+}\r
+\r
+int CClipboardSnap::GetCount()\r
+{\r
+       int nCount = 1;\r
+       for( CClipboardSnap* pSnap = this; pSnap->GetNext(); pSnap = pSnap->GetNext() ) ++nCount;\r
+       return ++nCount;\r
+}\r
diff --git a/xkeymacsdll/ClipboardSnap.h b/xkeymacsdll/ClipboardSnap.h
new file mode 100644 (file)
index 0000000..a3f70f9
--- /dev/null
@@ -0,0 +1,59 @@
+// ClipboardSnap.h: CClipboardSnap \83N\83\89\83X\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_CLIPBOARDSNAP_H__1FAE18B5_B0B4_4431_B3C4_BE6B26447AF2__INCLUDED_)\r
+#define AFX_CLIPBOARDSNAP_H__1FAE18B5_B0B4_4431_B3C4_BE6B26447AF2__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#include <afxtempl.h>\r
+#include "clipboardformatsnap.h"\r
+\r
+class CClipboardSnap  \r
+{\r
+       //\r
+       // * Constructors\r
+       //\r
+public:\r
+       CClipboardSnap();\r
+       virtual ~CClipboardSnap();\r
+\r
+       //\r
+       // * Copy\r
+       //\r
+public:\r
+       CClipboardSnap( const CClipboardSnap& rhs );\r
+       const BOOL operator==( const CClipboardSnap& rhs );\r
+       const BOOL operator!=( const CClipboardSnap& rhs );\r
+       const CClipboardSnap& operator=( const CClipboardSnap& rhs );\r
+       const CClipboardSnap& operator+=( const CClipboardSnap& rhs );\r
+\r
+       //\r
+       // * Operations\r
+       //\r
+public:\r
+       BOOL Restore();\r
+       BOOL Capture( const BOOL bTextOnly = FALSE );\r
+       int FindReturn();\r
+       void DeleteLastReturn();\r
+       void Add( const char* const pAddedString, const BOOL bTop );\r
+       BOOL IsEmpty();\r
+       void SetNext( CClipboardSnap* pNext );\r
+       CClipboardSnap* GetNext();\r
+       BOOL IsAllMergeableFormat();\r
+       int GetCount();\r
+private:\r
+       void ClearFormatSnaps();\r
+\r
+       //\r
+       // * Attributes\r
+       //\r
+private:\r
+       CArray<CClipboardFormatSnap *, CClipboardFormatSnap *> m_oFormatSnaps;\r
+       CClipboardSnap* m_pNext;\r
+};\r
+\r
+#endif // !defined(AFX_CLIPBOARDSNAP_H__1FAE18B5_B0B4_4431_B3C4_BE6B26447AF2__INCLUDED_)\r
diff --git a/xkeymacsdll/Commands.cpp b/xkeymacsdll/Commands.cpp
new file mode 100644 (file)
index 0000000..5b6cf64
--- /dev/null
@@ -0,0 +1,4124 @@
+// Commands.cpp: implementation of the CCommands class\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "stdafx.h"\r
+#include "Commands.h"\r
+#include "xkeymacsdll.h"\r
+#include "Utils.h"\r
+#include <math.h>\r
+#include <Imm.h>\r
+#pragma data_seg(".xkmcs")\r
+DWORD CCommands::m_nNumericArgument = 1;\r
+BOOL CCommands::m_bSetMark = FALSE;\r
+BOOL CCommands::m_bC_ = FALSE;\r
+BOOL CCommands::m_bC_x = FALSE;\r
+BOOL CCommands::m_bM_ = FALSE;\r
+BOOL CCommands::m_bM_x = FALSE;\r
+BOOL CCommands::m_bDefaultNumericArgument = TRUE;\r
+BOOL CCommands::m_bNegativeNumericArgument = FALSE;\r
+BOOL CCommands::m_bC_u = FALSE;\r
+SEARCH_DIRECTION CCommands::m_SearchDirection = NA;\r
+int (*CCommands::m_LastKillCommand)() = NULL;\r
+int (*CCommands::m_LastCommand)() = NULL;\r
+CPtrList CCommands::m_CaretPos;\r
+CPtrList CCommands::m_ScrollInfo;\r
+CPtrList CCommands::m_FindText;\r
+BOOL CCommands::m_bFirstFindDialog = FALSE;\r
+BOOL CCommands::m_bTemporarilyDisableXKeymacs = FALSE;\r
+CArray<CClipboardSnap *, CClipboardSnap *> CCommands::m_oClipboardData;\r
+OriginalWindowPosition_t CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};\r
+BOOL CCommands::m_bIsSu = FALSE;\r
+#pragma data_seg()\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// Construction/Destruction\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CCommands::CCommands()\r
+{\r
+\r
+}\r
+\r
+CCommands::~CCommands()\r
+{\r
+\r
+}\r
+\r
+void CCommands::DepressKey(BYTE bVk)\r
+{\r
+       CXkeymacsDll::DepressKey(bVk);\r
+}\r
+\r
+void CCommands::ReleaseKey(BYTE bVk)\r
+{\r
+       CXkeymacsDll::ReleaseKey(bVk);\r
+}\r
+\r
+void CCommands::Kdu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
+{\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+       BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+\r
+       if (CXkeymacsDll::Get326Compatible() || CUtils::IsAtok()) {\r
+               bIsShiftDown = FALSE;\r
+       }\r
+\r
+       if (bIsCtrlDown) {\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+       if (bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+       if (bIsShiftDown) {\r
+               ReleaseKey(VK_SHIFT);\r
+       }\r
+\r
+       if (bVk1) {\r
+               CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+       }\r
+       if (bVk2) {\r
+               CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
+       }\r
+       if (bVk3) {\r
+               CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
+       }\r
+       if (bVk4) {\r
+               CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
+       }\r
+\r
+       if (bIsShiftDown) {\r
+               DepressKey(VK_SHIFT);\r
+       }\r
+       if (bIsAltDown) {\r
+               DepressKey(VK_MENU);\r
+       }\r
+       if (bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+       }\r
+}\r
+\r
+void CCommands::SdKduSu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
+{\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+       BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+\r
+       if (bIsCtrlDown) {\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+       if (bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+       if (!bIsShiftDown) {\r
+               DepressKey(VK_SHIFT);\r
+       }\r
+\r
+       CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+       if (bVk2) {\r
+               CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
+       }\r
+       if (bVk3) {\r
+               CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
+       }\r
+       if (bVk4) {\r
+               CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
+       }\r
+\r
+       if (!bIsShiftDown) {\r
+               if (CUtils::IsShuriken()) {\r
+                       m_bIsSu = TRUE;\r
+               } else {\r
+                       ReleaseKey(VK_SHIFT);\r
+               }\r
+       }\r
+       if (bIsAltDown) {\r
+               DepressKey(VK_MENU);\r
+       }\r
+       if (bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+       }\r
+}\r
+\r
+void CCommands::Su()\r
+{\r
+       if (m_bIsSu) {\r
+               ReleaseKey(VK_SHIFT);\r
+               m_bIsSu = FALSE;\r
+       }\r
+}\r
+\r
+void CCommands::CdKduCu(BYTE bVk1, BYTE bVk2)\r
+{\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+       BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+//     if (!bVk1) {\r
+//             CUtils::Log("%d, %d, %d", CXkeymacsDll::IsDown(VK_MENU, FALSE), CXkeymacsDll::IsDown(VK_LMENU, FALSE), CXkeymacsDll::IsDown(VK_RMENU, FALSE));\r
+//     }\r
+       if (!bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+       }\r
+       if (bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+       if (bIsShiftDown && !m_bSetMark) {\r
+               ReleaseKey(VK_SHIFT);\r
+       }\r
+\r
+       if (bVk1) {\r
+               CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+       }\r
+       if (bVk2) {\r
+               CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
+       }\r
+\r
+       if (bIsShiftDown && !m_bSetMark) {\r
+               if (!CUtils::IsXPorLater()) {   // FIXME        Windows XP said VK_SHIFT was pressed physically after a user press VK_RSHIFT, so...\r
+                       DepressKey(VK_SHIFT);\r
+               }\r
+       }\r
+       if (bIsAltDown) {\r
+               DepressKey(VK_MENU);\r
+       }\r
+       if (!bIsCtrlDown) {\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+}\r
+\r
+void CCommands::CdSdKduSuCu(BYTE bVk)\r
+{\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+       BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+\r
+       if (!bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+       }\r
+       if (bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+       if (!bIsShiftDown) {\r
+               DepressKey(VK_SHIFT);\r
+       }\r
+\r
+       CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
+\r
+       if (!bIsShiftDown) {\r
+               ReleaseKey(VK_SHIFT);\r
+       }\r
+       if (bIsAltDown) {\r
+               DepressKey(VK_MENU);\r
+       }\r
+       if (!bIsCtrlDown) {\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+}\r
+\r
+void CCommands::AdKduAu(BYTE bVk1, BYTE bVk2, BYTE bVk3)\r
+{\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+       BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+\r
+       if (bIsCtrlDown) {\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+\r
+       if (!bIsAltDown) {\r
+               DepressKey(VK_MENU);\r
+       }\r
+\r
+       if (bIsShiftDown) {\r
+               ReleaseKey(VK_SHIFT);\r
+       }\r
+\r
+       CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+       if (bVk2) {\r
+               CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
+       }\r
+       if (bVk3) {\r
+               CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
+       }\r
+\r
+       if (bIsShiftDown) {\r
+               if (!CUtils::IsXPorLater()) {   // FIXME        Windows XP said VK_SHIFT was pressed physically after a user press VK_RSHIFT, so...\r
+                       DepressKey(VK_SHIFT);\r
+               }\r
+       }\r
+\r
+       if (!bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+\r
+       if (bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+       }\r
+}\r
+\r
+void CCommands::AdSdKduSuAu(BYTE bVk1)\r
+{\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+       BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+\r
+       if (bIsCtrlDown) {\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+\r
+       if (!bIsAltDown) {\r
+               DepressKey(VK_MENU);\r
+       }\r
+\r
+       if (!bIsShiftDown) {\r
+               DepressKey(VK_SHIFT);\r
+       }\r
+\r
+       CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+\r
+       if (!bIsShiftDown) {\r
+               ReleaseKey(VK_SHIFT);\r
+       }\r
+\r
+       if (!bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+\r
+       if (bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+       }\r
+}\r
+\r
+// C-a: Home\r
+int CCommands::BeginningOfLine()\r
+{\r
+       int nNumericArgument = 1;\r
+       if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
+               nNumericArgument = m_nNumericArgument;\r
+               if (m_bNegativeNumericArgument) {\r
+                       if (nNumericArgument) {\r
+                               nNumericArgument *= -1;\r
+                       } else {\r
+                               nNumericArgument = -1;\r
+                       }\r
+               }\r
+       }\r
+       ClearNumericArgument();\r
+\r
+       if (nNumericArgument <= 0) {\r
+               nNumericArgument = -1 * nNumericArgument + 1;\r
+               while (nNumericArgument--) {\r
+                       ReleaseKey(VK_CONTROL); // why?\r
+                       while (MoveCaret(VK_UP) != GOTO_HOOK);\r
+               }\r
+               ReleaseKey(VK_CONTROL); // why?\r
+               while (MoveCaret(VK_HOME) != GOTO_HOOK);\r
+               DepressKey(VK_CONTROL); // why?\r
+       } else if (nNumericArgument == 1) {\r
+               return Reset(MoveCaret(VK_HOME));\r
+       } else if (2 <= nNumericArgument) {\r
+               nNumericArgument -= 2;\r
+               while (nNumericArgument--) {\r
+                       ReleaseKey(VK_CONTROL); // why?\r
+                       while (MoveCaret(VK_DOWN) != GOTO_HOOK);\r
+               }\r
+               ReleaseKey(VK_CONTROL); // why?\r
+               while (MoveCaret(VK_END) != GOTO_HOOK);\r
+               while (MoveCaret(VK_RIGHT) != GOTO_HOOK);\r
+               DepressKey(VK_CONTROL); // why?\r
+       } else {\r
+               ASSERT(0);\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-b: Left\r
+int CCommands::BackwardChar()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return ForwardChar();\r
+       }\r
+\r
+       return Reset(MoveCaret(VK_LEFT));\r
+}\r
+\r
+// M-b: backward-word\r
+int CCommands::BackwardWord()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return ForwardWord();\r
+       }\r
+\r
+       return Reset(MoveCaret(VK_LEFT, TRUE));\r
+}\r
+\r
+// C-e: End\r
+int CCommands::EndOfLine()\r
+{\r
+       int nNumericArgument = 1;\r
+       if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
+               nNumericArgument = m_nNumericArgument;\r
+               if (m_bNegativeNumericArgument) {\r
+                       if (nNumericArgument) {\r
+                               nNumericArgument *= -1;\r
+                       } else {\r
+                               nNumericArgument = -1;\r
+                       }\r
+               }\r
+       }\r
+       ClearNumericArgument();\r
+       if (nNumericArgument <= 0) {\r
+               nNumericArgument *= -1;\r
+               while (nNumericArgument--) {\r
+                       ReleaseKey(VK_CONTROL); // why?\r
+                       while (MoveCaret(VK_UP) != GOTO_HOOK);\r
+               }\r
+               ReleaseKey(VK_CONTROL); // why?\r
+               while (MoveCaret(VK_HOME) != GOTO_HOOK);\r
+               while (MoveCaret(VK_LEFT) != GOTO_HOOK);\r
+               DepressKey(VK_CONTROL); // why?\r
+       } else if (nNumericArgument == 1) {\r
+               return (MoveCaret(VK_END));\r
+       } else if (2 <= nNumericArgument) {\r
+               --nNumericArgument;\r
+               while (nNumericArgument--) {\r
+                       ReleaseKey(VK_CONTROL); // why?\r
+                       while (MoveCaret(VK_DOWN) != GOTO_HOOK);\r
+               }\r
+               ReleaseKey(VK_CONTROL); // why?\r
+               while (MoveCaret(VK_END) != GOTO_HOOK);\r
+               DepressKey(VK_CONTROL); // why?\r
+       } else {\r
+               ASSERT(0);\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-f: Right\r
+int CCommands::ForwardChar()\r
+{\r
+//     TCHAR szWindowText[0x100] = {'\0'};\r
+//     GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
+//     CUtils::Log("C-f: %s", szWindowText);\r
+\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return BackwardChar();\r
+       }\r
+\r
+       return Reset(MoveCaret(VK_RIGHT));\r
+}\r
+\r
+// M-f: forward-word\r
+int CCommands::ForwardWord()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return BackwardWord();\r
+       }\r
+\r
+       return Reset(MoveCaret(VK_RIGHT, TRUE));\r
+}\r
+\r
+// C-n: Down\r
+int CCommands::NextLine()\r
+{\r
+//     CUtils::Log(_T("C-n"));\r
+\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return PreviousLine();\r
+       }\r
+\r
+       return Reset(MoveCaret(VK_DOWN));\r
+}\r
+\r
+// C-o: open-line\r
+int CCommands::OpenLine()\r
+{\r
+       static const int DEFAULT_NUMERIC_ARGUMENT = -1;\r
+       static int nNumericArgument = DEFAULT_NUMERIC_ARGUMENT;\r
+\r
+       if (nNumericArgument == DEFAULT_NUMERIC_ARGUMENT) {\r
+               nNumericArgument = m_nNumericArgument;\r
+               ClearNumericArgument();\r
+       }\r
+\r
+       if (CUtils::IsHidemaru()\r
+        || CUtils::IsTuruKameMail()) {\r
+               static int nStep = 0;\r
+\r
+               switch (nStep) {\r
+               case 0:\r
+                       CdKduCu('M');\r
+                       nStep = 1;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               case 1:\r
+                       nStep = 0;\r
+                       Kdu(VK_UP, VK_END);\r
+                       if (--nNumericArgument) {\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       }\r
+                       break;\r
+               }\r
+       } else {\r
+               while (nNumericArgument--) {\r
+                       Kdu(VK_RETURN, VK_UP, VK_END);\r
+               }\r
+       }\r
+\r
+       nNumericArgument = DEFAULT_NUMERIC_ARGUMENT;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-p: Up\r
+int CCommands::PreviousLine()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return NextLine();\r
+       }\r
+\r
+       return Reset(MoveCaret(VK_UP));\r
+}\r
+\r
+// M-%\r
+int CCommands::QueryReplace()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsBecky()) {\r
+               CdKduCu('Q', 'A');\r
+       } else if (CUtils::IsEclipse()\r
+                       || CUtils::IsInternetExplorer()\r
+                       || CUtils::IsLotusNotes()\r
+                       || CUtils::IsSleipnir()) {\r
+               CdKduCu('F');\r
+       } else if (CUtils::IsAutla()\r
+                       || CUtils::IsBorlandCppBuilder()\r
+                       || CUtils::IseMemoPad()\r
+                       || CUtils::IsNami2000()\r
+                       || CUtils::IsStoryEditor()) {\r
+               CdKduCu('R');\r
+       } else if (CUtils::IsEdLeaf()) {\r
+               AdKduAu('E', 'E');\r
+       } else if (CUtils::IsPHPEditor()) {\r
+               AdKduAu('S', 'F');\r
+       } else {\r
+               CdKduCu('H');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-M-%\r
+int CCommands::QueryReplaceRegexp()\r
+{\r
+       return QueryReplace();\r
+}\r
+\r
+// M-<:\r
+int CCommands::BeginningOfBuffer()\r
+{\r
+       ClearNumericArgument();\r
+       return Reset(MoveCaret(VK_HOME, TRUE));\r
+}\r
+\r
+// M->:\r
+int CCommands::EndOfBuffer()\r
+{\r
+       ClearNumericArgument();\r
+       return Reset(MoveCaret(VK_END, TRUE));\r
+}\r
+\r
+// C-h: Back space\r
+int CCommands::DeleteBackwardChar()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return DeleteChar();\r
+       }\r
+\r
+       Kdu(VK_BACK);\r
+       m_bSetMark = FALSE;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-d: Delete\r
+int CCommands::DeleteChar()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return DeleteBackwardChar();\r
+       }\r
+\r
+       m_bSetMark = FALSE;\r
+       Kdu(VK_DELETE);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::KillLineForAllFormat()\r
+{\r
+       return KillLine(TRUE, KillLineForAllFormat);\r
+}\r
+\r
+// C-k: Shift-End, Shift-Delete, if the cursor is not at EOL (is End Of Line)\r
+//             Shift-Right, Cut, if the cursor is at EOL\r
+int CCommands::KillLine()\r
+{\r
+       return KillLine(FALSE);\r
+}\r
+\r
+int CCommands::KillLine(BOOL bAllFormat, int (*pCommand)())\r
+{\r
+       static BOOL bKeepAllFormat = FALSE;\r
+\r
+       // Do not try to do these command at once.\r
+       // Clipboard has old data till you go out this function.\r
+       static int nStep = 0;\r
+       static int nPrevStep = 0;\r
+       static int nRepeat = 0;\r
+       static CString szClipboardText;\r
+       static BOOL bContinuous = FALSE;\r
+       static BOOL bTopOfFile = FALSE;\r
+\r
+       if (nStep == nPrevStep) {\r
+               ++nRepeat;\r
+       } else {\r
+               nRepeat = 0;\r
+               nPrevStep = nStep;\r
+       }\r
+\r
+       switch (nStep) {\r
+       case 0:         // Clear Selection and get next character to confirm the cursor is at the EOF or not.\r
+//             CUtils::Log(_T("C-k: 0"));\r
+               bTopOfFile = FALSE;\r
+\r
+               if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
+                       if (m_bNegativeNumericArgument || m_nNumericArgument == 0) {\r
+                               // Shift+Up x -n Shift+Home Ctrl+X\r
+                               SdKduSu(VK_UP);\r
+                               ClearNumericArgument();\r
+                               SdKduSu(VK_HOME);\r
+                       } else {\r
+                               // Shift+Down x (n - 1) Shift+End Shift+Right Ctrl+X\r
+                               --m_nNumericArgument;\r
+                               SdKduSu(VK_DOWN);\r
+                               ClearNumericArgument();\r
+                               SdKduSu(VK_END, VK_RIGHT);\r
+                       }\r
+                       CdKduCu('X');\r
+                       nStep = 6;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+\r
+               if (m_LastCommand == pCommand) {\r
+                       bContinuous = TRUE;\r
+               } else {\r
+                       bContinuous = FALSE;\r
+                       if (m_bSetMark) {\r
+                               m_bSetMark = FALSE;\r
+                               DeactivateMark();\r
+                       }\r
+               }\r
+\r
+               if (CUtils::IsDirector()\r
+                || CUtils::IsEudora()) {\r
+                       nStep = 1;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+\r
+               if (CUtils::IsLotus123()) {\r
+                       // C-k: Shift-End, Control-x\r
+                       SdKduSu(VK_END);\r
+                       CdKduCu('X');\r
+                       return Reset(GOTO_HOOK);\r
+               }\r
+\r
+               CaptureClipboardData(0, CUtils::IsLotusNotes());\r
+\r
+               if (!CopyNextCharacter()) {\r
+//                     CUtils::Log(_T("Error: CopyNextCharacter"));\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+\r
+               nStep = 4;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 1:         // Get back character to confirm the cursor is at the TOF or not only for Macromedia Director.\r
+//             CUtils::Log(_T("C-k: 1"));\r
+               nStep = 0;\r
+               CaptureClipboardData();\r
+\r
+               if (!CopyBackCharacter()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+\r
+               nStep = 2;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 2:         // Confirm the cursor is at the TOF or not only for Macromedia Director.\r
+               {\r
+//                     CUtils::Log(_T("C-k: 2"));\r
+                       nStep = 0;\r
+                       Su();\r
+\r
+                       if (CUtils::IsTOF()) {\r
+                               bTopOfFile = TRUE;\r
+                       }\r
+\r
+                       // CopyBackCharacter move cursor right\r
+                       Kdu(VK_LEFT);\r
+                       RestoreClipboardData();\r
+\r
+                       nStep = 3;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       case 3:         // Get next character to confirm the cursor is at the EOF or not.\r
+//             CUtils::Log(_T("C-k: 3"));\r
+               nStep = 0;\r
+\r
+               if (CUtils::IsLotus123()) {\r
+                       // C-k: Shift-End, Control-x\r
+                       SdKduSu(VK_END);\r
+                       CdKduCu('X');\r
+                       return Reset(GOTO_HOOK);\r
+               }\r
+\r
+               CaptureClipboardData();\r
+\r
+               if (!CopyNextCharacter()) {\r
+//                     CUtils::Log(_T("Error: CopyNextCharacter"));\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+\r
+               nStep = 4;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 4:         // Cut line\r
+//             CUtils::Log(_T("C-k: 4"));\r
+               nStep = 0;\r
+               Su();\r
+\r
+               if ((CUtils::IsDirector()\r
+                 || CUtils::IsEudora())\r
+                && !bTopOfFile) {\r
+                       // CopyNextCharacter move cursor left\r
+                       Kdu(VK_RIGHT);\r
+               }\r
+\r
+               CUtils::GetClipboardText(&szClipboardText);\r
+//             CUtils::Log(_T("%x, %s"), szClipboardText.GetAt(0), szClipboardText);\r
+\r
+               if (szClipboardText.IsEmpty()) {        // EOF\r
+//                     CUtils::Log(_T("C-k: EOF"));\r
+                       if (CUtils::IsLotusWordPro()\r
+                        || CUtils::IsMicrosoftFrontPage()\r
+                        || CUtils::IsMicrosoftWord()) {\r
+                               SdKduSu(VK_RIGHT);\r
+                               Cut_();\r
+                               nStep = 5;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else if (CUtils::IsLotusNotes()) {\r
+                               Kdu(VK_END);\r
+                               ReleaseKey(VK_CONTROL); // Why is it needed?\r
+                               SdKduSu(VK_DOWN, VK_HOME);\r
+                               Copy_();\r
+                               DepressKey(VK_CONTROL); // Why is it needed?\r
+                               nStep = 5;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else {\r
+                               // default\r
+                               Kdu(VK_RIGHT);\r
+                               RestoreClipboardData();\r
+//                             CUtils::Log(_T("C-k: 4-1"));\r
+                               return Reset(GOTO_HOOK);\r
+                       }\r
+               }\r
+\r
+               if (szClipboardText.GetAt(0) != VK_RETURN) {\r
+//                     CUtils::Log(_T("C-k: szClipboardText.GetAt(0) != VK_RETURN"));\r
+                       if (CUtils::IsDirector()) {\r
+                               ReleaseKey(VK_CONTROL);\r
+                               SdKduSu(VK_END);\r
+                               Copy_();\r
+                               DepressKey(VK_CONTROL);\r
+                       } else if (CUtils::IseMemoPad()\r
+                                       || CUtils::IsHidemaru() // Hidemaru clears mark after copy.\r
+                                       || CUtils::IsOpenOffice()\r
+                                       || CUtils::IsTuruKameMail()) {\r
+                               SdKduSu(VK_END);\r
+                               Cut_();\r
+                       } else if (CUtils::IsLotusWordPro()\r
+                                       || CUtils::IsMicrosoftWord()) {\r
+                               SdKduSu(VK_END, VK_LEFT);\r
+                               Cut_();\r
+                       } else {\r
+                               SdKduSu(VK_END);\r
+                               Copy_();\r
+                       }\r
+               } else {        // EOL\r
+//                     CUtils::Log(_T("C-k: EOL"));\r
+                       if (CUtils::IsDirector()) {\r
+                               ReleaseKey(VK_CONTROL);\r
+                               SdKduSu(VK_RIGHT);\r
+                               Copy_();\r
+                               DepressKey(VK_CONTROL);\r
+                       } else if (CUtils::IsEclipse()\r
+                                       || CUtils::IsStoryEditor()) {\r
+                               SdKduSu(VK_RIGHT);\r
+                               Copy_();\r
+                       } else if (CUtils::IseMemoPad()\r
+                                       || CUtils::IsHidemaru() // Hidemaru clears mark after copy.\r
+                                       || CUtils::IsOpenOffice()\r
+                                       || CUtils::IsTuruKameMail()) {\r
+                               SdKduSu(VK_RIGHT);\r
+                               Cut_();\r
+                       } else {\r
+                               SdKduSu(VK_RIGHT);\r
+                               Copy_();\r
+                       }\r
+               }\r
+\r
+               nStep = 5;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 5:         // input return if XKeymacs not only line but also line feed code and set the kill-line data on the clipboard.\r
+//             CUtils::Log(_T("C-k: 5"));\r
+               nStep = 0;\r
+\r
+               if (1000 < nRepeat) {\r
+//                     CUtils::Log(_T("C-k: 5-1"));\r
+                       nStep = 6;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+\r
+//             CUtils::Log(_T("C-k: 5-1-1"));\r
+               Su();\r
+//             CUtils::Log(_T("C-k: 5-1-2"));\r
+               CaptureClipboardData(1, CUtils::IsLotusNotes());\r
+//             CUtils::Log(_T("C-k: 5-1-3"));\r
+\r
+//             if (m_oClipboardData.GetSize() < 1 || m_oClipboardData[0] == NULL) {\r
+////                   CUtils::Log(_T("C-k: 5-2"));\r
+//                     nStep = 6;\r
+//                     return Reset(GOTO_RECURSIVE);\r
+//             } else if (m_oClipboardData.GetSize() < 2 || m_oClipboardData[1] == NULL) {\r
+////                   CUtils::Log(_T("C-k: 5-3"));\r
+//                     nStep = 5;\r
+//                     return Reset(GOTO_RECURSIVE);\r
+//             }\r
+\r
+               if (CUtils::IseMemoPad()\r
+                || CUtils::IsHidemaru()        // Hidemaru clears mark after copy.\r
+                || CUtils::IsLotusWordPro()\r
+                || CUtils::IsMicrosoftWord ()\r
+                || CUtils::IsOpenOffice()\r
+                || CUtils::IsTuruKameMail()) {\r
+                       // do nothing\r
+//                     CUtils::Log(_T("C-k: 5-4"));\r
+               } else {\r
+                       // This changed will be required to avoid Thunderbird bug.\r
+                       // if (0 < FindReturnFromClipboardData(1) && !CUtils::IsExcel() && !CUtils::IsThunderbird()) {\r
+                       if (0 < FindReturnFromClipboardData(1) && !CUtils::IsExcel()) {\r
+//                             CUtils::Log(_T("C-k: 5-5"));\r
+                               SdKduSu(VK_LEFT);\r
+                               Copy_();\r
+                               nStep = 5;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else {\r
+                               Kdu(VK_DELETE);\r
+//                             CUtils::Log(_T("C-k: 5-6"));\r
+                       }\r
+               }\r
+\r
+               bKeepAllFormat = bAllFormat;\r
+               if (!bKeepAllFormat\r
+                && !m_oClipboardData[1]->IsAllMergeableFormat()) {\r
+//                     CUtils::Log(_T("C-k: 5-7"));\r
+                       bKeepAllFormat = TRUE;\r
+               }\r
+\r
+               if (bContinuous && !bKeepAllFormat) {\r
+//                     CUtils::Log(_T("C-k: 5-8"));\r
+                       *m_oClipboardData[0] += *m_oClipboardData[1];\r
+               } else {\r
+//                     CUtils::Log(_T("C-k: 5-9"));\r
+                       *m_oClipboardData[0] = *m_oClipboardData[1];\r
+               }\r
+               RestoreClipboardData(0);\r
+\r
+//             CUtils::Log(_T("C-k: 5-10"));\r
+               nStep = 6;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 6:         // add data into kill-ring\r
+//             CUtils::Log(_T("C-k: 6"));\r
+               nStep = 0;\r
+               Su();\r
+\r
+               if (bContinuous && bKeepAllFormat) {\r
+                       CXkeymacsDll::AddKillRing(FALSE);\r
+               } else {\r
+                       CXkeymacsDll::AddKillRing();\r
+               }\r
+               return Reset(GOTO_HOOK);\r
+               break;\r
+       }\r
+\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x u: C-/: C-_: Ctrl-Z\r
+int CCommands::Undo()\r
+{\r
+       if (CUtils::IsMicrosoftWord()) {\r
+               static BOOL bIsCtrlDown;\r
+               static BOOL bIsAltDown;\r
+               static BOOL bIsShiftDown;\r
+\r
+               bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+               bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+               bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+\r
+               if (!bIsCtrlDown) {\r
+                       DepressKey(VK_CONTROL);\r
+               }\r
+               if (bIsAltDown) {\r
+                       ReleaseKey(VK_MENU);\r
+               }\r
+               if (bIsShiftDown) {\r
+                       ReleaseKey(VK_SHIFT);\r
+               }\r
+\r
+               PostMessage(GetFocus(), WM_KEYDOWN, 'Z', 0);\r
+\r
+               if (bIsShiftDown) {\r
+                       DepressKey(VK_SHIFT);\r
+               }\r
+               if (bIsAltDown) {\r
+                       DepressKey(VK_MENU);\r
+               }\r
+               if (!bIsCtrlDown) {\r
+                       ReleaseKey(VK_CONTROL);\r
+               }\r
+\r
+       } else {\r
+               CdKduCu('Z');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x C-c: Alt-Space, Alt-C\r
+int CCommands::SaveBuffersKillEmacs()\r
+{\r
+       ClearNumericArgument();\r
+\r
+       HWND hWnd = GetForegroundWindow();\r
+       if (hWnd) {\r
+               OriginalWindowPosition_t *pOriginalWindowPosition = GetOriginalWindowPosition(hWnd);\r
+               if (pOriginalWindowPosition && pOriginalWindowPosition->bMax[ROLL_UP_UNROLL]) {\r
+                       RollUpUnroll();\r
+               }\r
+       }\r
+\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenu(CMD_CLOSE);\r
+       } else if (CUtils::IsExplorer()) {\r
+               if (!CUtils::IsXPorLater()) {\r
+                       ReleaseKey(VK_CONTROL);\r
+               }\r
+               AdKduAu(VK_F4);\r
+       } else if (CUtils::IsInternetExplorer()\r
+                       || CUtils::IsJavaW()) {\r
+               AdKduAu(VK_F4);\r
+       } else {\r
+               AdKduAu(VK_SPACE, 'C');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-z: Alt-Space, Alt-N\r
+int CCommands::IconifyOrDeiconifyFrame()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenu(CMD_MINIMIZE);\r
+       } else {\r
+               AdKduAu(VK_SPACE, 'N');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Restore()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenu(CMD_RESTORE);\r
+       } else {\r
+               AdKduAu(VK_SPACE, 'R');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Move()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenu(CMD_MOVE);\r
+       } else {\r
+               AdKduAu(VK_SPACE, 'M');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Size()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenu(CMD_SIZE);\r
+       } else {\r
+               AdKduAu(VK_SPACE, 'S');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Minimize()\r
+{\r
+       return IconifyOrDeiconifyFrame();\r
+}\r
+\r
+int CCommands::Maximize()\r
+{\r
+       ClearNumericArgument();\r
+\r
+       HWND hWnd = GetForegroundWindow();\r
+       if (!hWnd) {\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       WINDOWPLACEMENT wndpl = {sizeof(WINDOWPLACEMENT)};\r
+       if (!GetWindowPlacement(hWnd, &wndpl)) {\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       if (wndpl.showCmd == SW_SHOWMAXIMIZED) {\r
+               wndpl.showCmd = SW_RESTORE;\r
+       } else {\r
+               wndpl.showCmd = SW_SHOWMAXIMIZED;\r
+       }\r
+\r
+       SetWindowPlacement(hWnd, &wndpl);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+OriginalWindowPosition_t* CCommands::GetOriginalWindowPosition(HWND hWnd)\r
+{\r
+       const int nOriginalWindowPosition = sizeof(m_OriginalWindowPosition) / sizeof(m_OriginalWindowPosition[0]);\r
+\r
+       for (int i = 0; i < nOriginalWindowPosition; ++i) {\r
+               if (m_OriginalWindowPosition[i].hWnd == hWnd) {\r
+                       return &m_OriginalWindowPosition[i];\r
+               }\r
+       }\r
+\r
+       for (int j = 0; j < nOriginalWindowPosition; ++j) {\r
+               if (m_OriginalWindowPosition[j].hWnd == 0) {\r
+                       m_OriginalWindowPosition[j].hWnd = hWnd;\r
+                       memset(&m_OriginalWindowPosition[(j + 1) % nOriginalWindowPosition], 0, sizeof(m_OriginalWindowPosition[0]));\r
+                       return &m_OriginalWindowPosition[j];\r
+               }\r
+       }\r
+\r
+       ASSERT(0);\r
+       return NULL;\r
+}\r
+\r
+int CCommands::Maximize(MAXIMIZE_DIRECTION direction)\r
+{\r
+       ClearNumericArgument();\r
+\r
+       HWND hWnd = GetForegroundWindow();\r
+       if (!hWnd) {\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       RECT workarea = {'\0'};\r
+       if (!SystemParametersInfo(SPI_GETWORKAREA, 0, &workarea, 0)) {\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       RECT window = {'\0'};\r
+       if (!GetWindowRect(hWnd, &window)) {\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       OriginalWindowPosition_t *pOriginalWindowPosition = GetOriginalWindowPosition(hWnd);\r
+       if (!pOriginalWindowPosition) {\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       int X = window.left;\r
+       int Y = window.top;\r
+       int nWidth = window.right - window.left;\r
+       int nHeight = window.bottom - window.top;\r
+\r
+       switch (direction) {\r
+       case VERTICAL:\r
+               if (pOriginalWindowPosition->bMax[direction]) {\r
+                       Y = pOriginalWindowPosition->nOriginalY;\r
+                       nHeight = pOriginalWindowPosition->nOriginalHeight;\r
+               } else {\r
+                       pOriginalWindowPosition->nOriginalY = Y;\r
+                       pOriginalWindowPosition->nOriginalHeight = nHeight;\r
+\r
+                       Y = workarea.top;\r
+                       nHeight = workarea.bottom - workarea.top;\r
+               }\r
+               break;\r
+       case HORIZONTAL:\r
+               if (pOriginalWindowPosition->bMax[direction]) {\r
+                       X = pOriginalWindowPosition->nOriginalX;\r
+                       nWidth = pOriginalWindowPosition->nOriginalWidth;\r
+               } else {\r
+                       pOriginalWindowPosition->nOriginalX = X;\r
+                       pOriginalWindowPosition->nOriginalWidth = nWidth;\r
+\r
+                       X = workarea.left;\r
+                       nWidth = workarea.right - workarea.left;\r
+               }\r
+               break;\r
+       case ROLL_UP_UNROLL:\r
+               if (pOriginalWindowPosition->bMax[direction]) {\r
+                       nHeight = pOriginalWindowPosition->nOriginalHeight;\r
+               } else {\r
+                       pOriginalWindowPosition->nOriginalHeight = nHeight;\r
+\r
+                       nHeight = 0x15;\r
+               }\r
+               break;\r
+       default:\r
+               ASSERT(0);\r
+               break;\r
+       }\r
+\r
+       MoveWindow(hWnd, X, Y, nWidth, nHeight, TRUE);\r
+       pOriginalWindowPosition->bMax[direction] = !pOriginalWindowPosition->bMax[direction];\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::MaximizeVertically()\r
+{\r
+       return Maximize(VERTICAL);\r
+}\r
+\r
+int CCommands::MaximizeHorizontally()\r
+{\r
+       return Maximize(HORIZONTAL);\r
+}\r
+\r
+// C-Space: \r
+int CCommands::SetMarkCommand()\r
+{\r
+       ClearNumericArgument();\r
+       if (m_bSetMark) {\r
+               DeactivateMark();\r
+       }\r
+       m_bSetMark = TRUE;\r
+\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenuEdit(CMD_MARK);\r
+       }\r
+\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-g: Keyboard quit\r
+int CCommands::KeyboardQuit()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsFindDialog()) {\r
+               Kdu(VK_ESCAPE);\r
+       }\r
+       if (m_bSetMark) {\r
+               m_bSetMark = FALSE;\r
+               DeactivateMark();\r
+       }\r
+       SetTemporarilyDisableXKeymacs(FALSE);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+DWORD CCommands::ClickCaret()\r
+{\r
+       HWND hWnd = GetFocus();\r
+\r
+       POINT CaretPos = {'\0'};\r
+       if (!GetCaretPos(&CaretPos)) {\r
+               return GetLastError();\r
+       }\r
+//     CUtils::Log(_T("client: x = %d, y = %d"), CaretPos.x, CaretPos.y);\r
+\r
+       if (!ClientToScreen(hWnd, &CaretPos)) {\r
+               return GetLastError();\r
+       }\r
+//     CUtils::Log(_T("screen: x = %d, y = %d"), CaretPos.x, CaretPos.y);\r
+\r
+       POINT Delta = {0, 1};\r
+       if (CUtils::IsSakuraEditor()) {\r
+               Delta.x = 1;\r
+               Delta.y = 29;   // OK: 29-42 NG: 28, 43\r
+       }\r
+\r
+       const POINT clickPoint = {CaretPos.x + Delta.x, CaretPos.y + Delta.y};\r
+       return Click(&clickPoint);\r
+}\r
+\r
+DWORD CCommands::DeactivateMark()\r
+{\r
+       if (CUtils::IsOpenOffice()\r
+        || CUtils::IsVisualBasicEditor()) {\r
+               // GetCaretPos always returen (x,y) = (0,0) on OpenOffice, so ...\r
+               // GetCaretPos always returen (x,y) = (-2199,*) on M$ Excel VBE, so ...\r
+               Kdu(VK_ESCAPE);\r
+               return ERROR_SUCCESS;   // i.e. return 0;\r
+       }\r
+       if (CUtils::IsFlash()\r
+        || CUtils::IsInternetExplorer()\r
+        || CUtils::IsMicrosoftPowerPoint()\r
+        || CUtils::IsMicrosoftWord()\r
+        || CUtils::IsSleipnir()\r
+        || CUtils::IsThunderbird()) {\r
+               // GetCaretPos always returen (x,y) = (0,0) on M$ Word and Thunderbird, so ...\r
+               // GetCaretPos always returen start point on IE (and Sleipnir that uses IE), so ...\r
+               Kdu(VK_RIGHT);\r
+               return ERROR_SUCCESS;   // i.e. return 0;\r
+       }\r
+       if (CUtils::IsDirector()) {\r
+               // GetCaretPos always returen (x,y) = (0,0) on Macromedia Director, so ...\r
+               Kdu(VK_RIGHT, VK_LEFT);\r
+               return ERROR_SUCCESS;   // i.e. return 0;\r
+       }\r
+       if (CUtils::IsExplorer()) {\r
+               AdKduAu('E', 'A');\r
+               AdKduAu('E', 'I');\r
+               return ERROR_SUCCESS;   // i.e. return 0;\r
+       }\r
+       if (CUtils::IsVisualStudioDotNet()) {   // Ctrl + Click select a word on Visual Studio .NET\r
+               ReleaseKey(VK_CONTROL);\r
+               return ClickCaret();\r
+       }\r
+\r
+       return ClickCaret();\r
+}\r
+\r
+// C-x C-f: Alt-F, Alt-O\r
+int CCommands::FindFile()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsFlash()\r
+        || CUtils::IsSleipnir()) {\r
+               CdKduCu('O');\r
+       } else if (CUtils::IsVisualStudioDotNet()) {\r
+               AdKduAu('F', 'O', 'F');\r
+       } else {\r
+               AdKduAu('F', 'O');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-i: Tab\r
+int CCommands::TabToTabStop()\r
+{\r
+       ClearNumericArgument();\r
+       if (m_bSetMark) {\r
+               m_bSetMark = FALSE;\r
+       }\r
+       Kdu(VK_TAB);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-m: Enter\r
+int CCommands::Newline()\r
+{\r
+       Kdu(VK_RETURN);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x h: Ctrl-End, Ctrl-Shift-Home\r
+int CCommands::MarkWholeBuffer()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenuEdit(CMD_SELECT_ALL);\r
+       } else if (CUtils::IsDreamweaver()\r
+                       || CUtils::IsFireworks()\r
+                       || CUtils::IsFlash()\r
+                       || CUtils::IsIllustrator()\r
+                       || CUtils::IsPaint()\r
+                       || CUtils::IsPhotoshop()) {\r
+               CdKduCu('A');\r
+       } else if (CUtils::IsExplorer()\r
+                       || CUtils::IsReget()) {\r
+               Kdu(VK_END);\r
+               m_bSetMark = TRUE;\r
+               return Reset(MoveCaret(VK_HOME));\r
+       } else {\r
+               CdKduCu(VK_END);\r
+               m_bSetMark = TRUE;\r
+               return Reset(MoveCaret(VK_HOME, TRUE));\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x C-p:\r
+int CCommands::MarkPage()\r
+{\r
+       return MarkWholeBuffer();\r
+}\r
+\r
+// C-x C-s: Alt-F, Alt-S\r
+int CCommands::SaveBuffer()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsFlash()\r
+        || CUtils::IsSleipnir()\r
+        || CUtils::IsThunderbird()) {\r
+               CdKduCu('S');\r
+               return Reset(GOTO_HOOK);\r
+       } else {\r
+               // default\r
+               AdKduAu('F', 'S');\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+}\r
+\r
+// C-v: Page Down\r
+int CCommands::ScrollUp()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return ScrollDown();\r
+       }\r
+\r
+       if (m_bDefaultNumericArgument) {\r
+               return Reset(MoveCaret(VK_NEXT));\r
+       } else {\r
+               while (m_nNumericArgument--) {\r
+                       SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
+               }\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// M-v: Page Up\r
+int CCommands::ScrollDown()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               m_bNegativeNumericArgument = FALSE;\r
+               return ScrollUp();\r
+       }\r
+\r
+       if (m_bDefaultNumericArgument) {\r
+               if (CUtils::IsFirefox()\r
+                || CUtils::IsVisualCpp()) {\r
+                       CdKduCu(0);     // dummy to clear Alt effect.\r
+               }\r
+               return Reset(MoveCaret(VK_PRIOR));\r
+       } else {\r
+               while (m_nNumericArgument--) {\r
+                       SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
+               }\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+BOOL CCommands::bC_()\r
+{\r
+       return m_bC_;\r
+}\r
+\r
+void CCommands::bC_(BOOL b)\r
+{\r
+       m_bC_ = b;\r
+       CXkeymacsDll::ModifyShell_NotifyIcon(CTRL_ICON, m_bC_);\r
+}\r
+\r
+BOOL CCommands::bC_x()\r
+{\r
+       return m_bC_x;\r
+}\r
+\r
+void CCommands::bC_x(BOOL b)\r
+{\r
+       m_bC_x = b;\r
+       CXkeymacsDll::ModifyShell_NotifyIcon(CX_ICON, m_bC_x);\r
+}\r
+\r
+BOOL CCommands::bM_x()\r
+{\r
+       return m_bM_x;\r
+}\r
+\r
+void CCommands::bM_x(const BOOL b)\r
+{\r
+       m_bM_x = b;\r
+\r
+       if (b) {\r
+               CXkeymacsDll::ModifyM_xTip("");\r
+       } else {\r
+               CXkeymacsDll::ModifyM_xTip(NULL);\r
+       }\r
+}\r
+\r
+// C-x: only set flag\r
+int CCommands::C_x()\r
+{\r
+       if (CXkeymacsDll::GetEnableCUA() && m_bSetMark) {\r
+               Cut();\r
+       } else {\r
+               bC_x(TRUE);\r
+       }\r
+       return Reset(GOTO_HOOKX);\r
+}\r
+\r
+// C-x C-w: Alt-F, Alt-A\r
+int CCommands::WriteFile()\r
+{\r
+       ClearNumericArgument();\r
+       if (CUtils::IsSleipnir()) {\r
+               CdKduCu('S');\r
+       } else if (CUtils::IsFlash()) {\r
+               CdSdKduSuCu('S');\r
+       } else {\r
+               AdKduAu('F', 'A');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Paste()\r
+{\r
+       ClearNumericArgument();\r
+       m_bSetMark = FALSE;\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenuEdit(CMD_PASTE);\r
+       } else {\r
+               CdKduCu('V');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-w: Ctrl-X\r
+int CCommands::KillRegion()\r
+{\r
+       static int nStep = 0;\r
+       switch (nStep) {\r
+       case 0:\r
+               m_bSetMark = FALSE;\r
+               ClearNumericArgument();\r
+               CdKduCu('X');\r
+               if (CUtils::IsExplorer()) {\r
+                       return Reset(GOTO_HOOK);\r
+               }\r
+               nStep = 1;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 1:\r
+               nStep = 0;\r
+               CXkeymacsDll::AddKillRing();\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+       // dummy\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// M-w: Ctrl-C\r
+int CCommands::KillRingSave()\r
+{\r
+       static int nStep = 0;\r
+       switch (nStep) {\r
+       case 0:\r
+               ClearNumericArgument();\r
+               m_bSetMark = FALSE;\r
+               if (CUtils::IsConsole()) {\r
+                       SystemMenuEdit(CMD_COPY);\r
+                       return Reset(GOTO_HOOK);\r
+               } else if (CUtils::IsMicrosoftPowerPoint()) {   // PowerPoint did not want to deactivate-mark. Temporary code?\r
+                       CdKduCu('X');\r
+               } else {\r
+                       CdKduCu('C');\r
+               }\r
+               if (CUtils::IsExplorer()) {\r
+                       return Reset(GOTO_HOOK);\r
+               }\r
+               nStep = 1;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 1:\r
+               nStep = 0;\r
+               CXkeymacsDll::AddKillRing();\r
+               if (CUtils::IsMicrosoftPowerPoint()) {  // Because DeactivateMark move object like graph.\r
+                       CdKduCu('V');\r
+               } else {\r
+                       DeactivateMark();\r
+               }\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+       // dummy\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-y: Ctrl-V\r
+int CCommands::Yank()\r
+{\r
+       m_bSetMark = FALSE;\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenuEdit(CMD_PASTE);\r
+       } else {\r
+               static CClipboardSnap* pSnap = NULL;\r
+               if (!m_bDefaultNumericArgument) {\r
+                       DecreaseNumericArgument();\r
+                       CXkeymacsDll::IncreaseKillRingIndex(m_nNumericArgument);\r
+                       pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
+               } else if (pSnap) {\r
+                       pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
+               } else {\r
+                       if (CUtils::IsExcel() && m_LastKillCommand == KillRegion) {\r
+                               // do nothing to work C-w not Copy but Cut\r
+                       } else if (CUtils::IsLotusNotes() && (m_LastKillCommand == KillRegion || m_LastKillCommand == KillRingSave)) {\r
+                               // do nothing\r
+                       } else {\r
+                               pSnap = CXkeymacsDll::GetKillRing(pSnap, FALSE);\r
+                       }\r
+               }\r
+               CdKduCu('V');\r
+               if (pSnap) {\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// M-y: yank-pop\r
+int CCommands::YankPop()\r
+{\r
+       ClearNumericArgument();\r
+\r
+       if (m_LastCommand == YankPop\r
+        || m_LastCommand == Yank) {\r
+               static CClipboardSnap* pSnap = NULL;\r
+               if (!pSnap) {\r
+                       CClipboardSnap* pOldSnap = NULL;\r
+                       pOldSnap = CXkeymacsDll::GetKillRing(pOldSnap);\r
+                       if (pOldSnap) {\r
+                               for (int i = 0; i < pOldSnap->GetCount(); ++i) {\r
+                                       CdKduCu('Z');\r
+                               }\r
+                       } else {\r
+                               CdKduCu('Z');\r
+                       }\r
+                       CXkeymacsDll::IncreaseKillRingIndex();\r
+               }\r
+               pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
+               CdKduCu('V');\r
+               if (pSnap) {\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       }\r
+\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// M-!: cmd.exe/command.com\r
+int CCommands::ShellCommand()\r
+{\r
+       if (!CUtils::Run(_tgetenv(_T("XKEYMACS_SHELL")))) {\r
+               CUtils::Run(_tgetenv(_T("COMSPEC")));\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Ignore()\r
+{\r
+       Reset();        // If you delete this line, Ignore() works as Enable/Disable XKeymacs only on Release build. Why?\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+void CCommands::bM_(BOOL b)\r
+{\r
+       m_bM_ = b;\r
+       CXkeymacsDll::ModifyShell_NotifyIcon(META_ICON, m_bM_);\r
+}\r
+\r
+BOOL CCommands::bM_()\r
+{\r
+       return m_bM_;\r
+}\r
+\r
+// C-[\r
+int CCommands::Meta()\r
+{\r
+       bM_(TRUE);\r
+       return Reset(GOTO_HOOKX);\r
+}\r
+\r
+// Esc\r
+int CCommands::MetaEscape()\r
+{\r
+       Meta();\r
+       return Reset(GOTO_DO_NOTHING);\r
+}\r
+\r
+// Alt\r
+int CCommands::MetaAlt()\r
+{\r
+       return Reset(GOTO_DO_NOTHING);\r
+}\r
+\r
+// C-0\r
+int CCommands::NumericArgument0()\r
+{\r
+       return NumericArgument(0);\r
+}\r
+\r
+// C-1\r
+int CCommands::NumericArgument1()\r
+{\r
+       return NumericArgument(1);\r
+}\r
+\r
+// C-2\r
+int CCommands::NumericArgument2()\r
+{\r
+       return NumericArgument(2);\r
+}\r
+\r
+// C-3\r
+int CCommands::NumericArgument3()\r
+{\r
+       return NumericArgument(3);\r
+}\r
+\r
+// C-4\r
+int CCommands::NumericArgument4()\r
+{\r
+       return NumericArgument(4);\r
+}\r
+\r
+// C-5\r
+int CCommands::NumericArgument5()\r
+{\r
+       return NumericArgument(5);\r
+}\r
+\r
+// C-6\r
+int CCommands::NumericArgument6()\r
+{\r
+       return NumericArgument(6);\r
+}\r
+\r
+// C-7\r
+int CCommands::NumericArgument7()\r
+{\r
+       return NumericArgument(7);\r
+}\r
+\r
+// C-8\r
+int CCommands::NumericArgument8()\r
+{\r
+       return NumericArgument(8);\r
+}\r
+\r
+// C-9\r
+int CCommands::NumericArgument9()\r
+{\r
+       return NumericArgument(9);\r
+}\r
+\r
+// C-#\r
+int CCommands::NumericArgument(int n)\r
+{\r
+       if (m_bDefaultNumericArgument) {\r
+               m_nNumericArgument = n;\r
+               m_bDefaultNumericArgument = FALSE;\r
+       } else {\r
+               m_nNumericArgument = m_nNumericArgument * 10 + n;\r
+       }\r
+       return Reset(GOTO_HOOK0_9);\r
+}\r
+\r
+// C--, M--\r
+int CCommands::NumericArgumentMinus()\r
+{\r
+       m_bNegativeNumericArgument = !m_bNegativeNumericArgument;\r
+       return Reset(GOTO_HOOK0_9);\r
+}\r
+\r
+// C-u\r
+int CCommands::UniversalArgument()\r
+{\r
+       if (m_bC_u) {\r
+               m_nNumericArgument *= 4;\r
+       } else {\r
+               m_nNumericArgument = 4;\r
+               m_bC_u = TRUE;\r
+       }\r
+       return Reset(GOTO_HOOKX);\r
+}\r
+\r
+// change function name and member variable name like bUniversalArgument()\r
+BOOL CCommands::bC_u()\r
+{\r
+       return m_bC_u;\r
+}\r
+\r
+void CCommands::bC_u(BOOL b)\r
+{\r
+       m_bC_u = b;\r
+}\r
+\r
+int CCommands::Repeat(BYTE bVk)\r
+{\r
+       if (m_bDefaultNumericArgument) {\r
+               return Reset(GOTO_DO_NOTHING);\r
+       } else {\r
+               CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+}\r
+\r
+// C-l: Recenter\r
+int CCommands::Recenter()\r
+{\r
+       if (CUtils::IsBecky()) {\r
+               static int nStep = 0;\r
+               RECT ClientRect = {'\0'};\r
+               GetClientRect(GetFocus(), &ClientRect);\r
+               static int gap = INT_MAX;\r
+\r
+               static POINT CaretPos = {'\0'};\r
+               GetCaretPos(&CaretPos);\r
+\r
+               switch (nStep) {\r
+               case 0:\r
+                       nStep = 0;      // omaginai\r
+                       if (CaretPos.y < ClientRect.bottom / 2) {\r
+                               SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
+                       } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
+                               SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
+                       } else {\r
+                               gap = INT_MAX;\r
+                               return Reset(GOTO_HOOK);\r
+                               break;\r
+                       }\r
+\r
+                       Kdu(VK_DOWN);\r
+                       nStep = 1;\r
+                       return Reset(GOTO_RECURSIVE);\r
+\r
+               case 1:\r
+                       nStep = 0;\r
+                       // When a client screen can display 2n lines, the center line is (n + 1)th line.\r
+                       int newgap = CaretPos.y - ClientRect.bottom / 2;\r
+                       if (fabs((double)gap) <= fabs((double)newgap)) {\r
+                               if ((fabs((double)gap) == fabs((double)newgap)) && (gap != newgap) && newgap < 0) {\r
+                                       SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
+                               }\r
+                               gap = INT_MAX;\r
+                               return Reset(GOTO_HOOK);\r
+                               break;\r
+                       }\r
+\r
+                       gap = newgap;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       } else if (CUtils::IsMicrosoftWord()\r
+                       || CUtils::IsThunderbird()) {\r
+               RECT ClientRect = {'\0'};\r
+               GetClientRect(GetFocus(), &ClientRect);\r
+//             CUtils::Log(_T("top = %d, bottom = %d, left = %d, right = %d"), ClientRect.top, ClientRect.bottom, ClientRect.left, ClientRect.right);\r
+\r
+               POINT CaretPos = {'\0'};\r
+               GetCaretPos(&CaretPos);\r
+\r
+               static const int LENGTH_PER_SCROLL = 32;\r
+\r
+               if (CaretPos.y < ClientRect.bottom / 2) {\r
+                       VScroll(SB_LINEUP, (ClientRect.bottom / 2 - CaretPos.y) / (LENGTH_PER_SCROLL / 2) + 1);\r
+               } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
+                       VScroll(SB_LINEDOWN, (CaretPos.y - ClientRect.bottom / 2) / (LENGTH_PER_SCROLL / 2));\r
+               }\r
+\r
+               return Reset(GOTO_HOOK);\r
+       } else {\r
+               RECT ClientRect = {'\0'};\r
+               GetClientRect(GetFocus(), &ClientRect);\r
+               int gap = INT_MAX;\r
+\r
+//             CUtils::Log(_T("top = %d, bottom = %d, left = %d, right = %d"), ClientRect.top, ClientRect.bottom, ClientRect.left, ClientRect.right);\r
+\r
+               for (;;) {\r
+                       POINT CaretPos = {'\0'};\r
+                       GetCaretPos(&CaretPos);\r
+\r
+                       if (CaretPos.y < ClientRect.bottom / 2) {\r
+                               VScroll(SB_LINEUP);\r
+                       } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
+                               VScroll(SB_LINEDOWN);\r
+                       } else {\r
+                               break;\r
+                       }\r
+\r
+                       // When a client screen can display 2n lines, the center line is (n + 1)th line.\r
+                       int newgap = CaretPos.y - ClientRect.bottom / 2;\r
+                       if (fabs((double)gap) <= fabs((double)newgap)) {\r
+                               if ((fabs((double)gap) == fabs((double)newgap)) && (gap != newgap) && newgap < 0) {\r
+                                       VScroll(SB_LINEUP);\r
+                               }\r
+                               break;\r
+                       }\r
+                       gap = newgap;\r
+               }\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-t: Shift-Left, Shift-Delete, Right Shift-Insert, if the cursor is not at EOL (is End Of Line)\r
+//             Left, Shift-Right, Shift-Delete, Left, Shift-Insert, Right, if the cursor is at EOL\r
+int CCommands::TransposeChars()\r
+{\r
+       ClearNumericArgument(); // tmp\r
+\r
+       // Do not try to do these command at once.\r
+       // Clipboard has old data till you go out this function.\r
+       static int nStep = 0;\r
+       switch (nStep) {\r
+       case 0:         // Clear Selection\r
+               if (m_bSetMark) {\r
+                       m_bSetMark = FALSE;\r
+                       Kdu(VK_RIGHT, VK_LEFT);\r
+                       nStep = 1;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               } else {\r
+                       // Do nothing. Go to case 1:\r
+               }\r
+       case 1:         // Get back character to confirm the cursor is at TOF or not.\r
+               nStep = 0;\r
+               CaptureClipboardData();\r
+\r
+               // simple version\r
+               if (CUtils::IsLotus123()) {\r
+                       // C-t: Left, Shift-Right, Shift-Delete, Left, Shift-Insert, Right\r
+                       Kdu(VK_LEFT);\r
+                       SdKduSu(VK_RIGHT, VK_DELETE);\r
+                       Kdu(VK_LEFT);\r
+                       SdKduSu(VK_INSERT);\r
+                       Kdu(VK_RIGHT);\r
+                       nStep = 7;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+\r
+               if (!CopyBackCharacter()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+\r
+               nStep = 2;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 2:         // Get next character to confirm the cursor is at the EOF or not.\r
+               {\r
+                       nStep = 0;\r
+                       Su();\r
+\r
+                       if (CUtils::IsTOF()) {\r
+                               Kdu(VK_LEFT);\r
+                               nStep = 7;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       }\r
+\r
+                       if (CUtils::IsDirector()) {\r
+                               // CopyBackCharacter move cursor right\r
+                               Kdu(VK_LEFT);\r
+                               ReleaseKey(VK_CONTROL);\r
+                       }\r
+\r
+                       if (CUtils::IsEudora()) {\r
+                               // CopyBackCharacter move cursor right\r
+                               Kdu(VK_LEFT);\r
+                       }\r
+\r
+                       if (!CopyNextCharacter()) {\r
+                               nStep = 7;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       }\r
+\r
+                       if (CUtils::IsDirector()) {\r
+                               DepressKey(VK_CONTROL);\r
+                       }\r
+\r
+                       nStep = 3;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       case 3:         // Cut Left Character\r
+               {\r
+                       nStep = 0;\r
+                       Su();\r
+\r
+                       CString szClipboardText;\r
+                       CUtils::GetClipboardText(&szClipboardText);\r
+//                     CUtils::Log(_T("%x, %d, %s"), szClipboardText.GetAt(0), szClipboardText.GetLength(), szClipboardText);\r
+\r
+                       if (CUtils::IsDirector()\r
+                        ||     CUtils::IsEudora()) {\r
+                               // CopyNextCharacter move cursor left\r
+                               Kdu(VK_RIGHT);\r
+                       }\r
+\r
+                       if (!szClipboardText.IsEmpty()\r
+                        && szClipboardText.GetAt(0) != VK_RETURN) {\r
+                               if (CUtils::IseMemoPad()\r
+                                || CUtils::IsFlash()\r
+                                || CUtils::IsK2Editor()\r
+                                || CUtils::IsShuriken()) {\r
+                                       SdKduSu(VK_LEFT);\r
+                                       CdKduCu('X');\r
+                               } else if (CUtils::IsDirector()) {\r
+                                       ReleaseKey(VK_CONTROL);\r
+                                       SdKduSu(VK_LEFT);\r
+                                       CdKduCu('X');\r
+                                       Kdu(VK_RIGHT);\r
+                                       DepressKey(VK_CONTROL);\r
+                               } else {\r
+                                       SdKduSu(VK_LEFT, VK_DELETE);\r
+                               }\r
+                               nStep = 4;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else {\r
+                               if (szClipboardText.IsEmpty()) {        // EOF\r
+                                       if (CUtils::IsLotusNotes()\r
+                                        || CUtils::IsLotusWordPro()\r
+                                        || CUtils::IsMicrosoftFrontPage()\r
+                                        || CUtils::IsMicrosoftWord()) {\r
+                                               // These applications say "EOL is EOF".\r
+                                               Kdu(VK_END);\r
+                                       } else {\r
+                                               // default\r
+                                               Kdu(VK_RIGHT);\r
+                                       }\r
+                               }\r
+\r
+                               nStep = 5;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       }\r
+\r
+                       nStep = 7;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       case 4:         // Paste the cut character\r
+               nStep = 0;\r
+               Su();\r
+               Kdu(VK_RIGHT);\r
+               if (CUtils::IsDirector()\r
+                || CUtils::IseMemoPad()\r
+                || CUtils::IsFlash()\r
+                || CUtils::IsK2Editor()\r
+                || CUtils::IsShuriken()) {\r
+                       CdKduCu('V');\r
+               } else {\r
+                       SdKduSu(VK_INSERT);\r
+               }\r
+               nStep = 7;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 5:         // Cut character at the EOF.\r
+               nStep = 0;\r
+               if (CUtils::IsDirector()\r
+                || CUtils::IseMemoPad()\r
+                || CUtils::IsFlash()\r
+                || CUtils::IsK2Editor()\r
+                || CUtils::IsShuriken()) {\r
+                       SdKduSu(VK_LEFT);\r
+                       CdKduCu('X');\r
+               } else {\r
+                       SdKduSu(VK_LEFT, VK_DELETE);\r
+               }\r
+               nStep = 6;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 6:         // Paste the cut character near the EOF.\r
+               nStep = 0;\r
+               Su();\r
+               Kdu(VK_LEFT);\r
+               if (CUtils::IsDirector()\r
+                || CUtils::IseMemoPad()\r
+                || CUtils::IsFlash()\r
+                || CUtils::IsK2Editor()\r
+                || CUtils::IsShuriken()) {\r
+                       DepressKey(VK_CONTROL);         // Why is this code needed?\r
+                       CdKduCu('V');\r
+               } else {\r
+                       SdKduSu(VK_INSERT);\r
+               }\r
+               Kdu(VK_RIGHT);\r
+               nStep = 7;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 7:         // Set the original data on the clipboard.\r
+               nStep = 0;\r
+               Su();\r
+               RestoreClipboardData();\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+void CCommands::Cut_()\r
+{\r
+       CdKduCu('X');\r
+}\r
+\r
+int CCommands::Cut()\r
+{\r
+       ClearNumericArgument();\r
+       m_bSetMark = FALSE;\r
+       Cut_();\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+void CCommands::Copy_()\r
+{\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenuEdit(CMD_COPY);\r
+       } else if (CUtils::IsEclipse()\r
+                       || CUtils::IsStoryEditor()) {\r
+               CdKduCu(VK_INSERT);\r
+       } else {\r
+               CdKduCu('C');\r
+       }\r
+}\r
+\r
+int CCommands::Copy()\r
+{\r
+       ClearNumericArgument();\r
+       m_bSetMark = FALSE;\r
+       Copy_();\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// Copy next character of the cursor if the caret is NOT at end of the file\r
+// Move the caret to left if caret is at end of the file\r
+BOOL CCommands::CopyNextCharacter()\r
+{\r
+       if (!CUtils::OpenClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!EmptyClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!CloseClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+\r
+       SdKduSu(VK_RIGHT);\r
+       Copy_();\r
+       Kdu(VK_LEFT);\r
+\r
+       return TRUE;\r
+}\r
+\r
+BOOL CCommands::CopyBackCharacter()\r
+{\r
+       if (!CUtils::OpenClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!EmptyClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!CloseClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+\r
+       SdKduSu(VK_LEFT);\r
+       Copy_();\r
+       Kdu(VK_RIGHT);\r
+\r
+       return TRUE;\r
+}\r
+\r
+BOOL CCommands::CopyPreviousLine()\r
+{\r
+       if (!CUtils::OpenClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!EmptyClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!CloseClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+\r
+       SdKduSu(VK_UP);\r
+       Copy_();\r
+\r
+       return TRUE;\r
+}\r
+\r
+BOOL CCommands::CopyCurrentLine()\r
+{\r
+       if (!CUtils::OpenClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!EmptyClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!CloseClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+\r
+       SdKduSu(VK_HOME);\r
+       Copy_();\r
+\r
+       return TRUE;\r
+}\r
+\r
+void CCommands::DecreaseNumericArgument()\r
+{\r
+       if (m_bNegativeNumericArgument) {\r
+               ++m_nNumericArgument;\r
+       } else {\r
+               if (m_nNumericArgument == 0) {\r
+                       ++m_nNumericArgument;\r
+                       m_bNegativeNumericArgument = TRUE;\r
+               } else {\r
+                       --m_nNumericArgument;\r
+               }\r
+       }\r
+}\r
+\r
+void CCommands::ClearNumericArgument()\r
+{\r
+       m_bDefaultNumericArgument = TRUE;\r
+       m_nNumericArgument = 1;\r
+       m_bNegativeNumericArgument = FALSE;\r
+}\r
+\r
+void CCommands::Reset()\r
+{\r
+       Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Reset(int rc)\r
+{\r
+       switch(rc) {\r
+       case GOTO_HOOK:\r
+               ClearNumericArgument();\r
+               m_bC_u = FALSE;\r
+       case GOTO_HOOK0_9:\r
+               bC_(FALSE);\r
+               bC_x(FALSE);\r
+               bM_(FALSE);\r
+               bM_x(FALSE);\r
+       case GOTO_HOOKX:\r
+               break;\r
+\r
+       case GOTO_RECURSIVE:\r
+               break;\r
+\r
+       case GOTO_DO_NOTHING:\r
+               break;\r
+\r
+       default:\r
+               break;\r
+       }\r
+       return rc;\r
+}\r
+\r
+// C-q\r
+int CCommands::EnableOrDisableXKeymacs()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;       // If there is not this 2 line, EnableOrDisableXKeymacs, EnableXKeymacs and DisableXKeymacs has same function pointer.\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::EnableXKeymacs()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::DisableXKeymacs()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::GetNumericArgument()\r
+{\r
+       return m_nNumericArgument;\r
+}\r
+\r
+// C-r\r
+int CCommands::IsearchBackward()\r
+{\r
+       return Search(BACKWARD);\r
+}\r
+\r
+// C-s\r
+int CCommands::IsearchForward()\r
+{\r
+       return Search(FORWARD);\r
+}\r
+\r
+void CCommands::OpenFindDialog()\r
+{\r
+       if (CUtils::IsAutla()\r
+        || CUtils::IsBorlandCppBuilder()\r
+        || CUtils::IsCodeWarrior()\r
+        || CUtils::IsDana()\r
+        || CUtils::IseMemoPad()\r
+        || CUtils::IsJmEditor()\r
+        || CUtils::IsK2Editor()\r
+        || (CUtils::IsNotepad() && CUtils::IsNTor9x())\r
+        || CUtils::IsOedit()\r
+        || CUtils::IsOpenJane()\r
+        || CUtils::IsPHPEditor()\r
+        || CUtils::IsStoryEditor()\r
+        || CUtils::IsTeraPad()) {\r
+               AdKduAu('S', 'F');\r
+       } else if (CUtils::IsConsole()) {\r
+               SystemMenuEdit(CMD_FIND);\r
+       } else if (CUtils::IsSakuraEditor()) {\r
+               AdKduAu('S', VK_RETURN);\r
+       } else if (CUtils::IsNami2000()) {\r
+               AdKduAu('D', 'F');\r
+       } else if (CUtils::IsVisualStudioDotNet()) {\r
+               AdKduAu('E', 'F', 'F');\r
+       } else if (CUtils::IsDirector()) {\r
+               AdKduAu('E', 'F', 'T');\r
+       } else if (CUtils::IsAdobeReader()) {\r
+               AdKduAu('E', 'S');\r
+       } else if (CUtils::IsDWFM()\r
+                       || CUtils::IsEggExplorer()\r
+                       || CUtils::IsExplorer()\r
+                       || CUtils::IsOutlookExpress()) {\r
+               Kdu(VK_F3);\r
+       } else if (CUtils::IsHidemaru()\r
+                       || CUtils::IsLunascape()\r
+                       || CUtils::IsMicrosoftPowerPoint()\r
+                       || CUtils::IsMozilla()\r
+                       || CUtils::IsNetscape()\r
+                       || CUtils::IsOpera()\r
+                       || CUtils::IsSleipnir()) {\r
+               CdKduCu('F');\r
+       } else if (CUtils::IsDreamweaver()\r
+                       || CUtils::IsezHTML()\r
+                       || CUtils::IsFlash()) {\r
+               DepressKey(VK_CONTROL);         // Why is this coad needed?\r
+               CdKduCu('F');\r
+       } else if (CUtils::IsIPMessenger()) {\r
+               DepressKey(VK_CONTROL);\r
+               PostMessage(GetFocus(), WM_KEYDOWN, 'F', 0);\r
+               PostMessage(GetFocus(), WM_KEYUP, 'F', 0);\r
+               ReleaseKey(VK_CONTROL);\r
+       } else {\r
+               // default\r
+               AdKduAu('E', 'F');\r
+       }\r
+\r
+       // Set Direction if Find dialog already exist\r
+       if (CUtils::IsDWFM()\r
+        || CUtils::IsEggExplorer()\r
+        || CUtils::IsExplorer()\r
+        || CUtils::IsFirefox()\r
+        || CUtils::IsHidemaru()\r
+        || CUtils::IsK2Editor()\r
+        || CUtils::IsLotusWordPro()\r
+        || CUtils::IsMicrosoftPowerPoint()\r
+        || CUtils::IsMozilla()\r
+        || CUtils::IsMSDN()\r
+        || CUtils::IsNetscape()\r
+        || CUtils::IsOpera()\r
+        || CUtils::IsSakuraEditor()) {\r
+       } else if (CUtils::IsInternetExplorer()\r
+                       || CUtils::IsSleipnir()) {\r
+               // I want to set direction but IE does not allow me.\r
+       } else {\r
+               SetSearchDirection();\r
+       }\r
+}\r
+\r
+int CCommands::Search(SEARCH_DIRECTION direction)\r
+{\r
+//     CUtils::Log(_T("%s"), CUtils::GetApplicationName());\r
+\r
+       if (CUtils::IsIllustrator()\r
+        || CUtils::IsPaint()\r
+        || CUtils::IsPhotoshop()) {\r
+               return Reset(GOTO_DO_NOTHING);\r
+       }\r
+\r
+       ClearNumericArgument();\r
+\r
+       if ((direction != FORWARD) && (direction != BACKWARD)) {\r
+               ASSERT(0);\r
+       }\r
+\r
+       if (CUtils::IsVisualCpp()\r
+        || CUtils::IsVisualStudioDotNet()) {\r
+               switch (direction) {\r
+               case FORWARD:\r
+                       CdKduCu('I');\r
+                       break;\r
+               case BACKWARD:\r
+                       CdSdKduSuCu('I');\r
+                       break;\r
+               default:\r
+                       ASSERT(0);\r
+                       break;\r
+               }\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       if (!CUtils::IsFindDialog()) {\r
+//             CUtils::Log(_T("Find Dialog is not."));\r
+\r
+               // F3 or Shift+F3\r
+               if (m_LastCommand == IsearchForward\r
+                || m_LastCommand == IsearchBackward) {\r
+                       if (CUtils::IsBecky()\r
+                        || CUtils::IsFirefox()\r
+                        || CUtils::IsHidemaru()\r
+                        || CUtils::IsPHPEditor()) {\r
+                               if (m_LastCommand == IsearchForward && direction != FORWARD\r
+                                || m_LastCommand == IsearchBackward && direction != BACKWARD) {\r
+                                       // do nothing\r
+                               } else if (direction == FORWARD) {\r
+                                       Kdu(VK_F3);\r
+                               } else if (direction == BACKWARD) {\r
+                                       SdKduSu(VK_F3);\r
+                               }\r
+                               return Reset(GOTO_HOOK);\r
+                       } else if (CUtils::IsBorlandCppBuilder()) {\r
+                               if (m_LastCommand == IsearchForward && direction != FORWARD\r
+                                || m_LastCommand == IsearchBackward && direction != BACKWARD) {\r
+                                       AdKduAu('S', 'F');\r
+                                       SetSearchDirection(direction);\r
+                                       Kdu(VK_RETURN);\r
+                               } else {\r
+                                       Kdu(VK_F3);\r
+                               }\r
+                               return Reset(GOTO_HOOK);\r
+                       }\r
+               }\r
+\r
+               m_SearchDirection = direction;\r
+               OpenFindDialog();\r
+       } else {\r
+//             CUtils::Log(_T("Find Dialog is opened."));\r
+\r
+               if (CUtils::IsHidemaru()\r
+                || CUtils::IsK2Editor()\r
+                || CUtils::IsOedit()\r
+                || CUtils::IsSakuraEditor()) {\r
+                       BYTE bDirection = 0;\r
+\r
+                       if (direction == FORWARD) {\r
+                               bDirection = GetDirectionForwardKey();\r
+                       } else if (direction == BACKWARD) {\r
+                               bDirection = GetDirectionBackwardKey();\r
+                       } else {\r
+                               ASSERT(0);\r
+                       }\r
+                       AdKduAu(bDirection);\r
+               } else if (CUtils::IsBorlandCppBuilder()) {\r
+                       if (m_SearchDirection != direction) {\r
+                               SetSearchDirection(direction);\r
+                       } else {\r
+                               Kdu(VK_RETURN);\r
+                       }\r
+               } else if (CUtils::IsJmEditor()\r
+                               || CUtils::IsPHPEditor()) {\r
+                       Kdu(VK_RETURN);\r
+               } else if (CUtils::IsAutla()) {\r
+                       if (direction == FORWARD) {\r
+                               Kdu(VK_F3);\r
+                       } else if (direction == BACKWARD) {\r
+                               SdKduSu(VK_F3);\r
+                       } else {\r
+                               ASSERT(0);\r
+                       }\r
+               } else {\r
+                       if (m_SearchDirection != direction) {\r
+                               // Set Direction if Find dialog already exist\r
+                               if (CUtils::IsConsole()) {\r
+                                       SetSearchDirection(BACKWARD);   // bad style\r
+                                       m_SearchDirection = direction;\r
+                               } else {\r
+                                       SetSearchDirection(direction);\r
+                               }\r
+                               return Reset(GOTO_HOOK);\r
+                       }\r
+\r
+                       // "Find Next(F)" if Find dialog already exist\r
+                       if (CUtils::IsStoryEditor()) {\r
+                               AdKduAu('F');\r
+                       } else {\r
+                               Kdu(VK_RETURN);\r
+                       }\r
+\r
+                       // open Find dialog again\r
+                       CString szDialogTitle;\r
+                       CUtils::GetFindDialogTitle(&szDialogTitle);\r
+                       if (CUtils::IsNami2000()) {\r
+                               AdKduAu('D', 'F');\r
+                               SetSearchDirection();\r
+                       } else if (CUtils::IsOutlook()\r
+                                       && szDialogTitle.Compare(_T("\8c\9f\8dõ"))) {\r
+                               // Outlook (w/o Japanese version)\r
+                               AdKduAu('E', 'F');\r
+                       } else if (CUtils::IsVisualCpp()) {\r
+                               CdKduCu('F');\r
+                               DepressKey(VK_CONTROL);         // Why is this need???\r
+                       } else if (CUtils::IsCodeWarrior()\r
+                                       || CUtils::IsDana()\r
+                                       || CUtils::IsStoryEditor()\r
+                                       || CUtils::IsTeraPad()) {\r
+                               AdKduAu('S', 'F');\r
+                       } else if (CUtils::IsezHTML()) {\r
+                               CdKduCu('F');\r
+                       }\r
+\r
+                       // set cursor at end of FindWhat\r
+                       if (CUtils::IsMozilla()\r
+                        || CUtils::IsNetscape()) {\r
+                               // do nothing\r
+                       } else if (CUtils::IsMicrosoftWord()) {\r
+                               CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
+                               ReleaseKey(VK_CONTROL);\r
+\r
+                               AdKduAu('N');\r
+                               Kdu(VK_ESCAPE);\r
+                               Kdu(VK_END);\r
+\r
+                               DepressKey(VK_CONTROL);\r
+                               CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+                       } else {\r
+                               AdKduAu(GetFindWhatKey());\r
+                       }\r
+                       Kdu(VK_END);\r
+               }\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+void CCommands::SetSearchDirection(SEARCH_DIRECTION direction)\r
+{\r
+//     CUtils::Log(_T("SetSearchDirection: %d"), direction);\r
+       if ((direction != FORWARD) && (direction != BACKWARD)) {\r
+               return;\r
+       }\r
+\r
+       m_SearchDirection = direction;\r
+\r
+       if (GetDirectionForwardKey() == 0 && GetDirectionBackwardKey() == 0) {\r
+               Kdu(VK_END);\r
+               return;\r
+       } else if (CUtils::IsConsole()) {\r
+               if (direction == BACKWARD) {    // bad style\r
+                       Kdu(VK_TAB, VK_TAB);\r
+                       Kdu(VK_RIGHT);\r
+                       SdKduSu(VK_TAB, VK_TAB);\r
+               }\r
+       } else if (CUtils::IsMicrosoftWord()) {\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
+               ReleaseKey(VK_CONTROL);\r
+\r
+               AdKduAu('M');\r
+               AdKduAu(0xBA);  // VK_OEM_1     Used for miscellaneous characters; it can vary by keyboard. \r
+                                               //                      Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+               Kdu(VK_UP, VK_UP);\r
+               if (direction == BACKWARD) {\r
+                       Kdu(VK_DOWN);\r
+               }\r
+               AdKduAu('N');\r
+               Kdu(VK_ESCAPE);\r
+               Kdu(VK_END);\r
+\r
+               DepressKey(VK_CONTROL);\r
+               CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+       } else if (CUtils::IsLotusNotes()) {\r
+               BYTE bDirection = 0;\r
+\r
+               if (direction == FORWARD) {\r
+                       bDirection = GetDirectionForwardKey();\r
+               } else if (direction == BACKWARD) {\r
+                       bDirection = GetDirectionBackwardKey();\r
+               }\r
+\r
+               AdKduAu(GetSearchOptionKey(), bDirection, GetSearchOptionKey());\r
+               {\r
+                       CString szDialogTitle;\r
+                       CUtils::GetFindDialogTitle(&szDialogTitle);\r
+\r
+                       if (!szDialogTitle.Compare(_T("\8c\9f\8dõ"))\r
+                        || !szDialogTitle.Compare(_T("Find"))) {\r
+                               SdKduSu(VK_TAB);\r
+                       } else {\r
+                               SdKduSu(VK_TAB, VK_TAB);\r
+                       }\r
+               }\r
+               Kdu(VK_END);\r
+       } else if (CUtils::IsBecky()) {\r
+               AdKduAu(GetDirectionForwardKey());\r
+               if (direction == BACKWARD) {\r
+                       Kdu(VK_UP);\r
+               }\r
+               Kdu(VK_TAB, VK_TAB, VK_TAB, VK_TAB);\r
+               Kdu(VK_END);\r
+       } else if (CUtils::IsMozilla()\r
+                       || CUtils::IsNetscape()) {\r
+               Kdu(VK_TAB, VK_TAB, VK_TAB, VK_SPACE);\r
+               SdKduSu(VK_TAB, VK_TAB, VK_TAB);\r
+       } else if (CUtils::IsezHTML()) {\r
+               BYTE bDirection = 0;\r
+\r
+               if (direction == FORWARD) {\r
+                       bDirection = GetDirectionForwardKey();\r
+               } else if (direction == BACKWARD) {\r
+                       bDirection = GetDirectionBackwardKey();\r
+               }\r
+\r
+               AdKduAu(bDirection);\r
+               SdKduSu(VK_TAB, VK_TAB, VK_TAB, VK_TAB);\r
+       } else {\r
+               // default\r
+               BYTE bDirection = 0;\r
+\r
+               if (direction == FORWARD) {\r
+                       bDirection = GetDirectionForwardKey();\r
+               } else if (direction == BACKWARD) {\r
+                       bDirection = GetDirectionBackwardKey();\r
+               }\r
+\r
+//             CUtils::Log(_T("aSetSearchDirection: Direction = %c, FindWhatKey = %c"), bDirection, GetFindWhatKey());\r
+               AdKduAu(bDirection, GetFindWhatKey());\r
+       }\r
+}\r
+\r
+// C-x C-j, C-o, C-\, C-BACKSLASH\r
+int CCommands::ToggleInputMethod()\r
+{\r
+       SetInputMethodOpenStatus(TOGGLE_INPUT_METHOD);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::CompleteToggleInputMethod()\r
+{\r
+       SetInputMethodOpenStatus(TOGGLE_INPUT_METHOD, TRUE);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::OpenInputMethod()\r
+{\r
+       SetInputMethodOpenStatus(OPEN_INPUT_METHOD);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::CloseInputMethod()\r
+{\r
+       SetInputMethodOpenStatus(CLOSE_INPUT_METHOD);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::CompleteCloseInputMethod()\r
+{\r
+       SetInputMethodOpenStatus(CLOSE_INPUT_METHOD, TRUE);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+void CCommands::SetInputMethodOpenStatus(INPUT_METHOD_OPEN_STATUS status, BOOL isComplete)\r
+{\r
+       ClearNumericArgument();\r
+       HKL hKL = GetKeyboardLayout(0);\r
+       if (CUtils::IsConsole()) {\r
+               Kdu(VK_KANJI);\r
+       } else if (ImmIsIME(hKL)) {\r
+               // default\r
+               HWND hWnd = GetFocus();\r
+               HIMC hIMC = ImmGetContext(hWnd);\r
+\r
+               if (isComplete && ImmGetOpenStatus(hIMC)) {\r
+                       ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);\r
+               }\r
+\r
+               switch (status) {\r
+               case CLOSE_INPUT_METHOD:\r
+                       ImmSetOpenStatus(hIMC, FALSE);\r
+                       break;\r
+               case OPEN_INPUT_METHOD:\r
+                       ImmSetOpenStatus(hIMC, TRUE);\r
+                       break;\r
+               case TOGGLE_INPUT_METHOD:\r
+                       ImmSetOpenStatus(hIMC, !ImmGetOpenStatus(hIMC));\r
+                       break;\r
+               default:\r
+                       ASSERT(0);\r
+                       break;\r
+               }\r
+\r
+               ImmReleaseContext(hWnd, hIMC);\r
+       } else {\r
+               Kdu(VK_KANJI);\r
+       }\r
+}\r
+\r
+// C-x k: Ctrl+F4\r
+int CCommands::KillBuffer()\r
+{\r
+       CdKduCu(VK_F4);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+BOOL CCommands::IsKillCommand(int (*nFunctionPointer)())\r
+{\r
+       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               if (Commands[nCommandID].fCommand == nFunctionPointer) {\r
+                       return !_tcsncmp(Commands[nCommandID].szCommandName, _T("kill-"), 5);\r
+               }\r
+       }\r
+       return FALSE;\r
+}\r
+\r
+void CCommands::SetLastCommand(int (__cdecl *LastCommand)(void))\r
+{\r
+       m_LastCommand = LastCommand;\r
+\r
+       if (IsKillCommand(LastCommand)) {\r
+               m_LastKillCommand = LastCommand;\r
+       }\r
+}\r
+\r
+// M-d: \r
+int CCommands::KillWord()\r
+{\r
+       if (CUtils::IsMicrosoftPowerPoint()\r
+        || CUtils::IsThunderbird()) {\r
+               CdKduCu(VK_DELETE);\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+\r
+       static int nStep = 0;\r
+       static CString szClipboardText;\r
+       static int nWhiteSpace = 0;\r
+       switch (nStep) {\r
+       case 0:\r
+//             CUtils::Log(_T("M-d: 0"));\r
+               ClearNumericArgument();\r
+               szClipboardText.Empty();\r
+               nWhiteSpace = 0;\r
+               CdSdKduSuCu(VK_RIGHT);\r
+               CdKduCu('X');\r
+               nStep = 1;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 1:\r
+               {\r
+//                     CUtils::Log(_T("M-d: 1"));\r
+                       nStep = 0;\r
+                       CUtils::GetClipboardText(&szClipboardText);\r
+                       int nWordEnd = szClipboardText.GetLength();\r
+                       int nFirstSpace = szClipboardText.Find(_T(' '));\r
+//                     CUtils::Log(_T("M-d: 1-1 _%s_%c"), szClipboardText, szClipboardText.GetAt(szClipboardText.GetLength() - 1));\r
+                       if (nFirstSpace == 0) {\r
+//                             CUtils::Log(_T("M-d: 1-1-1"));\r
+                               nStep = 0;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else if (0 < nFirstSpace) {\r
+//                             CUtils::Log(_T("M-d: 1-1-2"));\r
+                               nWordEnd = nFirstSpace; // (nFirstSpace + 1) - 1\r
+                       }\r
+                       int nFirstTab = szClipboardText.Find(_T('\t'));\r
+                       if (nFirstTab == 0) {\r
+//                             CUtils::Log(_T("M-d: 1-2-1"));\r
+                               nStep = 0;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else if (0 < nFirstTab && nFirstTab < nWordEnd) {\r
+//                             CUtils::Log(_T("M-d: 1-2-2"));\r
+                               nWordEnd = nFirstTab;   // (nFirstTab + 1) - 1\r
+                       }\r
+                       if (nWordEnd == szClipboardText.GetLength()) {\r
+//                             CUtils::Log(_T("M-d: 1-3-1"));\r
+                               nStep = 4;\r
+                       } else {\r
+//                             CUtils::Log(_T("M-d: 1-3-2"));\r
+                               CString szEndWhiteSpace;\r
+                               nWhiteSpace = szClipboardText.GetLength() - nWordEnd;\r
+                               szEndWhiteSpace = szClipboardText.Right(nWhiteSpace);\r
+                               CUtils::SetClipboardText(&szEndWhiteSpace);\r
+                               szClipboardText = szClipboardText.Left(nWordEnd);\r
+                               nStep = 2;\r
+                       }\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       case 2:\r
+//             CUtils::Log(_T("M-d: 2"));\r
+               nStep = 0;\r
+               CdKduCu('V');\r
+               nStep = 3;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 3:\r
+//             CUtils::Log(_T("M-d: 3"));\r
+               nStep = 0;\r
+               m_bDefaultNumericArgument = FALSE;\r
+               m_nNumericArgument = nWhiteSpace;\r
+               Kdu(VK_LEFT);\r
+               nStep = 4;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 4:\r
+//             CUtils::Log(_T("M-d: 4"));\r
+               nStep = 0;\r
+               CUtils::SetClipboardText(&szClipboardText);\r
+               nStep = 5;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 5:\r
+//             CUtils::Log(_T("M-d: 5"));\r
+               nStep = 0;\r
+               CXkeymacsDll::AddKillRing();\r
+               m_bSetMark = FALSE;\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+       // dummy\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// M-DEL\r
+int CCommands::BackwardKillWord()\r
+{\r
+       CdSdKduSuCu(VK_LEFT);\r
+       Cut_();\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// Select All\r
+int CCommands::SelectAll()\r
+{\r
+       if (CUtils::IsConsole()) {\r
+               SystemMenuEdit(CMD_SELECT_ALL);\r
+       } else {\r
+               CdKduCu('A');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x (\r
+int CCommands::StartKbdMacro()\r
+{\r
+       if (CUtils::IsMicrosoftWord()) {\r
+               AdKduAu('T', 'M', 'R');\r
+       } else if (CUtils::IsHidemaru()) {\r
+               SdKduSu(VK_F1);\r
+       } else {\r
+               CXkeymacsDll::DefiningMacro(TRUE);\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x )\r
+int CCommands::EndKbdMacro()\r
+{\r
+       if (CUtils::IsMicrosoftWord()) {\r
+               AdKduAu('T', 'M', 'R');\r
+       } else if (CUtils::IsHidemaru()) {\r
+               SdKduSu(VK_F1);\r
+       } else {\r
+               CXkeymacsDll::DefiningMacro(FALSE);\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x e\r
+int CCommands::CallLastKbdMacro()\r
+{\r
+       if (CUtils::IsMicrosoftWord()) {\r
+               AdKduAu('T', 'M', 'M');\r
+       } else if (CUtils::IsHidemaru()) {\r
+               int n = 1;\r
+               if (!m_bDefaultNumericArgument) {\r
+                       n = m_nNumericArgument;\r
+               }\r
+               ClearNumericArgument();\r
+               while (n--) {\r
+                       AdKduAu('M', 'P');\r
+               }\r
+       } else {\r
+               while (m_nNumericArgument--) {\r
+                       CXkeymacsDll::CallMacro();\r
+               }\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::SwitchBetweenInputLocales()\r
+{\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+\r
+       // Alt+Shift\r
+       if (bIsCtrlDown) {\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+       DepressKey(VK_MENU);    // why?\r
+       ReleaseKey(VK_MENU);\r
+       DepressKey(VK_MENU);\r
+       DepressKey(VK_SHIFT);\r
+       ReleaseKey(VK_SHIFT);\r
+       if (!bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+       if (bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+       }\r
+\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// C-x b\r
+int CCommands::SwitchToBuffer()\r
+{\r
+       ClearNumericArgument();\r
+       // GetWindowInfo does not get information to find out if the window is MDI or SDI.\r
+       CdKduCu(VK_TAB);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::C_()\r
+{\r
+       return Reset(GOTO_HOOKX);\r
+}\r
+\r
+int CCommands::C_Eisu()\r
+{\r
+       bC_(TRUE);\r
+       return Reset(GOTO_HOOKX);\r
+}\r
+\r
+int CCommands::Escape()\r
+{\r
+       ClearNumericArgument();\r
+       Kdu(VK_ESCAPE);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Tilde()\r
+{\r
+       ClearNumericArgument();\r
+       if (CXkeymacsData::Is106Keyboard()) {\r
+               SdKduSu(0xDE);  // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+               Su();                   //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+       } else {\r
+               SdKduSu(0xC0);  // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
+               Su();                   //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::BackQuote()\r
+{\r
+       ClearNumericArgument();\r
+       if (CXkeymacsData::Is106Keyboard()) {\r
+               SdKduSu(0xC0);\r
+               Su();\r
+       } else {\r
+               ReleaseKey(VK_SHIFT);\r
+               Kdu(0xC0);      // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
+                                       //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+BOOL CCommands::IsSetMark()\r
+{\r
+       return m_bSetMark;\r
+}\r
+\r
+BYTE CCommands::GetFindWhatKey()\r
+{\r
+       BYTE bFindWhat = 'N';\r
+\r
+       if (CUtils::IsBecky()\r
+        || CUtils::IsDana()\r
+        || CUtils::IsEclipse()\r
+        || CUtils::IsezHTML()\r
+        || CUtils::IsLotusNotes()\r
+        || CUtils::IsVisualBasicEditor()) {\r
+               bFindWhat = 'F';\r
+       } else if (CUtils::IseMemoPad()) {\r
+               bFindWhat = 'K';\r
+       } else if (CUtils::IsHidemaru()\r
+                       || CUtils::IsJmEditor()) {\r
+               bFindWhat = 'S';\r
+       } else if (CUtils::IsBorlandCppBuilder()\r
+                       || CUtils::IsNami2000()\r
+                       || CUtils::IsStoryEditor()\r
+                       || CUtils::IsTeraPad()) {\r
+               bFindWhat = 'T';\r
+       } else if (CUtils::IsAdobeReader()\r
+                       || CUtils::IsAutla()\r
+                       || CUtils::IsCodeWarrior()\r
+                       || CUtils::IsFirefox()\r
+                       || CUtils::IsFlash()\r
+                       || CUtils::IsIPMessenger()\r
+                       || CUtils::IsK2Editor()\r
+                       || CUtils::IsOedit()\r
+                       || CUtils::IsOpera()\r
+                       || CUtils::IsOpenJane()\r
+                       || CUtils::IsPHPEditor()\r
+                       || CUtils::IsSakuraEditor()) {\r
+               bFindWhat = 0;\r
+       }\r
+\r
+       return bFindWhat;\r
+}\r
+\r
+BYTE CCommands::GetSearchOptionKey()\r
+{\r
+       BYTE bSearchOption = 0;\r
+\r
+       if (CUtils::IsLotusNotes()) {\r
+               bSearchOption = 'O';\r
+       }\r
+\r
+       return bSearchOption;\r
+}\r
+\r
+BYTE CCommands::GetDirectionForwardKey()\r
+{\r
+       BYTE bDirectionForward = 'D';\r
+       CString szDialogTitle;\r
+       CUtils::GetFindDialogTitle(&szDialogTitle);\r
+\r
+       if (CUtils::IsAdobeReader()\r
+        || CUtils::IsAutla()\r
+        || CUtils::IsCodeWarrior()\r
+        || CUtils::IsDirector()\r
+        || CUtils::IsDreamweaver()\r
+        || CUtils::IsExcel()\r
+        || CUtils::IsFirefox()\r
+        || CUtils::IsFireworks()\r
+        || CUtils::IsFlash()\r
+        || CUtils::IsIPMessenger()\r
+        || CUtils::IsJmEditor()\r
+        || CUtils::IsLotus123()\r
+        || CUtils::IsMicrosoftPowerPoint()\r
+        || CUtils::IsOpera()\r
+        || CUtils::IsOpenJane()\r
+        || CUtils::IsStoryEditor()\r
+        || CUtils::IsVisualBasicEditor()\r
+        || CUtils::IsVisualStudioDotNet()\r
+        || CUtils::IsWordpad()) {\r
+               bDirectionForward = 0;\r
+       } else if (CUtils::IsLotusNotes()\r
+                       || CUtils::IsNami2000()\r
+                       || CUtils::IsSakuraEditor()) {\r
+               bDirectionForward = 'D';\r
+       } else if (CUtils::IsOedit()) {\r
+               bDirectionForward = 'F';\r
+       } else if (CUtils::IsBecky()) {\r
+               if (!szDialogTitle.Compare(_T("\96{\95\93à\8c\9f\8dõ"))) {\r
+                       bDirectionForward = 'O';\r
+               } else {\r
+                       bDirectionForward = 0;\r
+               }\r
+       } else if (CUtils::IsK2Editor()) {\r
+               bDirectionForward = 'L';\r
+       } else if (CUtils::IseMemoPad()\r
+                       || CUtils::IsHidemaru()) {\r
+               bDirectionForward = 'N';\r
+       } else if (CUtils::IsEclipse()) {\r
+               bDirectionForward = 'O';\r
+       }\r
+\r
+       if (CUtils::IsOutlook()\r
+        && !szDialogTitle.Compare(_T("Find"))) {\r
+               // Outlook (English version)\r
+               bDirectionForward = 0;\r
+       }\r
+\r
+       return bDirectionForward;\r
+}\r
+\r
+BYTE CCommands::GetDirectionBackwardKey()\r
+{\r
+       BYTE bDirectionBackward = 'U';\r
+       CString szDialogTitle;\r
+       CUtils::GetFindDialogTitle(&szDialogTitle);\r
+\r
+       if (CUtils::IsAdobeReader()\r
+        || CUtils::IsAutla()\r
+        || CUtils::IsCodeWarrior()\r
+        || CUtils::IsDirector()\r
+        || CUtils::IsDreamweaver()\r
+        || CUtils::IsExcel()\r
+        || CUtils::IsFirefox()\r
+        || CUtils::IsFireworks()\r
+        || CUtils::IsFlash()\r
+        || CUtils::IsIPMessenger()\r
+        || CUtils::IsJmEditor()\r
+        || CUtils::IsLotus123()\r
+        || CUtils::IsMicrosoftPowerPoint()\r
+        || CUtils::IsOpera()\r
+        || CUtils::IsOpenJane()\r
+        || CUtils::IsStoryEditor()\r
+        || CUtils::IsVisualBasicEditor()\r
+        || CUtils::IsWordpad()) {\r
+               bDirectionBackward = 0;\r
+       } else if (CUtils::IsBorlandCppBuilder()\r
+                       || CUtils::IsEclipse()\r
+                       || CUtils::IseMemoPad()\r
+                       || CUtils::IsLotusNotes()\r
+                       || CUtils::IsNami2000()) {\r
+               bDirectionBackward = 'B';\r
+       } else if (CUtils::IsBecky()) {\r
+               if (!szDialogTitle.Compare(_T("\96{\95\93à\8c\9f\8dõ"))) {\r
+                       bDirectionBackward = 'B';\r
+               } else {\r
+                       bDirectionBackward = 0;\r
+               }\r
+       } else if (CUtils::IsHidemaru()\r
+                       || CUtils::IsOedit()) {\r
+               bDirectionBackward = 'P';\r
+       } else if (CUtils::IsK2Editor()\r
+                       || CUtils::IsSakuraEditor()) {\r
+               bDirectionBackward = 'U';\r
+       }\r
+\r
+       if (CUtils::IsOutlook()\r
+        && !szDialogTitle.Compare(_T("Find"))) {\r
+               // Outlook (English version)\r
+               bDirectionBackward = 0;\r
+       }\r
+\r
+       return bDirectionBackward;\r
+}\r
+\r
+void CCommands::GetCaretPosition()\r
+{\r
+//     CUtils::Log(_T("GetClipboardTextLength = %d"), CUtils::GetClipboardTextLength());\r
+\r
+       try {\r
+               POINT *pCaretPos = new POINT;\r
+               if (pCaretPos && GetCaretPos(pCaretPos)) {\r
+//                     CUtils::Log(_T("x = %d, y = %d"), pCaretPos->x, pCaretPos->y);\r
+                       m_CaretPos.AddTail(pCaretPos);\r
+               } else {\r
+                       delete pCaretPos;\r
+                       pCaretPos = NULL;\r
+               }\r
+       }\r
+       catch (CMemoryException* e) {\r
+               e->Delete();\r
+//             CUtils::Log("GetCaretPosition: pCaretPos: 'new' threw an exception");\r
+       }\r
+\r
+       try {\r
+               SCROLLINFO *pScrollInfo = new SCROLLINFO;\r
+               if (pScrollInfo) {\r
+                       memset(pScrollInfo, 0, sizeof(SCROLLINFO));\r
+                       pScrollInfo->cbSize = sizeof(SCROLLINFO);\r
+                       pScrollInfo->fMask = SIF_ALL;\r
+                       if (GetScrollInfo(GetFocus(), SB_VERT, pScrollInfo)) {\r
+//                             CUtils::Log(_T("page = %d, pos = %d, max = %d, min = %d, trackpos = %d"), pScrollInfo->nPage, pScrollInfo->nPos, pScrollInfo->nMax, pScrollInfo->nMin, pScrollInfo->nTrackPos);\r
+                               m_ScrollInfo.AddTail(pScrollInfo);\r
+                       } else {\r
+//                             CUtils::Log(_T("GetScrollInfo Error: %d"), GetLastError());\r
+                               delete pScrollInfo;\r
+                               pScrollInfo = NULL;\r
+                       }\r
+               }\r
+       }\r
+       catch (CMemoryException* e) {\r
+               e->Delete();\r
+//             CUtils::Log("GetCaretPosition: pScrollInfo: 'new' threw an exception");\r
+       }\r
+\r
+       try {\r
+               CString* pClipboardText = new CString;\r
+               if (pClipboardText) {\r
+                       CUtils::GetClipboardText(pClipboardText);\r
+                       CUtils::SetClipboardText(pClipboardText);\r
+                       m_FindText.AddTail(pClipboardText);\r
+               }\r
+       }\r
+       catch (CMemoryException* e) {\r
+               e->Delete();\r
+//             CUtils::Log("GetCaretPosition: pClipboardText: 'new' threw an exception");\r
+       }\r
+}\r
+\r
+BOOL CCommands::SetCaretPosition()\r
+{\r
+       {\r
+//             TCHAR buf[0x100] = {'\0'};\r
+//             GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
+//             CUtils::Log(buf);\r
+       }\r
+\r
+       if (!m_ScrollInfo.IsEmpty()) {\r
+               SCROLLINFO* pScrollInfo = (SCROLLINFO*)m_ScrollInfo.GetTail();\r
+               delete pScrollInfo;\r
+               pScrollInfo = NULL;\r
+               m_ScrollInfo.RemoveTail();\r
+       }\r
+       if (!m_ScrollInfo.IsEmpty()) {\r
+               SCROLLINFO* pScrollInfo = (SCROLLINFO*)m_ScrollInfo.GetTail();\r
+               SendMessage(GetFocus(), WM_VSCROLL, SB_THUMBPOSITION | (pScrollInfo->nPos << 0x10), NULL);\r
+       }\r
+\r
+       BOOL bMoveCaret = FALSE;\r
+       if (!m_CaretPos.IsEmpty()) {\r
+               POINT* pCaretPos = (POINT*)m_CaretPos.GetTail();\r
+               delete pCaretPos;\r
+               pCaretPos = NULL;\r
+               m_CaretPos.RemoveTail();\r
+       }\r
+       if (!m_CaretPos.IsEmpty()) {\r
+               POINT* pCaretPos = (POINT*)m_CaretPos.GetTail();\r
+               SetCaretPos(pCaretPos->x, pCaretPos->y);\r
+\r
+//             CUtils::Log(_T("set x = %d), y = %d", p->x, p->y);\r
+\r
+               DeactivateMark();\r
+\r
+               const int nPreviousFindTextLength = CUtils::GetClipboardTextLength();\r
+               if (0 < nPreviousFindTextLength) {\r
+                       if (CUtils::IsWordpad()) {\r
+                               POSITION position = m_FindText.GetTailPosition();\r
+                               CString* pPreviousFindText = (CString*)m_FindText.GetPrev(position);\r
+                               CString* pNextFindText = (CString*)m_FindText.GetPrev(position);\r
+                               if (*pPreviousFindText == *pNextFindText) {\r
+                                       for (int i = 0; i <= nPreviousFindTextLength; ++i) {\r
+                                               Kdu(VK_LEFT);\r
+                                       }\r
+                               } else {\r
+                                       Kdu(VK_LEFT);\r
+                               }\r
+                       }\r
+                       bMoveCaret = TRUE;\r
+               }\r
+       } else {\r
+               Kdu(VK_LEFT);\r
+       }\r
+\r
+//     CUtils::Log(_T("scrollInfo.GetCount() = %d, szFindText.GetLength() = %d"), scrollInfo.GetCount(), szFindText.GetLength());\r
+\r
+       if (!m_FindText.IsEmpty()) {\r
+               CString *pFindText = (CString *)m_FindText.GetTail();\r
+               delete pFindText;\r
+               pFindText = NULL;\r
+               m_FindText.RemoveTail();\r
+       }\r
+       if (!m_FindText.IsEmpty()) {\r
+               CString *pFindText = (CString *)m_FindText.GetTail();\r
+               CUtils::SetClipboardText(pFindText);\r
+       }\r
+\r
+       return bMoveCaret;\r
+}\r
+\r
+void CCommands::SetMark(BOOL bSetMark)\r
+{\r
+       m_bSetMark = bSetMark;\r
+}\r
+\r
+GOTO CCommands::MoveCaret(BYTE bVk, BOOL bCtrl)\r
+{\r
+       switch (bVk) {\r
+       case VK_PRIOR:\r
+       case VK_NEXT:\r
+       case VK_END:\r
+       case VK_HOME:\r
+       case VK_LEFT:\r
+       case VK_UP:\r
+       case VK_RIGHT:\r
+       case VK_DOWN:\r
+               break;\r
+       default:\r
+               return CONTINUE;\r
+       }\r
+\r
+       struct {\r
+               BYTE bVk;\r
+               BOOL bCtrl;\r
+               DWORD time;\r
+       } static last;\r
+\r
+       const DWORD time = GetTickCount();\r
+//     CUtils::Log(_T("%d - %d = %d, %d, %d"), time, last.time, time - last.time, CXkeymacsDll::GetMaxKeyInterval(), CXkeymacsDll::GetAccelerate());\r
+       if (CXkeymacsDll::GetAccelerate() && bVk == last.bVk && bCtrl == last.bCtrl && time - last.time < CXkeymacsDll::GetMaxKeyInterval()) {\r
+               NumericArgument(CXkeymacsDll::GetAccelerate());\r
+       }\r
+       last.bVk = bVk;\r
+       last.bCtrl = bCtrl;\r
+       last.time = time;\r
+\r
+       if (bCtrl) {\r
+               if (m_bSetMark) {\r
+                       CdSdKduSuCu(bVk);\r
+               } else {\r
+                       CdKduCu(bVk);\r
+               }\r
+       } else {\r
+               if (m_bSetMark) {\r
+                       if (CUtils::IsShuriken()) {\r
+                               static BOOL bIsShiftDown = FALSE;\r
+                               static int nStep = 0;\r
+                               switch (nStep) {\r
+                               case 0:\r
+                                       {\r
+                                               BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+                                               BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+                                               bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+\r
+                                               if (bIsCtrlDown) {\r
+                                                       ReleaseKey(VK_CONTROL);\r
+                                               }\r
+                                               if (bIsAltDown) {\r
+                                                       ReleaseKey(VK_MENU);\r
+                                               }\r
+                                               if (!bIsShiftDown) {\r
+                                                       DepressKey(VK_SHIFT);\r
+                                               }\r
+\r
+                                               CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
+\r
+                                               if (bIsAltDown) {\r
+                                                       DepressKey(VK_MENU);\r
+                                               }\r
+                                               if (bIsCtrlDown) {\r
+                                                       DepressKey(VK_CONTROL);\r
+                                               }\r
+                                               nStep = 1;\r
+                                               return GOTO_RECURSIVE;\r
+                                       }\r
+                               case 1:\r
+                                       nStep = 0;\r
+                                       if (!bIsShiftDown) {\r
+                                               ReleaseKey(VK_SHIFT);\r
+                                       }\r
+                                       return GOTO_HOOK;\r
+                               }\r
+                       } else {\r
+                               SdKduSu(bVk);\r
+                       }\r
+               } else {\r
+                       Kdu(bVk);\r
+               }\r
+       }\r
+       return GOTO_HOOK;\r
+}\r
+\r
+int CCommands::PassThrough()\r
+{\r
+       Reset();        // Why?\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Redo()\r
+{\r
+       if (CUtils::IsCorelDRAW()) {\r
+               CdSdKduSuCu('Z');\r
+       } else {\r
+               CdKduCu('Y');\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::TemporarilyDisableXKeymacs()\r
+{\r
+//     CUtils::Log(_T("SetTemporarilyDisableXKeymacs"));\r
+       SetTemporarilyDisableXKeymacs(TRUE);\r
+       Reset();        // Why?\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+BOOL CCommands::IsTemporarilyDisableXKeymacs()\r
+{\r
+       return m_bTemporarilyDisableXKeymacs;\r
+}\r
+\r
+void CCommands::SetTemporarilyDisableXKeymacs(BOOL bTemporarilyDisableXKeymacs)\r
+{\r
+       m_bTemporarilyDisableXKeymacs = bTemporarilyDisableXKeymacs;\r
+       CXkeymacsDll::SetKeyboardHookFlag();\r
+}\r
+\r
+int CCommands::New()\r
+{\r
+       ClearNumericArgument();\r
+       m_bSetMark = FALSE;\r
+       CdKduCu('N');\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Print()\r
+{\r
+       ClearNumericArgument();\r
+       m_bSetMark = FALSE;\r
+       CdKduCu('P');\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Find()\r
+{\r
+       ClearNumericArgument();\r
+       m_bSetMark = FALSE;\r
+       CdKduCu('F');\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::FindNext()\r
+{\r
+       ClearNumericArgument();\r
+       m_bSetMark = FALSE;\r
+       Kdu(VK_F3);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::SystemMenu(const CONSOLE_MENU nDown)\r
+{\r
+//     CUtils::Log(_T("SystemMenu"));\r
+       if (!CUtils::IsConsole()) {\r
+               return ERROR_SUCCESS;\r
+       }\r
+\r
+       RECT consoleWindowRect = {'\0'};\r
+       if (!GetWindowRect(GetForegroundWindow(), &consoleWindowRect)) {\r
+               return GetLastError();\r
+       }\r
+//     CUtils::Log(_T("t = %d, l = %d"), consoleWindowRect.top, consoleWindowRect.left);\r
+\r
+       const POINT clickPoint = {consoleWindowRect.left + 5, consoleWindowRect.top + 5};\r
+       int rc = Click(&clickPoint);\r
+       if (rc != ERROR_SUCCESS) {\r
+               return rc;\r
+       }\r
+\r
+       if (nDown != CMD_EDIT) {\r
+               for (int i = 0; i <= nDown; ++i) {\r
+                       Kdu(VK_DOWN);\r
+               }\r
+               Kdu(VK_UP);\r
+               Kdu(VK_RETURN);\r
+       }\r
+       return ERROR_SUCCESS;   // i.e. return 0;\r
+}\r
+\r
+int CCommands::SystemMenuEdit(const CONSOLE_MENU_EDIT nDown)\r
+{\r
+       if (!CUtils::IsConsole()) {\r
+               return ERROR_SUCCESS;\r
+       }\r
+\r
+       SystemMenu(CMD_EDIT);\r
+       RECT consoleWindowRect = {'\0'};\r
+       if (!GetWindowRect(GetForegroundWindow(), &consoleWindowRect)) {\r
+               return GetLastError();\r
+       }\r
+\r
+       const y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) * 6 + 20;        // y = A + B * 6 + 20\r
+       const POINT clickPoint = {consoleWindowRect.left + 50, consoleWindowRect.top + y};      // 146 <= y <= 161 on W2K       (146 + 161 + 1) / 2 = 154 = 19 + 19 x 6 + 21\r
+       int rc = Click(&clickPoint);                                                                                                            // 157 <= y <= 172 on WXP       (157 + 172 + 1) / 2 = 165 = 26 + 20 x 6 + 19\r
+       if (rc != ERROR_SUCCESS) {\r
+               return rc;\r
+       }\r
+\r
+       for (int i = 0; i <= nDown; ++i) {\r
+               Kdu(VK_DOWN);\r
+       }\r
+       Kdu(VK_UP);     // Why? Because Mark did not work well only one VK_DOWN (or seven VK_DOWNs).\r
+\r
+       Kdu(VK_RETURN);\r
+       return ERROR_SUCCESS;   // i.e. return 0;\r
+}\r
+\r
+int CCommands::Click(const POINT *const pClickPoint)\r
+{\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
+\r
+       POINT CursorPos = {'\0'};\r
+       if (!GetCursorPos(&CursorPos)) {\r
+               return GetLastError();\r
+       }\r
+\r
+       if (!SetCursorPos(pClickPoint->x, pClickPoint->y)) {\r
+               return GetLastError();\r
+       }\r
+       if (CUtils::IsConsole()\r
+        && bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+       mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo());\r
+       mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo());\r
+       if (!SetCursorPos(CursorPos.x, CursorPos.y)) {\r
+               return GetLastError();\r
+       }\r
+       return ERROR_SUCCESS;\r
+}\r
+\r
+// C-x C-t\r
+int CCommands::TransposeLines()\r
+{\r
+       static int nStep = 0;\r
+       switch (nStep) {\r
+       case 0:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 0"));\r
+               Kdu(VK_END);\r
+               CaptureClipboardData();\r
+               nStep = 1;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 1:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 1"));\r
+               if (!CopyNextCharacter()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+               nStep = 2;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 2:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 2"));\r
+               Su();\r
+               if (CUtils::IsEOF()) {\r
+                       Kdu(VK_END, VK_RETURN, VK_UP, VK_END);\r
+               }\r
+               Kdu(VK_HOME);\r
+               nStep = 3;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 3:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 3"));\r
+               if (!CopyBackCharacter()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+               nStep = 4;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 4:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 4"));\r
+               Su();\r
+               if (CUtils::IsTOF()) {  // TOF\r
+                       Kdu(VK_DOWN, VK_END);\r
+//                     CUtils::Log(_T("C-x C-t: TOF"));\r
+                       nStep = 5;\r
+               } else {\r
+                       nStep = 7;\r
+               }\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 5:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 5"));\r
+               if (!CopyNextCharacter()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+               nStep = 6;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 6:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 6"));\r
+               Su();\r
+               if (CUtils::IsEOF()) {\r
+                       Kdu(VK_END, VK_RETURN, VK_UP, VK_END);\r
+//                     CUtils::Log(_T("C-x C-t: EOF2"));\r
+               }\r
+               nStep = 7;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 7:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 7"));\r
+               Kdu(VK_UP, VK_HOME);\r
+               SdKduSu(VK_DOWN);\r
+               CdKduCu('X');\r
+               nStep = 8;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 8:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 8"));\r
+               Su();\r
+               Kdu(VK_DOWN);\r
+               CdKduCu('V');\r
+               nStep = 9;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 9:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("C-x C-t: 9"));\r
+               RestoreClipboardData();\r
+               break;\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+void CCommands::CaptureClipboardData(const int nID, const BOOL bTextOnly)\r
+{\r
+//     CUtils::Log("CaptureClipboardData: 1");\r
+       {\r
+               int nSize = nID + 1;\r
+               if (m_oClipboardData.GetSize() < nSize) {\r
+//                     CUtils::Log("CaptureClipboardData: 2");\r
+                       try {\r
+                               m_oClipboardData.SetSize(nSize);\r
+                       }\r
+                       catch (CMemoryException* e) {\r
+                               e->Delete();\r
+//                             CUtils::Log("CaptureClipboardData: SetSize() threw an exception");\r
+                       }\r
+               }\r
+       }\r
+\r
+//     CUtils::Log("CaptureClipboardData: 3");\r
+       if (!m_oClipboardData[nID]) {\r
+//             CUtils::Log("CaptureClipboardData: 4");\r
+               try {\r
+                       CClipboardSnap *pSnap = new CClipboardSnap;\r
+                       if (!pSnap) {\r
+//                             CUtils::Log("CaptureClipboardData: 5");\r
+                               return;\r
+                       }\r
+                       m_oClipboardData.SetAt(nID, pSnap);\r
+               }\r
+               catch (CMemoryException* e) {\r
+                       e->Delete();\r
+//                     CUtils::Log("CaptureClipboardData: 'new' threw an exception");\r
+               }\r
+       }\r
+\r
+//     CUtils::Log("CaptureClipboardData: 6: nID=%d, size=%d", nID, m_oClipboardData.GetSize());\r
+       BOOL bCapture = m_oClipboardData[nID]->Capture(bTextOnly);\r
+//     CUtils::Log("CaptureClipboardData: 7");\r
+       Sleep(0);       // for OpenOffice\r
+       bCapture = m_oClipboardData[nID]->Capture(bTextOnly);   // for "office drawing shape format". Can CClipboardSnap care this problem?\r
+\r
+//     CUtils::Log("CaptureClipboardData: 8");\r
+       if (!bCapture) {\r
+//             CUtils::Log(_T("Can not Capture in CaptureClipboardData"));\r
+               delete m_oClipboardData[nID];\r
+//             CUtils::Log("CaptureClipboardData: 9");\r
+               m_oClipboardData.SetAt(nID, NULL);\r
+//             CUtils::Log("CaptureClipboardData: 10");\r
+       }\r
+}\r
+\r
+void CCommands::RestoreClipboardData(const int nID)\r
+{\r
+       if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
+               m_oClipboardData[nID]->Restore();\r
+       }\r
+}\r
+\r
+int CCommands::FindReturnFromClipboardData(const int nID)\r
+{\r
+       if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
+               return m_oClipboardData[nID]->FindReturn();\r
+       }\r
+       return -1;\r
+}\r
+\r
+BOOL CCommands::IsEmptyClipboardData(const int nID)\r
+{\r
+       if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
+               return m_oClipboardData[nID]->IsEmpty();\r
+       }\r
+       return FALSE;\r
+}\r
+\r
+void CCommands::PrintFunctionName(int (*nFunctionPointer)())\r
+{\r
+       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+               if (Commands[nCommandID].fCommand == nFunctionPointer) {\r
+                       CUtils::Log(_T("m_LastCommand: %s"), Commands[nCommandID].szCommandName);\r
+               }\r
+       }\r
+}\r
+\r
+int CCommands::CapsLock()\r
+{\r
+       ClearNumericArgument();\r
+       Kdu(VK_CAPITAL);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::Underscore()\r
+{\r
+       ClearNumericArgument();\r
+       if (CXkeymacsData::Is106Keyboard()) {\r
+               SdKduSu(0xE2);  // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
+               Su();\r
+       } else {\r
+               SdKduSu(0xBD);  // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
+               Su();\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::RollUpUnroll()\r
+{\r
+       return Maximize(ROLL_UP_UNROLL);\r
+}\r
+\r
+int CCommands::Retop()\r
+{\r
+       RECT ClientRect = {'\0'};\r
+       GetClientRect(GetFocus(), &ClientRect);\r
+\r
+       for (int i = 0; i < 0x10000; ++i) {\r
+               POINT CaretPos = {'\0'};\r
+               GetCaretPos(&CaretPos);\r
+               if (ClientRect.top + 10 < CaretPos.y) {\r
+                       SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
+               } else {\r
+                       return Reset(GOTO_HOOK);\r
+               }\r
+       }\r
+\r
+       Kdu(VK_UP, VK_DOWN);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::OneShotModifierShift()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::OneShotModifierShiftRepeat()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::OneShotModifierCtrl()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::OneShotModifierCtrlRepeat()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::OneShotModifierAlt()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::OneShotModifierAltRepeat()\r
+{\r
+       // dummy\r
+       ASSERT(0);\r
+       static int i = 0;\r
+       ++i;\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::CycleItems()\r
+{\r
+       ClearNumericArgument();\r
+       AdKduAu(VK_ESCAPE);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+int CCommands::CycleItemsInversely()\r
+{\r
+       ClearNumericArgument();\r
+       AdSdKduSuAu(VK_ESCAPE);\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// M-t\r
+int CCommands::TransposeWords()\r
+{\r
+       static int nStep = 0;\r
+       switch (nStep) {\r
+       case 0:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("M-t: 0"));\r
+               CdKduCu(VK_LEFT);\r
+               CaptureClipboardData();\r
+               nStep = 1;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 1:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("M-t: 1"));\r
+               CdSdKduSuCu(VK_RIGHT);\r
+               CdKduCu('X');\r
+               nStep = 2;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 2:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("M-t: 2"));\r
+               Su();\r
+               CdKduCu(VK_RIGHT);\r
+               CdKduCu('V');\r
+               Kdu(VK_LEFT);\r
+               nStep = 3;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 3:\r
+               nStep = 0;\r
+//             CUtils::Log(_T("M-t: 3"));\r
+               RestoreClipboardData();\r
+               break;\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+BOOL CCommands::GetCaretPos(LPPOINT lpPoint)\r
+{\r
+       if (CUtils::IsMicrosoftWord()\r
+        || CUtils::IsThunderbird()) {\r
+               IMECHARPOSITION ImeCharPosition = {sizeof(IMECHARPOSITION)};\r
+\r
+               CallWindowProc((WNDPROC)GetWindowLong(GetFocus(), GWL_WNDPROC), GetFocus(), WM_IME_REQUEST, IMR_QUERYCHARPOSITION, (LPARAM)&ImeCharPosition);\r
+//             CUtils::Log(_T("ImeCharPosition: rc = %d, x = %d, y = %d"), 0, ImeCharPosition.pt.x, ImeCharPosition.pt.y);\r
+\r
+               ScreenToClient(GetFocus(), &ImeCharPosition.pt);\r
+//             CUtils::Log(_T("ScreenToClient: rc = %d, x = %d, y = %d"), 0, ImeCharPosition.pt.x, ImeCharPosition.pt.y);\r
+\r
+               *lpPoint = ImeCharPosition.pt;\r
+//             CUtils::Log(_T("x = %d, y = %d"), lpPoint->x, lpPoint->y);\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       return ::GetCaretPos(lpPoint);\r
+}\r
+\r
+LRESULT CCommands::VScroll(UINT nSBCode, const int nTimes)\r
+{\r
+       if (CUtils::IsMicrosoftWord()\r
+        || CUtils::IsThunderbird()) {\r
+               RECT ClientRect = {'\0'};\r
+               GetClientRect(GetFocus(), &ClientRect);\r
+\r
+               POINT righttop = {ClientRect.right, ClientRect.top};\r
+               ClientToScreen(GetFocus(), &righttop);\r
+//             CUtils::Log(_T("righttop: x = %d, y = %d"), righttop.x, righttop.y);\r
+\r
+               POINT rightbottom = {ClientRect.right, ClientRect.bottom};\r
+               ClientToScreen(GetFocus(), &rightbottom);\r
+//             CUtils::Log(_T("rightbottom: x = %d, y = %d"), rightbottom.x, rightbottom.y);\r
+\r
+//             POINT CursorPos = {'\0'};\r
+//             GetCursorPos(&CursorPos);\r
+//             CUtils::Log(_T("VScroll: x = %d, y = %d"), CursorPos.x, CursorPos.y);\r
+\r
+               POINT scrollpos = {'\0'};\r
+\r
+               switch (nSBCode) {\r
+               case SB_LINEUP:\r
+                       if (CUtils::IsMicrosoftWord()) {\r
+                               scrollpos.x = righttop.x + 8;   // 0 to 16\r
+                               scrollpos.y = righttop.y - 9;   // 1 to 17\r
+                       } else if (CUtils::IsThunderbird()) {\r
+                               scrollpos.x = righttop.x - 10;  // 2 to 18\r
+                               scrollpos.y = righttop.y + 8;   // 0 to 16\r
+                       }\r
+                       break;\r
+               case SB_LINEDOWN:\r
+                       if (CUtils::IsMicrosoftWord()) {\r
+                               scrollpos.x = rightbottom.x + 8;        //  0 to 16\r
+                               scrollpos.y = rightbottom.y - 60;       // 52 to 68\r
+                       } else if (CUtils::IsThunderbird()) {\r
+                               scrollpos.x = rightbottom.x - 10;       // 2 to 18\r
+                               scrollpos.y = rightbottom.y - 9;        // 1 to 17\r
+                       }\r
+                       break;\r
+               default:\r
+                       return 1;\r
+               }\r
+\r
+               int i = 0;\r
+               for (i = 0; i < nTimes; ++i) {\r
+                       Click(&scrollpos);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       return SendMessage(GetFocus(), WM_VSCROLL, nSBCode, NULL);\r
+}\r
+\r
+// M-q\r
+int CCommands::FillParagraph()\r
+{\r
+       static const int nFillColumn = 70; // tmp\r
+       static CString szClipboardText;\r
+       static int nOldLineLength = 0;\r
+\r
+       ClearNumericArgument(); // tmp\r
+\r
+       static int nStep = 0;\r
+       switch (nStep) {\r
+       case 0:         // Clear Selection\r
+//             CUtils::Log(_T("M-q: 0"));\r
+               nStep = 0;\r
+\r
+               CaptureClipboardData();\r
+               if (m_bSetMark) {\r
+                       m_bSetMark = FALSE;\r
+               }\r
+               Kdu(VK_HOME);\r
+               nOldLineLength = 0;\r
+\r
+               nStep = 1;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 1:         // Copy previous line\r
+//             CUtils::Log(_T("M-q: 1"));\r
+               nStep = 0;\r
+\r
+               if (!CopyPreviousLine()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+\r
+               nStep = 2;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 2:         // Check previous line to find TOP (top of paragraph)\r
+//             CUtils::Log(_T("M-q: 2"));\r
+               nStep = 0;\r
+\r
+               CUtils::GetClipboardText(&szClipboardText);\r
+//             CUtils::Log(_T("M-q: 2-1: _%s_"), szClipboardText);\r
+               if (szClipboardText.IsEmpty()) {\r
+                       // TOF\r
+//                     CUtils::Log(_T("M-q: 2: TOF"));\r
+                       Kdu(VK_HOME);\r
+                       nStep = 3;\r
+               } else if (szClipboardText == _T("\r\n")\r
+                               || szClipboardText == _T("\r")\r
+                               || szClipboardText == _T("\n")) {\r
+                       // blank line i.e. top of paragraph\r
+                       // UNIX: LF "\n"\r
+                       // WINDOWS: CR LF "\r\n"\r
+                       // MAC: CR "\r"\r
+//                     CUtils::Log(_T("M-q: 2: TOP"));\r
+                       Kdu(VK_DOWN);\r
+                       nStep = 3;\r
+               } else {\r
+                       // middle of paragraph\r
+//                     CUtils::Log(_T("M-q: 2: MOP_%d_"), szClipboardText.GetLength());\r
+//                     CUtils::Log(_T("M-q: 2: MOP_%c(%d)%c(%d)"), szClipboardText.GetAt(0), szClipboardText.GetAt(0), szClipboardText.GetAt(1), szClipboardText.GetAt(1));\r
+                       Kdu(VK_HOME);\r
+                       nStep = 1;\r
+               }\r
+\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 3:         // Go to EOL to copy a current line at the next step\r
+//             CUtils::Log(_T("M-q: 3"));\r
+               nStep = 0;\r
+\r
+               Kdu(VK_END);\r
+\r
+               nStep = 4;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 4:         // Copy a current line\r
+//             CUtils::Log(_T("M-q: 4"));\r
+               nStep = 0;\r
+\r
+               if (!CopyCurrentLine()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+\r
+               nStep = 5;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 5:         // Just release shift\r
+//             CUtils::Log(_T("M-q: 5"));\r
+               nStep = 0;\r
+\r
+               ReleaseKey(VK_SHIFT);\r
+\r
+               nStep = 6;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 6:         // Check current line and fill paragraph\r
+//             CUtils::Log(_T("M-q: 6"));\r
+               nStep = 0;\r
+\r
+               CUtils::GetClipboardText(&szClipboardText);\r
+               if (szClipboardText.GetLength() == nOldLineLength + 1) {\r
+//                     CUtils::Log(_T("M-q: 6-1 Finished"));\r
+                       Kdu(VK_END, VK_BACK, VK_RETURN);\r
+                       nStep = 8;\r
+               } else if (szClipboardText.GetLength() < nFillColumn) {\r
+//                     CUtils::Log(_T("M-q: 6-2 This line is too small"));\r
+                       Kdu(VK_END, VK_SPACE, VK_DELETE, VK_HOME);\r
+                       nStep = 3;\r
+               } else {\r
+//                     CUtils::Log(_T("M-q: 6-3 %d_%s_%d"), szClipboardText.Left(nFillColumn).GetLength(), szClipboardText.Left(nFillColumn), szClipboardText.Left(nFillColumn).ReverseFind(_T(' ')));\r
+                       const int offset = szClipboardText.Left(nFillColumn).ReverseFind(_T(' '));\r
+                       if (offset == 0) {\r
+//                             CUtils::Log(_T("M-q: 6-3-1 TOL is space"));\r
+                               Kdu(VK_DELETE);\r
+                       } else if (0 < offset) {\r
+//                             CUtils::Log(_T("M-q: 6-3-2"));\r
+                               ReleaseKey(VK_MENU); // FIXME\r
+                               for (int i = 0; i < offset; ++i) {\r
+                                       Kdu(VK_RIGHT);\r
+                               }\r
+                               nStep = 7;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else {\r
+//                             CUtils::Log(_T("M-q: 6-3-3 No space in first fill-column"));\r
+                               const int offset = szClipboardText.Find(_T(' '));\r
+                               if (offset < 0) {\r
+                                       Kdu(VK_HOME, VK_DOWN);\r
+                               } else {\r
+                                       ReleaseKey(VK_MENU); // FIXME\r
+                                       for (int i = 0; i < offset; ++i) {\r
+                                               Kdu(VK_RIGHT);\r
+                                       }\r
+                                       nStep = 7;\r
+                                       return Reset(GOTO_RECURSIVE);\r
+                               }\r
+                       }\r
+                       nStep = 3;\r
+               }\r
+               nOldLineLength = szClipboardText.GetLength();\r
+\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 7:         // Linefeed\r
+//             CUtils::Log(_T("M-q: 7"));\r
+               nStep = 0;\r
+\r
+               Kdu(VK_RETURN, VK_DELETE);\r
+\r
+               nStep = 3;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 8:         // Restore clipboard data\r
+//             CUtils::Log(_T("M-q: 8"));\r
+               nStep = 0;\r
+\r
+               RestoreClipboardData();\r
+\r
+               return Reset(GOTO_HOOK);\r
+       }\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+// M-l\r
+int CCommands::DowncaseWord()\r
+{\r
+       return CaseWord(DOWNCASE);\r
+}\r
+\r
+// M-u\r
+int CCommands::UpcaseWord()\r
+{\r
+       return CaseWord(UPCASE);\r
+}\r
+\r
+// M-c\r
+int CCommands::CapitalizeWord()\r
+{\r
+       return CaseWord(CAPITALIZE);\r
+}\r
+\r
+int CCommands::CaseWord(CASE_WORD nCase)\r
+{\r
+       ClearNumericArgument(); // tmp\r
+\r
+       // Do not try to do these command at once.\r
+       // Clipboard has old data till you go out this function.\r
+       static GOTO nNext = GOTO_HOOK;\r
+       static int nStep = 0;\r
+       static int nLastWhiteSpace = 0;\r
+       static BOOL bFirstCharacter = TRUE;\r
+       switch (nStep) {\r
+       case 0:         // Clear Selection\r
+               nLastWhiteSpace = 0;\r
+\r
+               if (m_bSetMark) {\r
+                       m_bSetMark = FALSE;\r
+                       Kdu(VK_RIGHT, VK_LEFT);\r
+                       nStep = 1;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               } else {\r
+                       // Do nothing. Go to case 1:\r
+               }\r
+       case 1:         // Get back character to confirm the cursor is at TOF or not.\r
+               nStep = 0;\r
+\r
+               CaptureClipboardData();\r
+\r
+               if (!CutFollowingWord()) {\r
+                       return Reset(GOTO_DO_NOTHING);\r
+               }\r
+\r
+               nStep = 2;\r
+               return Reset(GOTO_RECURSIVE);\r
+       case 2:\r
+               {\r
+                       nStep = 0;\r
+\r
+                       CString szClipboardText;\r
+                       CUtils::GetClipboardText(&szClipboardText);\r
+\r
+                       CString szTrimmed = szClipboardText;\r
+                       szTrimmed.TrimLeft();\r
+                       if (szClipboardText.IsEmpty()) {\r
+                               nNext = GOTO_HOOK;\r
+                               RestoreClipboardData();\r
+                               return Reset(GOTO_HOOK);\r
+                       } else if (szTrimmed.IsEmpty()) {\r
+                               if (nNext == GOTO_HOOK) {\r
+                                       nNext = GOTO_RECURSIVE;\r
+                               } else {\r
+                                       if (CUtils::IsHidemaru()) {\r
+                                               nLastWhiteSpace = 1;\r
+                                       }\r
+                                       nNext = GOTO_HOOK;\r
+                               }\r
+                               CUtils::SetClipboardText(&szClipboardText);\r
+                               nStep = 3;\r
+                               return Reset(GOTO_RECURSIVE);\r
+                       } else if (CUtils::IsHidemaru()) {\r
+                               nNext = GOTO_RECURSIVE;\r
+                       } else {\r
+                               nNext = GOTO_HOOK;\r
+                       }\r
+\r
+                       switch (nCase) {\r
+                       case DOWNCASE:\r
+                               szClipboardText.MakeLower();\r
+                               break;\r
+                       case UPCASE:\r
+                               szClipboardText.MakeUpper();\r
+                               break;\r
+                       case CAPITALIZE:\r
+                               {\r
+                                       for (int i = 0; i < szClipboardText.GetLength(); ++i) {\r
+                                               if (_istspace(szClipboardText.GetAt(i))) {\r
+                                                       continue;\r
+                                               } else if (bFirstCharacter) {\r
+                                                       bFirstCharacter = FALSE;\r
+                                                       if (_istlower(szClipboardText.GetAt(i))) {\r
+                                                               szClipboardText.SetAt(i, (TCHAR) toupper(szClipboardText.GetAt(i)));\r
+                                                       }\r
+                                               } else {\r
+                                                       if (_istupper(szClipboardText.GetAt(i))) {\r
+                                                               szClipboardText.SetAt(i, (TCHAR) tolower(szClipboardText.GetAt(i)));\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       break;\r
+                               }\r
+                       default:\r
+                               ASSERT(0);\r
+                       }\r
+\r
+                       CUtils::SetClipboardText(&szClipboardText);\r
+\r
+                       nLastWhiteSpace = 0;\r
+                       for (int j = szClipboardText.GetLength() - 1; !szClipboardText.IsEmpty() && 0 <= j; --j) {\r
+                               if (_istspace(szClipboardText.GetAt(j))) {\r
+                                       ++nLastWhiteSpace;\r
+                               } else {\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       nStep = 3;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       case 3:\r
+               {\r
+                       nStep = 0;\r
+\r
+                       Paste();\r
+\r
+                       for (int i = 0; i < nLastWhiteSpace; ++i) {\r
+                               Kdu(VK_LEFT);\r
+                       }\r
+\r
+                       nStep = 4;\r
+                       return Reset(GOTO_RECURSIVE);\r
+               }\r
+       case 4:\r
+               nStep = 0;\r
+\r
+               RestoreClipboardData();\r
+\r
+               if (nNext == GOTO_HOOK) {\r
+                       bFirstCharacter = TRUE;\r
+               }\r
+               return Reset(nNext);\r
+       }\r
+\r
+       return Reset(GOTO_HOOK);\r
+}\r
+\r
+BOOL CCommands::CutFollowingWord()\r
+{\r
+       if (!CUtils::OpenClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!EmptyClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+       if (!CloseClipboard()) {\r
+               ASSERT(0);\r
+               return FALSE;\r
+       }\r
+\r
+       if (CUtils::IsHidemaru()) {\r
+               // On Hidemaru, Cut_() does not work well after CdSdKduSuCu(). I do not know why.\r
+               SdKduSu(VK_RIGHT);\r
+       } else {\r
+               CdSdKduSuCu(VK_RIGHT);\r
+       }\r
+       Cut_();\r
+\r
+       return TRUE;\r
+}\r
+\r
+// M-x: execute-extended-command\r
+int CCommands::ExecuteExtendedCommand()\r
+{\r
+//     CUtils::Log(_T("ExecuteExtendedCommand"));\r
+       bM_x(TRUE);\r
+       return Reset(GOTO_HOOKX);\r
+}\r
diff --git a/xkeymacsdll/Commands.h b/xkeymacsdll/Commands.h
new file mode 100644 (file)
index 0000000..375a7cb
--- /dev/null
@@ -0,0 +1,517 @@
+// Commands.h: interface of the CCommands class\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "xkeymacsdll.h"\r
+\r
+#if !defined(AFX_COMMANDS_H__3AD9D537_AB40_40BB_9697_35F1BB0CA431__INCLUDED_)\r
+#define AFX_COMMANDS_H__3AD9D537_AB40_40BB_9697_35F1BB0CA431__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+enum SEARCH_DIRECTION { NA, FORWARD, BACKWARD, AGAIN };\r
+enum MAXIMIZE_DIRECTION { VERTICAL, HORIZONTAL, ROLL_UP_UNROLL, MAX_MAXIMIZE_DIRECTION };\r
+enum INPUT_METHOD_OPEN_STATUS {CLOSE_INPUT_METHOD, OPEN_INPUT_METHOD, TOGGLE_INPUT_METHOD};\r
+enum CONSOLE_MENU_EDIT { CMD_MARK = 1, CMD_COPY, CMD_PASTE, CMD_SELECT_ALL, CMD_SCROLL, CMD_FIND };\r
+enum CONSOLE_MENU { CMD_RESTORE = 1, CMD_MOVE, CMD_SIZE, CMD_MINIMIZE, CMD_MAXIMIZE, CMD_CLOSE, CMD_EDIT, CMD_DEFAULTS, CMD_PROPERTIES };\r
+enum { MAX_WINDOW = 64 };\r
+enum CASE_WORD { DOWNCASE, UPCASE, CAPITALIZE };\r
+\r
+typedef struct OriginalWindowPosition\r
+{\r
+       HWND hWnd;\r
+       BOOL bMax[MAX_MAXIMIZE_DIRECTION];\r
+       int nOriginalX;                 // for HORIZONTAL\r
+       int nOriginalY;                 // for VERTICAL\r
+       int nOriginalWidth;             // for HORIZONTAL\r
+       int nOriginalHeight;    // for VERTICAL\r
+} OriginalWindowPosition_t;\r
+\r
+class AFX_EXT_CLASS CCommands  \r
+{\r
+public:\r
+       static int ExecuteExtendedCommand();\r
+       static int CapitalizeWord();\r
+       static int UpcaseWord();\r
+       static int DowncaseWord();\r
+       static int FillParagraph();\r
+       static int TransposeWords();\r
+       static int CycleItemsInversely();\r
+       static int CycleItems();\r
+       static int OneShotModifierAltRepeat();\r
+       static int OneShotModifierAlt();\r
+       static int OneShotModifierCtrlRepeat();\r
+       static int OneShotModifierCtrl();\r
+       static int OneShotModifierShiftRepeat();\r
+       static int OneShotModifierShift();\r
+       static int Retop();\r
+       static int RollUpUnroll();\r
+       static int Underscore();\r
+       static int CapsLock();\r
+       static int DisableXKeymacs();\r
+       static int EnableXKeymacs();\r
+       static int BackwardKillWord();\r
+       static int KillLineForAllFormat();\r
+       static int TransposeLines();\r
+       static int FindNext();\r
+       static int Find();\r
+       static int Print();\r
+       static int New();\r
+       static int Cut();\r
+       static int Paste();\r
+       static int Copy();\r
+       static void SetTemporarilyDisableXKeymacs(BOOL bTemporarilyDisableXKeymacs);\r
+       static BOOL IsTemporarilyDisableXKeymacs();\r
+       static int TemporarilyDisableXKeymacs();\r
+       static int Redo();\r
+       static int PassThrough();\r
+       static GOTO MoveCaret(BYTE bVk, BOOL bCtrl = FALSE);\r
+       static int MaximizeHorizontally();\r
+       static int MaximizeVertically();\r
+       static int Maximize();\r
+       static int Minimize();\r
+       static int Size();\r
+       static int Move();\r
+       static int Restore();\r
+       static void SetMark(BOOL bSetMark);\r
+       static BOOL IsSetMark();\r
+       static int BackQuote();\r
+       static int Tilde();\r
+       static int Escape();\r
+       static int C_Eisu();\r
+       static int C_();\r
+       static int SwitchToBuffer();\r
+       static int SwitchBetweenInputLocales();\r
+       static int CallLastKbdMacro();\r
+       static int EndKbdMacro();\r
+       static int StartKbdMacro();\r
+       static int SelectAll();\r
+       static int MarkWholeBuffer();\r
+       static int KillWord();\r
+       static void SetLastCommand(int (*LastCommand)());\r
+       static int KillBuffer();\r
+       static int Reset(int rc);\r
+       static int CloseInputMethod();\r
+       static int CompleteCloseInputMethod();\r
+       static int OpenInputMethod();\r
+       static int NumericArgument(int n);\r
+       static void ClearNumericArgument();\r
+       static int GetNumericArgument();\r
+       static int EnableOrDisableXKeymacs();\r
+       static int IsearchForward();\r
+       static int IsearchBackward();\r
+       static int TransposeChars();\r
+       static int Recenter();\r
+       static int Repeat(BYTE bVk);\r
+       static void bC_u(BOOL b);\r
+       static BOOL bC_u();\r
+       static int UniversalArgument();\r
+       static int NumericArgumentMinus();\r
+       static int NumericArgument9();\r
+       static int NumericArgument8();\r
+       static int NumericArgument7();\r
+       static int NumericArgument6();\r
+       static int NumericArgument5();\r
+       static int NumericArgument4();\r
+       static int NumericArgument3();\r
+       static int NumericArgument2();\r
+       static int NumericArgument1();\r
+       static int NumericArgument0();\r
+       static int MetaAlt();\r
+       static int MetaEscape();\r
+       static int Meta();\r
+       static void bM_(BOOL b);\r
+       static BOOL bM_();\r
+       static int Ignore();\r
+       static int ShellCommand();\r
+       static int YankPop();\r
+       static int Yank();\r
+       static int KillRingSave();\r
+       static int KillRegion();\r
+       static int WriteFile();\r
+       static int C_x();\r
+       static void Reset();\r
+       static void bC_(BOOL b);\r
+       static BOOL bC_();\r
+       static void bC_x(BOOL b);\r
+       static BOOL bC_x();\r
+       static void bM_x(BOOL b);\r
+       static BOOL bM_x();\r
+       static int ScrollDown();\r
+       static int ScrollUp();\r
+       static int SaveBuffer();\r
+       static int MarkPage();\r
+       static int Newline();\r
+       static int TabToTabStop();\r
+       static int FindFile();\r
+       static int KeyboardQuit();\r
+       static int SetMarkCommand();\r
+       static int IconifyOrDeiconifyFrame();\r
+       static int SaveBuffersKillEmacs();\r
+       static int Undo();\r
+       static int KillLine();\r
+       static int DeleteChar();\r
+       static int DeleteBackwardChar();\r
+       static int EndOfBuffer();\r
+       static int BeginningOfBuffer();\r
+       static int QueryReplaceRegexp();\r
+       static int QueryReplace();\r
+       static int ToggleInputMethod();\r
+       static int CompleteToggleInputMethod();\r
+       static int OpenLine();\r
+       static int PreviousLine();\r
+       static int NextLine();\r
+       static int BackwardWord();\r
+       static int ForwardWord();\r
+       static int EndOfLine();\r
+       static int BackwardChar();\r
+       static int BeginningOfLine();\r
+       static int ForwardChar();\r
+       CCommands();\r
+       virtual ~CCommands();\r
+\r
+private:\r
+       static BOOL CutFollowingWord();\r
+       static int CaseWord(CASE_WORD nCase);\r
+       static BOOL CopyCurrentLine();\r
+       static BOOL CopyPreviousLine();\r
+       static LRESULT VScroll(UINT nSBCode, int nTimes = 1);\r
+       static BOOL GetCaretPos(LPPOINT lpPoint);\r
+       static BOOL IsKillCommand(int (*nFunctionPointer)());\r
+       static void PrintFunctionName(int (*nFunctionPointer)());\r
+       static OriginalWindowPosition_t* GetOriginalWindowPosition(HWND hWnd);\r
+       static OriginalWindowPosition_t m_OriginalWindowPosition[MAX_WINDOW];\r
+       static int KillLine(BOOL bAllFormat, int (*pCommand)() = KillLine);\r
+       static BOOL IsEmptyClipboardData(const int nID = 0);\r
+       static int FindReturnFromClipboardData(const int nID = 0);\r
+       static void Cut_();\r
+       static void RestoreClipboardData(const int nID = 0);\r
+       static void CaptureClipboardData(const int nID = 0, const BOOL bTextOnly = FALSE);\r
+       static CArray<CClipboardSnap *, CClipboardSnap *> m_oClipboardData;\r
+       static int SystemMenuEdit(const CONSOLE_MENU_EDIT nDown);\r
+       static int Click(const POINT* const pClickPoint);\r
+       static int SystemMenu(const CONSOLE_MENU nDown);\r
+       static BOOL m_bTemporarilyDisableXKeymacs;\r
+       static int Maximize(MAXIMIZE_DIRECTION direction);\r
+       static DWORD DeactivateMark();\r
+       static BOOL m_bFirstFindDialog;\r
+       static BOOL SetCaretPosition();\r
+       static void GetCaretPosition();\r
+       static CPtrList m_FindText;\r
+       static CPtrList m_ScrollInfo;\r
+       static CPtrList m_CaretPos;\r
+       static void Copy_();\r
+       static BYTE GetDirectionBackwardKey();\r
+       static BYTE GetDirectionForwardKey();\r
+       static BYTE GetSearchOptionKey();\r
+       static BYTE GetFindWhatKey();\r
+       static void OpenFindDialog();\r
+       static BOOL m_bC_;\r
+       static void CdSdKduSuCu(BYTE bVk);\r
+       static int (*m_LastKillCommand)();\r
+       static int (*m_LastCommand)();\r
+       static void SetInputMethodOpenStatus(INPUT_METHOD_OPEN_STATUS status, BOOL isComplete = FALSE);\r
+       static void SetSearchDirection(SEARCH_DIRECTION direction = m_SearchDirection);\r
+       static SEARCH_DIRECTION m_SearchDirection;\r
+       static int Search(SEARCH_DIRECTION direction);\r
+       static void DecreaseNumericArgument();\r
+       static BOOL CopyBackCharacter();\r
+       static BOOL CopyNextCharacter();\r
+       static BOOL m_bC_u;\r
+       static BOOL m_bNegativeNumericArgument;\r
+       static BOOL m_bDefaultNumericArgument;\r
+       static BOOL m_bM_x;\r
+       static BOOL m_bM_;\r
+       static BOOL m_bC_x;\r
+       static DWORD ClickCaret();\r
+       static BOOL m_bSetMark;\r
+       static void ReleaseKey(BYTE bVk);\r
+       static void DepressKey(BYTE bVk);\r
+       static void SdKduSu(BYTE bVk1, BYTE bVk2 = 0, BYTE bVk3 = 0, BYTE bVk4 = 0);\r
+       static void AdSdKduSuAu(BYTE bVk1);\r
+       static void AdKduAu(BYTE bVk1, BYTE bVk2 = 0, BYTE bVk3 = 0);\r
+       static void CdKduCu(BYTE bVk1, BYTE bVk2 = 0);\r
+       static void Kdu(BYTE bVk1 = 0, BYTE bVk2 = 0, BYTE bVk3 = 0, BYTE bVk4 = 0);\r
+       static DWORD m_nNumericArgument;\r
+       static void Su();\r
+       static BOOL m_bIsSu;\r
+};\r
+\r
+enum { MAX_KEY_BIND = 8 };\r
+\r
+typedef struct Command\r
+{\r
+       LPCTSTR szCommandName;\r
+       int nCategoryID;\r
+       int nDescriptionID;\r
+       int nToolTipID;\r
+       int (*fCommand)();\r
+       KeyBind_t keybind[MAX_KEY_BIND];\r
+} Command_t;\r
+\r
+#include "../xkeymacs/resource.h"\r
+\r
+static const Command_t Commands[] = {\r
+       {_T("[unassigned]"),                            0,                              0,                                                                      0,                                                                      NULL,                                                           {'\0'}},\r
+       {_T("C-x"),                                                     0,                              IDS_CONTROL_X_PREFIX_D,                         IDS_CONTROL_X_PREFIX_T,                         CCommands::C_x,                                         {'\0'}},\r
+       {_T("C-"),                                                      IDS_OTHER,              IDS_CONTROL_D,                                          IDS_CONTROL_T,                                          CCommands::C_,                                          {{NONE, VK_CONTROL, 0},\r
+                                                                                                                                                                                                                                                                                                                                        {NONE, VK_LCONTROL, 0},\r
+                                                                                                                                                                                                                                                                                                                                        {NONE, VK_RCONTROL, 0},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("C- for Eisu"),                                     0,                              IDS_CONTROL_PREFIX_D,                           IDS_CONTROL_PREFIX_T,                           CCommands::C_Eisu,                                      {'\0'}},\r
+       {_T("Caps Lock"),                                       IDS_OTHER,              IDS_CAPS_LOCK_D,                                        IDS_CAPS_LOCK_T,                                        CCommands::CapsLock,                            {'\0'}},\r
+       {_T("Close Input Method"),                      IDS_IME,                IDS_CLOSE_INPUT_METHOD_D,                       IDS_CLOSE_INPUT_METHOD_T,                       CCommands::CloseInputMethod,            {'\0'}},\r
+       {_T("Complete & Close Input Method"),   IDS_IME,        IDS_COMPLETE_CLOSE_INPUT_METHOD_D,      IDS_COMPLETE_CLOSE_INPUT_METHOD_T,      CCommands::CompleteCloseInputMethod,{'\0'}},\r
+       {_T("Complete & Toggle Input Method"),  IDS_IME,        IDS_COMPLETE_TOGGLE_INPUT_METHOD_D,     IDS_COMPLETE_TOGGLE_INPUT_METHOD_T,     CCommands::CompleteToggleInputMethod,   {'\0'}},\r
+       {_T("Copy"),                                            IDS_OTHER,              IDS_COPY_D,                                                     IDS_COPY_T,                                                     CCommands::Copy,                                        {'\0'}},\r
+       {_T("Cut"),                                                     IDS_OTHER,              IDS_CUT_D,                                                      IDS_CUT_T,                                                      CCommands::Cut,                                         {'\0'}},\r
+       {_T("Cycle items"),                                     IDS_OTHER,              IDS_CYCLE_ITEMS_D,                                      IDS_CYCLE_ITEMS_T,                                      CCommands::CycleItems,                          {'\0'}},\r
+       {_T("Cycle items inversely"),           IDS_OTHER,              IDS_CYCLE_ITEMS_INVERSELY_D,            IDS_CYCLE_ITEMS_INVERSELY_T,            CCommands::CycleItemsInversely,         {'\0'}},\r
+       {_T("Disable XKeymacs"),                        IDS_OTHER,              IDS_DISABLE_XKEYMACS_D,                         IDS_DISABLE_XKEYMACS_T,                         CCommands::DisableXKeymacs,                     {'\0'}},\r
+       {_T("Enable or Disable XKeymacs"),      IDS_OTHER,              IDS_ENABLE_OR_DISABLE_XKEYMACS_D,       IDS_ENABLE_OR_DISABLE_XKEYMACS_T,       CCommands::EnableOrDisableXKeymacs,     {{CONTROL, 'Q', IDC_CQ},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'Q', IDC_CQ},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("Enable XKeymacs"),                         IDS_OTHER,              IDS_ENABLE_XKEYMACS_D,                          IDS_ENABLE_XKEYMACS_T,                          CCommands::EnableXKeymacs,                      {'\0'}},\r
+       {_T("newline"),                                         IDS_OTHER,              IDS_NEWLINE_D,                                          IDS_NEWLINE_T,                                          CCommands::Newline,                                     {{CONTROL, 'M', IDC_CM},\r
+                                                                                                                                                                                                                                                                                                                                       {CONTROL+SHIFT, 'M', IDC_CM},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("Esc"),                                                     IDS_OTHER,              IDS_ESCAPE_D,                                           IDS_ESCAPE_T,                                           CCommands::Escape,                                      {'\0'}},\r
+       {_T("Find"),                                            IDS_OTHER,              IDS_FIND_D,                                                     IDS_FIND_T,                                                     CCommands::Find,                                        {'\0'}},\r
+       {_T("Find Next"),                                       IDS_OTHER,              IDS_FIND_NEXT_D,                                        IDS_FIND_NEXT_T,                                        CCommands::FindNext,                            {'\0'}},\r
+       {_T("Ignore"),                                          IDS_OTHER,              IDS_IGNORE_D,                                           IDS_IGNORE_T,                                           CCommands::Ignore,                                      {'\0'}},\r
+       {_T("Kill Line for All Format"),        IDS_OTHER,              IDS_KILL_LINE_FOR_ALL_FORMAT_D,         IDS_KILL_LINE_FOR_ALL_FORMAT_T,         CCommands::KillLineForAllFormat,        {'\0'}},\r
+       {_T("Maximize"),                                        IDS_OTHER,              IDS_MAXIMIZE_D,                                         IDS_MAXIMIZE_T,                                         CCommands::Maximize,                            {'\0'}},\r
+       {_T("Maximize Horizontally"),           IDS_OTHER,              IDS_MAXIMIZE_HORIZONTALLY_D,            IDS_MAXIMIZE_HORIZONTALLY_T,            CCommands::MaximizeHorizontally,        {'\0'}},\r
+       {_T("Maximize Vertically"),                     IDS_OTHER,              IDS_MAXIMIZE_VERTICALLY_D,                      IDS_MAXIMIZE_VERTICALLY_T,                      CCommands::MaximizeVertically,          {'\0'}},\r
+       {_T("Meta"),                                            IDS_OTHER,              IDS_META_PREFIX_D,                                      IDS_META_PREFIX_T,                                      CCommands::Meta,                                        {{CONTROL, 0xDB, IDC_SQUARE_BRA},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},      // VK_OEM_4\r
+       {_T("Meta for Alt"),                            IDS_OTHER,              IDS_META_D,                                                     IDS_META_T,                                                     CCommands::MetaAlt,                                     {{NONE, VK_MENU, IDC_ALT},\r
+                                                                                                                                                                                                                                                                                                                                        {NONE, VK_LMENU, IDC_LEFT_ALT},\r
+                                                                                                                                                                                                                                                                                                                                        {NONE, VK_RMENU, IDC_RIGHT_ALT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("Meta for Escape"),                         IDS_OTHER,              IDS_META_PREFIX_AND_ORIGINAL_D,         IDS_META_PREFIX_AND_ORIGINAL_T,         CCommands::MetaEscape,                          {{NONE, VK_ESCAPE, IDC_ESCAPE},\r
+                                                                                                                                                                                                                                                                                                                                        {NONE+SHIFT, VK_ESCAPE, IDC_ESCAPE},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},      // add SHIFT\r
+       {_T("Minimize"),                                        IDS_OTHER,              IDS_MINIMIZE_D,                                         IDS_MINIMIZE_T,                                         CCommands::Minimize,                            {'\0'}},\r
+       {_T("Move"),                                            IDS_OTHER,              IDS_MOVE_D,                                                     IDS_MOVE_T,                                                     CCommands::Move,                                        {'\0'}},\r
+       {_T("New"),                                                     IDS_OTHER,              IDS_NEW_D,                                                      IDS_NEW_T,                                                      CCommands::New,                                         {'\0'}},\r
+       {_T("One Shot Modifier Alt"),           IDS_MODIFIER,   IDS_OSMODIFIER_ALT_D,                           IDS_OSMODIFIER_ALT_T,                           CCommands::OneShotModifierAlt,          {'\0'}},\r
+       {_T("One Shot Modifier Alt with Repeat"),       IDS_MODIFIER,   IDS_OSMODIFIER_ALT_REPEAT_D,    IDS_OSMODIFIER_ALT_REPEAT_T,    CCommands::OneShotModifierAltRepeat,    {'\0'}},\r
+       {_T("One Shot Modifier Ctrl"),          IDS_MODIFIER,   IDS_OSMODIFIER_CTRL_D,                          IDS_OSMODIFIER_CTRL_T,                          CCommands::OneShotModifierCtrl,         {'\0'}},\r
+       {_T("One Shot Modifier Ctrl with Repeat"),      IDS_MODIFIER,   IDS_OSMODIFIER_CTRL_REPEAT_D,   IDS_OSMODIFIER_CTRL_REPEAT_T,   CCommands::OneShotModifierCtrlRepeat,   {'\0'}},\r
+       {_T("One Shot Modifier Shift"),         IDS_MODIFIER,   IDS_OSMODIFIER_SHIFT_D,                         IDS_OSMODIFIER_SHIFT_T,                         CCommands::OneShotModifierShift,        {'\0'}},\r
+       {_T("One Shot Modifier Shift with Repeat"),     IDS_MODIFIER,   IDS_OSMODIFIER_SHIFT_REPEAT_D,  IDS_OSMODIFIER_SHIFT_REPEAT_T,  CCommands::OneShotModifierShiftRepeat,  {'\0'}},\r
+       {_T("Open Input Method"),                       IDS_IME,                IDS_OPEN_INPUT_METHOD_D,                        IDS_OPEN_INPUT_METHOD_T,                        CCommands::OpenInputMethod,                     {'\0'}},\r
+       {_T("Pass Through"),                            IDS_OTHER,              IDS_PASS_THROUGH_D,                                     IDS_PASS_THROUGH_T,                                     CCommands::PassThrough,                         {'\0'}},\r
+       {_T("Paste"),                                           IDS_OTHER,              IDS_PASTE_D,                                            IDS_PASTE_T,                                            CCommands::Paste,                                       {'\0'}},\r
+       {_T("Print"),                                           IDS_OTHER,              IDS_PRINT_D,                                            IDS_PRINT_T,                                            CCommands::Print,                                       {'\0'}},\r
+       {_T("Redo"),                                            IDS_OTHER,              IDS_REDO_D,                                                     IDS_REDO_T,                                                     CCommands::Redo,                                        {'\0'}},\r
+       {_T("Restore"),                                         IDS_OTHER,              IDS_RESTORE_D,                                          IDS_RESTORE_T,                                          CCommands::Restore,                                     {'\0'}},\r
+       {_T("Retop"),                                           IDS_OTHER,              IDS_RETOP_D,                                            IDS_RETOP_T,                                            CCommands::Retop,                                       {'\0'}},\r
+       {_T("Roll-up/Unroll"),                          IDS_WINDOW,             IDS_ROLL_UP_UNROLL_D,                           IDS_ROLL_UP_UNROLL_T,                           CCommands::RollUpUnroll,                        {{META, VK_F12, IDC_MF12},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("Select All"),                                      IDS_OTHER,              IDS_SELECT_ALL_D,                                       IDS_SELECT_ALL_T,                                       CCommands::SelectAll,                           {'\0'}},\r
+       {_T("Size"),                                            IDS_OTHER,              IDS_SIZE_D,                                                     IDS_SIZE_T,                                                     CCommands::Size,                                        {'\0'}},\r
+       {_T("Switch Between Input Locales"),IDS_IME,            IDS_SWITCH_BETWEEN_INPUT_LOCALES_D,     IDS_SWITCH_BETWEEN_INPUT_LOCALES_T,     CCommands::SwitchBetweenInputLocales,   {'\0'}},\r
+       {_T("Temporarily Disable XKeymacs"),IDS_OTHER,          IDS_TEMPORARILY_DISABLE_XKEYMACS_D,     IDS_TEMPORARILY_DISABLE_XKEYMACS_T,     CCommands::TemporarilyDisableXKeymacs,  {'\0'}},\r
+       {_T("~"),                                                       IDS_OTHER,              IDS_TILDE_D,                                            IDS_TILDE_T,                                            CCommands::Tilde,                                       {'\0'}},\r
+       {_T("`"),                                                       IDS_OTHER,              IDS_BACK_QUOTE_D,                                       IDS_BACK_QUOTE_T,                                       CCommands::BackQuote,                           {'\0'}},\r
+       {_T("_"),                                                       IDS_OTHER,              IDS_UNDERSCORE_D,                                       IDS_UNDERSCORE_T,                                       CCommands::Underscore,                          {'\0'}},\r
+       {_T("backward-char"),                           IDS_MOTION,             IDS_BACKWARD_CHAR_D,                            IDS_BACKWARD_CHAR_T,                            CCommands::BackwardChar,                        {{CONTROL, 'B', IDC_CB},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'B', IDC_CB},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("backward-kill-word"),                      IDS_KILL,               IDS_BACKWARD_KILL_WORD_D,                       IDS_BACKWARD_KILL_WORD_T,                       CCommands::BackwardKillWord,            {{META, VK_BACK, IDC_MDEL},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, VK_BACK, IDC_MDEL},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("backward-word"),                           IDS_MOTION,             IDS_BACKWARD_WORD_D,                            IDS_BACKWARD_WORD_T,                            CCommands::BackwardWord,                        {{META, 'B', IDC_MB},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'B', IDC_MB},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("beginning-of-buffer"),                     IDS_MOTION,             IDS_BEGINNING_OF_BUFFER_D,                      IDS_BEGINNING_OF_BUFFER_T,                      CCommands::BeginningOfBuffer,           {{META+SHIFT, 0xBC, IDC_MSCOMMA},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},      // VK_OEM_COMMA\r
+       {_T("beginning-of-line"),                       IDS_MOTION,             IDS_BEGINNING_OF_LINE_D,                        IDS_BEGINNING_OF_LINE_T,                        CCommands::BeginningOfLine,                     {{CONTROL, 'A', IDC_CA},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'A', IDC_CA},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("call-last-kbd-macro"),                     IDS_OTHER,              IDS_CALL_LAST_KBD_MACRO_D,                      IDS_CALL_LAST_KBD_MACRO_T,                      CCommands::CallLastKbdMacro,            {{CONTROLX, 'E', IDC_CXE},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROLX+SHIFT, 'E', IDC_CXE},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("capitalize-word"),                         IDS_OTHER,              IDS_CAPITALIZE_WORD_D,                          IDS_CAPITALIZE_WORD_T,                          CCommands::CapitalizeWord,                      {{META, 'C', IDC_MC},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'C', IDC_MC},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("delete-backward-char"),            IDS_KILL,               IDS_DELETE_BACKWARD_CHAR_D,                     IDS_DELETE_BACKWARD_CHAR_T,                     CCommands::DeleteBackwardChar,          {{CONTROL, 'H', IDC_CH},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'H', IDC_CH},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("delete-char"),                                     IDS_KILL,               IDS_DELETE_CHAR_D,                                      IDS_DELETE_CHAR_T,                                      CCommands::DeleteChar,                          {{CONTROL, 'D', IDC_CD},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'D', IDC_CD},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("downcase-word"),                           IDS_OTHER,              IDS_DOWNCASE_WORD_D,                            IDS_DOWNCASE_WORD_T,                            CCommands::DowncaseWord,                        {{META, 'L', IDC_ML},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'L', IDC_ML},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("end-kbd-macro"),                           IDS_OTHER,              IDS_END_KBD_MACRO_D,                            IDS_END_KBD_MACRO_T,                            CCommands::EndKbdMacro,                         {{CONTROLX+SHIFT, '0', IDC_CXS0},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("end-of-buffer"),                           IDS_MOTION,             IDS_END_OF_BUFFER_D,                            IDS_END_OF_BUFFER_T,                            CCommands::EndOfBuffer,                         {{META+SHIFT, 0xBE, IDC_MSPERIOD},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},      // VK_OEM_PERIOD\r
+       {_T("end-of-line"),                                     IDS_MOTION,             IDS_END_OF_LINE_D,                                      IDS_END_OF_LINE_T,                                      CCommands::EndOfLine,                           {{CONTROL, 'E', IDC_CE},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'E', IDC_CE},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("execute-extended-command"),    IDS_OTHER,      IDS_EXECUTE_EXTENDED_COMMAND_D,     IDS_EXECUTE_EXTENDED_COMMAND_T,     CCommands::ExecuteExtendedCommand,  {{META, 'X', IDC_MX},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'X', IDC_MX},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+//     {_T("fill-paragraph"),                          IDS_OTHER,              IDS_FILL_PARAGRAPH_D,                           IDS_FILL_PARAGRAPH_T,                           CCommands::FillParagraph,                       {'\0'}},\r
+       {_T("find-file"),                                       IDS_FILES,              IDS_FIND_FILE_D,                                        IDS_FIND_FILE_T,                                        CCommands::FindFile,                            {{CONTROL+CONTROLX, 'F', IDC_CXCF},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT+CONTROLX, 'F', IDC_CXCF},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("forward-char"),                            IDS_MOTION,             IDS_FORWARD_CHAR_D,                                     IDS_FORWARD_CHAR_T,                                     CCommands::ForwardChar,                         {{CONTROL, 'F', IDC_CF},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'F', IDC_CF},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("forward-word"),                            IDS_MOTION,             IDS_FORWARD_WORD_D,                                     IDS_FORWARD_WORD_T,                                     CCommands::ForwardWord,                         {{META, 'F', IDC_MF},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'F', IDC_MF},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("iconify-or-deiconify-frame"),      IDS_WINDOW,             IDS_ICONIFY_OR_DEICONIFY_FRAME_D,       IDS_ICONIFY_OR_DEICONIFY_FRAME_T,       CCommands::IconifyOrDeiconifyFrame,     {{CONTROL, 'Z', IDC_CZ},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'Z', IDC_CZ},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("isearch-backward"),                        IDS_SEARCH,             IDS_ISEARCH_BACKWARD_D,                         IDS_ISEARCH_BACKWARD_T,                         CCommands::IsearchBackward,                     {{CONTROL, 'R', IDC_CR},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'R', IDC_CR},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("isearch-forward"),                         IDS_SEARCH,             IDS_ISEARCH_FORWARD_D,                          IDS_ISEARCH_FORWARD_T,                          CCommands::IsearchForward,                      {{CONTROL, 'S', IDC_CS},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'S', IDC_CS},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("keyboard-quit"),                           IDS_RECOVERY,   IDS_KEYBOARD_QUIT_D,                            IDS_KEYBOARD_QUIT_T,                            CCommands::KeyboardQuit,                        {{CONTROL, 'G', IDC_CG},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'G', IDC_CG},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("kill-buffer"),                                     IDS_FILES,              IDS_KILL_BUFFER_D,                                      IDS_KILL_BUFFER_T,                                      CCommands::KillBuffer,                          {{CONTROLX, 'K', IDC_CXK},\r
+                                                                                                                                                                                                                                                                                                                                        {SHIFT+CONTROLX, 'K', IDC_CXK},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("kill-line"),                                       IDS_KILL,               IDS_KILL_LINE_D,                                        IDS_KILL_LINE_T,                                        CCommands::KillLine,                            {{CONTROL, 'K', IDC_CK},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'K', IDC_CK},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("kill-region"),                                     IDS_KILL,               IDS_KILL_REGION_D,                                      IDS_KILL_REGION_T,                                      CCommands::KillRegion,                          {{CONTROL, 'W', IDC_CW},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'W', IDC_CW},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("kill-ring-save"),                          IDS_KILL,               IDS_KILL_RING_SAVE_D,                           IDS_KILL_RING_SAVE_T,                           CCommands::KillRingSave,                        {{META, 'W', IDC_MW},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'W', IDC_MW},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("kill-word"),                                       IDS_KILL,               IDS_KILL_WORD_D,                                        IDS_KILL_WORD_T,                                        CCommands::KillWord,                            {{META, 'D', IDC_MD},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'D', IDC_MD},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("mark-page"),                                       IDS_OTHER,              IDS_MARK_PAGE_D,                                        IDS_MARK_PAGE_T,                                        CCommands::MarkPage,                            {{CONTROL+CONTROLX, 'P', IDC_CXCP},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT+CONTROLX, 'P', IDC_CXCP},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("mark-whole-buffer"),                       IDS_OTHER,              IDS_MARK_WHOLE_BUFFER_D,                        IDS_MARK_WHOLE_BUFFER_T,                        CCommands::MarkWholeBuffer,                     {{CONTROLX, 'H', IDC_CXH},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROLX+SHIFT, 'H', IDC_CXH},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("next-line"),                                       IDS_MOTION,             IDS_NEXT_LINE_D,                                        IDS_NEXT_LINE_T,                                        CCommands::NextLine,                            {{CONTROL, 'N', IDC_CN},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'N', IDC_CN},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 0"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT0_D,                          IDS_DIGIT_ARGUMENT0_T,                          CCommands::NumericArgument0,            {{CONTROL, '0', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '0', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 1"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT1_D,                          IDS_DIGIT_ARGUMENT1_T,                          CCommands::NumericArgument1,            {{CONTROL, '1', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '1', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 2"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT2_D,                          IDS_DIGIT_ARGUMENT2_T,                          CCommands::NumericArgument2,            {{CONTROL, '2', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '2', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 3"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT3_D,                          IDS_DIGIT_ARGUMENT3_T,                          CCommands::NumericArgument3,            {{CONTROL, '3', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '3', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 4"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT4_D,                          IDS_DIGIT_ARGUMENT4_T,                          CCommands::NumericArgument4,            {{CONTROL, '4', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '4', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 5"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT5_D,                          IDS_DIGIT_ARGUMENT5_T,                          CCommands::NumericArgument5,            {{CONTROL, '5', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '5', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 6"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT6_D,                          IDS_DIGIT_ARGUMENT6_T,                          CCommands::NumericArgument6,            {{CONTROL, '6', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '6', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 7"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT7_D,                          IDS_DIGIT_ARGUMENT7_T,                          CCommands::NumericArgument7,            {{CONTROL, '7', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '7', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 8"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT8_D,                          IDS_DIGIT_ARGUMENT8_T,                          CCommands::NumericArgument8,            {{CONTROL, '8', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '8', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument 9"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT9_D,                          IDS_DIGIT_ARGUMENT9_T,                          CCommands::NumericArgument9,            {{CONTROL, '9', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, '9', IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("numeric argument -"),                      IDS_OTHER,              IDS_NEGATIVE_ARGUMENT_D,                        IDS_NEGATIVE_ARGUMENT_T,                        CCommands::NumericArgumentMinus,        {{CONTROL, 0xBD, IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {META, 0xBD, IDC_CDIGIT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("open-line"),                                       IDS_OTHER,              IDS_OPEN_LINE_D,                                        IDS_OPEN_LINE_T,                                        CCommands::OpenLine,                            {{CONTROL, 'O', IDC_CO},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'O', IDC_CO},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("previous-line"),                           IDS_MOTION,             IDS_PREVIOUS_LINE_D,                            IDS_PREVIOUS_LINE_T,                            CCommands::PreviousLine,                        {{CONTROL, 'P', IDC_CP},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'P', IDC_CP},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("query-replace"),                           IDS_SEARCH,             IDS_QUERY_REPLACE_D,                            IDS_QUERY_REPLACE_T,                            CCommands::QueryReplace,                        {{META+SHIFT, '5', IDC_MS5},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("query-replace-regexp"),            IDS_SEARCH,             IDS_QUERY_REPLACE_REGEXP_D,                     IDS_QUERY_REPLACE_REGEXP_T,                     CCommands::QueryReplaceRegexp,          {{CONTROL+META+SHIFT, '5', IDC_CMS5},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("recenter"),                                        IDS_MOTION,             IDS_RECENTER_D,                                         IDS_RECENTER_T,                                         CCommands::Recenter,                            {{CONTROL, 'L', IDC_CL},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'L', IDC_CL},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("save-buffer"),                                     IDS_FILES,              IDS_SAVE_BUFFER_D,                                      IDS_SAVE_BUFFER_T,                                      CCommands::SaveBuffer,                          {{CONTROL+CONTROLX, 'S', IDC_CXCS},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT+CONTROLX, 'S', IDC_CXCS},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("save-buffers-kill-emacs"),         IDS_WINDOW,             IDS_SAVE_BUFFERS_KILL_EMACS_D,          IDS_SAVE_BUFFERS_KILL_EMACS_T,          CCommands::SaveBuffersKillEmacs,        {{CONTROL+CONTROLX, 'C', IDC_CXCC},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT+CONTROLX, 'C', IDC_CXCC},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("scroll-down"),                                     IDS_MOTION,             IDS_SCROLL_DOWN_D,                                      IDS_SCROLL_DOWN_T,                                      CCommands::ScrollDown,                          {{META, 'V', IDC_MV},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'V', IDC_MV},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("scroll-up"),                                       IDS_MOTION,             IDS_SCROLL_UP_D,                                        IDS_SCROLL_UP_T,                                        CCommands::ScrollUp,                            {{CONTROL, 'V', IDC_CV},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'V', IDC_CV},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("set-mark-command"),                        IDS_OTHER,              IDS_SET_MARK_COMMAND_D,                         IDS_SET_MARK_COMMAND_T,                         CCommands::SetMarkCommand,                      {{CONTROL, VK_SPACE, IDC_CSPACE},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, VK_SPACE, IDC_CSPACE},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("shell-command"),                           IDS_OTHER,              IDS_SHELL_COMMAND_D,                            IDS_SHELL_COMMAND_T,                            CCommands::ShellCommand,                        {{META+SHIFT, '1', IDC_MS1},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("start-kbd-macro"),                         IDS_OTHER,              IDS_START_KBD_MACRO_D,                          IDS_START_KBD_MACRO_T,                          CCommands::StartKbdMacro,                       {{CONTROLX+SHIFT, '9', IDC_CXS9},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("switch-to-buffer"),                        IDS_OTHER,              IDS_SWITCH_TO_BUFFER_D,                         IDS_SWITCH_TO_BUFFER_T,                         CCommands::SwitchToBuffer,                      {{CONTROLX, 'B', IDC_CXB},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROLX+SHIFT, 'B', IDC_CXB},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("tab-to-tab-stop"),                         IDS_OTHER,              IDS_TAB_D,                                                      IDS_TAB_T,                                                      CCommands::TabToTabStop,                        {{CONTROL, 'I', IDC_CI},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'I', IDC_CI},\r
+                                                                                                                                                                                                                                                                                                                                        {META, 'I', IDC_MI},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'I', IDC_MI},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("toggle-input-method"),                     IDS_IME,                IDS_TOGGLE_WIN32IME_MODE_D,                     IDS_TOGGLE_WIN32IME_MODE_T,                     CCommands::ToggleInputMethod,           {{CONTROL+CONTROLX, 'J', IDC_CXCJ},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT+CONTROLX, 'J', IDC_CXCJ},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL, 'O', IDC_CO2},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'O', IDC_CO2},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL, 0xDC, IDC_CBACKSLASH},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL, 0xE2, IDC_CBACKSLASH_106},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("transpose-chars"),                         IDS_KILL,               IDS_TRANSPOSE_CHARS_D,                          IDS_TRANSPOSE_CHARS_T,                          CCommands::TransposeChars,                      {{CONTROL, 'T', IDC_CT},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'T', IDC_CT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("transpose-lines"),                         IDS_KILL,               IDS_TRANSPOSE_LINES_D,                          IDS_TRANSPOSE_LINES_T,                          CCommands::TransposeLines,                      {{CONTROL+CONTROLX, 'T', IDC_CXCT},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT+CONTROLX, 'T', IDC_CXCT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("transpose-words"),                         IDS_KILL,               IDS_TRANSPOSE_WORDS_D,                          IDS_TRANSPOSE_WORDS_T,                          CCommands::TransposeWords,                      {{META, 'T', IDC_MT},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'T', IDC_MT},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("undo"),                                            IDS_RECOVERY,   IDS_UNDO_D,                                                     IDS_UNDO_T,                                                     CCommands::Undo,                                        {{CONTROLX, 'U', IDC_CXU},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 0xBD, IDC_C_},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL, 0xBF, IDC_CSLASH},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("universal-argument"),                      IDS_OTHER,              IDS_UNIVERSAL_ARGUMENT_D,                       IDS_UNIVERSAL_ARGUMENT_T,                       CCommands::UniversalArgument,           {{CONTROL, 'U', IDC_CU},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'U', IDC_CU},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("upcase-word"),                                     IDS_OTHER,              IDS_UPCASE_WORD_D,                                      IDS_UPCASE_WORD_T,                                      CCommands::UpcaseWord,                          {{META, 'U', IDC_MU},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'U', IDC_MU},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("write-file"),                                      IDS_FILES,              IDS_WRITE_FILE_D,                                       IDS_WRITE_FILE_T,                                       CCommands::WriteFile,                           {{CONTROL+CONTROLX, 'W', IDC_CXCW},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT+CONTROLX, 'W', IDC_CXCW},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("yank"),                                            IDS_KILL,               IDS_YANK_D,                                                     IDS_YANK_T,                                                     CCommands::Yank,                                        {{CONTROL, 'Y', IDC_CY},\r
+                                                                                                                                                                                                                                                                                                                                        {CONTROL+SHIFT, 'Y', IDC_CY},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+       {_T("yank-pop"),                                        IDS_KILL,               IDS_YANK_POP_D,                                         IDS_YANK_POP_T,                                         CCommands::YankPop,                                     {{META, 'Y', IDC_MY},\r
+                                                                                                                                                                                                                                                                                                                                        {META+SHIFT, 'Y', IDC_MY},\r
+                                                                                                                                                                                                                                                                                                                                        {'\0'}}},\r
+};\r
+\r
+#endif // !defined(AFX_COMMANDS_H__3AD9D537_AB40_40BB_9697_35F1BB0CA431__INCLUDED_)\r
diff --git a/xkeymacsdll/FunctionDefinition.cpp b/xkeymacsdll/FunctionDefinition.cpp
new file mode 100644 (file)
index 0000000..400c315
--- /dev/null
@@ -0,0 +1,129 @@
+// FunctionDefinition.cpp: implementation of the CFunctionDefinition class.\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "stdafx.h"\r
+#include "FunctionDefinition.h"\r
+#include "Commands.h"\r
+#include "Utils.h"\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// Construction/Destruction\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CFunctionDefinition::CFunctionDefinition()\r
+{\r
+\r
+}\r
+\r
+CFunctionDefinition::CFunctionDefinition(CString szSymbol, CString szDefinition)\r
+{\r
+       SetSymbol(szSymbol);\r
+       SetDefinition(szDefinition);\r
+}\r
+\r
+CFunctionDefinition::~CFunctionDefinition()\r
+{\r
+\r
+}\r
+\r
+void CFunctionDefinition::SetSymbol(CString szSymbol)\r
+{\r
+       m_szSymbol = szSymbol;\r
+}\r
+\r
+void CFunctionDefinition::SetDefinition(CString szDefinition)\r
+{\r
+       m_szDefinition = szDefinition;\r
+}\r
+\r
+CString CFunctionDefinition::GetSymbol()\r
+{\r
+       return m_szSymbol;\r
+}\r
+\r
+CString CFunctionDefinition::GetDefinition()\r
+{\r
+       return m_szDefinition;\r
+}\r
+\r
+void CFunctionDefinition::ClearKey(int nApplicationID)\r
+{\r
+       if (nApplicationID < 0 || MAX_APP <= nApplicationID) {\r
+               return;\r
+       }\r
+\r
+       while (!m_oKey[nApplicationID].IsEmpty()) {\r
+               KeyBind *pKeyBind = (KeyBind *)m_oKey[nApplicationID].GetHead();\r
+               delete pKeyBind;\r
+               pKeyBind = NULL;\r
+               m_oKey[nApplicationID].RemoveHead();\r
+       }\r
+}\r
+\r
+void CFunctionDefinition::SetKey(int nApplicationID, int nCommandType, int nKey)\r
+{\r
+       if (nApplicationID < 0 || MAX_APP <= nApplicationID) {\r
+               return;\r
+       }\r
+\r
+       try {\r
+               KeyBind *pKeyBind = new KeyBind;\r
+\r
+               if (pKeyBind) {\r
+                       pKeyBind->nCommandType = nCommandType;\r
+                       pKeyBind->bVk = (BYTE)nKey;\r
+                       pKeyBind->nControlID = 0;\r
+\r
+                       m_oKey[nApplicationID].AddTail((CObject *)pKeyBind);\r
+               }\r
+       }\r
+       catch (CMemoryException* e) {\r
+               e->Delete();\r
+//             CUtils::Log("CFunctionDefinition::SetKey: 'new' threw an exception");\r
+       }\r
+}\r
+\r
+int CFunctionDefinition::GetKeyNumber(int nApplicationID)\r
+{\r
+       if (nApplicationID < 0 || MAX_APP <= nApplicationID) {\r
+               return 0;\r
+       }\r
+\r
+       return m_oKey[nApplicationID].GetCount();\r
+}\r
+\r
+void CFunctionDefinition::GetKey(int nApplicationID, int nKeyID, int *pCommandType, int *pKey)\r
+{\r
+       *pCommandType = 0;\r
+       *pKey = 0;\r
+\r
+       if (nApplicationID < 0 || MAX_APP <= nApplicationID) {\r
+               return;\r
+       }\r
+       if (nKeyID < 0 || m_oKey[nApplicationID].GetCount() <= nKeyID) {\r
+               return;\r
+       }\r
+\r
+       KeyBind *pKeyBind = (KeyBind *)m_oKey[nApplicationID].GetAt(m_oKey[nApplicationID].FindIndex(nKeyID));\r
+       *pCommandType = pKeyBind->nCommandType;\r
+       *pKey = pKeyBind->bVk;\r
+}\r
+\r
+void CFunctionDefinition::RemoveKey(int nApplicationID, int nCommandType, int nKey)\r
+{\r
+       if (nApplicationID < 0 || MAX_APP <= nApplicationID) {\r
+               return;\r
+       }\r
+\r
+       for (POSITION pos = m_oKey[nApplicationID].GetHeadPosition(); pos; ) {\r
+               POSITION currentPos = pos;\r
+               KeyBind *pKeyBind = (KeyBind *)m_oKey[nApplicationID].GetNext(pos);\r
+               if (pKeyBind->nCommandType == nCommandType && pKeyBind->bVk == nKey) {\r
+                       delete pKeyBind;\r
+                       pKeyBind = NULL;\r
+                       m_oKey[nApplicationID].RemoveAt(currentPos);\r
+                       break;\r
+               }\r
+       }\r
+}\r
diff --git a/xkeymacsdll/FunctionDefinition.h b/xkeymacsdll/FunctionDefinition.h
new file mode 100644 (file)
index 0000000..04fb60f
--- /dev/null
@@ -0,0 +1,36 @@
+// FunctionDefinition.h: interface for the CFunctionDefinition class.\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_FUNCTIONDEFINITION_H__22E7286C_E86F_4964_896F_28A66E94A7A2__INCLUDED_)\r
+#define AFX_FUNCTIONDEFINITION_H__22E7286C_E86F_4964_896F_28A66E94A7A2__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#include "xkeymacsdll.h"\r
+\r
+class AFX_EXT_CLASS CFunctionDefinition\r
+{\r
+public:\r
+       void RemoveKey(int nApplicationID, int nCommandType, int nKey);\r
+       void GetKey(int nApplicationID, int nKeyID, int *pCommandType, int *pKey);\r
+       int GetKeyNumber(int nApplicationID);\r
+       void SetKey(int nApplicationID, int nCommandType, int nKey);\r
+       void ClearKey(int nApplicationID);\r
+       CString GetDefinition();\r
+       CString GetSymbol();\r
+       void SetDefinition(CString szDefinition);\r
+       void SetSymbol(CString szSymbol);\r
+       CFunctionDefinition();\r
+       CFunctionDefinition(CString szSymbol, CString szDefinition);\r
+       virtual ~CFunctionDefinition();\r
+\r
+private:\r
+       CObList m_oKey[MAX_APP];\r
+       CString m_szDefinition;\r
+       CString m_szSymbol;\r
+};\r
+\r
+#endif // !defined(AFX_FUNCTIONDEFINITION_H__22E7286C_E86F_4964_896F_28A66E94A7A2__INCLUDED_)\r
diff --git a/xkeymacsdll/StdAfx.cpp b/xkeymacsdll/StdAfx.cpp
new file mode 100644 (file)
index 0000000..716ab69
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes\r
+//     xkeymacsdll.pch will be the pre-compiled header\r
+//     stdafx.obj will contain the pre-compiled type information\r
+\r
+#include "stdafx.h"\r
+\r
+\r
+\r
diff --git a/xkeymacsdll/StdAfx.h b/xkeymacsdll/StdAfx.h
new file mode 100644 (file)
index 0000000..1a3bdd8
--- /dev/null
@@ -0,0 +1,42 @@
+// stdafx.h : include file for standard system include files,\r
+//  or project specific include files that are used frequently, but\r
+//      are changed infrequently\r
+//\r
+\r
+#if !defined(AFX_STDAFX_H__AA2B17FB_4840_41A9_896C_D69FA3B6D6FB__INCLUDED_)\r
+#define AFX_STDAFX_H__AA2B17FB_4840_41A9_896C_D69FA3B6D6FB__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+#define VC_EXTRALEAN           // Exclude rarely-used stuff from Windows headers\r
+\r
+#include <afxwin.h>         // MFC core and standard components\r
+#include <afxext.h>         // MFC extensions\r
+\r
+#ifndef _AFX_NO_OLE_SUPPORT\r
+#include <afxole.h>         // MFC OLE classes\r
+#include <afxodlgs.h>       // MFC OLE dialog classes\r
+#include <afxdisp.h>        // MFC Automation classes\r
+#endif // _AFX_NO_OLE_SUPPORT\r
+\r
+\r
+#ifndef _AFX_NO_DB_SUPPORT\r
+#include <afxdb.h>                     // MFC ODBC database classes\r
+#endif // _AFX_NO_DB_SUPPORT\r
+\r
+#ifndef _AFX_NO_DAO_SUPPORT\r
+#include <afxdao.h>                    // MFC DAO database classes\r
+#endif // _AFX_NO_DAO_SUPPORT\r
+\r
+#include <afxdtctl.h>          // MFC support for Internet Explorer 4 Common Controls\r
+#ifndef _AFX_NO_AFXCMN_SUPPORT\r
+#include <afxcmn.h>                    // MFC support for Windows Common Controls\r
+#endif // _AFX_NO_AFXCMN_SUPPORT\r
+\r
+\r
+//{{AFX_INSERT_LOCATION}}\r
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\r
+\r
+#endif // !defined(AFX_STDAFX_H__AA2B17FB_4840_41A9_896C_D69FA3B6D6FB__INCLUDED_)\r
diff --git a/xkeymacsdll/Utils.cpp b/xkeymacsdll/Utils.cpp
new file mode 100644 (file)
index 0000000..a8cddd5
--- /dev/null
@@ -0,0 +1,1192 @@
+// Utils.cpp: implementation of the CUtils class\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "stdafx.h"\r
+#include "Utils.h"\r
+#include "../xkeymacs/resource.h"\r
+#include <Imm.h>\r
+#pragma data_seg(".xkmcs")\r
+TCHAR CUtils::m_szApplicationName[MAX_PATH] = {'\0'};\r
+TCHAR CUtils::m_szIMEName[MAX_PATH] = _T("IME");       // IDS_IME_FILE_NAME\r
+OSVERSIONINFO CUtils::m_OsVersionInfo = {sizeof(OSVERSIONINFO)};\r
+#pragma data_seg()\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// Construction/Destruction\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CUtils::CUtils()\r
+{\r
+\r
+}\r
+\r
+CUtils::~CUtils()\r
+{\r
+\r
+}\r
+\r
+BOOL CUtils::GetFindDialogTitle(CString *szDialogTitle)\r
+{\r
+       {\r
+               TCHAR buf[0x100] = {'\0'};\r
+               GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
+//             CUtils::Log(_T("Window Text --%s--"), buf);\r
+               szDialogTitle->Format(_T("%s"), buf);\r
+       }\r
+\r
+       if (!szDialogTitle->Compare(_T("\8c\9f\8dõ"))                                 // notepad, wordpad, IE, regedit, \r
+                                                                                                               // Excel, Front Page, PowerPoint, Acrobat Reader, IBM HPB\r
+        || !szDialogTitle->Compare(_T("Find"))                                 // notepad, Outlook, Outlook Express, Opera\r
+        || !szDialogTitle->Compare(_T("Find in this Page"))    // Mozilla\r
+        || !szDialogTitle->Compare(_T("Find/Replace"))                 // Eclipse\r
+        || !szDialogTitle->Compare(_T("\96{\95\93à\8c\9f\8dõ"))                   // Becky!\r
+        || !szDialogTitle->Compare(_T("\83\81\81[\83\8b\8c\9f\8dõ"))                   // Becky!\r
+        || !szDialogTitle->Compare(_T("\95\8e\9a\97ñ\82Ì\8c\9f\8dõ"))                 // M$ VC++\r
+        || !szDialogTitle->Compare(_T("\8c\9f\8dõ\82Æ\92u\8a·"))                   // M$ Word, 123\r
+        || !szDialogTitle->Compare(_T("\95\8f\91\82Ì\83e\83L\83X\83g\82Ì\8c\9f\8dõ")) // Lotus Notes\r
+        || !szDialogTitle->Compare(_T("\82±\82Ì\83y\81[\83W\82ð\8c\9f\8dõ"))             // Netscape 6\r
+        || !szDialogTitle->Compare(_T("\95\8e\9a\97ñ\8c\9f\8dõ"))                   // Dana\r
+        || !szDialogTitle->Compare(_T("\8c\9f\8dõ/\92u\8a·"))                    // PHP Editor\r
+        || !szDialogTitle->Compare(_T("\92u\8a·"))\r
+        || !szDialogTitle->Compare(_T("Replace"))) {\r
+               return TRUE;\r
+       }\r
+\r
+       szDialogTitle->Empty();\r
+       return FALSE;\r
+}\r
+\r
+BOOL CUtils::IsFindDialog()\r
+{\r
+       CString szDialogTitle;\r
+       return GetFindDialogTitle(&szDialogTitle);\r
+}\r
+\r
+BOOL CUtils::IsAstecX()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("astecx.exe"));\r
+}\r
+\r
+BOOL CUtils::IsBecky()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("b2.exe"));\r
+}\r
+\r
+BOOL CUtils::IsEmacs()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Emacs.exe"));\r
+}\r
+\r
+BOOL CUtils::IsExplorer()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("explorer.exe"));\r
+}\r
+\r
+BOOL CUtils::IsHidemaru()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("hidemaru.exe"));\r
+}\r
+\r
+BOOL CUtils::IsInternetExplorer()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("iexplore.exe"));\r
+}\r
+\r
+BOOL CUtils::IsLotus123()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("123w.exe"));\r
+}\r
+\r
+BOOL CUtils::IsLotusNotes()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("nlnotes.exe"));\r
+}\r
+\r
+BOOL CUtils::IsLotusWordPro()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("wordpro.exe"));\r
+}\r
+\r
+BOOL CUtils::IsMeadow()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Meadow.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("Meadow95.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("MeadowNT.exe"));\r
+}\r
+\r
+BOOL CUtils::IsMicrosoftFrontPage()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("frontpg.exe"));\r
+}\r
+\r
+BOOL CUtils::IsMicrosoftWord()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("winword.exe"));\r
+}\r
+\r
+BOOL CUtils::IsMozilla()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("mozilla.exe"));\r
+}\r
+\r
+BOOL CUtils::IsMuleForWin32()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("mule.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("mulent.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("mulecd.exe"));\r
+}\r
+\r
+BOOL CUtils::IsNetscape()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("netscp6.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("netscp.exe"));\r
+}\r
+\r
+BOOL CUtils::IsNotepad()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("notepad.exe"));\r
+}\r
+\r
+BOOL CUtils::IsOpera()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("opera.exe"));\r
+}\r
+\r
+BOOL CUtils::IsOutlook()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("outlook.exe"));\r
+}\r
+\r
+BOOL CUtils::IsOutlookExpress()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("msimn.exe"));\r
+}\r
+\r
+BOOL CUtils::IsSakuraEditor()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("sakura.exe"));\r
+}\r
+\r
+BOOL CUtils::IsTeraTermPro()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("ttermpro.exe"));\r
+}\r
+\r
+BOOL CUtils::IsVisualCpp()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("msdev.exe"));\r
+}\r
+\r
+BOOL CUtils::IsWordpad()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("wordpad.exe"));\r
+}\r
+\r
+BOOL CUtils::IsXWin()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("XWin.exe"));\r
+}\r
+\r
+BOOL CUtils::IsXyzzy()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("xyzzy.exe"));\r
+}\r
+\r
+LPCTSTR const CUtils::GetApplicationName()\r
+{\r
+       return m_szApplicationName;\r
+}\r
+\r
+void CUtils::FairConsoleApplicationName(LPTSTR szApplicationName, int nApplicationNameLength, LPTSTR szWindowText, int nWindowTextLength)\r
+{\r
+       if (IsFindDialog()) {\r
+               return;\r
+       }\r
+\r
+       if (*szWindowText == '"' && _tcschr(szWindowText+1, _T('"'))) {         // "foo bar" -> foo bar\r
+               int nApplicationName = _tcschr(szWindowText+1, _T('"')) - szWindowText - 1;     // length of "foo bar"\r
+               _tcsncpy(szWindowText, szWindowText + 1, nApplicationName);\r
+               memset(szWindowText + nApplicationName, 0, nWindowTextLength - nApplicationName);\r
+       } else if (_tcschr(szWindowText, _T(' '))) {    // foo bar -> foo\r
+               LPTSTR pFirstSpace = _tcschr(szWindowText, _T(' '));\r
+               memset(pFirstSpace, 0, nWindowTextLength - (pFirstSpace - szWindowText));\r
+       }\r
+\r
+       memset(szApplicationName, 0, nApplicationNameLength);\r
+       _stprintf(szApplicationName, _T("%s"), szWindowText);\r
+\r
+       static LPCTSTR const szExe = _T(".exe");\r
+       if (_tcsnicmp(szApplicationName + _tcslen(szApplicationName) - _tcslen(szExe), szExe, _tcslen(szExe))) {\r
+               _tcscat(szApplicationName, szExe);\r
+       }\r
+}\r
+\r
+// Set real application name in the szApplicationName.\r
+void CUtils::SetCorrectApplicationName(LPTSTR szApplicationName, const int nApplicationNameLength, LPTSTR szWindowText, const int nWindowTextLength)\r
+{\r
+       if (IsConsole(szApplicationName, nApplicationNameLength)) {\r
+               int i = 0;\r
+               static LPCTSTR const szPromptName[] = {_T("Command Prompt"), _T("Mark Command Prompt"), _T("Select Command Prompt"), _T("MS-DOS Prompt"),\r
+                                                                                          _T("Visual Studio .NET Command Prompt"), _T("Visual Studio .NET 2003 Command Prompt"),\r
+                                                                                          _T("\83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("\94Í\88Í\8ew\92è \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("\91I\91ð \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("MS-DOS \83v\83\8d\83\93\83v\83g"),\r
+                                                                                          _T("Visual Studio .NET \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("Visual Studio .NET 2003 \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g")};\r
+               static LPCTSTR const szPromptPath[] = {_T("system32\\cmd.exe")};        // WindowText of Command Prompt is sometimes this style. But MS-DOS Prompt's is always MS-DOS Prompt.\r
+               static LPCTSTR const szSeparator = _T(" - ");\r
+\r
+               for (i = 0; i < sizeof(szPromptName) / sizeof(szPromptName[0]); ++i) {\r
+                       if (!_tcsicmp(szWindowText, szPromptName[i])) { // "Command Prompt"\r
+                               return;\r
+                       }\r
+\r
+                       TCHAR sz[0x100] = {'\0'};\r
+                       _stprintf(sz, _T("%s%s"), szPromptName[i], szSeparator);\r
+\r
+                       if (!_tcsnicmp(szWindowText, sz, _tcslen(sz))) {        // "Command Promp - foo"\r
+                               _tcscpy(szWindowText, szWindowText + _tcslen(sz));\r
+                               FairConsoleApplicationName(szApplicationName, nApplicationNameLength, szWindowText, nWindowTextLength);\r
+                               return;\r
+                       }\r
+               }\r
+\r
+               for (i = 0; i < sizeof(szPromptPath) / sizeof(szPromptPath[0]); ++i) {\r
+                       TCHAR szWindowTextLower[0x100] = {'\0'};\r
+                       _tcscpy(szWindowTextLower, szWindowText);\r
+                       _tcslwr(szWindowTextLower);\r
+\r
+                       if (_tcsstr(szWindowTextLower, szPromptPath[i])) {\r
+                               TCHAR sz[0x100] = {'\0'};\r
+                               _stprintf(sz, _T("%s%s"), szPromptPath[i], szSeparator);\r
+\r
+                               if (_tcsstr(szWindowTextLower, sz)) {                           // "X:\WINNT\system32\cmd.exe - foo"\r
+                                       _tcscpy(szWindowText, _tcsstr(szWindowTextLower, sz) + _tcslen(sz));\r
+                                       FairConsoleApplicationName(szApplicationName, nApplicationNameLength, szWindowText, nWindowTextLength);\r
+                                       return;\r
+                               } else {                                                                        // "X:\WINNT\system32\cmd.exe"\r
+                                       return;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (!_tcsicmp(szWindowText, _T("Cygwin Bash Shell"))\r
+                || (*szWindowText == _T('~'))\r
+                || (*szWindowText == _T('/'))) {                                               // Bash\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("bash.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("bash"));\r
+               } else if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 8, _T(" - pdksh"))) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("pdksh.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("pdksh"));\r
+               } else if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 7, _T(" - tcsh"))) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("tcsh.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("tcsh"));\r
+               } else if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 6, _T(" - zsh"))) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("zsh.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("zsh"));\r
+               } else if (!_tcsnicmp(szWindowText, _T("MKS Korn Shell"), 14)\r
+                               || !_tcsnicmp(szWindowText, _T("cat"), 3)) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("sh.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("MKS Korn Shell"));\r
+               } else if (!_tcsnicmp(szWindowText + 1, _T(":/"), 2)\r
+                               || !_tcsnicmp(szWindowText + 1, _T(":\\"), 2)) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("csh.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("C Shell"));\r
+               } else if (_tcsstr(szWindowText, _T(" - VIM"))) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("vim.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("VIM"));\r
+               } else if (_tcsstr(szWindowText, _T(" - Poderosa"))) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("Poderosa.exe"));\r
+                       memset(szWindowText, 0, nWindowTextLength);\r
+                       _stprintf(szWindowText, _T("Poderosa"));\r
+               } else {                                                                                        // unknown console application\r
+                       FairConsoleApplicationName(szApplicationName, nApplicationNameLength, szWindowText, nWindowTextLength);\r
+               }\r
+       } else if (IsJavaW(szApplicationName, nApplicationNameLength)) {\r
+               if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 19, _T(" - Eclipse Platform"))) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("eclipse.exe"));\r
+               } else if (!_tcsicmp(szWindowText, _T("BlueJ"))\r
+                           || !_tcsnicmp(szWindowText, _T("BlueJ: "), 7)) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("bluej.exe"));\r
+               } else if (!_tcsicmp(szWindowText, _T("JUDE"))\r
+                           || !_tcsnicmp(szWindowText, _T("JUDE - "), 7)) {\r
+                       memset(szApplicationName, 0, nApplicationNameLength);\r
+                       _stprintf(szApplicationName, _T("jude.exe"));\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void CUtils::SetApplicationName(BOOL bImeComposition)\r
+{\r
+//     CUtils::Log(_T("SetApplicationName: start"));\r
+\r
+       memset(m_szApplicationName, 0, sizeof(m_szApplicationName));\r
+\r
+       if (_tcscmp(m_szIMEName, _T("IME")) == 0) {     // IDS_IME_FILE_NAME\r
+               HKL hKL = GetKeyboardLayout(0);\r
+               if (ImmIsIME(hKL)) {\r
+                       if (!ImmGetIMEFileName(hKL, m_szIMEName, sizeof(m_szIMEName))) {\r
+                               _tcsncpy(m_szIMEName, _T("IME"), sizeof(m_szIMEName));  // IDS_IME_FILE_NAME\r
+                       }\r
+//                     CUtils::Log(_T("SetApplicationName: m_szIMEName == %s"), m_szIMEName);\r
+               }\r
+       }\r
+\r
+       if (bImeComposition) {\r
+//             CUtils::Log(_T("SetApplicationName: bImeComposition"));\r
+\r
+               HKL hKL = GetKeyboardLayout(0);\r
+               if (ImmIsIME(hKL)) {\r
+                       if (!ImmGetIMEFileName(hKL, m_szApplicationName, sizeof(m_szApplicationName))) {\r
+                               _tcsncpy(m_szApplicationName, m_szIMEName, sizeof(m_szApplicationName));\r
+                       }\r
+                       _tcsncpy(m_szIMEName, m_szApplicationName, sizeof(m_szIMEName));\r
+               } else {\r
+                       // ImmIsIME return 0 on Word2002, Excel2002, etc. with IME2002, so...\r
+                       // _tcsncpy(m_szApplicationName, _T("imjp81.ime"), sizeof(m_szApplicationName));\r
+                       _tcsncpy(m_szApplicationName, m_szIMEName, sizeof(m_szApplicationName));\r
+               }\r
+       } else {\r
+//             CUtils::Log(_T("SetApplicationName: appication (%s)"), m_szApplicationName);\r
+\r
+               GetModuleFileName(NULL, m_szApplicationName, sizeof(m_szApplicationName));\r
+               CString szFn(m_szApplicationName);\r
+               szFn.Delete(0, szFn.ReverseFind(_T('\\')) + 1);\r
+               ZeroMemory(m_szApplicationName, sizeof(m_szApplicationName));\r
+               _tcsncpy(m_szApplicationName, szFn, szFn.GetLength());\r
+\r
+//             CUtils::Log(_T("SetApplicationName: appication [%s]"), m_szApplicationName);\r
+\r
+               if (IsConsole()) {\r
+//                     CUtils::Log(_T("SetApplicationName: console"));\r
+\r
+                       memset(m_szApplicationName, 0, sizeof(m_szApplicationName));\r
+                       if (IsNT()) {\r
+                               _tcscpy(m_szApplicationName, _T("CMD.exe"));\r
+                       } else {\r
+                               _tcscpy(m_szApplicationName, _T("WINOA386.MOD"));\r
+                       }\r
+                       TCHAR szWindowText[0x100] = {'\0'};\r
+                       GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
+                       SetCorrectApplicationName(m_szApplicationName, sizeof(m_szApplicationName), szWindowText, sizeof(szWindowText));\r
+               } else if (IsJavaW()) {\r
+                       TCHAR szWindowText[0x100] = {'\0'};\r
+                       GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
+                       SetCorrectApplicationName(m_szApplicationName, sizeof(m_szApplicationName), szWindowText, sizeof(szWindowText));\r
+               }\r
+               if (!_tcsicmp(m_szApplicationName, _T("Cygwin.exe"))) {\r
+//                     CUtils::Log(_T("SetApplicationName: cygwin"));\r
+\r
+                       memset(m_szApplicationName, 0, sizeof(m_szApplicationName));\r
+                       _tcscpy(m_szApplicationName, _T("bash.exe"));\r
+               }\r
+//             CUtils::Log(_T("name: %s"), m_szApplicationName);\r
+       }\r
+}\r
+\r
+void CUtils::SetIMEName()\r
+{\r
+       HKL hKL = GetKeyboardLayout(0);\r
+       if (ImmIsIME(hKL)) {\r
+               ImmGetIMEFileName(hKL, m_szIMEName, sizeof(m_szIMEName));\r
+       }\r
+}\r
+\r
+void CUtils::InitCUtils()\r
+{\r
+       GetVersionEx(&m_OsVersionInfo);\r
+       SetIMEName();\r
+}\r
+\r
+BOOL CUtils::IsNTor9x()\r
+{\r
+       return ((m_OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) && (m_OsVersionInfo.dwMajorVersion <= 4))\r
+                || (m_OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);\r
+}\r
+\r
+BOOL CUtils::IsXPorLater()\r
+{\r
+       return 5 < m_OsVersionInfo.dwMajorVersion\r
+               || 5 == m_OsVersionInfo.dwMajorVersion && 1 <= m_OsVersionInfo.dwMinorVersion;\r
+}\r
+\r
+BOOL CUtils::IsNT()\r
+{\r
+       return m_OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT;\r
+}\r
+\r
+BOOL CUtils::OpenClipboard()\r
+{\r
+       const int RETRY_COUNT = 0x10;\r
+\r
+       BOOL bOpened = FALSE;\r
+       for (int i = 0; i <= RETRY_COUNT; ++i) {\r
+               if (::OpenClipboard(NULL)) {\r
+//                     Log(_T("ok (%d)"), i);\r
+                       bOpened = TRUE;\r
+                       break;\r
+               } else {\r
+                       Sleep(1);       // for OpenOffice\r
+//                     Log(_T("CUtils::OpenClipboard: %d (%d)"), GetLastError(), i);\r
+               }\r
+       }\r
+       ASSERT(bOpened);\r
+       return bOpened;\r
+}\r
+\r
+BOOL CUtils::GetClipboardText(CString *szClipboardText)\r
+{\r
+       if (!szClipboardText) {\r
+               return FALSE;\r
+       }\r
+\r
+       szClipboardText->Empty();\r
+\r
+       if (!OpenClipboard()) {\r
+//             CUtils::Log(_T("Cannot open the Clipboard"));\r
+               return FALSE;\r
+       }\r
+\r
+/*\r
+       {\r
+               Log(_T("GetClipboardText"));\r
+               UINT uFormat = 0;\r
+               for (;;) {\r
+                       uFormat = EnumClipboardFormats(uFormat);\r
+                       if (uFormat) {\r
+                               Log(_T("uFormat = %d"), uFormat);\r
+                       } else {\r
+                               break;\r
+                       }\r
+               }\r
+// winuser.h\r
+//#define CF_TEXT             1\r
+//#define CF_METAFILEPICT     3\r
+//#define CF_OEMTEXT          7\r
+//#define CF_UNICODETEXT      13\r
+//#define CF_ENHMETAFILE      14\r
+//#define CF_LOCALE           16\r
+//#define CF_DSPTEXT          0x0081\r
+// OwnerLink                                           49155\r
+// Native                                                      49156\r
+// DataObject                                          49161\r
+// Embed Source                                                49163\r
+// Object Descriptor                           49166\r
+// Ole Private Data                                    49171\r
+// Rich Text Format                                    49311\r
+// Rich Text Format                                    49312\r
+// HTML Format                                         49360\r
+// HTML Format                                         49361\r
+// Link                                                                49408\r
+// RTF As Text                                         49595\r
+// Rich Text Format Without Objects    49618\r
+// Star Object Descriptor (XML)                49681\r
+// Star Embed Source (XML)                     49708\r
+// HPB HTML Format                                     49742\r
+       }\r
+*/\r
+\r
+       UINT uFormat = CF_OEMTEXT;\r
+       if (IsSakuraEditor()) {\r
+               uFormat = CF_TEXT;\r
+       }\r
+\r
+       HANDLE hClipboardText;\r
+       if ((hClipboardText = ::GetClipboardData(uFormat)) == NULL) {\r
+//             DWORD dw = GetLastError();\r
+//             CUtils::Log(_T("Unable to get Clipboard data: %d"), dw);\r
+               CloseClipboard();\r
+               return FALSE;\r
+       }\r
+\r
+       szClipboardText->Format(_T("%s"), hClipboardText);\r
+       EmptyClipboard();\r
+       CloseClipboard();\r
+       return TRUE;\r
+}\r
+\r
+BOOL CUtils::SetClipboardText(CString *szClipboardText)\r
+{\r
+       if (!OpenClipboard()) {\r
+//             CUtils::Log(_T("Cannot open the Clipboard in SetClipboardText"));\r
+               return FALSE;\r
+       }\r
+\r
+       int nLength = szClipboardText->GetLength() + 1;\r
+       HGLOBAL hClipboardText = GlobalAlloc(GHND, nLength);\r
+       if (hClipboardText == NULL) {\r
+//             CUtils::Log(_T("Failed: GlobalAlloc in SetClipboardText"));\r
+               return FALSE;\r
+       }\r
+\r
+       LPTSTR lpStr = (LPTSTR)GlobalLock(hClipboardText);\r
+       lstrcpyn(lpStr, *szClipboardText, nLength);\r
+       GlobalUnlock(hClipboardText);\r
+       EmptyClipboard();\r
+\r
+       UINT uFormat = CF_OEMTEXT;\r
+       if (IsSakuraEditor()) {\r
+               uFormat = CF_TEXT;\r
+       }\r
+\r
+       if ((hClipboardText = ::SetClipboardData(uFormat, hClipboardText)) == NULL) {\r
+//             DWORD dw = GetLastError();\r
+//             CUtils::Log(_T("Unable to set Clipboard data: %d"), dw);\r
+               CloseClipboard();\r
+               return FALSE;\r
+       }\r
+\r
+       CloseClipboard();\r
+       return TRUE;\r
+}\r
+\r
+BOOL CUtils::IsDefaultIgnoreApplication()\r
+{\r
+       if (IsAstecX()\r
+        || IsBash()\r
+        || IsCsh()\r
+        || IsEmacs()\r
+        || IsLispWorksPersonalEdition()\r
+        || IsMeadow()\r
+        || IsMuleForWin32()\r
+        || IsPdksh()\r
+        || IsSh()\r
+        || IsTcsh()\r
+        || IsTeraTermPro() && !IsDialog()\r
+        || IsVisualSlickEdit() && !IsDialog()\r
+        || IsXWin()\r
+        || IsXyzzy() && !IsDialog()\r
+        || IsZsh()) {\r
+               return TRUE;\r
+       }\r
+       return FALSE;\r
+}\r
+\r
+BOOL CUtils::IsDWFM()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("dwfm.exe"));\r
+}\r
+\r
+BOOL CUtils::IsK2Editor()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("K2Editor.exe"));\r
+}\r
+\r
+BOOL CUtils::IsEggExplorer()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("EggExp.exe"));\r
+}\r
+\r
+BOOL CUtils::IsDirector()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Director.exe"));\r
+}\r
+\r
+BOOL CUtils::IsExcel()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Excel.exe"));\r
+}\r
+\r
+BOOL CUtils::IsFireworks()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Fireworks 4.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("Fireworks.exe"));\r
+}\r
+\r
+BOOL CUtils::IsDreamweaver()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Dreamweaver.exe"));\r
+}\r
+\r
+BOOL CUtils::IsFlash()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Flash.exe"));\r
+}\r
+\r
+BOOL CUtils::IsPhotoshop()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Photoshp.exe"));\r
+}\r
+\r
+BOOL CUtils::IsIllustrator()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Illustrator.exe"));\r
+}\r
+\r
+BOOL CUtils::IsMicrosoftPowerPoint()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("PowerPnt.exe"));\r
+}\r
+\r
+BOOL CUtils::IsReget()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Regetdx.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("Regetjr.exe"));\r
+}\r
+\r
+BOOL CUtils::IsPaint()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("mspaint.exe"));\r
+}\r
+\r
+BOOL CUtils::IsConsole()\r
+{\r
+//     Log(_T("_%s_"), m_szApplicationName);\r
+       return !m_szApplicationName[0]\r
+               || !_tcsicmp(m_szApplicationName, _T("xkeymacs.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("conime.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("csh.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("WINOA386.MOD"))\r
+               || !_tcsicmp(m_szApplicationName, _T("CMD.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("bash.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("ftp.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("sh.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("telnet.exe"));\r
+}\r
+\r
+BOOL CUtils::IsConsole(LPCTSTR szApplicationName, int nApplicationNameLength)\r
+{\r
+       return !_tcsnicmp(szApplicationName, _T("WINOA386.MOD"), nApplicationNameLength)\r
+               || !_tcsnicmp(szApplicationName, _T("CMD.exe"), nApplicationNameLength);\r
+}\r
+\r
+BOOL CUtils::IsJavaW(LPCTSTR szApplicationName, int nApplicationNameLength)\r
+{\r
+       return !_tcsnicmp(szApplicationName, _T("javaw.exe"), nApplicationNameLength);\r
+}\r
+\r
+BOOL CUtils::IsSleipnir()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Sleipnir.exe"));\r
+}\r
+\r
+BOOL CUtils::IsBash()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("bash.exe"));\r
+}\r
+\r
+// for debug\r
+void CUtils::Log(LPTSTR fmt, ...)\r
+{\r
+       va_list ap;\r
+       va_start(ap, fmt);\r
+\r
+       static const int LOG_MAX = 0x10000;\r
+       TCHAR szLog[LOG_MAX] = {'\0'};\r
+\r
+       for (unsigned int nIndex = 0; nIndex < _tcslen(fmt); ) {\r
+               LPTSTR pNextString = fmt + nIndex;\r
+               LPTSTR pLogEnd = szLog + _tcslen(szLog);\r
+\r
+               if (*pNextString == _T('%')) {\r
+                       TCHAR szFormatTag[LOG_MAX] = {'0'};\r
+                       _tcscpy(szFormatTag, pNextString);\r
+\r
+                       switch (GetFormatTag(szFormatTag)) {\r
+                       case _T('d'):\r
+                       case _T('i'):\r
+                       case _T('o'):\r
+                       case _T('x'):\r
+                       case _T('X'):\r
+                       case _T('u'):\r
+                       case _T('c'):\r
+                               _stprintf(pLogEnd, szFormatTag, va_arg(ap, int));\r
+                               break;\r
+                       case _T('s'):\r
+                               _stprintf(pLogEnd, szFormatTag, va_arg(ap, LPTSTR));\r
+                               break;\r
+                       case _T('f'):\r
+                       case _T('e'):\r
+                       case _T('E'):\r
+                       case _T('g'):\r
+                       case _T('G'):\r
+                               _stprintf(pLogEnd, szFormatTag, va_arg(ap, double));\r
+                               break;\r
+                       case _T('p'):\r
+                               _stprintf(pLogEnd, szFormatTag, va_arg(ap, void *));\r
+                               break;\r
+                       case _T('n'):\r
+                               _stprintf(pLogEnd, szFormatTag, va_arg(ap, int *));\r
+                               break;\r
+                       case _T('%'):\r
+                       default:\r
+                               _stprintf(pLogEnd, _T("%s"), szFormatTag);\r
+                               break;\r
+                       }\r
+\r
+                       nIndex += _tcslen(szFormatTag);\r
+               } else {\r
+                       TCHAR szString[LOG_MAX] = {'0'};\r
+                       _tcscpy(szString, pNextString);\r
+                       LPTSTR pString = _tcstok(szString, _T("%"));\r
+                       _stprintf(pLogEnd, _T("%s"), pString);\r
+\r
+                       nIndex += _tcslen(pString);\r
+               }\r
+       }\r
+\r
+       va_end(ap);\r
+\r
+       static int n = 0;\r
+       TCHAR szPath[MAX_PATH] = {'\0'};\r
+       if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_APPDATA, TRUE)) {\r
+               _tmakepath(szPath, NULL, szPath, _T("xkeylog"), _T("txt"));\r
+       } else {\r
+               _tcscpy(szPath, _T("c:\\xkeylog.txt"));\r
+       }\r
+       FILE *fp = _tfopen(szPath, _T("a"));\r
+       _ftprintf(fp, _T("%8d: %s       %s\n"), n++, m_szApplicationName, szLog);\r
+       fflush(fp);\r
+       fclose(fp);\r
+}\r
+\r
+BOOL CUtils::IsSh()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("sh.exe"));\r
+}\r
+\r
+BOOL CUtils::IsCsh()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("csh.exe"));\r
+}\r
+\r
+BOOL CUtils::IsVisualStudioDotNet()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("devenv.exe"));\r
+}\r
+\r
+BOOL CUtils::IsAccess()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("MSACCESS.EXE"));\r
+}\r
+\r
+BOOL CUtils::IsProject()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("WINPROJ.EXE"));\r
+}\r
+\r
+BOOL CUtils::IsVisualBasic()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("VB6.EXE"));\r
+}\r
+\r
+BOOL CUtils::IsVisualBasicEditor()\r
+{\r
+       if (IsVisualBasic()) {\r
+               return TRUE;\r
+       }\r
+\r
+       if (IsAccess()\r
+        || IsExcel()\r
+        || IsMicrosoftFrontPage()\r
+        || IsMicrosoftPowerPoint()\r
+        || IsMicrosoftWord()\r
+        || IsOutlook()\r
+        || IsProject()) {\r
+               TCHAR szWindowText[0x100] = {'\0'};\r
+               GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
+               static LPCTSTR const szVBE = _T("Microsoft Visual Basic - ");\r
+               if (!_tcsnicmp(szWindowText, szVBE, _tcslen(szVBE))) {\r
+                       return TRUE;\r
+               }\r
+       }\r
+       return FALSE;\r
+}\r
+\r
+BOOL CUtils::IsEclipse()\r
+{\r
+       TCHAR szWindowText[0x100] = {'\0'};\r
+       GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
+\r
+       LPCTSTR szEclipse = _T(" - Eclipse Platform");\r
+       LPCTSTR szFind = _T("Find/Replace");\r
+\r
+       return IsJavaW()\r
+               && (_tcslen(szEclipse) < _tcslen(szWindowText) && !_tcsicmp(szWindowText + _tcslen(szWindowText) - _tcslen(szEclipse), szEclipse)\r
+                || _tcslen(szFind) == _tcslen(szWindowText) && !_tcsicmp(szWindowText, szFind));\r
+}\r
+\r
+int CUtils::GetClipboardTextLength()\r
+{\r
+       CString szClipboardText;\r
+       CUtils::GetClipboardText(&szClipboardText);\r
+       CUtils::SetClipboardText(&szClipboardText);\r
+\r
+//     return sz.GetLength();\r
+\r
+       int nLength = 0;\r
+       for (int i = 0; i < szClipboardText.GetLength(); ++i) {\r
+               if (szClipboardText.GetAt(i) & 0x80) {\r
+                       ++i;\r
+               }\r
+               ++nLength;\r
+       }\r
+       return nLength;\r
+}\r
+\r
+BOOL CUtils::IsDialog()\r
+{\r
+       return GetParent(GetForegroundWindow()) != NULL;\r
+}\r
+\r
+int CUtils::GetFormatTag(LPTSTR szFormatTag)\r
+{\r
+       if (*(szFormatTag) != _T('%')) {\r
+               return NULL;\r
+       }\r
+\r
+       unsigned int nIndex = 1;\r
+\r
+       // flags\r
+       while (nIndex < _tcslen(szFormatTag)) {\r
+               switch (*(szFormatTag + nIndex)) {\r
+               case _T('-'):\r
+               case _T('+'):\r
+               case _T(' '):\r
+               case _T('0'):\r
+               case _T('#'):\r
+                       ++nIndex;\r
+                       continue;\r
+               default:\r
+                       break;\r
+               }\r
+\r
+               break;\r
+       }\r
+\r
+       // width\r
+       while (_istdigit(*(szFormatTag + nIndex))) {\r
+               ++nIndex;\r
+       }\r
+\r
+       // precision\r
+       if (*(szFormatTag + nIndex) == _T('.')) {\r
+               ++nIndex;\r
+               while (_istdigit(*(szFormatTag + nIndex))) {\r
+                       ++nIndex;\r
+               }\r
+       }\r
+\r
+       // prefix\r
+       switch (*(szFormatTag + nIndex)) {\r
+       case _T('h'):\r
+       case _T('l'):\r
+       case _T('L'):\r
+               ++nIndex;\r
+               break;\r
+       }\r
+\r
+       // type\r
+       switch (*(szFormatTag + nIndex)) {\r
+       case _T('d'):\r
+       case _T('i'):\r
+       case _T('o'):\r
+       case _T('x'):\r
+       case _T('X'):\r
+       case _T('u'):\r
+       case _T('c'):\r
+       case _T('s'):\r
+       case _T('f'):\r
+       case _T('e'):\r
+       case _T('E'):\r
+       case _T('g'):\r
+       case _T('G'):\r
+       case _T('p'):\r
+       case _T('n'):\r
+       case _T('%'):\r
+               *(szFormatTag + nIndex + 1) = NULL;\r
+               return *(szFormatTag + nIndex);\r
+       default:\r
+               *(szFormatTag + nIndex) = NULL;\r
+               return NULL;\r
+       }\r
+}\r
+\r
+BOOL CUtils::IsEudora()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Eudora.exe"));\r
+}\r
+\r
+BOOL CUtils::IsCodeWarrior()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("IDE.exe"));\r
+}\r
+\r
+BOOL CUtils::IseMemoPad()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("eMemoPad.exe"));\r
+}\r
+\r
+BOOL CUtils::IsStoryEditor()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("STRYEDIT.EXE"));\r
+}\r
+\r
+BOOL CUtils::IsNami2000()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Nami2000.exe"));\r
+}\r
+\r
+BOOL CUtils::IsCorelDRAW()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("CorelDrw.exe"));\r
+}\r
+\r
+// If Clipboard data is empty, return ture.\r
+// You must CopyNextCharacter in previous step.\r
+// Clipboard data is destroyed.\r
+BOOL CUtils::IsEOF()\r
+{\r
+       return IsTOForEOF();\r
+}\r
+\r
+// If Clipboard data is empty, return ture.\r
+// You must CopyBackCharacter in previous step.\r
+// Clipboard data is destroyed.\r
+BOOL CUtils::IsTOF()\r
+{\r
+       return IsTOForEOF();\r
+}\r
+\r
+BOOL CUtils::IsTOForEOF()\r
+{\r
+       CString szClipboardText;\r
+       GetClipboardText(&szClipboardText);\r
+       return szClipboardText.IsEmpty()                        // for normal application\r
+               || szClipboardText.GetLength() >= 3;    // for VC++\r
+}\r
+\r
+BOOL CUtils::IsHusen()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("husen.exe"));\r
+}\r
+\r
+BOOL CUtils::IsAdobeReader()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("AcroRd32.exe"));\r
+}\r
+\r
+BOOL CUtils::IsOpenOffice()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("soffice.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("soffice.bin"));\r
+}\r
+\r
+BOOL CUtils::IsTuruKameMail()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("TuruKame.exe"));\r
+}\r
+\r
+BOOL CUtils::IsOedit()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("oedit.exe"));\r
+}\r
+\r
+BOOL CUtils::IsAutla()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Autla.exe"));\r
+}\r
+\r
+BOOL CUtils::IsShuriken()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("JsvMail.exe"));\r
+}\r
+\r
+BOOL CUtils::IsEdLeaf()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("edleaf.exe"));\r
+}\r
+\r
+BOOL CUtils::IsJmEditor()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("JmEdit.exe"))\r
+               || !_tcsicmp(m_szApplicationName, _T("JmEdit2.exe"));\r
+}\r
+\r
+BOOL CUtils::IsDana()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Dana.exe"));\r
+}\r
+\r
+BOOL CUtils::IsIPMessenger()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("ipmsg.exe"));\r
+}\r
+\r
+BOOL CUtils::IsezHTML()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("ezhtml.exe"));\r
+}\r
+\r
+BOOL CUtils::IsTcsh()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("tcsh.exe"));\r
+}\r
+\r
+BOOL CUtils::IsZsh()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("zsh.exe"));\r
+}\r
+\r
+BOOL CUtils::IsPdksh()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("pdksh.exe"));\r
+}\r
+\r
+BOOL CUtils::IsFirefox()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("firefox.exe"));\r
+}\r
+\r
+BOOL CUtils::IsPHPEditor()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("php_editor.exe"));\r
+}\r
+\r
+BOOL CUtils::IsTeraPad()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("TeraPad.exe"));\r
+}\r
+\r
+BOOL CUtils::IsLispWorksPersonalEdition()\r
+{\r
+       CString szLispWorks(_T("lispworks-personal-"));\r
+       return !_tcsnicmp(m_szApplicationName, szLispWorks, szLispWorks.GetLength());\r
+\r
+//     return !_tcsicmp(m_szApplicationName, _T("lispworks-personal-4300.exe"));\r
+}\r
+\r
+BOOL CUtils::IsBorlandCppBuilder()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("bcb.exe"));\r
+}\r
+\r
+BOOL CUtils::Run(CString szCommandLine, BOOL isWait)\r
+{\r
+       STARTUPINFO si;\r
+       ZeroMemory(&si, sizeof(si));\r
+       si.cb = sizeof(si);\r
+\r
+       PROCESS_INFORMATION pi;\r
+       ZeroMemory(&pi, sizeof(pi));\r
+\r
+       BOOL rc = CreateProcess(NULL, szCommandLine.GetBuffer(szCommandLine.GetLength() + 1), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);\r
+       if (rc) {\r
+               if (isWait) {\r
+                       WaitForSingleObject( pi.hProcess, INFINITE );\r
+               }\r
+\r
+               CloseHandle(pi.hThread);\r
+               CloseHandle(pi.hProcess);\r
+       }\r
+\r
+       return rc;\r
+}\r
+\r
+BOOL CUtils::IsJavaW()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("javaw.exe"));\r
+}\r
+\r
+BOOL CUtils::IsMSDN()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("hh.exe"));\r
+}\r
+\r
+BOOL CUtils::IsVisualSlickEdit()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("vs.exe"));\r
+}\r
+\r
+void CUtils::PrintWindowInfo(WINDOWINFO *pwi)\r
+{\r
+       Log(_T("windowinfo.cbSize: %d"), pwi->cbSize);\r
+       Log(_T("windowinfo.rcWindow.top: %d"), pwi->rcWindow.top);\r
+       Log(_T("windowinfo.rcWindow.bottom: %d"), pwi->rcWindow.bottom);\r
+       Log(_T("windowinfo.rcWindow.left: %d"), pwi->rcWindow.left);\r
+       Log(_T("windowinfo.rcWindow.right: %d"), pwi->rcWindow.right);\r
+       Log(_T("windowinfo.rcClient.top: %d"), pwi->rcClient.top);\r
+       Log(_T("windowinfo.rcClient.bottom: %d"), pwi->rcClient.bottom);\r
+       Log(_T("windowinfo.rcClient.left: %d"), pwi->rcClient.left);\r
+       Log(_T("windowinfo.rcClient.right: %d"), pwi->rcClient.right);\r
+       Log(_T("windowinfo.dwStyle: %d"), pwi->dwStyle);\r
+       Log(_T("windowinfo.dwExStyle: %d"), pwi->dwExStyle);\r
+       Log(_T("windowinfo.dwWindowStatus: %d"), pwi->dwWindowStatus);\r
+       Log(_T("windowinfo.cxWindowBorders: %d"), pwi->cxWindowBorders);\r
+       Log(_T("windowinfo.cyWindowBorders: %d"), pwi->cyWindowBorders);\r
+       Log(_T("windowinfo.atomWindowType: %d"), pwi->atomWindowType);\r
+       Log(_T("windowinfo.wCreatorVersion: %d"), pwi->wCreatorVersion);\r
+}\r
+\r
+BOOL CUtils::IsOpenJane()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Jane2ch.exe"));\r
+}\r
+\r
+BOOL CUtils::UpdateKeyboardState(BYTE bVk, BYTE bState)\r
+{\r
+       BYTE ks[256] = {'\0'};\r
+       BOOL rc = FALSE;\r
+\r
+       if ((rc = GetKeyboardState(ks)) != FALSE) {\r
+               ks[bVk] = bState;\r
+               rc = SetKeyboardState(ks);\r
+       }\r
+       return rc;\r
+}\r
+\r
+BOOL CUtils::IsThunderbird()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("thunderbird.exe"));\r
+}\r
+\r
+int CUtils::GetWindowTextType(CString strWindowText)\r
+{\r
+       int nWindowTextType = IDS_WINDOW_TEXT_IGNORE;\r
+\r
+       if (3 <= strWindowText.GetLength()\r
+        && strWindowText.Find(_T('*')) == 0\r
+        && strWindowText.ReverseFind(_T('*')) == strWindowText.GetLength() - 1) {\r
+               nWindowTextType = IDS_WINDOW_TEXT_MATCH;\r
+       } else if (2 <= strWindowText.GetLength()\r
+                       && strWindowText.Find(_T('*')) != 0\r
+                       && strWindowText.ReverseFind(_T('*')) == strWindowText.GetLength() - 1) {\r
+               nWindowTextType = IDS_WINDOW_TEXT_MATCH_FORWARD;\r
+       } else if (2 <= strWindowText.GetLength()\r
+                       && strWindowText.Find(_T('*')) == 0\r
+                       && strWindowText.ReverseFind(_T('*')) != strWindowText.GetLength() - 1) {\r
+               nWindowTextType = IDS_WINDOW_TEXT_MATCH_BACKWARD;\r
+       } else if (!strWindowText.IsEmpty()\r
+                       && strWindowText.Find(_T('*')) != 0\r
+                       && strWindowText.ReverseFind(_T('*')) != strWindowText.GetLength() - 1) {\r
+               nWindowTextType = IDS_WINDOW_TEXT_MATCH_FULL;\r
+       }\r
+\r
+       return nWindowTextType;\r
+}\r
+\r
+BOOL CUtils::IsLunascape()\r
+{\r
+       return !_tcsicmp(m_szApplicationName, _T("Luna.exe"));\r
+}\r
+\r
+BOOL CUtils::IsAtok()\r
+{\r
+       return !_tcsnicmp(m_szApplicationName, _T("ATOK"), 4) && !_tcsnicmp(m_szApplicationName + _tcslen(m_szApplicationName) - 4, _T(".IME"), 4);\r
+}\r
diff --git a/xkeymacsdll/Utils.h b/xkeymacsdll/Utils.h
new file mode 100644 (file)
index 0000000..c7144c5
--- /dev/null
@@ -0,0 +1,134 @@
+// Utils.h: interface for the CUtils class.\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_UTILS_H__D64BCD3F_F2E2_41F7_AD58_0F32E2D46942__INCLUDED_)\r
+#define AFX_UTILS_H__D64BCD3F_F2E2_41F7_AD58_0F32E2D46942__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+class AFX_EXT_CLASS CUtils  \r
+{\r
+public:\r
+       static BOOL IsAtok();\r
+       static BOOL IsLunascape();\r
+       static int GetWindowTextType(CString strWindowText);\r
+       static BOOL IsThunderbird();\r
+       static BOOL UpdateKeyboardState(BYTE bVk, BYTE bState);\r
+       static BOOL IsOpenJane();\r
+       static void PrintWindowInfo(WINDOWINFO *pwi);\r
+       static BOOL IsVisualSlickEdit();\r
+       static BOOL IsMSDN();\r
+       static BOOL IsJavaW();\r
+       static BOOL Run(CString szCommandLine, BOOL isWait = FALSE);\r
+       static BOOL IsBorlandCppBuilder();\r
+       static BOOL IsLispWorksPersonalEdition();\r
+       static BOOL IsTeraPad();\r
+       static BOOL IsPHPEditor();\r
+       static BOOL IsFirefox();\r
+       static BOOL IsPdksh();\r
+       static BOOL IsZsh();\r
+       static BOOL IsTcsh();\r
+       static BOOL IsezHTML();\r
+       static BOOL IsIPMessenger();\r
+       static BOOL IsDana();\r
+       static BOOL IsJmEditor();\r
+       static BOOL IsXPorLater();\r
+       static BOOL IsEdLeaf();\r
+       static BOOL IsShuriken();\r
+       static BOOL IsAutla();\r
+       static BOOL OpenClipboard();\r
+       static BOOL IsOedit();\r
+       static BOOL IsTuruKameMail();\r
+       static BOOL IsOpenOffice();\r
+       static BOOL IsAdobeReader();\r
+       static BOOL IsHusen();\r
+       static BOOL IsTOF();\r
+       static BOOL IsEOF();\r
+       static BOOL IsCorelDRAW();\r
+       static BOOL IsNami2000();\r
+       static BOOL IsStoryEditor();\r
+       static BOOL IseMemoPad();\r
+       static BOOL IsNT();\r
+       static BOOL IsCodeWarrior();\r
+       static BOOL IsVisualBasicEditor();\r
+       static BOOL IsEudora();\r
+       static BOOL IsDialog();\r
+       static int GetClipboardTextLength();\r
+       static BOOL IsEclipse();\r
+       static BOOL IsFindDialog();\r
+       static BOOL IsVisualBasic();\r
+       static BOOL IsProject();\r
+       static BOOL IsAccess();\r
+       static BOOL IsVisualStudioDotNet();\r
+       static BOOL IsCsh();\r
+       static BOOL IsSh();\r
+       static BOOL IsBash();\r
+       static void SetCorrectApplicationName(LPTSTR szApplicationName, int nApplicationNameLength, LPTSTR szWindowText, int nWindowTextLength);\r
+       static void Log(LPTSTR fmt, ...);\r
+       static BOOL IsSleipnir();\r
+       static BOOL IsConsole();\r
+       static BOOL IsPaint();\r
+       static BOOL IsReget();\r
+       static BOOL IsMicrosoftPowerPoint();\r
+       static BOOL IsIllustrator();\r
+       static BOOL IsPhotoshop();\r
+       static BOOL IsFlash();\r
+       static BOOL IsDreamweaver();\r
+       static BOOL IsFireworks();\r
+       static BOOL IsExcel();\r
+       static BOOL IsDirector();\r
+       static BOOL IsEggExplorer();\r
+       static BOOL IsK2Editor();\r
+       static BOOL IsDWFM();\r
+       static BOOL IsDefaultIgnoreApplication();\r
+       static BOOL IsXWin();\r
+       static BOOL IsEmacs();\r
+       static BOOL SetClipboardText(CString *szClipboardText);\r
+       static BOOL GetClipboardText(CString *szClipboardText);\r
+       static BOOL IsNTor9x();\r
+       static void InitCUtils();\r
+       static void SetApplicationName(BOOL bImeComposition);\r
+       static LPCTSTR const GetApplicationName();\r
+       static BOOL IsXyzzy();\r
+       static BOOL IsWordpad();\r
+       static BOOL IsVisualCpp();\r
+       static BOOL IsTeraTermPro();\r
+       static BOOL IsSakuraEditor();\r
+       static BOOL IsOutlookExpress();\r
+       static BOOL IsOutlook();\r
+       static BOOL IsOpera();\r
+       static BOOL IsNotepad();\r
+       static BOOL IsNetscape();\r
+       static BOOL IsMuleForWin32();\r
+       static BOOL IsMozilla();\r
+       static BOOL IsMicrosoftWord();\r
+       static BOOL IsMicrosoftFrontPage();\r
+       static BOOL IsMeadow();\r
+       static BOOL IsLotusWordPro();\r
+       static BOOL IsLotusNotes();\r
+       static BOOL IsLotus123();\r
+       static BOOL IsInternetExplorer();\r
+       static BOOL IsHidemaru();\r
+       static BOOL IsExplorer();\r
+       static BOOL IsBecky();\r
+       static BOOL IsAstecX();\r
+       static BOOL CUtils::GetFindDialogTitle(CString *szDialogTitle);\r
+       CUtils();\r
+       virtual ~CUtils();\r
+\r
+private:\r
+       static BOOL IsTOForEOF();\r
+       static int GetFormatTag(LPTSTR szFormatTag);\r
+       static void FairConsoleApplicationName(LPTSTR szApplicationName, int nApplicationNameLength, LPTSTR szWindowText, int nWindowTextLength);\r
+       static BOOL IsConsole(LPCTSTR szApplicationName, int nApplicationNameLength);\r
+       static BOOL IsJavaW(LPCTSTR szApplicationName, int nApplicationNameLength);\r
+       static void SetIMEName();\r
+       static OSVERSIONINFO m_OsVersionInfo;\r
+       static TCHAR m_szIMEName[MAX_PATH];\r
+       static TCHAR m_szApplicationName[MAX_PATH];\r
+};\r
+\r
+#endif // !defined(AFX_UTILS_H__D64BCD3F_F2E2_41F7_AD58_0F32E2D46942__INCLUDED_)\r
diff --git a/xkeymacsdll/res/xkeymacsdll.rc2 b/xkeymacsdll/res/xkeymacsdll.rc2
new file mode 100644 (file)
index 0000000..85bf47e
--- /dev/null
@@ -0,0 +1,13 @@
+//\r
+// XKEYMACSDLL.RC2 - resources Microsoft Visual C++ does not edit directly\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+       #error this file is not editable by Microsoft Visual C++\r
+#endif //APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Add manually edited resources here...\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
diff --git a/xkeymacsdll/resource.h b/xkeymacsdll/resource.h
new file mode 100644 (file)
index 0000000..3b42c66
--- /dev/null
@@ -0,0 +1,15 @@
+//{{NO_DEPENDENCIES}}\r
+// Microsoft Developer Studio generated include file.\r
+// Used by xkeymacsdll.rc\r
+//\r
+\r
+// Next default values for new objects\r
+// \r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+#define _APS_NEXT_RESOURCE_VALUE        1000\r
+#define _APS_NEXT_COMMAND_VALUE         32771\r
+#define _APS_NEXT_CONTROL_VALUE         1000\r
+#define _APS_NEXT_SYMED_VALUE           1000\r
+#endif\r
+#endif\r
diff --git a/xkeymacsdll/xkeymacsdll.cpp b/xkeymacsdll/xkeymacsdll.cpp
new file mode 100644 (file)
index 0000000..3b4eb19
--- /dev/null
@@ -0,0 +1,2461 @@
+// xkeymacsdll.cpp : Defines the initialization routines for the DLL.\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "resource.h"\r
+#include "Utils.h"\r
+#include "Commands.h"\r
+#include <afxdllx.h>\r
+#include <math.h>\r
+#include <Imm.h>\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#undef THIS_FILE\r
+static char THIS_FILE[] = __FILE__;\r
+#endif\r
+\r
+\r
+static AFX_EXTENSION_MODULE XkeymacsdllDLL = { NULL, NULL };\r
+\r
+static HINSTANCE g_hDllInst = NULL;\r
+\r
+HINSTANCE GetThisHInst()\r
+{\r
+       return g_hDllInst;\r
+}\r
+\r
+extern "C" int APIENTRY\r
+DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)\r
+{\r
+       g_hDllInst = hInstance;\r
+       \r
+       // Remove this if you use lpReserved\r
+       UNREFERENCED_PARAMETER(lpReserved);\r
+\r
+       if (dwReason == DLL_PROCESS_ATTACH) {\r
+               TRACE0("XKEYMACSDLL.DLL Initializing!\n");\r
+               \r
+               // Extension DLL one-time initialization\r
+               if (!AfxInitExtensionModule(XkeymacsdllDLL, hInstance)) {\r
+                       return 0;\r
+               }\r
+\r
+               // Insert this DLL into the resource chain\r
+               // NOTE: If this Extension DLL is being implicitly linked to by\r
+               //  an MFC Regular DLL (such as an ActiveX Control)\r
+               //  instead of an MFC application, then you will want to\r
+               //  remove this line from DllMain and put it in a separate\r
+               //  function exported from this Extension DLL.  The Regular DLL\r
+               //  that uses this Extension DLL should then explicitly call that\r
+               //  function to initialize this Extension DLL.  Otherwise,\r
+               //  the CDynLinkLibrary object will not be attached to the\r
+               //  Regular DLL's resource chain, and serious problems will\r
+               //  result.\r
+\r
+               try {\r
+                       new CDynLinkLibrary(XkeymacsdllDLL);\r
+               }\r
+               catch (CMemoryException* e) {\r
+                       e->Delete();\r
+//                     CUtils::Log("DllMain: 'new' threw an exception");\r
+               }\r
+       } else if (dwReason == DLL_PROCESS_DETACH) {\r
+               TRACE0("XKEYMACSDLL.DLL Terminating!\n");\r
+               // Terminate the library before destructors are called\r
+               AfxTermExtensionModule(XkeymacsdllDLL);\r
+       }\r
+       return 1;   // ok\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// CXkeymacsDll Class\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "xkeymacsDll.h"\r
+#pragma data_seg(".xkmcs")\r
+       HHOOK   CXkeymacsDll::m_hHookKeyboard = NULL;\r
+       HHOOK   CXkeymacsDll::m_hHookCallWnd = NULL;\r
+       HHOOK   CXkeymacsDll::m_hHookCallWndRet = NULL;\r
+       HHOOK   CXkeymacsDll::m_hHookGetMessage = NULL;\r
+       HHOOK   CXkeymacsDll::m_hHookShell = NULL;\r
+       int             CXkeymacsDll::m_nCommandID[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
+       BOOL    CXkeymacsDll::m_bAtIbeamCursorOnly[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
+       int             CXkeymacsDll::m_nFunctionID[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
+       TCHAR   CXkeymacsDll::m_szSpecialApp[MAX_APP][CLASS_NAME_LENGTH] = {'\0'};\r
+       TCHAR   CXkeymacsDll::m_szWindowText[MAX_APP][WINDOW_TEXT_LENGTH] = {'\0'};\r
+       BOOL    CXkeymacsDll::m_bRightControl   = FALSE;\r
+       BOOL    CXkeymacsDll::m_bRightAlt               = FALSE;\r
+       BOOL    CXkeymacsDll::m_bRightShift             = FALSE;\r
+       BOOL    CXkeymacsDll::m_bHook                   = TRUE;\r
+       BOOL    CXkeymacsDll::m_bDefiningMacro  = FALSE;\r
+       DWORD   CXkeymacsDll::m_dwOldMessage[MAX_ICON_TYPE] = {'\0'};\r
+       NOTIFYICONDATA CXkeymacsDll::m_stNtfyIcon[MAX_ICON_TYPE] = {'\0'};\r
+       NOTIFYICONDATA CXkeymacsDll::m_stOldNtfyIcon[MAX_ICON_TYPE] = {'\0'};\r
+       HICON   CXkeymacsDll::m_hIcon[MAX_ICON_TYPE][MAX_STATUS] = {'\0'};\r
+       BOOL    CXkeymacsDll::m_bIcon[MAX_ICON_TYPE] = {'\0'};\r
+       int             CXkeymacsDll::m_nKillRingMax[MAX_APP] = {'\0'};\r
+       BOOL    CXkeymacsDll::m_bUseDialogSetting[MAX_APP] = {'\0'};\r
+       CList<CClipboardSnap *, CClipboardSnap *> CXkeymacsDll::m_oKillRing;\r
+       CObList CXkeymacsDll::m_Macro;\r
+       int             CXkeymacsDll::m_nKillRing = 0;\r
+       int             CXkeymacsDll::m_nOriginal[MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
+       int             CXkeymacsDll::m_nApplicationID = 0;\r
+       int             CXkeymacsDll::m_nSettingStyle[MAX_APP] = {'\0'};\r
+       BOOL    CXkeymacsDll::m_bIgnoreUndefinedMetaCtrl[MAX_APP] = {'\0'};\r
+       BOOL    CXkeymacsDll::m_bIgnoreUndefinedC_x[MAX_APP] = {'\0'};\r
+//     int             CXkeymacsDll::m_nPassThrough = 0;\r
+       TCHAR   CXkeymacsDll::m_szApplicationName[MAX_PATH] = {'\0'};\r
+       TCHAR   CXkeymacsDll::m_szOldApplicationName[MAX_PATH] = {'\0'};\r
+       BOOL    CXkeymacsDll::m_bEnableCUA[MAX_APP] = {'\0'};\r
+       TCHAR   CXkeymacsDll::m_szFunctionDefinition[MAX_FUNCTION][MAX_DEFINITION] = {'\0'};\r
+       int             CXkeymacsDll::m_nAccelerate = 0;\r
+       int             CXkeymacsDll::m_nKeyboardSpeed = 31;\r
+       HCURSOR CXkeymacsDll::m_hCursor[MAX_STATUS] = {'\0'};\r
+       HCURSOR CXkeymacsDll::m_hCurrentCursor = NULL;\r
+       BOOL    CXkeymacsDll::m_bCursor = FALSE;\r
+       BOOL    CXkeymacsDll::m_b326Compatible[MAX_APP] = {'\0'};\r
+\r
+       BOOL    CXkeymacsData::m_b106Keyboard = FALSE;\r
+#pragma data_seg()\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// Construction/Destruction\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CXkeymacsDll::CXkeymacsDll()\r
+{\r
+       CUtils::InitCUtils();\r
+}\r
+\r
+CXkeymacsDll::~CXkeymacsDll()\r
+{\r
+\r
+}\r
+\r
+int CXkeymacsDll::ModifyShell_NotifyIcon(ICON_TYPE icon, BOOL bNewStatus, BOOL bForce)\r
+{\r
+       if (m_stNtfyIcon[icon].hIcon == (bNewStatus ? m_hIcon[icon][ON_ICON] : m_hIcon[icon][OFF_ICON])) {\r
+               if (!bForce) {\r
+                       return TRUE;\r
+               }\r
+       } else {\r
+               m_stNtfyIcon[icon].hIcon = (bNewStatus ? m_hIcon[icon][ON_ICON] : m_hIcon[icon][OFF_ICON]);\r
+       }\r
+       return DoShell_NotifyIcon(icon, NIM_MODIFY);\r
+}\r
+\r
+void CXkeymacsDll::SetNotifyIconData(ICON_TYPE icon, NOTIFYICONDATA stNtfyIcon, HICON hEnable, HICON hDisableTMP, HICON hDisableWOCQ, HICON hDisable, BOOL bEnable)\r
+{\r
+       m_hIcon[icon][STATUS_ENABLE] = hEnable;\r
+       m_hIcon[icon][STATUS_DISABLE_TMP] = hDisableTMP;\r
+       m_hIcon[icon][STATUS_DISABLE_WOCQ] = hDisableWOCQ;\r
+       m_hIcon[icon][STATUS_DISABLE] = hDisable;\r
+       m_bIcon[icon] = bEnable;\r
+       m_stNtfyIcon[icon] = stNtfyIcon;\r
+       AddShell_NotifyIcon(icon);\r
+}\r
+\r
+void CXkeymacsDll::SetNotifyIconData(ICON_TYPE icon, NOTIFYICONDATA stNtfyIcon, HICON hOn, HICON hOff, BOOL bEnable)\r
+{\r
+       m_hIcon[icon][ON_ICON] = hOn;\r
+       m_hIcon[icon][OFF_ICON] = hOff;\r
+       m_bIcon[icon] = bEnable;\r
+       m_stNtfyIcon[icon] = stNtfyIcon;\r
+       AddShell_NotifyIcon(icon);\r
+}\r
+\r
+void CXkeymacsDll::EnableShell_NotifyIcon(ICON_TYPE icon, BOOL bEnable)\r
+{\r
+       DeleteShell_NotifyIcon(icon);\r
+       m_bIcon[icon] = bEnable;\r
+       AddShell_NotifyIcon(icon);\r
+}\r
+\r
+\r
+BOOL CXkeymacsDll::DoShell_NotifyIcon(ICON_TYPE icon, DWORD dwMessage)\r
+{\r
+       if (m_bIcon[icon]\r
+        &&     (m_dwOldMessage[icon] != dwMessage\r
+         || memcmp(&m_stOldNtfyIcon[icon], &m_stNtfyIcon[icon], sizeof(m_stNtfyIcon[icon])))) {\r
+               m_dwOldMessage[icon] = dwMessage;\r
+               m_stOldNtfyIcon[icon] = m_stNtfyIcon[icon];\r
+\r
+               BOOL rc = FALSE;\r
+               for (int retry_count = 0; retry_count < 20; ++retry_count) { // retry for timeout\r
+                       rc = Shell_NotifyIcon(dwMessage, &m_stNtfyIcon[icon]);\r
+                       if (dwMessage != NIM_ADD || rc || (GetLastError() != ERROR_TIMEOUT && 5 < retry_count)) {\r
+                               break;\r
+                       }\r
+                       Sleep(1000); // 1sec\r
+                       if ((rc = Shell_NotifyIcon(NIM_MODIFY, &m_stNtfyIcon[icon])) != FALSE) {\r
+                               break; // ERROR_TIMEOUT was returned but the icon was also added.\r
+                       }\r
+               }\r
+               return rc;\r
+       } else {\r
+               return TRUE;\r
+       }\r
+}\r
+\r
+void CXkeymacsDll::AddShell_NotifyIcon(ICON_TYPE icon)\r
+{\r
+       DoShell_NotifyIcon(icon, NIM_ADD);\r
+}\r
+\r
+void CXkeymacsDll::DeleteShell_NotifyIcon(ICON_TYPE icon)\r
+{\r
+       DoShell_NotifyIcon(icon, NIM_DELETE);\r
+}\r
+\r
+// set keyboard hook\r
+BOOL CXkeymacsDll::SetKeyboardHook()\r
+{\r
+       m_hHookKeyboard = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, GetThisHInst(), 0);\r
+       if (!m_hHookKeyboard) {\r
+               return FALSE;\r
+       }\r
+\r
+       m_hHookCallWnd = ::SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc, GetThisHInst(), 0);\r
+\r
+       m_hHookCallWndRet = ::SetWindowsHookEx(WH_CALLWNDPROCRET, (HOOKPROC)CallWndRetProc, GetThisHInst(), 0);\r
+\r
+       m_hHookGetMessage = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, GetThisHInst(), 0);\r
+\r
+       m_hHookShell = ::SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellProc, GetThisHInst(), 0);\r
+\r
+       AddShell_NotifyIcon(MAIN_ICON);\r
+\r
+       return TRUE;\r
+}\r
+\r
+// release keyboard hook\r
+BOOL CXkeymacsDll::ReleaseKeyboardHook()\r
+{\r
+       BOOL bKeyboard = TRUE;\r
+       BOOL bCallWnd = TRUE;\r
+       BOOL bCallWndRet = TRUE;\r
+       BOOL bGetMessage = TRUE;\r
+       BOOL bShell = TRUE;\r
+\r
+       if (m_hHookKeyboard) {\r
+               bKeyboard = ::UnhookWindowsHookEx(m_hHookKeyboard);\r
+       }\r
+       m_hHookKeyboard = NULL;\r
+\r
+       if (m_hHookCallWnd) {\r
+               bCallWnd = ::UnhookWindowsHookEx(m_hHookCallWnd);\r
+       }\r
+       m_hHookCallWnd = NULL;\r
+\r
+       if (m_hHookCallWndRet) {\r
+               bCallWndRet = ::UnhookWindowsHookEx(m_hHookCallWndRet);\r
+       }\r
+       m_hHookCallWndRet = NULL;\r
+\r
+       if (m_hHookGetMessage) {\r
+               bGetMessage = ::UnhookWindowsHookEx(m_hHookGetMessage);\r
+       }\r
+       m_hHookGetMessage = NULL;\r
+\r
+       if (m_hHookShell) {\r
+               bShell = ::UnhookWindowsHookEx(m_hHookShell);\r
+       }\r
+       m_hHookShell = NULL;\r
+\r
+       return bKeyboard && bCallWnd && bCallWndRet && bGetMessage && bShell;\r
+}\r
+\r
+void CXkeymacsDll::SetKeyboardHookFlag(BOOL bFlag)\r
+{\r
+       m_bHook = bFlag;\r
+\r
+       if (m_bHook) {\r
+               if (CCommands::IsTemporarilyDisableXKeymacs()) {\r
+                       m_stNtfyIcon[MAIN_ICON].hIcon = m_hIcon[MAIN_ICON][STATUS_DISABLE_TMP];\r
+                       m_hCurrentCursor = m_hCursor[STATUS_DISABLE_TMP];\r
+               } else {\r
+                       m_stNtfyIcon[MAIN_ICON].hIcon = m_hIcon[MAIN_ICON][STATUS_ENABLE];\r
+                       m_hCurrentCursor = m_hCursor[STATUS_ENABLE];\r
+               }\r
+       } else {\r
+               m_stNtfyIcon[MAIN_ICON].hIcon = m_hIcon[MAIN_ICON][STATUS_DISABLE_WOCQ];\r
+               m_hCurrentCursor = m_hCursor[STATUS_DISABLE_WOCQ];\r
+       }\r
+       if (m_nSettingStyle[m_nApplicationID] == SETTING_DISABLE\r
+        || (!_tcsicmp(m_szSpecialApp[m_nApplicationID], _T("Default"))\r
+         && CUtils::IsDefaultIgnoreApplication())) {\r
+               m_stNtfyIcon[MAIN_ICON].hIcon = m_hIcon[MAIN_ICON][STATUS_DISABLE];\r
+               m_hCurrentCursor = m_hCursor[STATUS_DISABLE];\r
+       }\r
+       DoShell_NotifyIcon(MAIN_ICON, NIM_MODIFY);\r
+       DoSetCursor();\r
+}\r
+\r
+// if be keyboard hook, return TRUE\r
+BOOL CXkeymacsDll::IsKeyboardHook()\r
+{\r
+       if (m_bHook) {\r
+               return TRUE;\r
+       }\r
+\r
+       return FALSE;\r
+}\r
+\r
+void CXkeymacsDll::LogCallWndProcMessage(WPARAM wParam, LPARAM lParam)\r
+{\r
+       CWPSTRUCT &cwps = *(CWPSTRUCT *)lParam;\r
+\r
+       switch (cwps.message) {\r
+       case WM_PAINT:                                  // 0x000F\r
+       case WM_MDIGETACTIVE:                   // 0x0229\r
+       case 0x0403:\r
+       case 0x0407:\r
+       case 0x0418:\r
+       case 0x043F:\r
+       case 0x0440:\r
+               break;\r
+       case WM_CREATE:                                 // 0x0001\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_CREATE"));\r
+               break;\r
+       case WM_DESTROY:                                // 0x0002\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_DESTROY"));\r
+               break;\r
+       case WM_MOVE:                                   // 0x0003\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_MOVE");)\r
+               break;\r
+       case WM_SIZE:                                   // 0x0005\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_SIZE"));\r
+               break;\r
+       case WM_GETTEXT:                                // 0x000D\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_GETTEXT"));\r
+               break;\r
+       case WM_ERASEBKGND:                             // 0x0014\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_ERASEBKGND"));\r
+               break;\r
+       case WM_WINDOWPOSCHANGING:              // 0x0046\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_WINDOWPOSCHANGING"));\r
+               break;\r
+       case WM_WINDOWPOSCHANGED:               // 0x0047\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_WINDOWPOSCHANGED"));\r
+               break;\r
+       case WM_COPYDATA:                               // 0x004A\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_COPYDATA"));\r
+               break;\r
+       case WM_NCCREATE:                               // 0x0081\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_NCCREATE"));\r
+               break;\r
+       case WM_NCDESTROY:                              // 0x0082\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_NCDESTROY"));\r
+               break;\r
+       case WM_NCCALCSIZE:                             // 0x0083\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_NCCALCSIZE"));\r
+               break;\r
+       case WM_NCPAINT:                                // 0x0085\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_NCPAINT"));\r
+               break;\r
+       case WM_IME_STARTCOMPOSITION:   // 0x010D\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_IME_STARTCOMPOSITION"));\r
+               break;\r
+       case WM_IME_ENDCOMPOSITION:             // 0x010E\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_IME_ENDCOMPOSITION"));\r
+               break;\r
+       case WM_IME_KEYLAST:                    // 0x010F\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_IME_KEYLAST"));\r
+               break;\r
+       case WM_COMMAND:                                // 0x0111\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_COMMAND"));\r
+               break;\r
+       case WM_CTLCOLOREDIT:                   // 0x0133\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_CTLCOLOREDIT"));\r
+               break;\r
+       case WM_POWERBROADCAST:                 // 0x0218\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_POWERBROADCAST"));\r
+               switch (wParam) {\r
+               case PBT_APMQUERYSUSPEND:               // 0x0000\r
+//                     CUtils::Log(_T("PBT_APMQUERYSUSPEND"));\r
+                       break;\r
+               case PBT_APMQUERYSTANDBY:               // 0x0001\r
+//                     CUtils::Log(_T("PBT_APMQUERYSTANDBY"));\r
+                       break;\r
+               case PBT_APMQUERYSUSPENDFAILED: // 0x0002\r
+//                     CUtils::Log(_T("PBT_APMQUERYSUSPENDFAILED"));\r
+                       break;\r
+               case PBT_APMQUERYSTANDBYFAILED: // 0x0003\r
+//                     CUtils::Log(_T("PBT_APMQUERYSTANDBYFAILED"));\r
+                       break;\r
+               case PBT_APMSUSPEND:                    // 0x0004\r
+//                     CUtils::Log(_T("PBT_APMSUSPEND"));\r
+                       break;\r
+               case PBT_APMSTANDBY:                    // 0x0005\r
+//                     CUtils::Log(_T("PBT_APMSTANDBY"));\r
+                       break;\r
+               case PBT_APMRESUMECRITICAL:             // 0x0006\r
+//                     CUtils::Log(_T("PBT_APMRESUMECRITICAL"));\r
+                       break;\r
+               case PBT_APMRESUMESUSPEND:              // 0x0007\r
+//                     CUtils::Log(_T("PBT_APMRESUMESUSPEND"));\r
+                       break;\r
+               case PBT_APMRESUMESTANDBY:              // 0x0008\r
+//                     CUtils::Log(_T("PBT_APMRESUMESTANDBY"));\r
+                       break;\r
+               case PBT_APMBATTERYLOW:                 // 0x0009\r
+//                     CUtils::Log(_T("PBT_APMBATTERYLOW"));\r
+                       break;\r
+               case PBT_APMPOWERSTATUSCHANGE:  // 0x000A\r
+//                     CUtils::Log(_T("PBT_APMPOWERSTATUSCHANGE"));\r
+                       break;\r
+               case PBT_APMOEMEVENT:                   // 0x000B\r
+//                     CUtils::Log(_T("PBT_APMOEMEVENT"));\r
+                       break;\r
+               case PBT_APMRESUMEAUTOMATIC:    // 0x0012\r
+//                     CUtils::Log(_T("PBT_APMRESUMEAUTOMATIC"));\r
+                       break;\r
+               default:\r
+//                     CUtils::Log(_T("PBT_OTHERS: %d"), wParam);\r
+                       break;\r
+               }\r
+               break;\r
+       case WM_IME_NOTIFY:                             // 0x0282\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = WM_IME_NOTIFY"));\r
+               break;\r
+       default:\r
+//             CUtils::Log(_T("CallWndProc: cwps.message = 0x%04X"), cwps.message);\r
+               break;\r
+       }\r
+}\r
+\r
+LRESULT CALLBACK CXkeymacsDll::CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+{\r
+//     LogCallWndProcMessage(wParam, lParam);\r
+\r
+       if (0 <= nCode) {\r
+               CWPSTRUCT &cwps = *(CWPSTRUCT *)lParam;\r
+               switch (cwps.message) {\r
+               case WM_IME_STARTCOMPOSITION:\r
+                       InitKeyboardProc(TRUE);\r
+                       break;\r
+               case WM_IME_ENDCOMPOSITION:\r
+                       InitKeyboardProc(FALSE);\r
+                       break;\r
+               case WM_SETFOCUS:\r
+                       if (cwps.hwnd == GetForegroundWindow()) {\r
+                               InitKeyboardProc(FALSE);\r
+                               SetKeyboardHookFlag(m_bHook);\r
+                       }\r
+                       break;\r
+               case WM_NCACTIVATE:\r
+                       if (cwps.wParam) {\r
+                               if (cwps.hwnd == GetForegroundWindow()) {\r
+                                       InitKeyboardProc(FALSE);\r
+                                       SetKeyboardHookFlag(m_bHook);\r
+                               }\r
+                       }\r
+                       break;\r
+               case WM_POWERBROADCAST:\r
+                       switch (wParam) {\r
+                       case PBT_APMRESUMECRITICAL: // 0x0006\r
+                       case PBT_APMRESUMESUSPEND:  // 0x0007\r
+                       case PBT_APMRESUMESTANDBY:  // 0x0008\r
+                               ReleaseKeyboardHook();\r
+                               SetKeyboardHook();\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+       return CallNextHookEx(m_hHookCallWnd, nCode, wParam, lParam);\r
+}\r
+\r
+LRESULT CALLBACK CXkeymacsDll::CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+{\r
+       if (0 <= nCode) {\r
+               CWPRETSTRUCT &cwprets = *(CWPRETSTRUCT *)lParam;\r
+               switch (cwprets.message) {\r
+               case WM_SETTEXT:\r
+                       if (cwprets.hwnd == GetForegroundWindow()) {\r
+                               InitKeyboardProc(FALSE);\r
+                       }\r
+                       break;\r
+               case WM_SETCURSOR:\r
+                       DoSetCursor();\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+       return CallNextHookEx(m_hHookCallWndRet, nCode, wParam, lParam);\r
+}\r
+\r
+LRESULT CALLBACK CXkeymacsDll::GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+{\r
+       MSG &msg = (*(MSG *)lParam);\r
+\r
+       switch (msg.message) {\r
+       case WM_IME_STARTCOMPOSITION:\r
+               InitKeyboardProc(TRUE);\r
+               break;\r
+       case WM_IME_ENDCOMPOSITION:\r
+               InitKeyboardProc(FALSE);\r
+               break;\r
+       }\r
+       return CallNextHookEx(m_hHookGetMessage, nCode, wParam, lParam);\r
+}\r
+\r
+LRESULT CALLBACK CXkeymacsDll::ShellProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (nCode) {\r
+       case HSHELL_WINDOWACTIVATED:\r
+       {\r
+               TCHAR className[256];\r
+               ::GetClassName((HWND)wParam, className, 255);\r
+               if (!_tcsicmp(className, _T("ConsoleWindowClass"))) {\r
+                       InitKeyboardProc(FALSE);\r
+                       SetKeyboardHookFlag(m_bHook);\r
+               }\r
+               break;\r
+       }\r
+       default:\r
+               break;\r
+       }\r
+       return CallNextHookEx( m_hHookShell, nCode, wParam, lParam );\r
+}\r
+\r
+// return true if the key is down\r
+BOOL CXkeymacsDll::IsDown(BYTE bVk, BOOL bPhysicalKey)\r
+{\r
+       if (bPhysicalKey) {\r
+               return GetKeyState(bVk) < 0;\r
+       } else {\r
+               return GetAsyncKeyState(bVk) < 0;\r
+       }\r
+}\r
+\r
+// Do keybd_event\r
+void CXkeymacsDll::DoKeybd_event(BYTE bVk, DWORD dwFlags)\r
+{\r
+       // Set KEYEVENTF_EXTENDEDKEY if needed\r
+       switch (bVk) {\r
+       case VK_CONTROL:\r
+               if (m_bRightControl) {          // Right Ctrl\r
+                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+               }\r
+               break;\r
+\r
+       case VK_MENU:\r
+               if (m_bRightAlt) {                      // Right Alt\r
+                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+//                     CUtils::Log("Right Alt %d", dwFlags);\r
+//             } else {\r
+//                     CUtils::Log("Left Alt %d", dwFlags);\r
+               }\r
+               break;\r
+\r
+       case VK_SHIFT:\r
+               if (m_bRightShift) {            // Right Shift\r
+                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+               }\r
+               break;\r
+\r
+       case VK_PAUSE:\r
+               if (IsDown(VK_CONTROL)) {       // Break\r
+                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+               }\r
+               break;\r
+\r
+       case VK_INSERT:\r
+       case VK_DELETE:\r
+       case VK_HOME:\r
+       case VK_END:\r
+       case VK_NEXT:\r
+       case VK_PRIOR:\r
+       case VK_UP:\r
+       case VK_DOWN:\r
+       case VK_RIGHT:\r
+       case VK_LEFT:\r
+       case VK_NUMLOCK:\r
+       case VK_PRINT:\r
+               dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+               break;\r
+\r
+       default:\r
+               break;\r
+       }\r
+\r
+//     CUtils::Log(_T("b: %x, %x, %x, %#x, %#x"), bVk, dwFlags, GetMessageExtraInfo(), GetKeyState(bVk), GetAsyncKeyState(bVk));\r
+       keybd_event(bVk, 0, dwFlags, GetMessageExtraInfo());\r
+//     CUtils::Log(_T("a: %x, %x, %x, %#x, %#x"), bVk, dwFlags, GetMessageExtraInfo(), GetKeyState(bVk), GetAsyncKeyState(bVk));\r
+}\r
+\r
+// the key is being depressed\r
+void CXkeymacsDll::DepressKey(BYTE bVk, BOOL bOriginal)        // bVk is virtual-key code, MSDN said\r
+{\r
+       if (bOriginal) {\r
+//             CUtils::Log(_T("i: %x, %d, %d, %d, %d, %d, %d, %d, %d"), bVk,\r
+//                     IsDown(VK_CONTROL), IsDown(VK_CONTROL, FALSE), IsDepressedModifier(CCommands::C_), IsDepressedModifier(CCommands::C_, FALSE),\r
+//                     IsDown(VK_MENU), IsDown(VK_MENU, FALSE), IsDepressedModifier(CCommands::MetaAlt), IsDepressedModifier(CCommands::MetaAlt, FALSE));\r
+\r
+               int nCommandType = NONE;\r
+               if (IsDown(VK_CONTROL, FALSE)) {\r
+                       nCommandType |= CONTROL;\r
+               }\r
+               if (IsDown(VK_MENU, FALSE)) {\r
+                       nCommandType |= META;\r
+               }\r
+               Original(nCommandType, bVk, 1);\r
+       }\r
+\r
+       DoKeybd_event(bVk, 0);\r
+}\r
+\r
+// the key is being released\r
+void CXkeymacsDll::ReleaseKey(BYTE bVk)        // bVk is virtual-key code, MSDN said\r
+{\r
+       DoKeybd_event(bVk, KEYEVENTF_KEYUP);\r
+}\r
+\r
+// bVk down, bVk up\r
+void CXkeymacsDll::Kdu(BYTE bVk, DWORD n, BOOL bOriginal)\r
+{\r
+       while (n--) {\r
+               DepressKey(bVk, bOriginal);\r
+               ReleaseKey(bVk);\r
+       }\r
+}\r
+\r
+void CXkeymacsDll::InitKeyboardProc(BOOL bImeComposition)\r
+{\r
+       if (CUtils::IsFindDialog()) {\r
+               static BOOL bImeCompositionOld = FALSE;\r
+               if (!bImeComposition\r
+                && bImeCompositionOld) {\r
+                       DepressKey(VK_END);\r
+                       ReleaseKey(VK_END);\r
+               }\r
+               bImeCompositionOld = bImeComposition;\r
+       }\r
+\r
+       CUtils::SetApplicationName(bImeComposition);\r
+\r
+       if (_tcsnicmp(m_szSpecialApp[m_nApplicationID], CUtils::GetApplicationName(), 0xF) || !IsMatchWindowText(m_szWindowText[m_nApplicationID])) {   // PROCESSENTRY32 has only 0xF bytes of Name\r
+               m_nApplicationID = -1;\r
+\r
+               for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                       if (!_tcsnicmp(m_szSpecialApp[nApplicationID], CUtils::GetApplicationName(), 0xF) && IsMatchWindowText(m_szWindowText[nApplicationID])) {\r
+\r
+                               if (m_nApplicationID < 0\r
+                                || CUtils::GetWindowTextType(m_szWindowText[m_nApplicationID]) < CUtils::GetWindowTextType(m_szWindowText[nApplicationID])\r
+                                || CUtils::GetWindowTextType(m_szWindowText[m_nApplicationID]) == CUtils::GetWindowTextType(m_szWindowText[nApplicationID])\r
+                                && _tcscmp(m_szWindowText[m_nApplicationID], m_szWindowText[nApplicationID]) <= 0) {\r
+                                       m_nApplicationID = nApplicationID;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (m_nApplicationID < 0) {\r
+                       for (int nApplicationID = 0; nApplicationID < MAX_APP; ++nApplicationID) {\r
+                               if (!_tcsicmp(m_szSpecialApp[nApplicationID], _T("Default"))) {\r
+                                       m_nApplicationID = nApplicationID;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (m_nApplicationID < 0) {\r
+                               m_nApplicationID = 0;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (m_nSettingStyle[m_nApplicationID] != SETTING_DISABLE\r
+        && (_tcsicmp(m_szSpecialApp[m_nApplicationID], _T("Default")) || !CUtils::IsDefaultIgnoreApplication())\r
+        && !bImeComposition\r
+        && CUtils::IsDialog()) {\r
+               // Use Dialog Setting\r
+               if (m_bUseDialogSetting[m_nApplicationID]) {\r
+                       int nOriginalApplicationID = m_nApplicationID;\r
+                       for (m_nApplicationID = 0; m_nApplicationID < MAX_APP; ++m_nApplicationID) {\r
+                               if (!_tcsicmp(m_szSpecialApp[m_nApplicationID], _T("Dialog"))) {\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if (m_nApplicationID == MAX_APP) {\r
+                               m_nApplicationID = nOriginalApplicationID;\r
+                       }\r
+               }\r
+       }\r
+\r
+       ModifyShell_NotifyIcon(CX_ICON, FALSE);\r
+       ModifyShell_NotifyIcon(MX_ICON, FALSE);\r
+       ModifyShell_NotifyIcon(META_ICON, FALSE);\r
+       CCommands::SetMark(FALSE);\r
+       CCommands::SetTemporarilyDisableXKeymacs(FALSE);\r
+       CCommands::Reset();\r
+}\r
+\r
+// emulate emacs       // cf virtual-key code\r
+LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+{\r
+       ASSERT(0 <= wParam && wParam <= UCHAR_MAX);\r
+\r
+       int nCommandType = NONE;\r
+       BYTE nKey = (BYTE)wParam;\r
+\r
+       static BOOL bLocked = FALSE;\r
+       static const BYTE RECURSIVE_KEY = 0x07;\r
+       static int (*fCommand)() = NULL;\r
+       static BYTE nOneShotModifier[MAX_KEY] = {'\0'};\r
+       static BOOL bCherryOneShotModifier = FALSE;\r
+\r
+//     CUtils::Log(_T("nCode = %#x, nKey = %#x, lParam = %#x"), nCode, nKey, lParam);\r
+\r
+       if (nCode < 0 || nCode == HC_NOREMOVE) {\r
+               goto DO_NOTHING;\r
+       }\r
+\r
+       if (nKey == RECURSIVE_KEY) {\r
+               if (lParam & BEING_RELEASED) {\r
+                       goto HOOK_RECURSIVE_KEY;\r
+               } else {\r
+                       goto RECURSIVE_COMMAND;\r
+               }\r
+       }\r
+\r
+       {\r
+               static BOOL bShift = FALSE;\r
+               if (IsDepressedShiftKeyOnly(nKey)) {\r
+                       if (lParam & BEING_RELEASED) {\r
+                               if (bShift) {\r
+                                       CCommands::SetMark(FALSE);\r
+                               }\r
+                       } else {\r
+                               bShift = TRUE;\r
+                       }\r
+               } else {\r
+                       bShift = FALSE;\r
+               }\r
+       }\r
+\r
+       if (CUtils::IsNT()) {\r
+               switch (nKey) {\r
+               case VK_CONTROL:\r
+                       if (lParam & EXTENDED_KEY) {\r
+                               nKey = VK_RCONTROL;\r
+                       } else {\r
+                               nKey = VK_LCONTROL;\r
+                       }\r
+                       break;\r
+               case VK_MENU:\r
+                       if (lParam & EXTENDED_KEY) {\r
+                               nKey = VK_RMENU;\r
+                       } else {\r
+                               nKey = VK_LMENU;\r
+                       }\r
+                       break;\r
+               case VK_SHIFT:\r
+                       if (lParam & EXTENDED_KEY) {\r
+                               nKey = VK_RSHIFT;\r
+                       } else {\r
+                               nKey = VK_LSHIFT;\r
+                       }\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+\r
+       if (lParam & BEING_RELEASED) {\r
+               if (nKey == VK_MENU\r
+                || nKey == VK_LWIN\r
+                || nKey == VK_RWIN\r
+                || nKey == VK_APPS\r
+                || nKey == VK_LMENU\r
+                || nKey == VK_RMENU) {\r
+                       for (int i = 0; i < MAX_COMMAND_TYPE; ++i) {\r
+                               if (Commands[m_nCommandID[m_nApplicationID][i][nKey]].fCommand\r
+                                && (Commands[m_nCommandID[m_nApplicationID][i][nKey]].fCommand != CCommands::MetaAlt\r
+                                 || nKey != VK_MENU && nKey != VK_LMENU && nKey != VK_RMENU)) {\r
+                                       goto HOOK;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (nOneShotModifier[nKey]) {\r
+                       ReleaseKey(nOneShotModifier[nKey]);\r
+                       nOneShotModifier[nKey] = 0;\r
+\r
+                       if (bCherryOneShotModifier) {\r
+                               bCherryOneShotModifier = FALSE;\r
+                               Kdu(nKey);\r
+                       }\r
+               }\r
+\r
+               goto DO_NOTHING;\r
+       }\r
+\r
+       if (m_nSettingStyle[m_nApplicationID] == SETTING_DISABLE) {\r
+               goto DO_NOTHING;\r
+       }\r
+\r
+       // Do Nothing for Meadow, Mule for Win32, ... if those use default setting.\r
+       if (!_tcsicmp(m_szSpecialApp[m_nApplicationID], _T("Default"))\r
+        && CUtils::IsDefaultIgnoreApplication()) {\r
+               goto DO_NOTHING;\r
+       }\r
+\r
+       switch (IsPassThrough(nKey)) {\r
+       case GOTO_DO_NOTHING:\r
+               goto DO_NOTHING;\r
+       case GOTO_HOOK:\r
+               goto HOOK;\r
+       case CONTINUE:\r
+               break;\r
+       default:\r
+               ASSERT(0);\r
+               break;\r
+       }\r
+\r
+       // set command type\r
+       {\r
+               nCommandType = NONE;\r
+               if (IsDown(VK_SHIFT, FALSE)) {\r
+                       nCommandType |= SHIFT;\r
+               }\r
+               if (IsControl()) {\r
+                       nCommandType |= CONTROL;\r
+               }\r
+               if (IsMeta()) {\r
+                       nCommandType |= META;\r
+               }\r
+               if (CCommands::bC_x()) {\r
+                       nCommandType |= CONTROLX;\r
+               }\r
+\r
+               // Ignore undefined C-x ?\r
+               if (nCommandType & CONTROLX) {\r
+                       if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == NULL\r
+                        && m_nFunctionID[m_nApplicationID][nCommandType][nKey] < 0) {\r
+                               if (m_bIgnoreUndefinedC_x[m_nApplicationID]) {\r
+                                       CCommands::Reset(GOTO_HOOK);\r
+                                       goto HOOK;\r
+                               }\r
+                               nCommandType &= ~CONTROLX;\r
+                       }\r
+               }\r
+\r
+               // Ignore undefined Meta Ctrl+?\r
+               if (CCommands::bM_() && (nCommandType & CONTROL)) {\r
+                       if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == NULL\r
+                        && m_nFunctionID[m_nApplicationID][nCommandType][nKey] < 0) {\r
+                               if (m_bIgnoreUndefinedMetaCtrl[m_nApplicationID]) {\r
+                                       if (Original(CONTROL, nKey)) {\r
+                                               Original(CONTROL, nKey, -1);\r
+                                               goto DO_NOTHING;\r
+                                       }\r
+                                       CCommands::Reset(GOTO_HOOK);\r
+                                       goto HOOK;\r
+                               }\r
+                               nCommandType &= ~META;\r
+                       }\r
+               }\r
+       }\r
+\r
+       {\r
+//             CUtils::Log(_T("o: %x, %d, %d, %d, %d, %d, %d, %d, %d"), (BYTE)wParam,\r
+//                     IsDown(VK_CONTROL), IsDown(VK_CONTROL, FALSE), IsDepressedModifier(CCommands::C_), IsDepressedModifier(CCommands::C_, FALSE),\r
+//                     IsDown(VK_MENU), IsDown(VK_MENU, FALSE), IsDepressedModifier(CCommands::MetaAlt), IsDepressedModifier(CCommands::MetaAlt, FALSE));\r
+\r
+               BYTE nKey = (BYTE)wParam; // VK_CONTROL is needed instead of VK_RCONTROL and VK_LCONTROL in this block just for Original()\r
+               int nVirtualCommandType = NONE;\r
+               if (IsDown(VK_CONTROL) && nKey != VK_CONTROL) {\r
+                       nVirtualCommandType |= CONTROL;\r
+               }\r
+               if (IsDown(VK_MENU) && nKey != VK_MENU) {\r
+                       nVirtualCommandType |= META;\r
+               }\r
+               if (Original(nVirtualCommandType, nKey)) {\r
+                       Original(nVirtualCommandType, nKey, -1);\r
+                       goto DO_NOTHING;\r
+               }\r
+       }\r
+\r
+       if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::EnableOrDisableXKeymacs) {\r
+               SetKeyboardHookFlag(!m_bHook);\r
+               goto HOOK;\r
+       }\r
+       if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::EnableXKeymacs) {\r
+               if (!m_bHook) {\r
+                       SetKeyboardHookFlag(!m_bHook);\r
+               }\r
+               goto HOOK;\r
+       }\r
+       if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::DisableXKeymacs) {\r
+               if (m_bHook) {\r
+                       SetKeyboardHookFlag(!m_bHook);\r
+               }\r
+               goto HOOK;\r
+       }\r
+       if (!m_bHook) {\r
+               goto DO_NOTHING;\r
+       }\r
+\r
+       if (CCommands::bM_x()) {\r
+               static unsigned int index = 0;\r
+               static TCHAR szPath[MAX_PATH] = {'\0'};\r
+\r
+               if (lParam & BEING_RELEASED) {\r
+                       // ignore\r
+               } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::BackwardChar) {\r
+                       if (index) {\r
+                               --index;\r
+                       }\r
+                       goto HOOKX;\r
+               } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::BeginningOfLine) {\r
+                       index = 0;\r
+                       goto HOOKX;\r
+               } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::DeleteBackwardChar) {\r
+                       if (index) {\r
+                               --index;\r
+                               memmove(&szPath[index], &szPath[index + 1], _tcslen(szPath) - index);\r
+                               ModifyM_xTip(szPath);\r
+                       }\r
+                       goto HOOKX;\r
+               } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::DeleteChar) {\r
+                       if (index < _tcslen(szPath)) {\r
+                               memmove(&szPath[index], &szPath[index + 1], _tcslen(szPath) - index);\r
+                               ModifyM_xTip(szPath);\r
+                       }\r
+                       goto HOOKX;\r
+               } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::EndOfLine) {\r
+                       index = _tcslen(szPath);\r
+                       goto HOOKX;\r
+               } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::ForwardChar) {\r
+                       if (index < _tcslen(szPath)) {\r
+                               ++index;\r
+                       }\r
+                       goto HOOKX;\r
+               } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::KeyboardQuit) {\r
+                       CCommands::bM_x(FALSE);\r
+                       index = 0;\r
+                       memset(szPath, 0, sizeof(szPath));\r
+                       goto HOOK;\r
+               } else if (nKey == VK_RETURN\r
+                               || Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::Newline) {\r
+                       InvokeM_x(szPath);\r
+\r
+                       CCommands::bM_x(FALSE);\r
+                       index = 0;\r
+                       memset(szPath, 0, sizeof(szPath));\r
+                       goto HOOK;\r
+               } else if (index < MAX_PATH - 1) {\r
+                       const BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
+                       for (TCHAR nAscii = 1; nAscii != 0; ++nAscii) { // repeat until overflow\r
+                               if (nKey != 0 && a2v(nAscii) == nKey && bIsShiftDown == IsShift(nAscii)) {\r
+//                                     CUtils::Log("M-x: %#X (%c), %#X (%c)", nKey, nKey, nAscii, nAscii);\r
+                                       if (index < _tcslen(szPath)) {\r
+                                               memmove(&szPath[index + 1], &szPath[index], __min(_tcslen(szPath) - index, MAX_PATH - (index + 1) - 1));\r
+                                       }\r
+                                       szPath[index++] = nAscii;\r
+//                                     CUtils::Log("M-x: %c(%#04x)", nAscii, nAscii);\r
+                                       ModifyM_xTip(szPath);\r
+                                       goto HOOKX;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (CCommands::bC_u()) {\r
+               if ((nCommandType == NONE) && ('0' <= nKey) && (nKey <= '9')) {\r
+                       CCommands::NumericArgument(nKey - '0');\r
+                       goto HOOK0_9;\r
+               }\r
+               if ((nCommandType == NONE) && (nKey == 0xBD)) {\r
+                       CCommands::NumericArgumentMinus();\r
+                       goto HOOK0_9;\r
+               }\r
+       }\r
+\r
+       if (Commands[m_nCommandID[m_nApplicationID][nCommandType & ~CONTROL][nKey]].fCommand == CCommands::OneShotModifierCtrl) {\r
+               nOneShotModifier[nKey] = VK_LCONTROL;\r
+               DepressKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = TRUE;\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::OneShotModifierCtrlRepeat) {\r
+               nOneShotModifier[nKey] = VK_LCONTROL;\r
+               DepressKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = TRUE;\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType & ~CONTROL][nKey]].fCommand == CCommands::OneShotModifierCtrlRepeat) {\r
+               ReleaseKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = FALSE;\r
+               Kdu(nKey);\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType & ~META][nKey]].fCommand == CCommands::OneShotModifierAlt) {\r
+               nOneShotModifier[nKey] = VK_LMENU;\r
+               DepressKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = TRUE;\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::OneShotModifierAltRepeat) {\r
+               nOneShotModifier[nKey] = VK_LMENU;\r
+               DepressKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = TRUE;\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType & ~META][nKey]].fCommand == CCommands::OneShotModifierAltRepeat) {\r
+               ReleaseKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = FALSE;\r
+               Kdu(nKey);\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType & ~SHIFT][nKey]].fCommand == CCommands::OneShotModifierShift) {\r
+               nOneShotModifier[nKey] = VK_SHIFT;\r
+               DepressKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = TRUE;\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::OneShotModifierShiftRepeat) {\r
+               nOneShotModifier[nKey] = VK_SHIFT;\r
+               DepressKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = TRUE;\r
+               goto HOOK;\r
+       } else if (Commands[m_nCommandID[m_nApplicationID][nCommandType & ~SHIFT][nKey]].fCommand == CCommands::OneShotModifierShiftRepeat) {\r
+               ReleaseKey(nOneShotModifier[nKey]);\r
+               bCherryOneShotModifier = FALSE;\r
+               Kdu(nKey);\r
+               goto HOOK;\r
+       } else {\r
+               for (int i = 0; i < MAX_KEY; ++i) {\r
+                       if (nOneShotModifier[i] == nKey) {\r
+                               break;\r
+                       }\r
+               }\r
+               if (i == MAX_KEY) {\r
+                       bCherryOneShotModifier = FALSE;\r
+               }\r
+       }\r
+\r
+       if (0 <= m_nFunctionID[m_nApplicationID][nCommandType][nKey]\r
+        && m_nFunctionID[m_nApplicationID][nCommandType][nKey] < MAX_FUNCTION\r
+        && _tcslen(m_szFunctionDefinition[m_nFunctionID[m_nApplicationID][nCommandType][nKey]])) {\r
+               CallFunction(m_nFunctionID[m_nApplicationID][nCommandType][nKey]);\r
+               CCommands::Reset(GOTO_HOOK);\r
+               goto HOOK;\r
+       }\r
+\r
+       if (!Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand) {\r
+               if (nKey == VK_CONTROL\r
+                || nKey == VK_LCONTROL\r
+                || nKey == VK_RCONTROL\r
+                || nKey == VK_MENU\r
+                || nKey == VK_LMENU\r
+                || nKey == VK_RMENU\r
+                || nKey == VK_SHIFT\r
+                || nKey == VK_LSHIFT\r
+                || nKey == VK_RSHIFT) {\r
+                       goto DO_NOTHING;\r
+               }\r
+\r
+               if (!(nCommandType & SHIFT)) {\r
+                       if (CCommands::IsSetMark()) {\r
+                               if (CCommands::MoveCaret(nKey, nCommandType & CONTROL) != CONTINUE) {\r
+                                       CCommands::ClearNumericArgument();\r
+                                       goto HOOK;\r
+                               }\r
+                               CCommands::SetMark(FALSE);\r
+                       }\r
+               }\r
+\r
+               if (1 < CCommands::GetNumericArgument()) {\r
+                       Kdu(nKey, CCommands::GetNumericArgument());\r
+                       CCommands::ClearNumericArgument();\r
+                       goto HOOK;\r
+               }\r
+\r
+               goto DO_NOTHING;\r
+       }\r
+\r
+       if (CCommands::IsTemporarilyDisableXKeymacs()\r
+        && Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand != CCommands::KeyboardQuit) {\r
+               CCommands::SetTemporarilyDisableXKeymacs(FALSE);\r
+               goto DO_NOTHING;\r
+       }\r
+\r
+       if (m_bAtIbeamCursorOnly[m_nApplicationID][nCommandType][nKey]) {\r
+               CURSORINFO cursorinfo = { sizeof(cursorinfo) };\r
+               if (GetCursorInfo(&cursorinfo) && cursorinfo.flags && cursorinfo.hCursor != LoadCursor(NULL, IDC_IBEAM)) {\r
+                       goto DO_NOTHING;\r
+               }\r
+       }\r
+\r
+       m_bRightControl = IsDown(VK_RCONTROL);\r
+       m_bRightAlt             = IsDown(VK_RMENU);\r
+       m_bRightShift   = IsDown(VK_RSHIFT);\r
+\r
+       if (!bLocked) {\r
+               bLocked = TRUE;\r
+               fCommand = Commands[m_nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand;\r
+RECURSIVE_COMMAND:\r
+               switch (fCommand()) {\r
+               case GOTO_DO_NOTHING:\r
+                       bLocked = FALSE;\r
+                       goto DO_NOTHING;\r
+               case GOTO_HOOK:\r
+                       bLocked = FALSE;\r
+                       goto HOOK;\r
+               case GOTO_RECURSIVE:\r
+                       goto RECURSIVE;\r
+               case GOTO_HOOKX:\r
+                       bLocked = FALSE;\r
+                       goto HOOKX;\r
+               case GOTO_HOOK0_9:\r
+                       bLocked = FALSE;\r
+                       goto HOOK0_9;\r
+               default:\r
+                       ASSERT(0);\r
+                       bLocked = FALSE;\r
+                       goto DO_NOTHING;\r
+               }\r
+       } else {\r
+               goto HOOK_RECURSIVE_KEY;\r
+       }\r
+\r
+DO_NOTHING:\r
+       ModifyShell_NotifyIcon(SHIFT_ICON, IsDown(VK_SHIFT));\r
+       ModifyShell_NotifyIcon(CTRL_ICON, IsControl());\r
+       ModifyShell_NotifyIcon(ALT_ICON, IsDown(VK_MENU));\r
+\r
+       {\r
+               static BOOL bDefiningMacro = FALSE;\r
+               if (m_bDefiningMacro) {\r
+                       static BOOL bDown[MAX_KEY] = {'\0'};\r
+\r
+                       if (!bDefiningMacro) {\r
+                               while (m_Macro.GetHeadPosition()) {\r
+                                       void *p = m_Macro.GetAt(m_Macro.GetHeadPosition());\r
+                                       m_Macro.RemoveHead();\r
+                                       delete p;\r
+                                       p = NULL;\r
+                               }\r
+                               memset(bDown, 0, sizeof(bDown));\r
+                       }\r
+\r
+                       if ((!(lParam & BEING_RELEASED)) || bDown[wParam]) {\r
+                               try {\r
+                                       KbdMacro_t *pKbdMacro = new KbdMacro;\r
+                                       if (pKbdMacro) {\r
+                                               pKbdMacro->nCode = nCode;\r
+                                               pKbdMacro->wParam = wParam;\r
+                                               pKbdMacro->lParam = lParam;\r
+                                               pKbdMacro->bOriginal = TRUE;\r
+                                               m_Macro.AddTail((CObject *)pKbdMacro);\r
+                                       }\r
+                               }\r
+                               catch (CMemoryException* e) {\r
+                                       e->Delete();\r
+//                                     CUtils::Log("KeyboardProc: 'new' threw an exception");\r
+                               }\r
+                               if (!(lParam & BEING_RELEASED)) {\r
+                                       bDown[wParam] = TRUE;\r
+                               }\r
+                       }\r
+               }\r
+               bDefiningMacro = m_bDefiningMacro;\r
+       }\r
+\r
+       return ::CallNextHookEx(m_hHookKeyboard, nCode, wParam, lParam);\r
+\r
+RECURSIVE:\r
+       Kdu(RECURSIVE_KEY, 1, FALSE);\r
+       ModifyShell_NotifyIcon(SHIFT_ICON, IsDown(VK_SHIFT));\r
+       ModifyShell_NotifyIcon(CTRL_ICON, IsControl());\r
+       ModifyShell_NotifyIcon(ALT_ICON, IsDown(VK_MENU));\r
+       return TRUE;\r
+\r
+HOOK:\r
+       CCommands::SetLastCommand(fCommand);\r
+HOOK0_9:\r
+HOOKX:\r
+       ModifyShell_NotifyIcon(SHIFT_ICON, IsDown(VK_SHIFT));\r
+       ModifyShell_NotifyIcon(CTRL_ICON, IsControl());\r
+       ModifyShell_NotifyIcon(ALT_ICON, IsDown(VK_MENU));\r
+HOOK_RECURSIVE_KEY:\r
+       return TRUE;\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// CXkeymacsData Class\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// Construction/Destruction\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+CXkeymacsData::CXkeymacsData()\r
+{\r
+       ClearAll();\r
+}\r
+\r
+CXkeymacsData::~CXkeymacsData()\r
+{\r
+\r
+}\r
+\r
+// set application name\r
+void CXkeymacsData::SetApplicationName(LPCTSTR lpszApplicationName)\r
+{\r
+       m_strApplicationName.Format(lpszApplicationName);\r
+}\r
+\r
+// return application name\r
+CString CXkeymacsData::GetApplicationName()\r
+{\r
+       return m_strApplicationName;\r
+}\r
+\r
+// set hook or not\r
+void CXkeymacsData::SetCommandID(int nCommandType, int nKey, int nCommandID)\r
+{\r
+       ASSERT(0 <= nCommandType        || nCommandType < MAX_COMMAND_TYPE);\r
+       ASSERT(0 <= nKey                        || nKey                 < MAX_KEY);\r
+\r
+       m_nCommandID[nCommandType][nKey] = nCommandID;\r
+}\r
+\r
+// return hook or not\r
+int CXkeymacsData::GetCommandID(int nCommandType, int nKey)\r
+{\r
+       ASSERT(0 <= nCommandType        || nCommandType < MAX_COMMAND_TYPE);\r
+       ASSERT(0 <= nKey                        || nKey                 < MAX_KEY);\r
+\r
+       return m_nCommandID[nCommandType][nKey];\r
+}\r
+\r
+// set hook at ibeam cursor only or not\r
+void CXkeymacsData::SetAtIbeamCursorOnly(int nCommandType, int nKey, BOOL bAtIbeamCursorOnly)\r
+{\r
+       ASSERT(0 <= nCommandType        || nCommandType < MAX_COMMAND_TYPE);\r
+       ASSERT(0 <= nKey                        || nKey                 < MAX_KEY);\r
+\r
+       m_bAtIbeamCursorOnly[nCommandType][nKey] = bAtIbeamCursorOnly;\r
+}\r
+\r
+// get hook at ibeam cursor only or not\r
+BOOL CXkeymacsData::GetAtIbeamCursorOnly(int nCommandType, int nKey)\r
+{\r
+       ASSERT(0 <= nCommandType        || nCommandType < MAX_COMMAND_TYPE);\r
+       ASSERT(0 <= nKey                        || nKey                 < MAX_KEY);\r
+\r
+       return m_bAtIbeamCursorOnly[nCommandType][nKey];\r
+}\r
+\r
+// clear all data\r
+void CXkeymacsData::ClearAll()\r
+{\r
+       ZeroMemory(m_nCommandID, sizeof(m_nCommandID));\r
+       ZeroMemory(m_bAtIbeamCursorOnly, sizeof(m_bAtIbeamCursorOnly));\r
+       m_strApplicationName.Empty();\r
+}\r
+\r
+void CXkeymacsDll::SetApplicationName(int nApplicationID, CString szApplicationName)\r
+{\r
+       ZeroMemory(m_szSpecialApp[nApplicationID], sizeof(m_szSpecialApp[nApplicationID]));\r
+       _tcsncpy(m_szSpecialApp[nApplicationID], szApplicationName, sizeof(m_szSpecialApp[nApplicationID]));\r
+}\r
+\r
+void CXkeymacsDll::SetWindowText(int nApplicationID, CString szWindowText)\r
+{\r
+       ZeroMemory(m_szWindowText[nApplicationID], sizeof(m_szWindowText[nApplicationID]));\r
+       _tcsncpy(m_szWindowText[nApplicationID], szWindowText, sizeof(m_szWindowText[nApplicationID]));\r
+}\r
+\r
+void CXkeymacsDll::SetCommandID(int nApplicationID, int nCommandType, int nKey, int nCommandID)\r
+{\r
+       m_nCommandID[nApplicationID][nCommandType][nKey] = nCommandID;\r
+}\r
+\r
+void CXkeymacsDll::SetAtIbeamCursorOnly(int nApplicationID, int nCommandType, int nKey, BOOL bAtIbeamCursorOnly)\r
+{\r
+       m_bAtIbeamCursorOnly[nApplicationID][nCommandType][nKey] = bAtIbeamCursorOnly;\r
+}\r
+\r
+void CXkeymacsDll::SetKillRingMax(int nApplicationID, int nKillRingMax)\r
+{\r
+       m_nKillRingMax[nApplicationID] = nKillRingMax;\r
+}\r
+\r
+void CXkeymacsDll::SetUseDialogSetting(int nApplicationID, BOOL bUseDialogSetting)\r
+{\r
+       m_bUseDialogSetting[nApplicationID] = bUseDialogSetting;\r
+}\r
+\r
+// Clear data of nApplicationID\r
+void CXkeymacsDll::Clear(int nApplicationID)\r
+{\r
+       if (0 <= nApplicationID && nApplicationID < MAX_APP) {\r
+               ZeroMemory(m_szSpecialApp[nApplicationID], sizeof(m_szSpecialApp[nApplicationID]));\r
+               ZeroMemory(m_nCommandID[nApplicationID], sizeof(m_nCommandID[nApplicationID]));\r
+               ZeroMemory(m_bAtIbeamCursorOnly[nApplicationID], sizeof(m_bAtIbeamCursorOnly[nApplicationID]));\r
+               m_nKillRingMax[nApplicationID] = 0;\r
+               m_bUseDialogSetting[nApplicationID] = FALSE;\r
+               m_nSettingStyle[nApplicationID] = 0;\r
+       } else {\r
+               ASSERT(0);\r
+       }\r
+}\r
+\r
+void CXkeymacsData::SetApplicationTitle(LPCTSTR lpszApplicationTitle)\r
+{\r
+       m_strApplicationTitle.Format(lpszApplicationTitle);\r
+\r
+       // delete white space at the end of the application title.\r
+       while (!m_strApplicationTitle.IsEmpty()\r
+               && _istspace(m_strApplicationTitle.GetAt(m_strApplicationTitle.GetLength() - 1))) {\r
+               m_strApplicationTitle.Delete(m_strApplicationTitle.GetLength() - 1);\r
+       }\r
+}\r
+\r
+CString CXkeymacsData::GetApplicationTitle()\r
+{\r
+       return m_strApplicationTitle;\r
+}\r
+\r
+void CXkeymacsData::SetKillRingMax(int nKillRingMax)\r
+{\r
+       m_nKillRingMax = nKillRingMax;\r
+}\r
+\r
+int CXkeymacsData::GetKillRingMax()\r
+{\r
+       return m_nKillRingMax;\r
+}\r
+\r
+BOOL CXkeymacsDll::IsValidKey(BYTE bVk)\r
+{\r
+       if (bVk == 0xf0) {      // 0xf0: Eisu key. GetAsyncKeyState returns the wrong state of Eisu key.\r
+               return FALSE;\r
+       }\r
+\r
+       if (CUtils::IsNT()) {\r
+               switch (bVk) {\r
+               case VK_CONTROL:\r
+               case VK_MENU:\r
+               case VK_SHIFT:\r
+                       return FALSE;\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+\r
+       return TRUE;\r
+}\r
+\r
+BOOL CXkeymacsDll::IsDepressedModifier(int (__cdecl *Modifier)(void), BOOL bPhysicalKey)\r
+{\r
+       BYTE bVk = 0;\r
+       do {\r
+               if (IsValidKey(bVk)\r
+                && IsDown(bVk, bPhysicalKey)\r
+                && Commands[m_nCommandID[m_nApplicationID][NONE][bVk]].fCommand == Modifier) {\r
+                       return TRUE;\r
+               }\r
+       } while (++bVk);\r
+       return FALSE;\r
+}\r
+\r
+BOOL CXkeymacsDll::IsDepressedShiftKeyOnly(BYTE nKey)\r
+{\r
+       if (nKey != VK_SHIFT\r
+        && nKey != VK_LSHIFT\r
+        && nKey != VK_RSHIFT) {\r
+               return FALSE;\r
+       }\r
+\r
+       BYTE bVk = 0;\r
+       do {\r
+               if (bVk == VK_SHIFT\r
+                || bVk == VK_LSHIFT\r
+                || bVk == VK_RSHIFT) {\r
+                       continue;\r
+               }\r
+\r
+               if (IsDown(bVk)) {\r
+                       return FALSE;\r
+               }\r
+       } while (++bVk);\r
+       return TRUE;\r
+}\r
+\r
+BOOL CXkeymacsDll::IsControl()\r
+{\r
+       return CCommands::bC_() || IsDepressedModifier(CCommands::C_, FALSE);\r
+}\r
+\r
+BOOL CXkeymacsDll::IsMeta()\r
+{\r
+       return CCommands::bM_() || IsDepressedModifier(CCommands::MetaAlt, FALSE);\r
+}\r
+\r
+void CXkeymacsDll::AddKillRing(BOOL bNewData)\r
+{\r
+       if (m_nKillRingMax[m_nApplicationID] == 0) {\r
+               return;\r
+       }\r
+\r
+       CClipboardSnap *pSnap = new CClipboardSnap;\r
+       if( !pSnap ) return;\r
+\r
+       BOOL bCapture = pSnap->Capture();\r
+       bCapture = pSnap->Capture();    // for "office drawing shape format". Can CClipboardSnap care this problem?\r
+\r
+       if( bCapture ) {\r
+               if (bNewData) {\r
+                       m_oKillRing.AddHead(pSnap);\r
+               } else {\r
+                       if (m_oKillRing.IsEmpty()) {\r
+                               m_oKillRing.AddHead(pSnap);\r
+                       } else {\r
+                               for (CClipboardSnap *pParent = m_oKillRing.GetHead(); pParent->GetNext(); pParent = pParent->GetNext()) {\r
+                                       ;\r
+                               }\r
+                               pParent->SetNext(pSnap);\r
+                       }\r
+               }\r
+       } else {\r
+               delete pSnap;\r
+               pSnap = NULL;\r
+       }\r
+\r
+       m_nKillRing = 0;\r
+\r
+       if (m_nKillRingMax[m_nApplicationID] < m_oKillRing.GetCount()) {\r
+               CClipboardSnap *pSnap = m_oKillRing.GetTail();\r
+               delete pSnap;\r
+               pSnap = NULL;\r
+               m_oKillRing.RemoveTail();\r
+       }\r
+}\r
+\r
+// Return TRUE if there is another data\r
+// Return FALSE if there is no more data\r
+CClipboardSnap* CXkeymacsDll::GetKillRing(CClipboardSnap* pSnap, BOOL bForce)\r
+{\r
+       if (m_nKillRingMax[m_nApplicationID] == 0) {\r
+               return NULL;\r
+       }\r
+\r
+       if (m_oKillRing.IsEmpty()) {\r
+               return NULL;\r
+       }\r
+\r
+       m_nKillRing %= m_oKillRing.GetCount();\r
+\r
+       if (!bForce) {\r
+               CClipboardSnap oCurrentSnap;\r
+               oCurrentSnap.Capture();\r
+\r
+               CClipboardSnap *pKillRing = m_oKillRing.GetAt(m_oKillRing.FindIndex(m_nKillRing));\r
+               if (!pKillRing) {\r
+                       return NULL;\r
+               }\r
+               for (; pKillRing->GetNext(); pKillRing = pKillRing->GetNext()) {\r
+                       ;\r
+               }\r
+               if (*pKillRing != oCurrentSnap) {\r
+                       return NULL;\r
+               }\r
+       }\r
+\r
+       if (!pSnap) {\r
+               pSnap = m_oKillRing.GetAt(m_oKillRing.FindIndex(m_nKillRing));\r
+       }\r
+       pSnap->Restore();\r
+\r
+       return pSnap->GetNext();\r
+}\r
+\r
+void CXkeymacsDll::Original(int nCommandType, BYTE bVk, int nOriginal)\r
+{\r
+       nCommandType &= ~SHIFT;\r
+\r
+       if (CUtils::IsNT()) {\r
+               switch (bVk) {\r
+               case VK_CONTROL:\r
+                       bVk = VK_LCONTROL;\r
+                       break;\r
+               case VK_MENU:\r
+                       bVk = VK_LMENU;\r
+                       break;\r
+               case VK_SHIFT:\r
+                       bVk = VK_LSHIFT;\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+\r
+       m_nOriginal[nCommandType][bVk] += nOriginal;\r
+}\r
+\r
+int CXkeymacsDll::Original(int nCommandType, BYTE bVk)\r
+{\r
+       nCommandType &= ~SHIFT;\r
+\r
+       if (CUtils::IsNT()) {\r
+               switch (bVk) {\r
+               case VK_CONTROL:\r
+                       bVk = VK_LCONTROL;\r
+                       break;\r
+               case VK_MENU:\r
+                       bVk = VK_LMENU;\r
+                       break;\r
+               case VK_SHIFT:\r
+                       bVk = VK_LSHIFT;\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+\r
+       return m_nOriginal[nCommandType][bVk];\r
+}\r
+\r
+void CXkeymacsDll::IncreaseKillRingIndex(int nKillRing)\r
+{\r
+       m_nKillRing += nKillRing;\r
+}\r
+\r
+// move CCommands\r
+CString CXkeymacsData::GetCommandName(int nCommandID)\r
+{\r
+       CString szCommandName(Commands[nCommandID].szCommandName);\r
+       return szCommandName;\r
+}\r
+\r
+// move CCommands\r
+int CXkeymacsData::GetDefaultCommandType(int nCommandID, int nIndex)\r
+{\r
+       if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+        || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+               ASSERT(0);\r
+               return NONE;\r
+       }\r
+\r
+       int nCommandType        = Commands[nCommandID].keybind[nIndex].nCommandType;\r
+       int bVk                         = Commands[nCommandID].keybind[nIndex].bVk;\r
+\r
+       if (m_b106Keyboard) {\r
+               if (nCommandType & SHIFT) {     // Shift\r
+                       switch (bVk) {\r
+                       case '2':\r
+                       case '6':\r
+                       case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+                               nCommandType &= ~SHIFT;\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               } else {                                        // Normal\r
+                       switch (bVk) {\r
+                       case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
+                       case 0xC0:              // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+                       case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               nCommandType |= SHIFT;\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return nCommandType;\r
+}\r
+\r
+// move CCommands\r
+int CXkeymacsData::GetDefaultCommandKey(int nCommandID, int nIndex)\r
+{\r
+       if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+        || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+               ASSERT(0);\r
+               return 0;\r
+       }\r
+\r
+       int nCommandType        = Commands[nCommandID].keybind[nIndex].nCommandType;\r
+       int bVk                         = Commands[nCommandID].keybind[nIndex].bVk;\r
+\r
+       if (m_b106Keyboard) {\r
+               if (nCommandType & SHIFT) {     // Shift\r
+                       switch (bVk) {\r
+                       case '0':\r
+                               bVk = '9';\r
+                               break;\r
+                       case '2':\r
+                               bVk = 0xC0;     // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+                               break;\r
+                       case '6':\r
+                               bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               break;\r
+                       case '7':\r
+                               bVk = '6';\r
+                               break;\r
+                       case '8':\r
+                               bVk = 0xBA;     // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+                               break;\r
+                       case '9':\r
+                               bVk = '8';\r
+                               break;\r
+                       case 0xBD:              // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
+                               bVk = 0xE2;     // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
+                               break;\r
+                       case 0xC0:\r
+                               bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               break;\r
+                       case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               bVk = '2';\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               } else {                                        // Normal\r
+                       switch (bVk) {\r
+                       case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+                               bVk = 0xBB;     // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
+                               break;\r
+                       case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
+                               bVk = 0xBD;     // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
+                               break;\r
+                       case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               bVk = '7';\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return bVk;\r
+}\r
+\r
+// move CCommands\r
+int CXkeymacsData::GetDefaultControlID(int nCommandID, int nIndex)\r
+{\r
+       if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+        || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+               ASSERT(0);\r
+               return 0;\r
+       }\r
+\r
+       return Commands[nCommandID].keybind[nIndex].nControlID;\r
+}\r
+\r
+// nobody use\r
+int CXkeymacsDll::GetMickey(int nDifferential, int nThreshold1, int nThreshold2, int nAcceleration, int nSpeed)\r
+{\r
+       nDifferential = nDifferential * 10 / nSpeed;\r
+\r
+       switch (nAcceleration) {\r
+       case 2:\r
+               if (nThreshold2 < fabs((double)(nDifferential / 4))) {\r
+                       nDifferential /= 4;\r
+                       break;\r
+               }\r
+               // Do NOT write break; here.\r
+       case 1:\r
+               if (nThreshold1 < fabs((double)(nDifferential / 2))) {\r
+                       nDifferential /= 2;\r
+               }\r
+               break;\r
+       case 0:\r
+               break;\r
+       default:\r
+               ASSERT(0);\r
+               break;\r
+       }\r
+\r
+       return nDifferential;\r
+}\r
+\r
+\r
+int CXkeymacsData::GetSettingStyle()\r
+{\r
+       return m_nSettingStyle;\r
+}\r
+\r
+void CXkeymacsData::SetSettingStyle(int nSettingStyle)\r
+{\r
+       m_nSettingStyle = nSettingStyle;\r
+}\r
+\r
+void CXkeymacsDll::SetSettingStyle(int nApplicationID, int nSettingStyle)\r
+{\r
+       m_nSettingStyle[nApplicationID] = nSettingStyle;\r
+}\r
+\r
+int CXkeymacsData::GetCategoryID(int nCommandID)\r
+{\r
+       return Commands[nCommandID].nCategoryID;\r
+}\r
+\r
+void CXkeymacsData::SetIgnoreUndefinedMetaCtrl(BOOL bIgnoreUndefinedMetaCtrl)\r
+{\r
+       m_bIgnoreUndefinedMetaCtrl = bIgnoreUndefinedMetaCtrl;\r
+}\r
+\r
+BOOL CXkeymacsData::GetIgnoreUndefinedMetaCtrl()\r
+{\r
+       return m_bIgnoreUndefinedMetaCtrl;\r
+}\r
+\r
+void CXkeymacsDll::SetIgnoreUndefinedMetaCtrl(int nApplicationID, BOOL bIgnoreUndefinedMetaCtrl)\r
+{\r
+       m_bIgnoreUndefinedMetaCtrl[nApplicationID] = bIgnoreUndefinedMetaCtrl;\r
+}\r
+\r
+void CXkeymacsData::SetIgnoreUndefinedC_x(BOOL bIgnoreUndefinedC_x)\r
+{\r
+       m_bIgnoreUndefinedC_x = bIgnoreUndefinedC_x;\r
+}\r
+\r
+BOOL CXkeymacsData::GetIgnoreUndefinedC_x()\r
+{\r
+       return m_bIgnoreUndefinedC_x;\r
+}\r
+\r
+void CXkeymacsDll::SetIgnoreUndefinedC_x(int nApplicationID, BOOL bIgnoreUndefinedC_x)\r
+{\r
+       m_bIgnoreUndefinedC_x[nApplicationID] = bIgnoreUndefinedC_x;\r
+}\r
+\r
+void CXkeymacsData::SetEnableCUA(BOOL bEnableCUA)\r
+{\r
+       m_bEnableCUA = bEnableCUA;\r
+}\r
+\r
+BOOL CXkeymacsData::GetEnableCUA()\r
+{\r
+       return m_bEnableCUA;\r
+}\r
+\r
+void CXkeymacsDll::SetEnableCUA(int nApplicationID, BOOL bEnableCUA)\r
+{\r
+       m_bEnableCUA[nApplicationID] = bEnableCUA;\r
+}\r
+\r
+BOOL CXkeymacsDll::GetEnableCUA()\r
+{\r
+       return m_bEnableCUA[m_nApplicationID];\r
+}\r
+\r
+void CXkeymacsData::SetUseDialogSetting(BOOL bUseDialogSetting)\r
+{\r
+       m_bUseDialogSetting = bUseDialogSetting;\r
+}\r
+\r
+BOOL CXkeymacsData::GetUseDialogSetting()\r
+{\r
+       return m_bUseDialogSetting;\r
+}\r
+\r
+int CXkeymacsData::GetDescriptionID(int nCommandID)\r
+{\r
+       return Commands[nCommandID].nDescriptionID;\r
+}\r
+\r
+int CXkeymacsData::GetToolTipID(int nCommandID)\r
+{\r
+       return Commands[nCommandID].nToolTipID;\r
+}\r
+\r
+void CXkeymacsDll::DefiningMacro(BOOL bDefiningMacro)\r
+{\r
+       m_bDefiningMacro = bDefiningMacro;\r
+\r
+       if (bDefiningMacro) {   // start-kbd-macro\r
+               if (CCommands::bC_u()) {\r
+                       ReleaseKey(VK_SHIFT);\r
+                       CallMacro();\r
+               }\r
+       } else {                                // end-kbd-macro\r
+               while (!m_Macro.IsEmpty()) {\r
+                       KbdMacro_t *pKbdMacro = (KbdMacro_t *)m_Macro.GetTail();\r
+                       if (pKbdMacro->lParam & BEING_RELEASED) {\r
+                               break;\r
+                       } else {\r
+                               m_Macro.RemoveTail();\r
+                               delete pKbdMacro;\r
+                               pKbdMacro = NULL;\r
+                       }\r
+               }\r
+\r
+//             CUtils::Log(_T("Macro MemMap: start"));\r
+               if (!m_Macro.IsEmpty()) {\r
+                       static HANDLE hMacro = NULL;\r
+                       if (!hMacro) {\r
+                               hMacro = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x3000, _T("macro"));\r
+                       }\r
+                       if (hMacro) {\r
+//                             CUtils::Log(_T("Macro MemMap: 1"));\r
+                               PVOID pView = MapViewOfFile(hMacro, FILE_MAP_ALL_ACCESS, 0, 0, 0);\r
+//                             CUtils::Log(_T("Macro MemMap: 2"));\r
+                               if (pView) {\r
+//                                     CUtils::Log(_T("Macro MemMap: 2.5"));\r
+                                       for (int i = 0; i < m_Macro.GetCount(); ++i) {\r
+//                                             CUtils::Log(_T("Macro MemMap: 3-1 %d"), i);\r
+                                               KbdMacro_t *pKbdMacro = (KbdMacro_t *)m_Macro.GetAt(m_Macro.FindIndex(i));\r
+//                                             CUtils::Log(_T("Macro MemMap: 3-2 %d"), i);\r
+                                               memcpy((LPTSTR) pView + i * sizeof(KbdMacro_t), pKbdMacro, sizeof(KbdMacro_t));\r
+//                                             CUtils::Log(_T("Macro MemMap: 3-3 %d"), i);\r
+                                       }\r
+//                                     CUtils::Log(_T("Macro MemMap: 4"));\r
+                                       UnmapViewOfFile(pView);\r
+//                                     CUtils::Log(_T("Macro MemMap: 5"));\r
+                               } else {\r
+//                                     CUtils::Log(_T("Macro MemMpa: error: %d"), GetLastError());\r
+                               }\r
+                       } else {\r
+//                             CUtils::Log(_T("Macro MemMap: 6"));\r
+                               ASSERT(0);\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+BOOL CXkeymacsDll::DefiningMacro()\r
+{\r
+       return m_bDefiningMacro;\r
+}\r
+\r
+/**/ \r
+void CXkeymacsDll::CallMacro()\r
+{\r
+       BOOL bIsCtrlDown = IsDown(VK_CONTROL);\r
+       if (bIsCtrlDown) {\r
+               ReleaseKey(VK_CONTROL);\r
+       }\r
+       BOOL bIsAltDown = IsDown(VK_MENU);\r
+       if (bIsAltDown) {\r
+               ReleaseKey(VK_MENU);\r
+       }\r
+       BOOL bIsShiftDown = IsDown(VK_SHIFT);\r
+       if (bIsShiftDown) {\r
+               ReleaseKey(VK_SHIFT);\r
+       }\r
+\r
+       for (POSITION pos = m_Macro.GetHeadPosition(); pos; ) {\r
+               KbdMacro_t *pKbdMacro = (KbdMacro_t *)m_Macro.GetNext(pos);\r
+               if (pKbdMacro->lParam & BEING_RELEASED) {\r
+                       ReleaseKey((BYTE)pKbdMacro->wParam);\r
+               } else {\r
+                       DepressKey((BYTE)pKbdMacro->wParam, pKbdMacro->bOriginal);\r
+               }\r
+       }\r
+\r
+       if (bIsCtrlDown) {\r
+               DepressKey(VK_CONTROL);\r
+       }\r
+       if (bIsAltDown) {\r
+               DepressKey(VK_MENU);\r
+       }\r
+       if (bIsShiftDown) {\r
+               DepressKey(VK_SHIFT);\r
+       }\r
+}\r
+\r
+/*/\r
+void CXkeymacsDll::CallMacro() // for debug\r
+{\r
+       CString sz;\r
+       for (POSITION pos = m_Macro.GetHeadPosition(); pos; ) {\r
+               KbdMacro_t *pKbdMacro = (KbdMacro_t *)m_Macro.GetNext(pos);\r
+               if (pKbdMacro->lParam & BEING_RELEASED) {\r
+                       CString t;\r
+                       t.Format(_T("0x%xu "), pKbdMacro->wParam);\r
+                       sz += t;\r
+               } else {\r
+                       CString t;\r
+                       t.Format(_T("0x%xd "), pKbdMacro->wParam);\r
+                       sz += t;\r
+               }\r
+       }\r
+//     CUtils::Log(sz);\r
+}\r
+/**/\r
+\r
+void CXkeymacsData::Set106Keyboard(BOOL b106Keyboard)\r
+{\r
+       m_b106Keyboard = b106Keyboard;\r
+}\r
+\r
+BOOL CXkeymacsData::Is106Keyboard()\r
+{\r
+       return m_b106Keyboard;\r
+}\r
+\r
+int CXkeymacsDll::IsPassThrough(BYTE nKey)\r
+{\r
+       BYTE bVk = 0;\r
+       do {\r
+               if (IsDown(bVk)\r
+                && (Commands[m_nCommandID[m_nApplicationID][NONE][bVk]].fCommand == CCommands::PassThrough)) {\r
+                       if (bVk == nKey) {\r
+                               return GOTO_HOOK;\r
+                       }\r
+\r
+                       return GOTO_DO_NOTHING;\r
+               }\r
+       } while (++bVk);\r
+       return CONTINUE;\r
+}\r
+\r
+void CXkeymacsDll::SetKeyboardHookFlag()\r
+{\r
+       SetKeyboardHookFlag(m_bHook);\r
+}\r
+\r
+void CXkeymacsDll::SetFunctionKey(int nFunctionID, int nApplicationID, int nCommandType, int nKey)\r
+{\r
+       if (nApplicationID      < 0 || MAX_APP                  <= nApplicationID\r
+        || nCommandType        < 0 || MAX_COMMAND_TYPE <= nCommandType\r
+        || nKey                        < 0 || MAX_KEY                  <= nKey) {\r
+               return;\r
+       }\r
+\r
+       m_nFunctionID[nApplicationID][nCommandType][nKey] = nFunctionID;\r
+}\r
+\r
+void CXkeymacsDll::ClearFunctionDefinition()\r
+{\r
+       memset(m_nFunctionID, -1, sizeof(m_nFunctionID));\r
+       memset(m_szFunctionDefinition, 0, sizeof(m_szFunctionDefinition));\r
+}\r
+\r
+void CXkeymacsDll::SetFunctionDefinition(int nFunctionID, CString szDefinition)\r
+{\r
+       if (nFunctionID < 0 || MAX_FUNCTION <= nFunctionID) {\r
+               return;\r
+       }\r
+\r
+       memset(m_szFunctionDefinition[nFunctionID], 0, sizeof(m_szFunctionDefinition[nFunctionID]));\r
+       _stprintf(m_szFunctionDefinition[nFunctionID], _T("%s"), szDefinition);\r
+\r
+       return;\r
+\r
+}\r
+\r
+// call an original command which is defined in dot.xkeymacs\r
+void CXkeymacsDll::CallFunction(int nFunctionID)\r
+{\r
+       CArray<KeyBind_t, KeyBind_t> keybinds;\r
+\r
+       if (nFunctionID < 0 || MAX_FUNCTION <= nFunctionID || !_tcslen(m_szFunctionDefinition[nFunctionID])) {\r
+               return;\r
+       }\r
+\r
+       BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
+       BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
+       BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
+\r
+       if (m_szFunctionDefinition[nFunctionID][0] == _T('"') && m_szFunctionDefinition[nFunctionID][_tcslen(m_szFunctionDefinition[nFunctionID]) - 1] == _T('"')) {\r
+               for (unsigned int i = 1; i < _tcslen(m_szFunctionDefinition[nFunctionID]) - 1; ++i) {   // skip '"'\r
+                       keybinds.Add(ParseKey(nFunctionID, i));\r
+               }\r
+       } else if (m_szFunctionDefinition[nFunctionID][0] == _T('[') && m_szFunctionDefinition[nFunctionID][_tcslen(m_szFunctionDefinition[nFunctionID]) - 1] == _T(']')) {\r
+               for (unsigned int i = 1; i < _tcslen(m_szFunctionDefinition[nFunctionID]) - 1; ++i) {   // skip '[' and ']'\r
+                       if (m_szFunctionDefinition[nFunctionID][i] == _T('?')) {        // [?f ?o ?o]\r
+                               ++i;\r
+                               keybinds.Add(ParseKey(nFunctionID, i));\r
+                       } else {                                                                                                // [ControlCharacter]\r
+                               for (int nKeyID = 0; nKeyID < sizeof(ControlCharacters) / sizeof(ControlCharacters[0]); ++nKeyID) {\r
+                                       if (!_tcsncmp(m_szFunctionDefinition[nFunctionID] + i, ControlCharacters[nKeyID].name, _tcslen(ControlCharacters[nKeyID].name))) {\r
+                                               KeyBind_t keybind = {NONE, ControlCharacters[nKeyID].bVk};\r
+                                               keybinds.Add(keybind);\r
+                                               i += _tcslen(ControlCharacters[nKeyID].name);\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       } else {\r
+               return;\r
+       }\r
+\r
+       BOOL bM_x = FALSE;\r
+       TCHAR szPath[MAX_PATH] = {'\0'};\r
+       unsigned int index = 0;\r
+       BOOL bInitialized = FALSE;\r
+\r
+       for (int i = 0; i < keybinds.GetSize(); ++i) {\r
+               const int nCommandType = keybinds.GetAt(i).nCommandType;\r
+               const BYTE bVk = keybinds.GetAt(i).bVk;\r
+\r
+               if (nCommandType < MAX_COMMAND_TYPE && Commands[m_nCommandID[m_nApplicationID][nCommandType][bVk]].fCommand) {\r
+                       if (Commands[m_nCommandID[m_nApplicationID][nCommandType][bVk]].fCommand == CCommands::ExecuteExtendedCommand) {\r
+                               bM_x = TRUE;\r
+                       } else if (!bInitialized) {\r
+                               if (bIsCtrlDown) {\r
+                                       CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
+                                       ReleaseKey(VK_CONTROL);\r
+                               }\r
+\r
+                               if (bIsAltDown) {\r
+                                       ReleaseKey(VK_MENU);\r
+                               }\r
+\r
+                               if (bIsShiftDown) {\r
+                                       ReleaseKey(VK_SHIFT);\r
+                               }\r
+\r
+                               bInitialized = TRUE;\r
+                       }\r
+//                     CUtils::Log("CallFunction: Command Name: %s", Commands[m_nCommandID[m_nApplicationID][nCommandType][bVk]].szCommandName);\r
+                       while (Commands[m_nCommandID[m_nApplicationID][nCommandType][bVk]].fCommand() == GOTO_RECURSIVE) {\r
+                               ;\r
+                       }\r
+               } else if (bM_x) {\r
+                       if (bVk == VK_RETURN) {\r
+                               InvokeM_x(szPath);\r
+                       } else {\r
+                               for (TCHAR nAscii = 1; nAscii != 0; ++nAscii) { // repeat until overflow\r
+                                       if (bVk != 0 && a2v(nAscii) == bVk && ((nCommandType & SHIFT) != 0) == IsShift(nAscii)) {\r
+//                                             CUtils::Log("M-x: %#X (%c), %#X (%c)", bVk, bVk, nAscii, nAscii);\r
+                                               szPath[index++] = nAscii;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               } else {\r
+                       if (!bInitialized) {\r
+                               if (bIsCtrlDown) {\r
+                                       CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
+                                       ReleaseKey(VK_CONTROL);\r
+                               }\r
+\r
+                               if (bIsAltDown) {\r
+                                       ReleaseKey(VK_MENU);\r
+                               }\r
+\r
+                               if (bIsShiftDown) {\r
+                                       ReleaseKey(VK_SHIFT);\r
+                               }\r
+\r
+                               bInitialized = TRUE;\r
+                       }\r
+                       if (nCommandType & WIN_WIN) {\r
+                               DepressKey(VK_LWIN);\r
+                       }\r
+                       if (nCommandType & WIN_CTRL) {\r
+                               DepressKey(VK_CONTROL);\r
+                       }\r
+                       if (nCommandType & WIN_ALT) {\r
+                               DepressKey(VK_MENU);\r
+                       }\r
+                       if (nCommandType & SHIFT) {\r
+                               DepressKey(VK_SHIFT);\r
+                       }\r
+\r
+                       Kdu(bVk);\r
+\r
+                       if (nCommandType & SHIFT && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & SHIFT))) {\r
+                               ReleaseKey(VK_SHIFT);\r
+                       }\r
+                       if (nCommandType & WIN_ALT && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_ALT))) {\r
+                               ReleaseKey(VK_MENU);\r
+                       }\r
+                       if (nCommandType & WIN_CTRL && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_CTRL))) {\r
+                               ReleaseKey(VK_CONTROL);\r
+                       }\r
+                       if (nCommandType & WIN_WIN && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_WIN))) {\r
+                               ReleaseKey(VK_LWIN);\r
+                       }\r
+               }\r
+       }\r
+\r
+       keybinds.RemoveAll();\r
+\r
+       if (bInitialized) {\r
+               // If these lines are invoked at M-x, a window transition does not work well.\r
+\r
+               if (bIsShiftDown) {\r
+                       DepressKey(VK_SHIFT);\r
+               }\r
+\r
+               if (bIsAltDown) {\r
+                       DepressKey(VK_MENU);\r
+               }\r
+\r
+               if (bIsCtrlDown) {\r
+                       DepressKey(VK_CONTROL);\r
+                       CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+KeyBind_t CXkeymacsDll::ParseKey(const int nFunctionID, unsigned int &i)\r
+{\r
+       KeyBind keybind = {NONE};\r
+\r
+       if (m_szFunctionDefinition[nFunctionID][i] == _T('\\')) {\r
+               ++i;\r
+               BOOL bFound = FALSE;\r
+               do {\r
+                       bFound = FALSE;\r
+                       for (int ModifierID = 0; ModifierID < sizeof(Modifiers) / sizeof(Modifiers[0]); ++ModifierID) {\r
+                               if (!_tcsncmp(m_szFunctionDefinition[nFunctionID] + i, Modifiers[ModifierID].name, _tcslen(Modifiers[ModifierID].name))\r
+                                && _tcslen(Modifiers[ModifierID].name) < _tcslen(m_szFunctionDefinition[nFunctionID] + i)) {\r
+                                       keybind.nCommandType |= Modifiers[ModifierID].id;\r
+                                       i+= _tcslen(Modifiers[ModifierID].name);\r
+                                       bFound = TRUE;\r
+                               }\r
+                       }\r
+               } while (bFound);\r
+       }\r
+       if (IsShift(m_szFunctionDefinition[nFunctionID][i]) && !(keybind.nCommandType & (WIN_CTRL | WIN_ALT | WIN_WIN))) {\r
+               keybind.nCommandType |= SHIFT;\r
+       }\r
+\r
+       for (int nKeyID = 0; nKeyID < sizeof(ControlCharacters) / sizeof(ControlCharacters[0]); ++nKeyID) {\r
+               if (!_tcsncmp(m_szFunctionDefinition[nFunctionID] + i, ControlCharacters[nKeyID].name, _tcslen(ControlCharacters[nKeyID].name))) {\r
+                       i += _tcslen(ControlCharacters[nKeyID].name);\r
+                       break;\r
+               }\r
+       }\r
+       if (nKeyID < sizeof(ControlCharacters) / sizeof(ControlCharacters[0])) {\r
+               keybind.bVk = ControlCharacters[nKeyID].bVk;\r
+       } else {\r
+               keybind.bVk = a2v(m_szFunctionDefinition[nFunctionID][i]);\r
+       }\r
+\r
+       return keybind;\r
+}\r
+\r
+BOOL CXkeymacsDll::IsShift(TCHAR nAscii)\r
+{\r
+       switch (nAscii) {\r
+       case _T(' '):\r
+               return FALSE;\r
+       case _T('!'):\r
+       case _T('"'):\r
+       case _T('#'):\r
+       case _T('$'):\r
+       case _T('%'):\r
+       case _T('&'):\r
+               return TRUE;\r
+       case _T('\''):\r
+               return CXkeymacsData::Is106Keyboard();\r
+       case _T('('):\r
+       case _T(')'):\r
+       case _T('*'):\r
+       case _T('+'):\r
+               return TRUE;\r
+       case _T(','):\r
+       case _T('-'):\r
+       case _T('.'):\r
+       case _T('/'):\r
+       case _T('0'): case _T('1'): case _T('2'): case _T('3'): case _T('4'): case _T('5'): case _T('6'): case _T('7'): case _T('8'): case _T('9'):\r
+               return FALSE;\r
+       case _T(':'):\r
+               return !CXkeymacsData::Is106Keyboard();\r
+       case _T(';'):\r
+               return FALSE;\r
+       case _T('<'):\r
+               return TRUE;\r
+       case _T('='):\r
+               return CXkeymacsData::Is106Keyboard();\r
+       case _T('>'):\r
+       case _T('?'):\r
+               return TRUE;\r
+       case _T('@'):\r
+               return !CXkeymacsData::Is106Keyboard();\r
+       case _T('A'): case _T('B'): case _T('C'): case _T('D'): case _T('E'): case _T('F'): case _T('G'): case _T('H'): case _T('I'): case _T('J'): \r
+       case _T('K'): case _T('L'): case _T('M'): case _T('N'): case _T('O'): case _T('P'): case _T('Q'): case _T('R'): case _T('S'): case _T('T'): \r
+       case _T('U'): case _T('V'): case _T('W'): case _T('X'): case _T('Y'): case _T('Z'): \r
+               return TRUE;\r
+       case _T('['):\r
+       case _T('\\'):\r
+       case _T(']'):\r
+               return FALSE;\r
+       case _T('^'):\r
+               return !CXkeymacsData::Is106Keyboard();\r
+       case _T('_'):\r
+               return TRUE;\r
+       case _T('`'):\r
+               return CXkeymacsData::Is106Keyboard();\r
+       case _T('a'): case _T('b'): case _T('c'): case _T('d'): case _T('e'): case _T('f'): case _T('g'): case _T('h'): case _T('i'): case _T('j'): \r
+       case _T('k'): case _T('l'): case _T('m'): case _T('n'): case _T('o'): case _T('p'): case _T('q'): case _T('r'): case _T('s'): case _T('t'): \r
+       case _T('u'): case _T('v'): case _T('w'): case _T('x'): case _T('y'): case _T('z'): \r
+               return FALSE;\r
+       case _T('{'):\r
+       case _T('|'):\r
+       case _T('}'):\r
+       case _T('~'):\r
+               return TRUE;\r
+       default:\r
+               return FALSE;\r
+       }\r
+}\r
+\r
+BYTE CXkeymacsDll::a2v(TCHAR nAscii)\r
+{\r
+       switch (nAscii) {\r
+       case _T(' '):\r
+               return VK_SPACE;\r
+       case _T('!'):\r
+               return '1';\r
+       case _T('"'):\r
+               return CXkeymacsData::Is106Keyboard() ? '2' : (BYTE) 0xde;      // VK_OEM_7\r
+       case _T('#'):\r
+               return '3';\r
+       case _T('$'):\r
+               return '4';\r
+       case _T('%'):\r
+               return '5';\r
+       case _T('&'):\r
+               return CXkeymacsData::Is106Keyboard() ? '6' : '7';\r
+       case _T('\''):\r
+               return CXkeymacsData::Is106Keyboard() ? '7' : (BYTE) 0xde;      // VK_OEM_7\r
+       case _T('('):\r
+               return CXkeymacsData::Is106Keyboard() ? '8' : '9';\r
+       case _T(')'):\r
+               return CXkeymacsData::Is106Keyboard() ? '9' : '0';\r
+       case _T('*'):\r
+               return CXkeymacsData::Is106Keyboard() ? (BYTE) 0xba : '8';      // VK_OEM_1\r
+       case _T('+'):\r
+               return 0xbb;    // VK_OEM_PLUS\r
+       case _T(','):\r
+               return 0xbc;    // VK_OEM_COMMA\r
+       case _T('-'):\r
+               return 0xbd;    // VK_OEM_MINUS\r
+       case _T('.'):\r
+               return 0xbe;    // VK_OEM_PERIOD\r
+       case _T('/'):\r
+               return 0xbf;    // VK_OEM_2\r
+       case _T('0'): case _T('1'): case _T('2'): case _T('3'): case _T('4'): case _T('5'): case _T('6'): case _T('7'): case _T('8'): case _T('9'):\r
+               return nAscii;\r
+       case _T(':'):\r
+               return 0xba;    // VK_OEM_1\r
+       case _T(';'):\r
+               return CXkeymacsData::Is106Keyboard() ? (BYTE) 0xbb : (BYTE) 0xba;      // VK_OEM_PLUS  VK_OEM_1\r
+       case _T('<'):\r
+               return 0xbc;    // VK_OEM_COMMA\r
+       case _T('='):\r
+               return CXkeymacsData::Is106Keyboard() ? (BYTE) 0xbd : (BYTE) 0xbb;      // VK_OEM_MINUS VK_OEM_PLUS\r
+       case _T('>'):\r
+               return 0xbe;    // VK_OEM_PERIOD\r
+       case _T('?'):\r
+               return 0xbf;    // VK_OEM_2\r
+       case _T('@'):\r
+               return CXkeymacsData::Is106Keyboard() ? (BYTE) 0xc0 : '2';\r
+       case _T('A'): case _T('B'): case _T('C'): case _T('D'): case _T('E'): case _T('F'): case _T('G'): case _T('H'): case _T('I'): case _T('J'): \r
+       case _T('K'): case _T('L'): case _T('M'): case _T('N'): case _T('O'): case _T('P'): case _T('Q'): case _T('R'): case _T('S'): case _T('T'): \r
+       case _T('U'): case _T('V'): case _T('W'): case _T('X'): case _T('Y'): case _T('Z'): \r
+               return nAscii;\r
+       case _T('['):\r
+               return 0xdb;    // VK_OEM_4\r
+       case _T('\\'):\r
+               return 0xdc;    // VK_OEM_5\r
+       case _T(']'):\r
+               return 0xdd;    // VK_OEM_6\r
+       case _T('^'):\r
+               return CXkeymacsData::Is106Keyboard() ? (BYTE) 0xde : '6';      // VK_OEM_7\r
+       case _T('_'):\r
+               return CXkeymacsData::Is106Keyboard() ? (BYTE) 0xe2 : (BYTE) 0xbd;      // VK_OEM_102   VK_OEM_MINUS\r
+       case _T('`'):\r
+               return 0xc0;    // VK_OEM_3\r
+       case _T('a'): case _T('b'): case _T('c'): case _T('d'): case _T('e'): case _T('f'): case _T('g'): case _T('h'): case _T('i'): case _T('j'): \r
+       case _T('k'): case _T('l'): case _T('m'): case _T('n'): case _T('o'): case _T('p'): case _T('q'): case _T('r'): case _T('s'): case _T('t'): \r
+       case _T('u'): case _T('v'): case _T('w'): case _T('x'): case _T('y'): case _T('z'): \r
+               return (BYTE) (nAscii - (_T('a') - _T('A')));\r
+       case _T('{'):\r
+               return 0xdb;    // VK_OEM_4\r
+       case _T('|'):\r
+               return 0xdc;    // VK_OEM_5\r
+       case _T('}'):\r
+               return 0xdd;    // VK_OEM_6\r
+       case _T('~'):\r
+               return CXkeymacsData::Is106Keyboard() ? (BYTE) 0xde : (BYTE) 0xc0;      // VK_OEM_7     VK_OEM_3\r
+       default:\r
+               return 0;\r
+       }\r
+}\r
+\r
+void CXkeymacsDll::DeleteAllShell_NotifyIcon()\r
+{\r
+       for (int icon = 0; icon < MAX_ICON_TYPE; ++icon) {\r
+               DeleteShell_NotifyIcon((ICON_TYPE)icon);\r
+       }\r
+}\r
+\r
+void CXkeymacsDll::AddAllShell_NotifyIcon()\r
+{\r
+       for (int icon = 0; icon < MAX_ICON_TYPE; ++icon) {\r
+               AddShell_NotifyIcon((ICON_TYPE)icon);\r
+       }\r
+}\r
+\r
+void CXkeymacsData::SetWindowText(LPCTSTR lpszWindowText)\r
+{\r
+       m_nWindowTextType = CUtils::GetWindowTextType(lpszWindowText);\r
+       if (m_nWindowTextType == IDS_WINDOW_TEXT_IGNORE) {\r
+               m_strWindowText = _T('*');\r
+       } else {\r
+               m_strWindowText.Format(lpszWindowText);\r
+       }\r
+}\r
+\r
+CString CXkeymacsData::GetWindowText()\r
+{\r
+       return m_strWindowText;\r
+}\r
+\r
+void CXkeymacsData::SetWindowTextType(int nWindowTextType)\r
+{\r
+       m_nWindowTextType = nWindowTextType;\r
+}\r
+\r
+int CXkeymacsData::GetWindowTextType()\r
+{\r
+       return m_nWindowTextType;\r
+}\r
+\r
+BOOL CXkeymacsDll::IsMatchWindowText(CString szWindowText)\r
+{\r
+       BOOL bIsMatchWindowText = TRUE;\r
+\r
+       TCHAR szCurrentWindowText[0x100] = {'\0'};\r
+       GetWindowText(GetForegroundWindow(), szCurrentWindowText, sizeof(szCurrentWindowText));\r
+\r
+       switch (CUtils::GetWindowTextType(szWindowText)) {\r
+       case IDS_WINDOW_TEXT_MATCH:                                                             // *foo*\r
+               szWindowText.Delete(0);                                                         // Delete first '*'\r
+               szWindowText.Delete(szWindowText.GetLength() - 1);      // Delete last '*'\r
+               bIsMatchWindowText = 0 <= CString(szCurrentWindowText).Find(szWindowText);\r
+               break;\r
+       case IDS_WINDOW_TEXT_MATCH_FORWARD:                                             // foo*\r
+               szWindowText.Delete(szWindowText.GetLength() - 1);      // Delete last '*'\r
+               bIsMatchWindowText = 0 == CString(szCurrentWindowText).Find(szWindowText);\r
+               break;\r
+       case IDS_WINDOW_TEXT_MATCH_BACKWARD:                                    // *foo\r
+               szWindowText.Delete(0);                                                         // Delete first '*'\r
+               bIsMatchWindowText = 0 <= CString(szCurrentWindowText).Find(szWindowText, CString(szCurrentWindowText).GetLength() - szWindowText.GetLength());\r
+               break;\r
+       case IDS_WINDOW_TEXT_MATCH_FULL:                                                // foo\r
+               bIsMatchWindowText = szWindowText == CString(szCurrentWindowText);\r
+               break;\r
+       case IDS_WINDOW_TEXT_IGNORE:                                                    // *\r
+               bIsMatchWindowText = TRUE;\r
+               break;\r
+       default:\r
+               ASSERT(0);\r
+               break;\r
+       }\r
+\r
+//     CUtils::Log(_T("IsMatchWindowText: %d, _%s_, _%s_"), bIsMatchWindowText, szCurrentWindowText, szWindowText);\r
+       return bIsMatchWindowText;\r
+}\r
+\r
+void CXkeymacsDll::SetAccelerate(int nAccelerate)\r
+{\r
+       m_nAccelerate = nAccelerate;\r
+}\r
+\r
+int CXkeymacsDll::GetAccelerate()\r
+{\r
+       return m_nAccelerate;\r
+}\r
+\r
+void CXkeymacsDll::SetKeyboardSpeed(int nKeyboardSpeed)\r
+{\r
+       m_nKeyboardSpeed = nKeyboardSpeed;\r
+}\r
+\r
+unsigned int CXkeymacsDll::GetMaxKeyInterval()\r
+{\r
+       // m_nKeyboardSpeed == 0:       slowest repeat rate; approximately  2 characters per second\r
+       // m_nKeyboardSpeed == 31:      fastest repeat rate; approximately 30 characters per second\r
+       // 47 ms is max on my machine w/ KeyboardSpeed 31.\r
+       // 1000 /  2 + 50 = 550\r
+       // 1000 / 30 + 50 = 83\r
+       return (unsigned int) (1000.0 / (2.0 + m_nKeyboardSpeed % 32 * 28.0 / 31.0) + 50.0);\r
+}\r
+\r
+void CXkeymacsDll::SetCursorData(HCURSOR hEnable, HCURSOR hDisableTMP, HCURSOR hDisableWOCQ, HICON hDisable, BOOL bEnable)\r
+{\r
+       m_hCursor[STATUS_ENABLE] = hEnable;\r
+       m_hCursor[STATUS_DISABLE_TMP] = hDisableTMP;\r
+       m_hCursor[STATUS_DISABLE_WOCQ] = hDisableWOCQ;\r
+       m_hCursor[STATUS_DISABLE] = hDisable;\r
+       m_bCursor = bEnable;\r
+}\r
+\r
+void CXkeymacsDll::DoSetCursor()\r
+{\r
+       if (m_bCursor && m_hCurrentCursor) {\r
+               ::SetCursor(m_hCurrentCursor);\r
+       }\r
+}\r
+\r
+BOOL CXkeymacsData::Get326Compatible()\r
+{\r
+       return m_b326Compatible;\r
+}\r
+\r
+void CXkeymacsData::Set326Compatible(BOOL b326Compatible)\r
+{\r
+       m_b326Compatible = b326Compatible;\r
+}\r
+\r
+void CXkeymacsDll::Set326Compatible(int nApplicationID, BOOL b326Compatible)\r
+{\r
+       m_b326Compatible[nApplicationID] = b326Compatible;\r
+}\r
+\r
+BOOL CXkeymacsDll::Get326Compatible()\r
+{\r
+       return m_b326Compatible[m_nApplicationID];\r
+}\r
+\r
+void CXkeymacsDll::InvokeM_x(const TCHAR *const szPath)\r
+{\r
+//     CUtils::Log("M-x: szPath=_%s_", szPath);\r
+       int (*fCommand)() = NULL;\r
+\r
+       for (int i = 0; i < sizeof(Commands) / sizeof(Commands[0]); ++i) {\r
+               if (_tcsicmp(szPath, Commands[i].szCommandName) == 0) {\r
+                       fCommand = Commands[i].fCommand;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       if (fCommand) {\r
+//             CUtils::Log("M-x: Command: _%s_", Commands[i].szCommandName);\r
+               fCommand();\r
+       } else {\r
+//             CUtils::Log("M-x: Path: _%s_", szPath);\r
+               ShellExecute(NULL, NULL, szPath, NULL, NULL, SW_SHOWNORMAL);\r
+       }\r
+}\r
+\r
+void CXkeymacsDll::ModifyM_xTip(const TCHAR *const szPath)\r
+{\r
+       if (szPath) {\r
+               if (_tcslen(szPath) < sizeof(m_stNtfyIcon[MX_ICON].szTip) / sizeof(m_stNtfyIcon[MX_ICON].szTip[0]) - 5) {\r
+                       memset(m_stNtfyIcon[MX_ICON].szTip, 0, sizeof(m_stNtfyIcon[MX_ICON].szTip));\r
+                       _stprintf(m_stNtfyIcon[MX_ICON].szTip, "M-x %s", szPath);\r
+               }\r
+       } else {\r
+               memset(m_stNtfyIcon[MX_ICON].szTip, 0, sizeof(m_stNtfyIcon[MX_ICON].szTip));\r
+               _stprintf(m_stNtfyIcon[MX_ICON].szTip, "M-x LED");\r
+       }\r
+\r
+       ModifyShell_NotifyIcon(MX_ICON, CCommands::bM_x(), TRUE);\r
+}\r
diff --git a/xkeymacsdll/xkeymacsdll.def b/xkeymacsdll/xkeymacsdll.def
new file mode 100644 (file)
index 0000000..fef68f0
--- /dev/null
@@ -0,0 +1,10 @@
+; xkeymacsdll.def : Declares the module parameters for the DLL.\r
+\r
+LIBRARY      "xkeymacs"\r
+DESCRIPTION  'xkeymacs Windows Dynamic Link Library'\r
+\r
+EXPORTS\r
+    ; Explicit exports can go here\r
+\r
+SECTIONS\r
+       .xkmcs  READ WRITE SHARED\r
diff --git a/xkeymacsdll/xkeymacsdll.dsp b/xkeymacsdll/xkeymacsdll.dsp
new file mode 100644 (file)
index 0000000..5d63d8a
--- /dev/null
@@ -0,0 +1,180 @@
+# Microsoft Developer Studio Project File - Name="xkeymacsdll" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102\r
+\r
+CFG=xkeymacsdll - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "xkeymacsdll.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "xkeymacsdll.mak" CFG="xkeymacsdll - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "xkeymacsdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE "xkeymacsdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""$/xkeymacsdll", KDAAAAAA"\r
+# PROP Scc_LocalPath "."\r
+CPP=cl.exe\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "xkeymacsdll - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 6\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 6\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /Yu"stdafx.h" /FD /c\r
+# ADD CPP /nologo /MD /W4 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /D "_AFXEXT" /Yu"stdafx.h" /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"\r
+# ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 /nologo /subsystem:windows /dll /machine:I386\r
+# ADD LINK32 Imm32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"../xkeymacs/Release/xkeymacs.dll"\r
+\r
+!ELSEIF  "$(CFG)" == "xkeymacsdll - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 6\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 6\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\xkeymacs\Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W4 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /D "_AFXEXT" /FR /Yu"stdafx.h" /FD /GZ /c\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"\r
+# ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 Imm32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../xkeymacs/Debug/xkeymacs.dll" /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "xkeymacsdll - Win32 Release"\r
+# Name "xkeymacsdll - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\ClipboardFormatSnap.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ClipboardSnap.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Commands.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\FunctionDefinition.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\StdAfx.cpp\r
+# ADD CPP /Yc"stdafx.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Utils.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xkeymacsdll.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xkeymacsdll.def\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xkeymacsdll.rc\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\ClipboardFormatSnap.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ClipboardSnap.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Commands.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\FunctionDefinition.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Resource.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\StdAfx.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Utils.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xkeymacsdll.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# Begin Source File\r
+\r
+SOURCE=.\res\xkeymacsdll.rc2\r
+# End Source File\r
+# End Group\r
+# Begin Source File\r
+\r
+SOURCE=.\ReadMe.txt\r
+# End Source File\r
+# End Target\r
+# End Project\r
diff --git a/xkeymacsdll/xkeymacsdll.dsw b/xkeymacsdll/xkeymacsdll.dsw
new file mode 100644 (file)
index 0000000..196c68a
--- /dev/null
@@ -0,0 +1,33 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "xkeymacsdll"=.\xkeymacsdll.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+    begin source code control\r
+    "$/xkeymacsdll", KDAAAAAA\r
+    .\r
+    end source code control\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/xkeymacsdll/xkeymacsdll.h b/xkeymacsdll/xkeymacsdll.h
new file mode 100644 (file)
index 0000000..9fc55da
--- /dev/null
@@ -0,0 +1,354 @@
+// xkeymacs.h: interface for the CXkeymacsDll class.\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#if !defined(AFX_XKEYMACS_H__88552DEC_1233_4A0A_BE62_9EF7BC618EC6__INCLUDED_)\r
+#define AFX_XKEYMACS_H__88552DEC_1233_4A0A_BE62_9EF7BC618EC6__INCLUDED_\r
+\r
+#if _MSC_VER > 1000\r
+#pragma once\r
+#endif // _MSC_VER > 1000\r
+\r
+HINSTANCE GetThisHInst();\r
+\r
+#include "ClipboardSnap.h"\r
+\r
+enum { MAX_APP = 64 };\r
+enum { NONE = 0x0, SHIFT = 0x1, CONTROL = 0x2, META = 0x4, CONTROLX = 0x8,\r
+          MAX_COMMAND_TYPE = NONE + SHIFT + CONTROL + META + CONTROLX + 1 };\r
+enum { /* WIN_SHIFT = 0x100, */ WIN_CTRL = 0x200, WIN_ALT = 0x400, WIN_WIN = 0x800 };\r
+enum { MAX_KEY = 256 };\r
+enum { MAX_FUNCTION = 64 };\r
+enum { MAX_DEFINITION = 256 };\r
+\r
+enum { WINDOW_NAME_LENGTH      = 128 };\r
+enum { CLASS_NAME_LENGTH       = 128 };\r
+enum { SUB_KEY_NAME_LENGTH     = 128 };\r
+enum { WINDOW_TEXT_LENGTH   = 128 + 128 + 3};\r
+\r
+enum ICON_TYPE { MAIN_ICON, CX_ICON, MX_ICON, META_ICON, SHIFT_ICON, CTRL_ICON, ALT_ICON, MAX_ICON_TYPE };\r
+enum XKEYMACS_STATUS { STATUS_ENABLE, STATUS_DISABLE_TMP, STATUS_DISABLE_WOCQ, STATUS_DISABLE, MAX_STATUS };\r
+enum { ON_ICON, OFF_ICON };    // alias of status\r
+\r
+enum GOTO { GOTO_DO_NOTHING, GOTO_HOOK, GOTO_RECURSIVE, GOTO_HOOKX, GOTO_HOOK0_9, CONTINUE };\r
+enum SETTING_STYLE { SETTING_DEFAULT, SETTING_SPECIFIC, SETTING_DISABLE, SETTING_UNDEFINED };\r
+\r
+enum { EXTENDED_KEY = 0x01000000 };\r
+enum { REPEATED_KEY = 0x40000000 };\r
+enum { BEING_RELEASED = 0x80000000 };\r
+\r
+typedef struct KeyBind\r
+{\r
+       int nCommandType;\r
+       BYTE bVk;\r
+       int nControlID;\r
+} KeyBind_t;\r
+\r
+typedef struct KbdMacro\r
+{\r
+       int nCode;\r
+       WPARAM wParam;\r
+       LPARAM lParam;\r
+       BOOL bOriginal;\r
+} KbdMacro_t;\r
+\r
+typedef struct Modifier {\r
+       LPCTSTR name;\r
+       int id;\r
+} Modifier_t;\r
+\r
+static const Modifier_t Modifiers[] = {\r
+//     { _T("A-"), ALT },\r
+       { _T("C-"), CONTROL},\r
+//     { _T("H-"), HYPER },\r
+       { _T("M-"), META },\r
+       { _T("S-"), SHIFT },\r
+//     { _T("s-"), SUPER },\r
+       { _T("Ctrl+"), WIN_CTRL },\r
+       { _T("Alt+"), WIN_ALT },\r
+       { _T("Win+"), WIN_WIN },\r
+};\r
+\r
+typedef struct KeyName\r
+{\r
+       BYTE bVk;\r
+       LPCTSTR name;\r
+} KeyName_t;\r
+\r
+static const KeyName_t ControlCharacters[] = {\r
+//     { VK_LBUTTON,           _T("mouse-1") },                                // does not work well\r
+//     { VK_RBUTTON,           _T("mouse-3") },                                // does not work well\r
+       { VK_CANCEL,            _T("break") },\r
+//     { VK_MBUTTON,           _T("mouse-2") },                                // does not work well\r
+       { VK_BACK,                      _T("backspace") },\r
+       { VK_TAB,                       _T("tab") },\r
+       { VK_RETURN,            _T("return") },\r
+       { VK_CAPITAL,           _T("capslock") },\r
+       { VK_KANA,                      _T("kana") },\r
+       { VK_KANJI,                     _T("kanji") },\r
+       { VK_ESCAPE,            _T("escape") },\r
+       { VK_CONVERT,           _T("convert") },\r
+       { VK_NONCONVERT,        _T("nonconvert") },\r
+//     { VK_SPACE,                     _T("SPC") },                                    // [? ]\r
+       { VK_PRIOR,                     _T("prior") },\r
+       { VK_NEXT,                      _T("next") },\r
+       { VK_END,                       _T("end") },\r
+       { VK_HOME,                      _T("home") },\r
+       { VK_LEFT,                      _T("left") },\r
+       { VK_UP,                        _T("up") },\r
+       { VK_RIGHT,                     _T("right") },\r
+       { VK_DOWN,                      _T("down") },\r
+       { VK_SELECT,            _T("select") },\r
+       { VK_PRINT,                     _T("print") },\r
+       { VK_EXECUTE,           _T("execute") },\r
+       { VK_SNAPSHOT,          _T("printscreen") },                    // work as print\r
+       { VK_INSERT,            _T("insert") },\r
+       { VK_DELETE,            _T("delete") },\r
+       { VK_LWIN,                      _T("lwindow") },\r
+       { VK_RWIN,                      _T("rwindow") },\r
+       { VK_APPS,                      _T("apps") },\r
+       { VK_SLEEP,                     _T("sleep") },\r
+       { VK_NUMPAD0,           _T("kp-0") },\r
+       { VK_NUMPAD1,           _T("kp-1") },\r
+       { VK_NUMPAD2,           _T("kp-2") },\r
+       { VK_NUMPAD3,           _T("kp-3") },\r
+       { VK_NUMPAD4,           _T("kp-4") },\r
+       { VK_NUMPAD5,           _T("kp-5") },\r
+       { VK_NUMPAD6,           _T("kp-6") },\r
+       { VK_NUMPAD7,           _T("kp-7") },\r
+       { VK_NUMPAD8,           _T("kp-8") },\r
+       { VK_NUMPAD9,           _T("kp-9") },\r
+       { VK_MULTIPLY,          _T("kp-multiply") },\r
+       { VK_ADD,                       _T("kp-add") },\r
+       { VK_SUBTRACT,          _T("kp-subtract") },\r
+       { VK_DECIMAL,           _T("kp-decimal") },\r
+       { VK_DIVIDE,            _T("kp-divide") },\r
+//     { VK_F1,                        _T("f1") },                                             // FIXME\r
+//     { 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
+       { VK_F3,                        _T("f3") },\r
+       { VK_F4,                        _T("f4") },\r
+       { VK_F5,                        _T("f5") },\r
+       { VK_F6,                        _T("f6") },\r
+       { VK_F7,                        _T("f7") },\r
+       { VK_F8,                        _T("f8") },\r
+       { VK_F9,                        _T("f9") },\r
+       { VK_F10,                       _T("f10") },\r
+       { VK_F11,                       _T("f11") },\r
+       { VK_F12,                       _T("f12") },\r
+       { VK_F13,                       _T("f13") },\r
+       { VK_F14,                       _T("f14") },\r
+       { VK_F15,                       _T("f15") },\r
+       { VK_F16,                       _T("f16") },\r
+       { VK_F17,                       _T("f17") },\r
+       { VK_F18,                       _T("f18") },\r
+       { VK_F19,                       _T("f19") },\r
+       { VK_F20,                       _T("f20") },\r
+       { VK_F21,                       _T("f21") },\r
+       { VK_F22,                       _T("f22") },\r
+       { VK_F23,                       _T("f23") },\r
+       { VK_F24,                       _T("f24") },\r
+       { VK_F1,                        _T("f1") },\r
+       { VK_F2,                        _T("f2") },\r
+       { VK_NUMLOCK,           _T("kp-numlock") },\r
+       { VK_SCROLL,            _T("scroll") },\r
+       { 0xa6,                         _T("browser-back") },                   // VK_BROWSER_BACK\r
+       { 0xa7,                         _T("browser-forward") },                // VK_BROWSER_FORWARD\r
+       { 0xa8,                         _T("browser-refresh") },                // VK_BROWSER_REFRESH\r
+       { 0xa9,                         _T("browser-stop") },                   // VK_BROWSER_STOP\r
+       { 0xaa,                         _T("browser-search") },                 // VK_BROWSER_SEARCH\r
+       { 0xab,                         _T("browser-favorites") },              // VK_BROWSER_FAVORITES\r
+       { 0xac,                         _T("browser-home") },                   // VK_BROWSER_HOME\r
+       { 0xad,                         _T("volume-mute") },                    // VK_VOLUME_MUTE\r
+       { 0xae,                         _T("volume-down") },                    // VK_VOLUME_DOWN\r
+       { 0xaf,                         _T("volume-up") },                              // VK_VOLUME_UP\r
+       { 0xb0,                         _T("media-next-track") },               // VK_MEDIA_NEXT_TRACK\r
+       { 0xb1,                         _T("media-prev-track") },               // VK_MEDIA_PREV_TRACK\r
+       { 0xb2,                         _T("media-stop") },                             // VK_MEDIA_STOP\r
+       { 0xb3,                         _T("media-play-pause") },               // VK_MEDIA_PLAY_PAUSE\r
+       { 0xb4,                         _T("launch-mail") },                    // VK_LAUNCH_MAIL\r
+       { 0xb5,                         _T("launch-media-select") },    // VK_LAUNCH_MEDIA_SELECT\r
+       { 0xb6,                         _T("launch-1") },                               // VK_LAUNCH_APP1\r
+       { 0xb7,                         _T("launch-2") },                               // VK_LAUNCH_APP2\r
+};\r
+\r
+class AFX_EXT_CLASS CXkeymacsDll  \r
+{\r
+public:\r
+       static void ModifyM_xTip(const TCHAR *const szPath);\r
+       static BOOL Get326Compatible();\r
+       void Set326Compatible(int nApplicationID, BOOL b326Compatible);\r
+       void SetCursorData(HCURSOR hEnable, HCURSOR hDisableTMP, HCURSOR hDisableWOCQ, HICON hDisable, BOOL bEnable);\r
+       static unsigned int GetMaxKeyInterval(void);\r
+       static void SetKeyboardSpeed(int nKeyboardSpeed);\r
+       static int GetAccelerate(void);\r
+       static void SetAccelerate(int nAccelerate);\r
+       void SetWindowText(int nApplicationID, CString szWindowText);\r
+//     static int m_nPassThrough;\r
+       void AddAllShell_NotifyIcon();\r
+       void DeleteAllShell_NotifyIcon();\r
+       void SetKillRingMax(int nApplicationID, int nKillRingMax);\r
+       void CXkeymacsDll::EnableShell_NotifyIcon(ICON_TYPE icon, BOOL bEnable);\r
+       void SetNotifyIconData(ICON_TYPE icon, NOTIFYICONDATA stNtfyIcon, HICON hEnable, HICON hDisableTMP, HICON hDisableWOCQ, HICON hDisable, BOOL bEnable);\r
+       void SetNotifyIconData(ICON_TYPE icon, NOTIFYICONDATA stNtfyIcon, HICON hOn, HICON hOff, BOOL bEnable);\r
+       void Clear(int nApplicationID);\r
+       BOOL IsKeyboardHook();\r
+       void SetCommandID(int nApplicationID, int nCommandType, int nKey, int nCommandID);\r
+       void SetAtIbeamCursorOnly(int nApplicationID, int nCommandType, int nKey, BOOL bAtIbeamCursorOnly);\r
+       void SetApplicationName(int nApplicationID, CString szApplicationName);\r
+       static BOOL ReleaseKeyboardHook();\r
+       void SetEnableCUA(int nApplicationID, BOOL bEnableCUA);\r
+       void SetIgnoreUndefinedC_x(int nApplicationID, BOOL bIgnoreUndefinedC_x);\r
+       void SetIgnoreUndefinedMetaCtrl(int nApplicationID, BOOL bIgnoreUndefinedMetaCtrl);\r
+       static BOOL SetKeyboardHook();\r
+       void SetSettingStyle(int nApplicationID, int nSettingStyle);\r
+       void SetUseDialogSetting(int nApplicationID, BOOL bUseDialogSetting);\r
+       static void AddKillRing(BOOL bNewData = TRUE);\r
+       static void CallMacro();\r
+       static void ClearFunctionDefinition();\r
+       static void DefiningMacro(BOOL bDefiningMacro);\r
+       static void DepressKey(BYTE bVk, BOOL bOriginal = TRUE);\r
+       static BOOL GetEnableCUA();\r
+       static CClipboardSnap* GetKillRing(CClipboardSnap *pSnap, BOOL bForce = TRUE);\r
+       static void IncreaseKillRingIndex(int nKillRing = 1);\r
+       static BOOL IsDown(BYTE bVk, BOOL bPhysicalKey = TRUE);\r
+       static void Kdu(BYTE bVk, DWORD n = 1, BOOL bOriginal = TRUE);\r
+       static int ModifyShell_NotifyIcon(ICON_TYPE icon, BOOL bNewStatus, BOOL bForce = TRUE);\r
+       static void ReleaseKey(BYTE bVk);\r
+       static void SetFunctionDefinition(int nFunctionID, CString szDefinition);\r
+       static void SetFunctionKey(int nFunctionID, int nApplicationID, int nCommandType, int nKey);\r
+       static void SetKeyboardHookFlag();\r
+       static void SetKeyboardHookFlag(BOOL bFlag);\r
+       CXkeymacsDll();\r
+       virtual ~CXkeymacsDll();\r
+private:\r
+       static void InvokeM_x(const TCHAR* const szPath);\r
+       static BOOL m_b326Compatible[MAX_APP];\r
+       static void LogCallWndProcMessage(WPARAM wParam, LPARAM lParam);\r
+       static void DoSetCursor();\r
+       static HCURSOR m_hCurrentCursor;\r
+       static BOOL m_bCursor;\r
+       static HCURSOR m_hCursor[MAX_STATUS];\r
+       static int m_nKeyboardSpeed;\r
+       static int m_nAccelerate;\r
+       static HHOOK m_hHookCallWndRet;\r
+       static LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam);\r
+       static BOOL IsMatchWindowText(CString szWindowText);\r
+       static TCHAR m_szWindowText[MAX_APP][WINDOW_TEXT_LENGTH];\r
+       static HHOOK m_hHookKeyboard;\r
+       static HHOOK m_hHookCallWnd;\r
+       static HHOOK m_hHookGetMessage;\r
+       static HHOOK m_hHookShell;\r
+       static void AddShell_NotifyIcon(ICON_TYPE icon);\r
+       void DeleteShell_NotifyIcon(ICON_TYPE icon);\r
+       static BOOL DefiningMacro();\r
+       static BOOL IsControl();\r
+       static BOOL IsMeta();\r
+       static void DoKeybd_event(BYTE bVk, DWORD dwFlags);\r
+       static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);\r
+       static LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);\r
+       static LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam);\r
+       static LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam);\r
+       static KeyBind_t ParseKey(const int nFunctionID, unsigned int &i);\r
+       static BYTE a2v(TCHAR nAscii);\r
+       static BOOL IsShift(TCHAR nAscii);\r
+       static TCHAR m_szFunctionDefinition[MAX_FUNCTION][MAX_DEFINITION];\r
+       static void CallFunction(int nFunctionID);\r
+       static int m_nFunctionID[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY];\r
+       static BOOL m_bEnableCUA[MAX_APP];\r
+       static TCHAR m_szOldApplicationName[MAX_PATH];\r
+       static TCHAR m_szApplicationName[MAX_PATH];\r
+       static int IsPassThrough(BYTE nKey);\r
+       static BOOL IsDepressedShiftKeyOnly(BYTE nKey);\r
+       static BOOL IsDepressedModifier(int Modifier(), BOOL bPhysicalKey = TRUE);\r
+       static BOOL IsValidKey(BYTE bVk);\r
+       static CObList m_Macro;\r
+       static BOOL m_bDefiningMacro;\r
+       static void Original(int nCommandType, BYTE bVk, int nOriginal);\r
+       static int Original(int nCommandType, BYTE bVk);\r
+       static HICON m_hIcon[MAX_ICON_TYPE][MAX_STATUS];\r
+       static BOOL m_bUseDialogSetting[MAX_APP];\r
+       static void InitKeyboardProc(BOOL bImeComposition);\r
+       static BOOL m_bIgnoreUndefinedC_x[MAX_APP];\r
+       static BOOL m_bIgnoreUndefinedMetaCtrl[MAX_APP];\r
+       static int m_nSettingStyle[MAX_APP];\r
+       static int m_nApplicationID;\r
+       static int m_nOriginal[MAX_COMMAND_TYPE][MAX_KEY];\r
+       static int m_nKillRing;\r
+       static CList<CClipboardSnap *, CClipboardSnap *> m_oKillRing;\r
+       static int m_nKillRingMax[MAX_APP];\r
+       static int GetMickey(int nDifferential, int nThreshold1, int nThreshold2, int nAcceleration, int nSpeed);\r
+       static BOOL DoShell_NotifyIcon(ICON_TYPE icon, DWORD dwMessage);\r
+       static BOOL m_bIcon[MAX_ICON_TYPE];\r
+       static DWORD m_dwOldMessage[MAX_ICON_TYPE];\r
+       static NOTIFYICONDATA m_stNtfyIcon[MAX_ICON_TYPE];\r
+       static NOTIFYICONDATA m_stOldNtfyIcon[MAX_ICON_TYPE];\r
+       static BOOL m_bHook;\r
+       static BOOL m_bRightShift;\r
+       static BOOL m_bRightAlt;\r
+       static BOOL m_bRightControl;\r
+       static TCHAR m_szSpecialApp[MAX_APP][CLASS_NAME_LENGTH];\r
+       static int m_nCommandID[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY];\r
+       static BOOL m_bAtIbeamCursorOnly[MAX_APP][MAX_COMMAND_TYPE][MAX_KEY];\r
+};\r
+\r
+\r
+class AFX_EXT_CLASS CXkeymacsData  \r
+{\r
+public:\r
+       void Set326Compatible(BOOL b326Compatible);\r
+       BOOL Get326Compatible();\r
+       int GetWindowTextType();\r
+       void SetWindowTextType(int nWindowTextType);\r
+       CString GetWindowText();\r
+       void SetWindowText(LPCTSTR lpszWindowText);\r
+       static BOOL Is106Keyboard();\r
+       static void Set106Keyboard(BOOL b106Keyboard);\r
+       static int GetToolTipID(int nCommandID);\r
+       static int GetDescriptionID(int nCommandID);\r
+       void SetUseDialogSetting(BOOL bUseDialogSetting);\r
+       BOOL GetUseDialogSetting();\r
+       BOOL GetEnableCUA();\r
+       void SetEnableCUA(BOOL bEnableCUA);\r
+       BOOL GetIgnoreUndefinedC_x();\r
+       void SetIgnoreUndefinedC_x(BOOL bIgnoreUndefinedC_x);\r
+       BOOL GetIgnoreUndefinedMetaCtrl();\r
+       void SetIgnoreUndefinedMetaCtrl(BOOL bIgnoreUndefinedMetaCtrl);\r
+       static int GetCategoryID(int nCommandID);\r
+       void SetSettingStyle(int nSettingStyle);\r
+       int GetSettingStyle();\r
+       static int GetDefaultControlID(int nCommandID, int nIndex);\r
+       static int GetDefaultCommandKey(int nCommandID, int nIndex);\r
+       static int GetDefaultCommandType(int nCommandID, int nIndex);\r
+       static CString GetCommandName(int nCommandID);\r
+       void SetKillRingMax(int nKillRingMax);\r
+       int GetKillRingMax();\r
+       CString GetApplicationTitle();\r
+       void SetApplicationTitle(LPCTSTR lpszApplicationTitle);\r
+       void ClearAll();\r
+       int GetCommandID(int nCommandType, int nKey);\r
+       void SetCommandID(int nCommandType, int nKey, int nCommandID);\r
+       BOOL GetAtIbeamCursorOnly(int nCommandType, int nKey);\r
+       void SetAtIbeamCursorOnly(int nCommandType, int nKey, BOOL bAtIbeamCursorOnly);\r
+       CString GetApplicationName();\r
+       void SetApplicationName(LPCTSTR lpszApplicationName);\r
+       CXkeymacsData();\r
+       virtual ~CXkeymacsData();\r
+\r
+private:\r
+       BOOL m_b326Compatible;\r
+       int m_nWindowTextType;\r
+       CString m_strWindowText;\r
+       BOOL m_bEnableCUA;\r
+       static BOOL m_b106Keyboard;\r
+       BOOL m_bUseDialogSetting;\r
+       BOOL m_bIgnoreUndefinedC_x;\r
+       BOOL m_bIgnoreUndefinedMetaCtrl;\r
+       int m_nSettingStyle;\r
+       int m_nKillRingMax;\r
+       CString m_strApplicationTitle;\r
+       CString m_strApplicationName;\r
+       int m_nCommandID[MAX_COMMAND_TYPE][MAX_KEY];\r
+       BOOL m_bAtIbeamCursorOnly[MAX_COMMAND_TYPE][MAX_KEY];\r
+};\r
+\r
+#endif // !defined(AFX_XKEYMACS_H__88552DEC_1233_4A0A_BE62_9EF7BC618EC6__INCLUDED_)\r
diff --git a/xkeymacsdll/xkeymacsdll.rc b/xkeymacsdll/xkeymacsdll.rc
new file mode 100644 (file)
index 0000000..179cfe4
--- /dev/null
@@ -0,0 +1,133 @@
+//Microsoft Developer Studio generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#include "afxres.h"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// \89p\8cê (±Òض) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "#include ""afxres.h""\r\n"\r
+    "\0"\r
+END\r
+\r
+3 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"\r
+    "#define _AFX_NO_OLE_RESOURCES\r\n"\r
+    "#define _AFX_NO_TRACKER_RESOURCES\r\n"\r
+    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"\r
+    "\r\n"\r
+    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"\r
+    "#ifdef _WIN32\r\n"\r
+    "LANGUAGE 9, 1\r\n"\r
+    "#pragma code_page(1252)\r\n"\r
+    "#endif //_WIN32\r\n"\r
+    "#include ""res\\xkeymacsdll.rc2""  // non-Microsoft Visual C++ edited resources\r\n"\r
+    "#include ""afxres.rc""         // Standard components\r\n"\r
+    "#endif\r\n"\r
+    "\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+#ifndef _MAC\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Version\r
+//\r
+\r
+VS_VERSION_INFO VERSIONINFO\r
+ FILEVERSION 3,47,0,0\r
+ PRODUCTVERSION 3,47,0,0\r
+ FILEFLAGSMASK 0x3fL\r
+#ifdef _DEBUG\r
+ FILEFLAGS 0x1L\r
+#else\r
+ FILEFLAGS 0x0L\r
+#endif\r
+ FILEOS 0x4L\r
+ FILETYPE 0x2L\r
+ FILESUBTYPE 0x0L\r
+BEGIN\r
+    BLOCK "StringFileInfo"\r
+    BEGIN\r
+        BLOCK "040904b0"\r
+        BEGIN\r
+            VALUE "Comments", "\0"\r
+            VALUE "CompanyName", "\0"\r
+            VALUE "FileDescription", "XKeymacs DLL\0"\r
+            VALUE "FileVersion", "3, 47, 0, 0\0"\r
+            VALUE "InternalName", "xkeymacsdll\0"\r
+            VALUE "LegalCopyright", "Copyright (C) 2001-2008\0"\r
+            VALUE "LegalTrademarks", "\0"\r
+            VALUE "OriginalFilename", "xkeymacs.dll\0"\r
+            VALUE "PrivateBuild", "\0"\r
+            VALUE "ProductName", "XKeymacs Dynamic Link Library\0"\r
+            VALUE "ProductVersion", "3, 47, 0, 0\0"\r
+            VALUE "SpecialBuild", "\0"\r
+        END\r
+    END\r
+    BLOCK "VarFileInfo"\r
+    BEGIN\r
+        VALUE "Translation", 0x409, 1200\r
+    END\r
+END\r
+\r
+#endif    // !_MAC\r
+\r
+#endif    // \89p\8cê (±Òض) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+#define _AFX_NO_SPLITTER_RESOURCES\r
+#define _AFX_NO_OLE_RESOURCES\r
+#define _AFX_NO_TRACKER_RESOURCES\r
+#define _AFX_NO_PROPERTY_RESOURCES\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE 9, 1\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+#include "res\xkeymacsdll.rc2"  // non-Microsoft Visual C++ edited resources\r
+#include "afxres.rc"         // Standard components\r
+#endif\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif    // not APSTUDIO_INVOKED\r
+\r