OSDN Git Service

Make the keyboard hook local to each thread. Remove the code to
[xkeymacs/xkeymacs.git] / xkeymacsdll / Commands.cpp
1 // Commands.cpp: implementation of the CCommands class\r
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \r
5 #include "stdafx.h"\r
6 #include "Commands.h"\r
7 #include "xkeymacsdll.h"\r
8 #include "Utils.h"\r
9 #include <math.h>\r
10 #include <Imm.h>\r
11 \r
12 AFX_EXT_DATA const Command Commands[] = {\r
13         {_T("[unassigned]"),                            0,                              0,                                                                      0,                                                                      NULL,                                                           {'\0'}},\r
14         {_T("C-x"),                                                     0,                              IDS_CONTROL_X_PREFIX_D,                         IDS_CONTROL_X_PREFIX_T,                         CCommands::C_x,                                         {'\0'}},\r
15         {_T("C-"),                                                      IDS_OTHER,              IDS_CONTROL_D,                                          IDS_CONTROL_T,                                          CCommands::C_,                                          {{NONE, VK_CONTROL, 0},\r
16                                                                                                                                                                                                                                                                                                                                          {NONE, VK_LCONTROL, 0},\r
17                                                                                                                                                                                                                                                                                                                                          {NONE, VK_RCONTROL, 0},\r
18                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
19         {_T("C- for Eisu"),                                     0,                              IDS_CONTROL_PREFIX_D,                           IDS_CONTROL_PREFIX_T,                           CCommands::C_Eisu,                                      {'\0'}},\r
20         {_T("Caps Lock"),                                       IDS_OTHER,              IDS_CAPS_LOCK_D,                                        IDS_CAPS_LOCK_T,                                        CCommands::CapsLock,                            {'\0'}},\r
21         {_T("Close Input Method"),                      IDS_IME,                IDS_CLOSE_INPUT_METHOD_D,                       IDS_CLOSE_INPUT_METHOD_T,                       CCommands::CloseInputMethod,            {'\0'}},\r
22         {_T("Complete & Close Input Method"),   IDS_IME,        IDS_COMPLETE_CLOSE_INPUT_METHOD_D,      IDS_COMPLETE_CLOSE_INPUT_METHOD_T,      CCommands::CompleteCloseInputMethod,{'\0'}},\r
23         {_T("Complete & Toggle Input Method"),  IDS_IME,        IDS_COMPLETE_TOGGLE_INPUT_METHOD_D,     IDS_COMPLETE_TOGGLE_INPUT_METHOD_T,     CCommands::CompleteToggleInputMethod,   {'\0'}},\r
24         {_T("Copy"),                                            IDS_OTHER,              IDS_COPY_D,                                                     IDS_COPY_T,                                                     CCommands::Copy,                                        {'\0'}},\r
25         {_T("Cut"),                                                     IDS_OTHER,              IDS_CUT_D,                                                      IDS_CUT_T,                                                      CCommands::Cut,                                         {'\0'}},\r
26         {_T("Cycle items"),                                     IDS_OTHER,              IDS_CYCLE_ITEMS_D,                                      IDS_CYCLE_ITEMS_T,                                      CCommands::CycleItems,                          {'\0'}},\r
27         {_T("Cycle items inversely"),           IDS_OTHER,              IDS_CYCLE_ITEMS_INVERSELY_D,            IDS_CYCLE_ITEMS_INVERSELY_T,            CCommands::CycleItemsInversely,         {'\0'}},\r
28         {_T("Disable XKeymacs"),                        IDS_OTHER,              IDS_DISABLE_XKEYMACS_D,                         IDS_DISABLE_XKEYMACS_T,                         CCommands::DisableXKeymacs,                     {'\0'}},\r
29         {_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
30                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'Q', IDC_CQ},\r
31                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
32         {_T("Enable XKeymacs"),                         IDS_OTHER,              IDS_ENABLE_XKEYMACS_D,                          IDS_ENABLE_XKEYMACS_T,                          CCommands::EnableXKeymacs,                      {'\0'}},\r
33         {_T("newline"),                                         IDS_OTHER,              IDS_NEWLINE_D,                                          IDS_NEWLINE_T,                                          CCommands::Newline,                                     {{CONTROL, 'M', IDC_CM},\r
34                                                                                                                                                                                                                                                                                                                                         {CONTROL+SHIFT, 'M', IDC_CM},\r
35                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
36         {_T("Esc"),                                                     IDS_OTHER,              IDS_ESCAPE_D,                                           IDS_ESCAPE_T,                                           CCommands::Escape,                                      {'\0'}},\r
37         {_T("Find"),                                            IDS_OTHER,              IDS_FIND_D,                                                     IDS_FIND_T,                                                     CCommands::Find,                                        {'\0'}},\r
38         {_T("Find Next"),                                       IDS_OTHER,              IDS_FIND_NEXT_D,                                        IDS_FIND_NEXT_T,                                        CCommands::FindNext,                            {'\0'}},\r
39         {_T("Ignore"),                                          IDS_OTHER,              IDS_IGNORE_D,                                           IDS_IGNORE_T,                                           CCommands::Ignore,                                      {'\0'}},\r
40         {_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
41         {_T("Maximize"),                                        IDS_OTHER,              IDS_MAXIMIZE_D,                                         IDS_MAXIMIZE_T,                                         CCommands::Maximize,                            {'\0'}},\r
42         {_T("Maximize Horizontally"),           IDS_OTHER,              IDS_MAXIMIZE_HORIZONTALLY_D,            IDS_MAXIMIZE_HORIZONTALLY_T,            CCommands::MaximizeHorizontally,        {'\0'}},\r
43         {_T("Maximize Vertically"),                     IDS_OTHER,              IDS_MAXIMIZE_VERTICALLY_D,                      IDS_MAXIMIZE_VERTICALLY_T,                      CCommands::MaximizeVertically,          {'\0'}},\r
44         {_T("Meta"),                                            IDS_OTHER,              IDS_META_PREFIX_D,                                      IDS_META_PREFIX_T,                                      CCommands::Meta,                                        {{CONTROL, 0xDB, IDC_SQUARE_BRA},\r
45                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // VK_OEM_4\r
46         {_T("Meta for Alt"),                            IDS_OTHER,              IDS_META_D,                                                     IDS_META_T,                                                     CCommands::MetaAlt,                                     {{NONE, VK_MENU, IDC_ALT},\r
47                                                                                                                                                                                                                                                                                                                                          {NONE, VK_LMENU, IDC_LEFT_ALT},\r
48                                                                                                                                                                                                                                                                                                                                          {NONE, VK_RMENU, IDC_RIGHT_ALT},\r
49                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
50         {_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
51                                                                                                                                                                                                                                                                                                                                          {NONE+SHIFT, VK_ESCAPE, IDC_ESCAPE},\r
52                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // add SHIFT\r
53         {_T("Minimize"),                                        IDS_OTHER,              IDS_MINIMIZE_D,                                         IDS_MINIMIZE_T,                                         CCommands::Minimize,                            {'\0'}},\r
54         {_T("Move"),                                            IDS_OTHER,              IDS_MOVE_D,                                                     IDS_MOVE_T,                                                     CCommands::Move,                                        {'\0'}},\r
55         {_T("New"),                                                     IDS_OTHER,              IDS_NEW_D,                                                      IDS_NEW_T,                                                      CCommands::New,                                         {'\0'}},\r
56         {_T("One Shot Modifier Alt"),           IDS_MODIFIER,   IDS_OSMODIFIER_ALT_D,                           IDS_OSMODIFIER_ALT_T,                           CCommands::OneShotModifierAlt,          {'\0'}},\r
57         {_T("One Shot Modifier Alt with Repeat"),       IDS_MODIFIER,   IDS_OSMODIFIER_ALT_REPEAT_D,    IDS_OSMODIFIER_ALT_REPEAT_T,    CCommands::OneShotModifierAltRepeat,    {'\0'}},\r
58         {_T("One Shot Modifier Ctrl"),          IDS_MODIFIER,   IDS_OSMODIFIER_CTRL_D,                          IDS_OSMODIFIER_CTRL_T,                          CCommands::OneShotModifierCtrl,         {'\0'}},\r
59         {_T("One Shot Modifier Ctrl with Repeat"),      IDS_MODIFIER,   IDS_OSMODIFIER_CTRL_REPEAT_D,   IDS_OSMODIFIER_CTRL_REPEAT_T,   CCommands::OneShotModifierCtrlRepeat,   {'\0'}},\r
60         {_T("One Shot Modifier Shift"),         IDS_MODIFIER,   IDS_OSMODIFIER_SHIFT_D,                         IDS_OSMODIFIER_SHIFT_T,                         CCommands::OneShotModifierShift,        {'\0'}},\r
61         {_T("One Shot Modifier Shift with Repeat"),     IDS_MODIFIER,   IDS_OSMODIFIER_SHIFT_REPEAT_D,  IDS_OSMODIFIER_SHIFT_REPEAT_T,  CCommands::OneShotModifierShiftRepeat,  {'\0'}},\r
62         {_T("Open Input Method"),                       IDS_IME,                IDS_OPEN_INPUT_METHOD_D,                        IDS_OPEN_INPUT_METHOD_T,                        CCommands::OpenInputMethod,                     {'\0'}},\r
63         {_T("Pass Through"),                            IDS_OTHER,              IDS_PASS_THROUGH_D,                                     IDS_PASS_THROUGH_T,                                     CCommands::PassThrough,                         {'\0'}},\r
64         {_T("Paste"),                                           IDS_OTHER,              IDS_PASTE_D,                                            IDS_PASTE_T,                                            CCommands::Paste,                                       {'\0'}},\r
65         {_T("Print"),                                           IDS_OTHER,              IDS_PRINT_D,                                            IDS_PRINT_T,                                            CCommands::Print,                                       {'\0'}},\r
66         {_T("Redo"),                                            IDS_OTHER,              IDS_REDO_D,                                                     IDS_REDO_T,                                                     CCommands::Redo,                                        {'\0'}},\r
67         {_T("Restore"),                                         IDS_OTHER,              IDS_RESTORE_D,                                          IDS_RESTORE_T,                                          CCommands::Restore,                                     {'\0'}},\r
68         {_T("Retop"),                                           IDS_OTHER,              IDS_RETOP_D,                                            IDS_RETOP_T,                                            CCommands::Retop,                                       {'\0'}},\r
69         {_T("Roll-up/Unroll"),                          IDS_WINDOW,             IDS_ROLL_UP_UNROLL_D,                           IDS_ROLL_UP_UNROLL_T,                           CCommands::RollUpUnroll,                        {{META, VK_F12, IDC_MF12},\r
70                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
71         {_T("Select All"),                                      IDS_OTHER,              IDS_SELECT_ALL_D,                                       IDS_SELECT_ALL_T,                                       CCommands::SelectAll,                           {'\0'}},\r
72         {_T("Size"),                                            IDS_OTHER,              IDS_SIZE_D,                                                     IDS_SIZE_T,                                                     CCommands::Size,                                        {'\0'}},\r
73         {_T("Switch Between Input Locales"),IDS_IME,            IDS_SWITCH_BETWEEN_INPUT_LOCALES_D,     IDS_SWITCH_BETWEEN_INPUT_LOCALES_T,     CCommands::SwitchBetweenInputLocales,   {'\0'}},\r
74         {_T("Temporarily Disable XKeymacs"),IDS_OTHER,          IDS_TEMPORARILY_DISABLE_XKEYMACS_D,     IDS_TEMPORARILY_DISABLE_XKEYMACS_T,     CCommands::TemporarilyDisableXKeymacs,  {'\0'}},\r
75         {_T("~"),                                                       IDS_OTHER,              IDS_TILDE_D,                                            IDS_TILDE_T,                                            CCommands::Tilde,                                       {'\0'}},\r
76         {_T("`"),                                                       IDS_OTHER,              IDS_BACK_QUOTE_D,                                       IDS_BACK_QUOTE_T,                                       CCommands::BackQuote,                           {'\0'}},\r
77         {_T("_"),                                                       IDS_OTHER,              IDS_UNDERSCORE_D,                                       IDS_UNDERSCORE_T,                                       CCommands::Underscore,                          {'\0'}},\r
78         {_T("backward-char"),                           IDS_MOTION,             IDS_BACKWARD_CHAR_D,                            IDS_BACKWARD_CHAR_T,                            CCommands::BackwardChar,                        {{CONTROL, 'B', IDC_CB},\r
79                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'B', IDC_CB},\r
80                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
81         {_T("backward-kill-word"),                      IDS_KILL,               IDS_BACKWARD_KILL_WORD_D,                       IDS_BACKWARD_KILL_WORD_T,                       CCommands::BackwardKillWord,            {{META, VK_BACK, IDC_MDEL},\r
82                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, VK_BACK, IDC_MDEL},\r
83                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
84         {_T("backward-word"),                           IDS_MOTION,             IDS_BACKWARD_WORD_D,                            IDS_BACKWARD_WORD_T,                            CCommands::BackwardWord,                        {{META, 'B', IDC_MB},\r
85                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'B', IDC_MB},\r
86                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
87         {_T("beginning-of-buffer"),                     IDS_MOTION,             IDS_BEGINNING_OF_BUFFER_D,                      IDS_BEGINNING_OF_BUFFER_T,                      CCommands::BeginningOfBuffer,           {{META+SHIFT, 0xBC, IDC_MSCOMMA},\r
88                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // VK_OEM_COMMA\r
89         {_T("beginning-of-line"),                       IDS_MOTION,             IDS_BEGINNING_OF_LINE_D,                        IDS_BEGINNING_OF_LINE_T,                        CCommands::BeginningOfLine,                     {{CONTROL, 'A', IDC_CA},\r
90                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'A', IDC_CA},\r
91                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
92         {_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
93                                                                                                                                                                                                                                                                                                                                          {CONTROLX+SHIFT, 'E', IDC_CXE},\r
94                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
95         {_T("capitalize-word"),                         IDS_OTHER,              IDS_CAPITALIZE_WORD_D,                          IDS_CAPITALIZE_WORD_T,                          CCommands::CapitalizeWord,                      {{META, 'C', IDC_MC},\r
96                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'C', IDC_MC},\r
97                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
98         {_T("delete-backward-char"),            IDS_KILL,               IDS_DELETE_BACKWARD_CHAR_D,                     IDS_DELETE_BACKWARD_CHAR_T,                     CCommands::DeleteBackwardChar,          {{CONTROL, 'H', IDC_CH},\r
99                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'H', IDC_CH},\r
100                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
101         {_T("delete-char"),                                     IDS_KILL,               IDS_DELETE_CHAR_D,                                      IDS_DELETE_CHAR_T,                                      CCommands::DeleteChar,                          {{CONTROL, 'D', IDC_CD},\r
102                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'D', IDC_CD},\r
103                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
104         {_T("downcase-word"),                           IDS_OTHER,              IDS_DOWNCASE_WORD_D,                            IDS_DOWNCASE_WORD_T,                            CCommands::DowncaseWord,                        {{META, 'L', IDC_ML},\r
105                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'L', IDC_ML},\r
106                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
107         {_T("end-kbd-macro"),                           IDS_OTHER,              IDS_END_KBD_MACRO_D,                            IDS_END_KBD_MACRO_T,                            CCommands::EndKbdMacro,                         {{CONTROLX+SHIFT, '0', IDC_CXS0},\r
108                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
109         {_T("end-of-buffer"),                           IDS_MOTION,             IDS_END_OF_BUFFER_D,                            IDS_END_OF_BUFFER_T,                            CCommands::EndOfBuffer,                         {{META+SHIFT, 0xBE, IDC_MSPERIOD},\r
110                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // VK_OEM_PERIOD\r
111         {_T("end-of-line"),                                     IDS_MOTION,             IDS_END_OF_LINE_D,                                      IDS_END_OF_LINE_T,                                      CCommands::EndOfLine,                           {{CONTROL, 'E', IDC_CE},\r
112                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'E', IDC_CE},\r
113                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
114         {_T("execute-extended-command"),    IDS_OTHER,      IDS_EXECUTE_EXTENDED_COMMAND_D,     IDS_EXECUTE_EXTENDED_COMMAND_T,     CCommands::ExecuteExtendedCommand,  {{META, 'X', IDC_MX},\r
115                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'X', IDC_MX},\r
116                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
117 //      {_T("fill-paragraph"),                          IDS_OTHER,              IDS_FILL_PARAGRAPH_D,                           IDS_FILL_PARAGRAPH_T,                           CCommands::FillParagraph,                       {'\0'}},\r
118         {_T("find-file"),                                       IDS_FILES,              IDS_FIND_FILE_D,                                        IDS_FIND_FILE_T,                                        CCommands::FindFile,                            {{CONTROL+CONTROLX, 'F', IDC_CXCF},\r
119                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'F', IDC_CXCF},\r
120                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
121         {_T("forward-char"),                            IDS_MOTION,             IDS_FORWARD_CHAR_D,                                     IDS_FORWARD_CHAR_T,                                     CCommands::ForwardChar,                         {{CONTROL, 'F', IDC_CF},\r
122                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'F', IDC_CF},\r
123                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
124         {_T("forward-word"),                            IDS_MOTION,             IDS_FORWARD_WORD_D,                                     IDS_FORWARD_WORD_T,                                     CCommands::ForwardWord,                         {{META, 'F', IDC_MF},\r
125                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'F', IDC_MF},\r
126                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
127         {_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
128                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'Z', IDC_CZ},\r
129                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
130         {_T("isearch-backward"),                        IDS_SEARCH,             IDS_ISEARCH_BACKWARD_D,                         IDS_ISEARCH_BACKWARD_T,                         CCommands::IsearchBackward,                     {{CONTROL, 'R', IDC_CR},\r
131                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'R', IDC_CR},\r
132                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
133         {_T("isearch-forward"),                         IDS_SEARCH,             IDS_ISEARCH_FORWARD_D,                          IDS_ISEARCH_FORWARD_T,                          CCommands::IsearchForward,                      {{CONTROL, 'S', IDC_CS},\r
134                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'S', IDC_CS},\r
135                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
136         {_T("keyboard-quit"),                           IDS_RECOVERY,   IDS_KEYBOARD_QUIT_D,                            IDS_KEYBOARD_QUIT_T,                            CCommands::KeyboardQuit,                        {{CONTROL, 'G', IDC_CG},\r
137                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'G', IDC_CG},\r
138                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
139         {_T("kill-buffer"),                                     IDS_FILES,              IDS_KILL_BUFFER_D,                                      IDS_KILL_BUFFER_T,                                      CCommands::KillBuffer,                          {{CONTROLX, 'K', IDC_CXK},\r
140                                                                                                                                                                                                                                                                                                                                          {SHIFT+CONTROLX, 'K', IDC_CXK},\r
141                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
142         {_T("kill-line"),                                       IDS_KILL,               IDS_KILL_LINE_D,                                        IDS_KILL_LINE_T,                                        CCommands::KillLine,                            {{CONTROL, 'K', IDC_CK},\r
143                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'K', IDC_CK},\r
144                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
145         {_T("kill-region"),                                     IDS_KILL,               IDS_KILL_REGION_D,                                      IDS_KILL_REGION_T,                                      CCommands::KillRegion,                          {{CONTROL, 'W', IDC_CW},\r
146                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'W', IDC_CW},\r
147                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
148         {_T("kill-ring-save"),                          IDS_KILL,               IDS_KILL_RING_SAVE_D,                           IDS_KILL_RING_SAVE_T,                           CCommands::KillRingSave,                        {{META, 'W', IDC_MW},\r
149                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'W', IDC_MW},\r
150                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
151         {_T("kill-word"),                                       IDS_KILL,               IDS_KILL_WORD_D,                                        IDS_KILL_WORD_T,                                        CCommands::KillWord,                            {{META, 'D', IDC_MD},\r
152                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'D', IDC_MD},\r
153                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
154         {_T("mark-page"),                                       IDS_OTHER,              IDS_MARK_PAGE_D,                                        IDS_MARK_PAGE_T,                                        CCommands::MarkPage,                            {{CONTROL+CONTROLX, 'P', IDC_CXCP},\r
155                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'P', IDC_CXCP},\r
156                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
157         {_T("mark-whole-buffer"),                       IDS_OTHER,              IDS_MARK_WHOLE_BUFFER_D,                        IDS_MARK_WHOLE_BUFFER_T,                        CCommands::MarkWholeBuffer,                     {{CONTROLX, 'H', IDC_CXH},\r
158                                                                                                                                                                                                                                                                                                                                          {CONTROLX+SHIFT, 'H', IDC_CXH},\r
159                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
160         {_T("next-line"),                                       IDS_MOTION,             IDS_NEXT_LINE_D,                                        IDS_NEXT_LINE_T,                                        CCommands::NextLine,                            {{CONTROL, 'N', IDC_CN},\r
161                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'N', IDC_CN},\r
162                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
163         {_T("numeric argument 0"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT0_D,                          IDS_DIGIT_ARGUMENT0_T,                          CCommands::NumericArgument0,            {{CONTROL, '0', IDC_CDIGIT},\r
164                                                                                                                                                                                                                                                                                                                                          {META, '0', IDC_CDIGIT},\r
165                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
166         {_T("numeric argument 1"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT1_D,                          IDS_DIGIT_ARGUMENT1_T,                          CCommands::NumericArgument1,            {{CONTROL, '1', IDC_CDIGIT},\r
167                                                                                                                                                                                                                                                                                                                                          {META, '1', IDC_CDIGIT},\r
168                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
169         {_T("numeric argument 2"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT2_D,                          IDS_DIGIT_ARGUMENT2_T,                          CCommands::NumericArgument2,            {{CONTROL, '2', IDC_CDIGIT},\r
170                                                                                                                                                                                                                                                                                                                                          {META, '2', IDC_CDIGIT},\r
171                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
172         {_T("numeric argument 3"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT3_D,                          IDS_DIGIT_ARGUMENT3_T,                          CCommands::NumericArgument3,            {{CONTROL, '3', IDC_CDIGIT},\r
173                                                                                                                                                                                                                                                                                                                                          {META, '3', IDC_CDIGIT},\r
174                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
175         {_T("numeric argument 4"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT4_D,                          IDS_DIGIT_ARGUMENT4_T,                          CCommands::NumericArgument4,            {{CONTROL, '4', IDC_CDIGIT},\r
176                                                                                                                                                                                                                                                                                                                                          {META, '4', IDC_CDIGIT},\r
177                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
178         {_T("numeric argument 5"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT5_D,                          IDS_DIGIT_ARGUMENT5_T,                          CCommands::NumericArgument5,            {{CONTROL, '5', IDC_CDIGIT},\r
179                                                                                                                                                                                                                                                                                                                                          {META, '5', IDC_CDIGIT},\r
180                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
181         {_T("numeric argument 6"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT6_D,                          IDS_DIGIT_ARGUMENT6_T,                          CCommands::NumericArgument6,            {{CONTROL, '6', IDC_CDIGIT},\r
182                                                                                                                                                                                                                                                                                                                                          {META, '6', IDC_CDIGIT},\r
183                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
184         {_T("numeric argument 7"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT7_D,                          IDS_DIGIT_ARGUMENT7_T,                          CCommands::NumericArgument7,            {{CONTROL, '7', IDC_CDIGIT},\r
185                                                                                                                                                                                                                                                                                                                                          {META, '7', IDC_CDIGIT},\r
186                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
187         {_T("numeric argument 8"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT8_D,                          IDS_DIGIT_ARGUMENT8_T,                          CCommands::NumericArgument8,            {{CONTROL, '8', IDC_CDIGIT},\r
188                                                                                                                                                                                                                                                                                                                                          {META, '8', IDC_CDIGIT},\r
189                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
190         {_T("numeric argument 9"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT9_D,                          IDS_DIGIT_ARGUMENT9_T,                          CCommands::NumericArgument9,            {{CONTROL, '9', IDC_CDIGIT},\r
191                                                                                                                                                                                                                                                                                                                                          {META, '9', IDC_CDIGIT},\r
192                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
193         {_T("numeric argument -"),                      IDS_OTHER,              IDS_NEGATIVE_ARGUMENT_D,                        IDS_NEGATIVE_ARGUMENT_T,                        CCommands::NumericArgumentMinus,        {{CONTROL, 0xBD, IDC_CDIGIT},\r
194                                                                                                                                                                                                                                                                                                                                          {META, 0xBD, IDC_CDIGIT},\r
195                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
196         {_T("open-line"),                                       IDS_OTHER,              IDS_OPEN_LINE_D,                                        IDS_OPEN_LINE_T,                                        CCommands::OpenLine,                            {{CONTROL, 'O', IDC_CO},\r
197                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'O', IDC_CO},\r
198                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
199         {_T("previous-line"),                           IDS_MOTION,             IDS_PREVIOUS_LINE_D,                            IDS_PREVIOUS_LINE_T,                            CCommands::PreviousLine,                        {{CONTROL, 'P', IDC_CP},\r
200                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'P', IDC_CP},\r
201                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
202         {_T("query-replace"),                           IDS_SEARCH,             IDS_QUERY_REPLACE_D,                            IDS_QUERY_REPLACE_T,                            CCommands::QueryReplace,                        {{META+SHIFT, '5', IDC_MS5},\r
203                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
204         {_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
205                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
206         {_T("recenter"),                                        IDS_MOTION,             IDS_RECENTER_D,                                         IDS_RECENTER_T,                                         CCommands::Recenter,                            {{CONTROL, 'L', IDC_CL},\r
207                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'L', IDC_CL},\r
208                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
209         {_T("save-buffer"),                                     IDS_FILES,              IDS_SAVE_BUFFER_D,                                      IDS_SAVE_BUFFER_T,                                      CCommands::SaveBuffer,                          {{CONTROL+CONTROLX, 'S', IDC_CXCS},\r
210                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'S', IDC_CXCS},\r
211                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
212         {_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
213                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'C', IDC_CXCC},\r
214                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
215         {_T("scroll-down"),                                     IDS_MOTION,             IDS_SCROLL_DOWN_D,                                      IDS_SCROLL_DOWN_T,                                      CCommands::ScrollDown,                          {{META, 'V', IDC_MV},\r
216                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'V', IDC_MV},\r
217                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
218         {_T("scroll-up"),                                       IDS_MOTION,             IDS_SCROLL_UP_D,                                        IDS_SCROLL_UP_T,                                        CCommands::ScrollUp,                            {{CONTROL, 'V', IDC_CV},\r
219                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'V', IDC_CV},\r
220                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
221         {_T("set-mark-command"),                        IDS_OTHER,              IDS_SET_MARK_COMMAND_D,                         IDS_SET_MARK_COMMAND_T,                         CCommands::SetMarkCommand,                      {{CONTROL, VK_SPACE, IDC_CSPACE},\r
222                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, VK_SPACE, IDC_CSPACE},\r
223                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
224         {_T("shell-command"),                           IDS_OTHER,              IDS_SHELL_COMMAND_D,                            IDS_SHELL_COMMAND_T,                            CCommands::ShellCommand,                        {{META+SHIFT, '1', IDC_MS1},\r
225                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
226         {_T("start-kbd-macro"),                         IDS_OTHER,              IDS_START_KBD_MACRO_D,                          IDS_START_KBD_MACRO_T,                          CCommands::StartKbdMacro,                       {{CONTROLX+SHIFT, '9', IDC_CXS9},\r
227                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
228         {_T("switch-to-buffer"),                        IDS_OTHER,              IDS_SWITCH_TO_BUFFER_D,                         IDS_SWITCH_TO_BUFFER_T,                         CCommands::SwitchToBuffer,                      {{CONTROLX, 'B', IDC_CXB},\r
229                                                                                                                                                                                                                                                                                                                                          {CONTROLX+SHIFT, 'B', IDC_CXB},\r
230                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
231         {_T("tab-to-tab-stop"),                         IDS_OTHER,              IDS_TAB_D,                                                      IDS_TAB_T,                                                      CCommands::TabToTabStop,                        {{CONTROL, 'I', IDC_CI},\r
232                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'I', IDC_CI},\r
233                                                                                                                                                                                                                                                                                                                                          {META, 'I', IDC_MI},\r
234                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'I', IDC_MI},\r
235                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
236         {_T("toggle-input-method"),                     IDS_IME,                IDS_TOGGLE_WIN32IME_MODE_D,                     IDS_TOGGLE_WIN32IME_MODE_T,                     CCommands::ToggleInputMethod,           {{CONTROL+CONTROLX, 'J', IDC_CXCJ},\r
237                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'J', IDC_CXCJ},\r
238                                                                                                                                                                                                                                                                                                                                          {CONTROL, 'O', IDC_CO2},\r
239                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'O', IDC_CO2},\r
240                                                                                                                                                                                                                                                                                                                                          {CONTROL, 0xDC, IDC_CBACKSLASH},\r
241                                                                                                                                                                                                                                                                                                                                          {CONTROL, 0xE2, IDC_CBACKSLASH_106},\r
242                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
243         {_T("transpose-chars"),                         IDS_KILL,               IDS_TRANSPOSE_CHARS_D,                          IDS_TRANSPOSE_CHARS_T,                          CCommands::TransposeChars,                      {{CONTROL, 'T', IDC_CT},\r
244                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'T', IDC_CT},\r
245                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
246         {_T("transpose-lines"),                         IDS_KILL,               IDS_TRANSPOSE_LINES_D,                          IDS_TRANSPOSE_LINES_T,                          CCommands::TransposeLines,                      {{CONTROL+CONTROLX, 'T', IDC_CXCT},\r
247                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'T', IDC_CXCT},\r
248                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
249         {_T("transpose-words"),                         IDS_KILL,               IDS_TRANSPOSE_WORDS_D,                          IDS_TRANSPOSE_WORDS_T,                          CCommands::TransposeWords,                      {{META, 'T', IDC_MT},\r
250                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'T', IDC_MT},\r
251                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
252         {_T("undo"),                                            IDS_RECOVERY,   IDS_UNDO_D,                                                     IDS_UNDO_T,                                                     CCommands::Undo,                                        {{CONTROLX, 'U', IDC_CXU},\r
253                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 0xBD, IDC_C_},\r
254                                                                                                                                                                                                                                                                                                                                          {CONTROL, 0xBF, IDC_CSLASH},\r
255                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
256         {_T("universal-argument"),                      IDS_OTHER,              IDS_UNIVERSAL_ARGUMENT_D,                       IDS_UNIVERSAL_ARGUMENT_T,                       CCommands::UniversalArgument,           {{CONTROL, 'U', IDC_CU},\r
257                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'U', IDC_CU},\r
258                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
259         {_T("upcase-word"),                                     IDS_OTHER,              IDS_UPCASE_WORD_D,                                      IDS_UPCASE_WORD_T,                                      CCommands::UpcaseWord,                          {{META, 'U', IDC_MU},\r
260                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'U', IDC_MU},\r
261                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
262         {_T("write-file"),                                      IDS_FILES,              IDS_WRITE_FILE_D,                                       IDS_WRITE_FILE_T,                                       CCommands::WriteFile,                           {{CONTROL+CONTROLX, 'W', IDC_CXCW},\r
263                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'W', IDC_CXCW},\r
264                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
265         {_T("yank"),                                            IDS_KILL,               IDS_YANK_D,                                                     IDS_YANK_T,                                                     CCommands::Yank,                                        {{CONTROL, 'Y', IDC_CY},\r
266                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'Y', IDC_CY},\r
267                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
268         {_T("yank-pop"),                                        IDS_KILL,               IDS_YANK_POP_D,                                         IDS_YANK_POP_T,                                         CCommands::YankPop,                                     {{META, 'Y', IDC_MY},\r
269                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'Y', IDC_MY},\r
270                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
271 };\r
272 \r
273 #pragma data_seg(".xkmcs")\r
274 DWORD CCommands::m_nNumericArgument = 1;\r
275 BOOL CCommands::m_bSetMark = FALSE;\r
276 BOOL CCommands::m_bC_ = FALSE;\r
277 BOOL CCommands::m_bC_x = FALSE;\r
278 BOOL CCommands::m_bM_ = FALSE;\r
279 BOOL CCommands::m_bM_x = FALSE;\r
280 BOOL CCommands::m_bDefaultNumericArgument = TRUE;\r
281 BOOL CCommands::m_bNegativeNumericArgument = FALSE;\r
282 BOOL CCommands::m_bC_u = FALSE;\r
283 SEARCH_DIRECTION CCommands::m_SearchDirection = NA;\r
284 int (*CCommands::m_LastKillCommand)() = NULL;\r
285 int (*CCommands::m_LastCommand)() = NULL;\r
286 BOOL CCommands::m_bFirstFindDialog = FALSE;\r
287 BOOL CCommands::m_bTemporarilyDisableXKeymacs = FALSE;\r
288 CArray<CClipboardSnap *, CClipboardSnap *> CCommands::m_oClipboardData;\r
289 OriginalWindowPosition CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};\r
290 BOOL CCommands::m_bIsSu = FALSE;\r
291 #pragma data_seg()\r
292 \r
293 void CCommands::DepressKey(BYTE bVk)\r
294 {\r
295         CXkeymacsDll::DepressKey(bVk);\r
296 }\r
297 \r
298 void CCommands::ReleaseKey(BYTE bVk)\r
299 {\r
300         CXkeymacsDll::ReleaseKey(bVk);\r
301 }\r
302 \r
303 void CCommands::Kdu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
304 {\r
305         UINT before = CXkeymacsDll::GetModifierState();\r
306         if (CXkeymacsDll::Get326Compatible() || CUtils::IsAtok())\r
307                 before &= ~SHIFT;\r
308         CXkeymacsDll::SetModifierState(0, before);\r
309 \r
310         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
311         if (bVk2)\r
312                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
313         if (bVk3)\r
314                 CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
315         if (bVk4)\r
316                 CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
317 \r
318         CXkeymacsDll::SetModifierState(before, 0);\r
319 }\r
320 \r
321 void CCommands::SdKduSu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
322 {\r
323         UINT before = CXkeymacsDll::GetModifierState();\r
324         CXkeymacsDll::SetModifierState(SHIFT, before);\r
325 \r
326         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
327         if (bVk2)\r
328                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
329         if (bVk3)\r
330                 CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
331         if (bVk4)\r
332                 CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
333 \r
334         if (!(before & SHIFT) && CUtils::IsShuriken()) {\r
335                 m_bIsSu = TRUE;\r
336                 before |= SHIFT;\r
337         }\r
338         CXkeymacsDll::SetModifierState(before, SHIFT);\r
339 }\r
340 \r
341 void CCommands::Su()\r
342 {\r
343         if (m_bIsSu) {\r
344                 ReleaseKey(VK_SHIFT);\r
345                 m_bIsSu = FALSE;\r
346         }\r
347 }\r
348 \r
349 void CCommands::CdKduCu(BYTE bVk1, BYTE bVk2)\r
350 {\r
351         UINT before = CXkeymacsDll::GetModifierState();\r
352         CXkeymacsDll::SetModifierState(CONTROL, before);\r
353 \r
354         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
355         if (bVk2)\r
356                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
357 \r
358         CXkeymacsDll::SetModifierState(before, CONTROL);\r
359 }\r
360 \r
361 void CCommands::CdSdKduSuCu(BYTE bVk)\r
362 {\r
363         UINT before = CXkeymacsDll::GetModifierState();\r
364         CXkeymacsDll::SetModifierState(SHIFT | CONTROL, before);\r
365 \r
366         CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
367 \r
368         CXkeymacsDll::SetModifierState(before, SHIFT | CONTROL);\r
369 }\r
370 \r
371 void CCommands::AdKduAu(BYTE bVk1, BYTE bVk2, BYTE bVk3)\r
372 {\r
373         UINT before = CXkeymacsDll::GetModifierState();\r
374         CXkeymacsDll::SetModifierState(META, before);\r
375 \r
376         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
377         if (bVk2)\r
378                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
379         if (bVk3)\r
380                 CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
381 \r
382         CXkeymacsDll::SetModifierState(before, META);\r
383 }\r
384 \r
385 void CCommands::AdSdKduSuAu(BYTE bVk1)\r
386 {\r
387         UINT before = CXkeymacsDll::GetModifierState();\r
388         CXkeymacsDll::SetModifierState(SHIFT | META, before);\r
389 \r
390         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
391 \r
392         CXkeymacsDll::SetModifierState(before, SHIFT | META);\r
393 }\r
394 \r
395 void CCommands::AdCdKduCuAu(BYTE bVk1)\r
396 {\r
397         UINT before = CXkeymacsDll::GetModifierState();\r
398         CXkeymacsDll::SetModifierState(CONTROL | META, before);\r
399 \r
400         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
401 \r
402         CXkeymacsDll::SetModifierState(before, CONTROL | META);\r
403 }\r
404 \r
405 // C-a: Home\r
406 int CCommands::BeginningOfLine()\r
407 {\r
408         int nNumericArgument = 1;\r
409         if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
410                 nNumericArgument = m_nNumericArgument;\r
411                 if (m_bNegativeNumericArgument) {\r
412                         if (nNumericArgument) {\r
413                                 nNumericArgument *= -1;\r
414                         } else {\r
415                                 nNumericArgument = -1;\r
416                         }\r
417                 }\r
418         }\r
419         ClearNumericArgument();\r
420 \r
421         if (nNumericArgument <= 0) {\r
422                 nNumericArgument = -1 * nNumericArgument + 1;\r
423                 while (nNumericArgument--) {\r
424                         ReleaseKey(VK_CONTROL); // why?\r
425                         while (MoveCaret(VK_UP) != GOTO_HOOK);\r
426                 }\r
427                 ReleaseKey(VK_CONTROL); // why?\r
428                 while (MoveCaret(VK_HOME) != GOTO_HOOK);\r
429                 DepressKey(VK_CONTROL); // why?\r
430         } else if (nNumericArgument == 1) {\r
431                 return Reset(MoveCaret(VK_HOME));\r
432         } else if (2 <= nNumericArgument) {\r
433                 nNumericArgument -= 2;\r
434                 while (nNumericArgument--) {\r
435                         ReleaseKey(VK_CONTROL); // why?\r
436                         while (MoveCaret(VK_DOWN) != GOTO_HOOK);\r
437                 }\r
438                 ReleaseKey(VK_CONTROL); // why?\r
439                 while (MoveCaret(VK_END) != GOTO_HOOK);\r
440                 while (MoveCaret(VK_RIGHT) != GOTO_HOOK);\r
441                 DepressKey(VK_CONTROL); // why?\r
442         } else {\r
443                 ASSERT(0);\r
444         }\r
445         return Reset(GOTO_HOOK);\r
446 }\r
447 \r
448 // C-b: Left\r
449 int CCommands::BackwardChar()\r
450 {\r
451         if (m_bNegativeNumericArgument) {\r
452                 m_bNegativeNumericArgument = FALSE;\r
453                 return ForwardChar();\r
454         }\r
455 \r
456         return Reset(MoveCaret(VK_LEFT));\r
457 }\r
458 \r
459 // M-b: backward-word\r
460 int CCommands::BackwardWord()\r
461 {\r
462         if (m_bNegativeNumericArgument) {\r
463                 m_bNegativeNumericArgument = FALSE;\r
464                 return ForwardWord();\r
465         }\r
466 \r
467         return Reset(MoveCaret(VK_LEFT, TRUE));\r
468 }\r
469 \r
470 // C-e: End\r
471 int CCommands::EndOfLine()\r
472 {\r
473         int nNumericArgument = 1;\r
474         if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
475                 nNumericArgument = m_nNumericArgument;\r
476                 if (m_bNegativeNumericArgument) {\r
477                         if (nNumericArgument) {\r
478                                 nNumericArgument *= -1;\r
479                         } else {\r
480                                 nNumericArgument = -1;\r
481                         }\r
482                 }\r
483         }\r
484         ClearNumericArgument();\r
485         if (nNumericArgument <= 0) {\r
486                 nNumericArgument *= -1;\r
487                 while (nNumericArgument--) {\r
488                         ReleaseKey(VK_CONTROL); // why?\r
489                         while (MoveCaret(VK_UP) != GOTO_HOOK);\r
490                 }\r
491                 ReleaseKey(VK_CONTROL); // why?\r
492                 while (MoveCaret(VK_HOME) != GOTO_HOOK);\r
493                 while (MoveCaret(VK_LEFT) != GOTO_HOOK);\r
494                 DepressKey(VK_CONTROL); // why?\r
495         } else if (nNumericArgument == 1) {\r
496                 return (MoveCaret(VK_END));\r
497         } else if (2 <= nNumericArgument) {\r
498                 --nNumericArgument;\r
499                 while (nNumericArgument--) {\r
500                         ReleaseKey(VK_CONTROL); // why?\r
501                         while (MoveCaret(VK_DOWN) != GOTO_HOOK);\r
502                 }\r
503                 ReleaseKey(VK_CONTROL); // why?\r
504                 while (MoveCaret(VK_END) != GOTO_HOOK);\r
505                 DepressKey(VK_CONTROL); // why?\r
506         } else {\r
507                 ASSERT(0);\r
508         }\r
509         return Reset(GOTO_HOOK);\r
510 }\r
511 \r
512 // C-f: Right\r
513 int CCommands::ForwardChar()\r
514 {\r
515 //      TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
516 //      GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
517 //      CUtils::Log("C-f: %s", szWindowText);\r
518 \r
519         if (m_bNegativeNumericArgument) {\r
520                 m_bNegativeNumericArgument = FALSE;\r
521                 return BackwardChar();\r
522         }\r
523 \r
524         return Reset(MoveCaret(VK_RIGHT));\r
525 }\r
526 \r
527 // M-f: forward-word\r
528 int CCommands::ForwardWord()\r
529 {\r
530         if (m_bNegativeNumericArgument) {\r
531                 m_bNegativeNumericArgument = FALSE;\r
532                 return BackwardWord();\r
533         }\r
534 \r
535         return Reset(MoveCaret(VK_RIGHT, TRUE));\r
536 }\r
537 \r
538 // C-n: Down\r
539 int CCommands::NextLine()\r
540 {\r
541 //      CUtils::Log(_T("C-n"));\r
542 \r
543         if (m_bNegativeNumericArgument) {\r
544                 m_bNegativeNumericArgument = FALSE;\r
545                 return PreviousLine();\r
546         }\r
547 \r
548         return Reset(MoveCaret(VK_DOWN));\r
549 }\r
550 \r
551 // C-o: open-line\r
552 int CCommands::OpenLine()\r
553 {\r
554         static const int DEFAULT_NUMERIC_ARGUMENT = -1;\r
555         static int nNumericArgument = DEFAULT_NUMERIC_ARGUMENT;\r
556 \r
557         if (nNumericArgument == DEFAULT_NUMERIC_ARGUMENT) {\r
558                 nNumericArgument = m_nNumericArgument;\r
559                 ClearNumericArgument();\r
560         }\r
561 \r
562         if (CUtils::IsHidemaru()\r
563          || CUtils::IsTuruKameMail()) {\r
564                 static int nStep = 0;\r
565 \r
566                 switch (nStep) {\r
567                 case 0:\r
568                         CdKduCu('M');\r
569                         nStep = 1;\r
570                         return Reset(GOTO_RECURSIVE);\r
571                 case 1:\r
572                         nStep = 0;\r
573                         Kdu(VK_UP, VK_END);\r
574                         if (--nNumericArgument) {\r
575                                 return Reset(GOTO_RECURSIVE);\r
576                         }\r
577                         break;\r
578                 }\r
579         } else {\r
580                 while (nNumericArgument--) {\r
581                         Kdu(VK_RETURN, VK_UP, VK_END);\r
582                 }\r
583         }\r
584 \r
585         nNumericArgument = DEFAULT_NUMERIC_ARGUMENT;\r
586         return Reset(GOTO_HOOK);\r
587 }\r
588 \r
589 // C-p: Up\r
590 int CCommands::PreviousLine()\r
591 {\r
592         if (m_bNegativeNumericArgument) {\r
593                 m_bNegativeNumericArgument = FALSE;\r
594                 return NextLine();\r
595         }\r
596 \r
597         return Reset(MoveCaret(VK_UP));\r
598 }\r
599 \r
600 // M-%\r
601 int CCommands::QueryReplace()\r
602 {\r
603         ClearNumericArgument();\r
604         if (CUtils::IsBecky()) {\r
605                 CdKduCu('Q', 'A');\r
606         } else if (CUtils::IsEclipse()\r
607                         || CUtils::IsInternetExplorer()\r
608                         || CUtils::IsLotusNotes()\r
609                         || CUtils::IsSleipnir()) {\r
610                 CdKduCu('F');\r
611         } else if (CUtils::IsAutla()\r
612                         || CUtils::IsBorlandCppBuilder()\r
613                         || CUtils::IseMemoPad()\r
614                         || CUtils::IsNami2000()\r
615                         || CUtils::IsStoryEditor()) {\r
616                 CdKduCu('R');\r
617         } else if (CUtils::IsEdLeaf()) {\r
618                 AdKduAu('E', 'E');\r
619         } else if (CUtils::IsPHPEditor()) {\r
620                 AdKduAu('S', 'F');\r
621         } else {\r
622                 CdKduCu('H');\r
623         }\r
624         return Reset(GOTO_HOOK);\r
625 }\r
626 \r
627 // C-M-%\r
628 int CCommands::QueryReplaceRegexp()\r
629 {\r
630         return QueryReplace();\r
631 }\r
632 \r
633 // M-<:\r
634 int CCommands::BeginningOfBuffer()\r
635 {\r
636         ClearNumericArgument();\r
637         return Reset(MoveCaret(VK_HOME, TRUE));\r
638 }\r
639 \r
640 // M->:\r
641 int CCommands::EndOfBuffer()\r
642 {\r
643         ClearNumericArgument();\r
644         return Reset(MoveCaret(VK_END, TRUE));\r
645 }\r
646 \r
647 // C-h: Back space\r
648 int CCommands::DeleteBackwardChar()\r
649 {\r
650         if (m_bNegativeNumericArgument) {\r
651                 m_bNegativeNumericArgument = FALSE;\r
652                 return DeleteChar();\r
653         }\r
654 \r
655         Kdu(VK_BACK);\r
656         m_bSetMark = FALSE;\r
657         return Reset(GOTO_HOOK);\r
658 }\r
659 \r
660 // C-d: Delete\r
661 int CCommands::DeleteChar()\r
662 {\r
663         if (m_bNegativeNumericArgument) {\r
664                 m_bNegativeNumericArgument = FALSE;\r
665                 return DeleteBackwardChar();\r
666         }\r
667 \r
668         m_bSetMark = FALSE;\r
669         Kdu(VK_DELETE);\r
670         return Reset(GOTO_HOOK);\r
671 }\r
672 \r
673 int CCommands::KillLineForAllFormat()\r
674 {\r
675         return KillLine(TRUE, KillLineForAllFormat);\r
676 }\r
677 \r
678 // C-k: Shift-End, Shift-Delete, if the cursor is not at EOL (is End Of Line)\r
679 //              Shift-Right, Cut, if the cursor is at EOL\r
680 int CCommands::KillLine()\r
681 {\r
682         return KillLine(FALSE);\r
683 }\r
684 \r
685 int CCommands::KillLine(BOOL bAllFormat, int (*pCommand)())\r
686 {\r
687         static BOOL bKeepAllFormat = FALSE;\r
688 \r
689         // Do not try to do these command at once.\r
690         // Clipboard has old data till you go out this function.\r
691         static int nStep = 0;\r
692         static int nPrevStep = 0;\r
693         static int nRepeat = 0;\r
694         static CString szClipboardText;\r
695         static BOOL bContinuous = FALSE;\r
696         static BOOL bTopOfFile = FALSE;\r
697 \r
698         if (nStep == nPrevStep) {\r
699                 ++nRepeat;\r
700         } else {\r
701                 nRepeat = 0;\r
702                 nPrevStep = nStep;\r
703         }\r
704 \r
705         switch (nStep) {\r
706         case 0:         // Clear Selection and get next character to confirm the cursor is at the EOF or not.\r
707 //              CUtils::Log(_T("C-k: 0"));\r
708                 bTopOfFile = FALSE;\r
709 \r
710                 if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
711                         if (m_bNegativeNumericArgument || m_nNumericArgument == 0) {\r
712                                 // Shift+Up x -n Shift+Home Ctrl+X\r
713                                 SdKduSu(VK_UP);\r
714                                 ClearNumericArgument();\r
715                                 SdKduSu(VK_HOME);\r
716                         } else {\r
717                                 // Shift+Down x (n - 1) Shift+End Shift+Right Ctrl+X\r
718                                 --m_nNumericArgument;\r
719                                 SdKduSu(VK_DOWN);\r
720                                 ClearNumericArgument();\r
721                                 SdKduSu(VK_END, VK_RIGHT);\r
722                         }\r
723                         CdKduCu('X');\r
724                         nStep = 6;\r
725                         return Reset(GOTO_RECURSIVE);\r
726                 }\r
727 \r
728                 if (m_LastCommand == pCommand) {\r
729                         bContinuous = TRUE;\r
730                 } else {\r
731                         bContinuous = FALSE;\r
732                         if (m_bSetMark) {\r
733                                 m_bSetMark = FALSE;\r
734                                 DeactivateMark();\r
735                         }\r
736                 }\r
737 \r
738                 if (CUtils::IsDirector()\r
739                  || CUtils::IsEudora()) {\r
740                         nStep = 1;\r
741                         return Reset(GOTO_RECURSIVE);\r
742                 }\r
743 \r
744                 if (CUtils::IsLotus123()) {\r
745                         // C-k: Shift-End, Control-x\r
746                         SdKduSu(VK_END);\r
747                         CdKduCu('X');\r
748                         return Reset(GOTO_HOOK);\r
749                 }\r
750 \r
751                 CaptureClipboardData(0, CUtils::IsLotusNotes());\r
752 \r
753                 if (!CopyNextCharacter()) {\r
754 //                      CUtils::Log(_T("Error: CopyNextCharacter"));\r
755                         return Reset(GOTO_DO_NOTHING);\r
756                 }\r
757 \r
758                 nStep = 4;\r
759                 return Reset(GOTO_RECURSIVE);\r
760         case 1:         // Get back character to confirm the cursor is at the TOF or not only for Macromedia Director.\r
761 //              CUtils::Log(_T("C-k: 1"));\r
762                 nStep = 0;\r
763                 CaptureClipboardData();\r
764 \r
765                 if (!CopyBackCharacter()) {\r
766                         return Reset(GOTO_DO_NOTHING);\r
767                 }\r
768 \r
769                 nStep = 2;\r
770                 return Reset(GOTO_RECURSIVE);\r
771         case 2:         // Confirm the cursor is at the TOF or not only for Macromedia Director.\r
772                 {\r
773 //                      CUtils::Log(_T("C-k: 2"));\r
774                         nStep = 0;\r
775                         Su();\r
776 \r
777                         if (CUtils::IsTOF()) {\r
778                                 bTopOfFile = TRUE;\r
779                         }\r
780 \r
781                         // CopyBackCharacter move cursor right\r
782                         Kdu(VK_LEFT);\r
783                         RestoreClipboardData();\r
784 \r
785                         nStep = 3;\r
786                         return Reset(GOTO_RECURSIVE);\r
787                 }\r
788         case 3:         // Get next character to confirm the cursor is at the EOF or not.\r
789 //              CUtils::Log(_T("C-k: 3"));\r
790                 nStep = 0;\r
791 \r
792                 if (CUtils::IsLotus123()) {\r
793                         // C-k: Shift-End, Control-x\r
794                         SdKduSu(VK_END);\r
795                         CdKduCu('X');\r
796                         return Reset(GOTO_HOOK);\r
797                 }\r
798 \r
799                 CaptureClipboardData();\r
800 \r
801                 if (!CopyNextCharacter()) {\r
802 //                      CUtils::Log(_T("Error: CopyNextCharacter"));\r
803                         return Reset(GOTO_DO_NOTHING);\r
804                 }\r
805 \r
806                 nStep = 4;\r
807                 return Reset(GOTO_RECURSIVE);\r
808         case 4:         // Cut line\r
809 //              CUtils::Log(_T("C-k: 4"));\r
810                 nStep = 0;\r
811                 Su();\r
812 \r
813                 if ((CUtils::IsDirector()\r
814                   || CUtils::IsEudora())\r
815                  && !bTopOfFile) {\r
816                         // CopyNextCharacter move cursor left\r
817                         Kdu(VK_RIGHT);\r
818                 }\r
819 \r
820                 CUtils::GetClipboardText(&szClipboardText);\r
821 //              CUtils::Log(_T("%x, %s"), szClipboardText.GetAt(0), szClipboardText);\r
822 \r
823                 if (szClipboardText.IsEmpty()) {        // EOF\r
824 //                      CUtils::Log(_T("C-k: EOF"));\r
825                         if (CUtils::IsLotusWordPro()\r
826                          || CUtils::IsMicrosoftFrontPage()\r
827                          || CUtils::IsMicrosoftWord()) {\r
828                                 SdKduSu(VK_RIGHT);\r
829                                 Cut_();\r
830                                 nStep = 5;\r
831                                 return Reset(GOTO_RECURSIVE);\r
832                         } else if (CUtils::IsLotusNotes()) {\r
833                                 Kdu(VK_END);\r
834                                 ReleaseKey(VK_CONTROL); // Why is it needed?\r
835                                 SdKduSu(VK_DOWN, VK_HOME);\r
836                                 Copy_();\r
837                                 DepressKey(VK_CONTROL); // Why is it needed?\r
838                                 nStep = 5;\r
839                                 return Reset(GOTO_RECURSIVE);\r
840                         } else {\r
841                                 // default\r
842                                 Kdu(VK_RIGHT);\r
843                                 RestoreClipboardData();\r
844 //                              CUtils::Log(_T("C-k: 4-1"));\r
845                                 return Reset(GOTO_HOOK);\r
846                         }\r
847                 }\r
848 \r
849                 if (szClipboardText.GetAt(0) != VK_RETURN) {\r
850 //                      CUtils::Log(_T("C-k: szClipboardText.GetAt(0) != VK_RETURN"));\r
851                         if (CUtils::IsDirector()) {\r
852                                 ReleaseKey(VK_CONTROL);\r
853                                 SdKduSu(VK_END);\r
854                                 Copy_();\r
855                                 DepressKey(VK_CONTROL);\r
856                         } else if (CUtils::IseMemoPad()\r
857                                         || CUtils::IsHidemaru() // Hidemaru clears mark after copy.\r
858                                         || CUtils::IsOpenOffice()\r
859                                         || CUtils::IsTuruKameMail()) {\r
860                                 SdKduSu(VK_END);\r
861                                 Cut_();\r
862                         } else if (CUtils::IsLotusWordPro()\r
863                                         || CUtils::IsMicrosoftWord()) {\r
864                                 SdKduSu(VK_END, VK_LEFT);\r
865                                 Cut_();\r
866                         } else {\r
867                                 SdKduSu(VK_END);\r
868                                 Copy_();\r
869                         }\r
870                 } else {        // EOL\r
871 //                      CUtils::Log(_T("C-k: EOL"));\r
872                         if (CUtils::IsDirector()) {\r
873                                 ReleaseKey(VK_CONTROL);\r
874                                 SdKduSu(VK_RIGHT);\r
875                                 Copy_();\r
876                                 DepressKey(VK_CONTROL);\r
877                         } else if (CUtils::IsEclipse()\r
878                                         || CUtils::IsStoryEditor()) {\r
879                                 SdKduSu(VK_RIGHT);\r
880                                 Copy_();\r
881                         } else if (CUtils::IseMemoPad()\r
882                                         || CUtils::IsHidemaru() // Hidemaru clears mark after copy.\r
883                                         || CUtils::IsOpenOffice()\r
884                                         || CUtils::IsTuruKameMail()) {\r
885                                 SdKduSu(VK_RIGHT);\r
886                                 Cut_();\r
887                         } else {\r
888                                 SdKduSu(VK_RIGHT);\r
889                                 Copy_();\r
890                         }\r
891                 }\r
892 \r
893                 nStep = 5;\r
894                 return Reset(GOTO_RECURSIVE);\r
895         case 5:         // input return if XKeymacs not only line but also line feed code and set the kill-line data on the clipboard.\r
896 //              CUtils::Log(_T("C-k: 5"));\r
897                 nStep = 0;\r
898 \r
899                 if (1000 < nRepeat) {\r
900 //                      CUtils::Log(_T("C-k: 5-1"));\r
901                         nStep = 6;\r
902                         return Reset(GOTO_RECURSIVE);\r
903                 }\r
904 \r
905 //              CUtils::Log(_T("C-k: 5-1-1"));\r
906                 Su();\r
907 //              CUtils::Log(_T("C-k: 5-1-2"));\r
908                 CaptureClipboardData(1, CUtils::IsLotusNotes());\r
909 //              CUtils::Log(_T("C-k: 5-1-3"));\r
910 \r
911 //              if (m_oClipboardData.GetSize() < 1 || m_oClipboardData[0] == NULL) {\r
912 ////                    CUtils::Log(_T("C-k: 5-2"));\r
913 //                      nStep = 6;\r
914 //                      return Reset(GOTO_RECURSIVE);\r
915 //              } else if (m_oClipboardData.GetSize() < 2 || m_oClipboardData[1] == NULL) {\r
916 ////                    CUtils::Log(_T("C-k: 5-3"));\r
917 //                      nStep = 5;\r
918 //                      return Reset(GOTO_RECURSIVE);\r
919 //              }\r
920 \r
921                 if (CUtils::IseMemoPad()\r
922                  || CUtils::IsHidemaru()        // Hidemaru clears mark after copy.\r
923                  || CUtils::IsLotusWordPro()\r
924                  || CUtils::IsMicrosoftWord ()\r
925                  || CUtils::IsOpenOffice()\r
926                  || CUtils::IsTuruKameMail()) {\r
927                         // do nothing\r
928 //                      CUtils::Log(_T("C-k: 5-4"));\r
929                 } else {\r
930                         // This changed will be required to avoid Thunderbird bug.\r
931                         // if (0 < FindReturnFromClipboardData(1) && !CUtils::IsExcel() && !CUtils::IsThunderbird()) {\r
932                         if (0 < FindReturnFromClipboardData(1) && !CUtils::IsExcel()) {\r
933 //                              CUtils::Log(_T("C-k: 5-5"));\r
934                                 SdKduSu(VK_LEFT);\r
935                                 Copy_();\r
936                                 nStep = 5;\r
937                                 return Reset(GOTO_RECURSIVE);\r
938                         } else {\r
939                                 Kdu(VK_DELETE);\r
940 //                              CUtils::Log(_T("C-k: 5-6"));\r
941                         }\r
942                 }\r
943 \r
944                 bKeepAllFormat = bAllFormat;\r
945                 if (!bKeepAllFormat\r
946                  && !m_oClipboardData[1]->IsAllMergeableFormat()) {\r
947 //                      CUtils::Log(_T("C-k: 5-7"));\r
948                         bKeepAllFormat = TRUE;\r
949                 }\r
950 \r
951                 if (bContinuous && !bKeepAllFormat) {\r
952 //                      CUtils::Log(_T("C-k: 5-8"));\r
953                         *m_oClipboardData[0] += *m_oClipboardData[1];\r
954                 } else {\r
955 //                      CUtils::Log(_T("C-k: 5-9"));\r
956                         *m_oClipboardData[0] = *m_oClipboardData[1];\r
957                 }\r
958                 RestoreClipboardData(0);\r
959 \r
960 //              CUtils::Log(_T("C-k: 5-10"));\r
961                 nStep = 6;\r
962                 return Reset(GOTO_RECURSIVE);\r
963         case 6:         // add data into kill-ring\r
964 //              CUtils::Log(_T("C-k: 6"));\r
965                 nStep = 0;\r
966                 Su();\r
967 \r
968                 if (bContinuous && bKeepAllFormat) {\r
969                         CXkeymacsDll::AddKillRing(FALSE);\r
970                 } else {\r
971                         CXkeymacsDll::AddKillRing();\r
972                 }\r
973                 return Reset(GOTO_HOOK);\r
974                 break;\r
975         }\r
976 \r
977         return Reset(GOTO_HOOK);\r
978 }\r
979 \r
980 // C-x u: C-/: C-_: Ctrl-Z\r
981 int CCommands::Undo()\r
982 {\r
983         if (CUtils::IsMicrosoftWord()) {\r
984                 UINT before = CXkeymacsDll::GetModifierState();\r
985                 CXkeymacsDll::SetModifierState(CONTROL, before);\r
986                 PostMessage(GetFocus(), WM_KEYDOWN, 'Z', 0);\r
987                 CXkeymacsDll::SetModifierState(before, CONTROL);\r
988         } else\r
989                 CdKduCu('Z');\r
990         return Reset(GOTO_HOOK);\r
991 }\r
992 \r
993 // C-x C-c: Alt-Space, Alt-C\r
994 int CCommands::SaveBuffersKillEmacs()\r
995 {\r
996         ClearNumericArgument();\r
997 \r
998         HWND hWnd = GetForegroundWindow();\r
999         if (hWnd) {\r
1000                 OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
1001                 if (pPos && pPos->bMax[ROLL_UP_UNROLL]) {\r
1002                         RollUpUnroll();\r
1003                 }\r
1004         }\r
1005 \r
1006         if (CUtils::IsConsole()) {\r
1007                 SystemMenu(CMD_CLOSE);\r
1008         } else if (CUtils::IsExplorer()) {\r
1009                 if (!CUtils::IsXPorLater()) {\r
1010                         ReleaseKey(VK_CONTROL);\r
1011                 }\r
1012                 AdKduAu(VK_F4);\r
1013         } else if (CUtils::IsInternetExplorer()\r
1014                         || CUtils::IsJavaW()) {\r
1015                 AdKduAu(VK_F4);\r
1016         } else {\r
1017                 AdKduAu(VK_SPACE, 'C');\r
1018         }\r
1019         return Reset(GOTO_HOOK);\r
1020 }\r
1021 \r
1022 // C-z: Alt-Space, Alt-N\r
1023 int CCommands::IconifyOrDeiconifyFrame()\r
1024 {\r
1025         ClearNumericArgument();\r
1026         if (CUtils::IsConsole()) {\r
1027                 SystemMenu(CMD_MINIMIZE);\r
1028         } else {\r
1029                 AdKduAu(VK_SPACE, 'N');\r
1030         }\r
1031         return Reset(GOTO_HOOK);\r
1032 }\r
1033 \r
1034 int CCommands::Restore()\r
1035 {\r
1036         ClearNumericArgument();\r
1037         if (CUtils::IsConsole()) {\r
1038                 SystemMenu(CMD_RESTORE);\r
1039         } else {\r
1040                 AdKduAu(VK_SPACE, 'R');\r
1041         }\r
1042         return Reset(GOTO_HOOK);\r
1043 }\r
1044 \r
1045 int CCommands::Move()\r
1046 {\r
1047         ClearNumericArgument();\r
1048         if (CUtils::IsConsole()) {\r
1049                 SystemMenu(CMD_MOVE);\r
1050         } else {\r
1051                 AdKduAu(VK_SPACE, 'M');\r
1052         }\r
1053         return Reset(GOTO_HOOK);\r
1054 }\r
1055 \r
1056 int CCommands::Size()\r
1057 {\r
1058         ClearNumericArgument();\r
1059         if (CUtils::IsConsole()) {\r
1060                 SystemMenu(CMD_SIZE);\r
1061         } else {\r
1062                 AdKduAu(VK_SPACE, 'S');\r
1063         }\r
1064         return Reset(GOTO_HOOK);\r
1065 }\r
1066 \r
1067 int CCommands::Minimize()\r
1068 {\r
1069         return IconifyOrDeiconifyFrame();\r
1070 }\r
1071 \r
1072 int CCommands::Maximize()\r
1073 {\r
1074         ClearNumericArgument();\r
1075 \r
1076         HWND hWnd = GetForegroundWindow();\r
1077         if (!hWnd) {\r
1078                 return Reset(GOTO_HOOK);\r
1079         }\r
1080 \r
1081         WINDOWPLACEMENT wndpl = {sizeof(WINDOWPLACEMENT)};\r
1082         if (!GetWindowPlacement(hWnd, &wndpl)) {\r
1083                 return Reset(GOTO_HOOK);\r
1084         }\r
1085 \r
1086         if (wndpl.showCmd == SW_SHOWMAXIMIZED) {\r
1087                 wndpl.showCmd = SW_RESTORE;\r
1088         } else {\r
1089                 wndpl.showCmd = SW_SHOWMAXIMIZED;\r
1090         }\r
1091 \r
1092         SetWindowPlacement(hWnd, &wndpl);\r
1093         return Reset(GOTO_HOOK);\r
1094 }\r
1095 \r
1096 OriginalWindowPosition* CCommands::GetOriginalWindowPosition(HWND hWnd)\r
1097 {\r
1098         for (int i = 0; i < MAX_WINDOW; ++i) {\r
1099                 if (m_OriginalWindowPosition[i].hWnd == hWnd) {\r
1100                         return &m_OriginalWindowPosition[i];\r
1101                 }\r
1102         }\r
1103 \r
1104         for (int j = 0; j < MAX_WINDOW; ++j) {\r
1105                 if (m_OriginalWindowPosition[j].hWnd == 0) {\r
1106                         m_OriginalWindowPosition[j].hWnd = hWnd;\r
1107                         memset(&m_OriginalWindowPosition[(j + 1) % MAX_WINDOW], 0, sizeof(OriginalWindowPosition));\r
1108                         return &m_OriginalWindowPosition[j];\r
1109                 }\r
1110         }\r
1111 \r
1112         ASSERT(0);\r
1113         return NULL;\r
1114 }\r
1115 \r
1116 int CCommands::Maximize(MAXIMIZE_DIRECTION direction)\r
1117 {\r
1118         ClearNumericArgument();\r
1119 \r
1120         HWND hWnd = GetForegroundWindow();\r
1121         if (!hWnd) {\r
1122                 return Reset(GOTO_HOOK);\r
1123         }\r
1124 \r
1125         RECT workarea = {'\0'};\r
1126         if (!SystemParametersInfo(SPI_GETWORKAREA, 0, &workarea, 0)) {\r
1127                 return Reset(GOTO_HOOK);\r
1128         }\r
1129 \r
1130         RECT window = {'\0'};\r
1131         if (!GetWindowRect(hWnd, &window)) {\r
1132                 return Reset(GOTO_HOOK);\r
1133         }\r
1134 \r
1135         OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
1136         if (!pPos) {\r
1137                 return Reset(GOTO_HOOK);\r
1138         }\r
1139 \r
1140         int X = window.left;\r
1141         int Y = window.top;\r
1142         int nWidth = window.right - window.left;\r
1143         int nHeight = window.bottom - window.top;\r
1144 \r
1145         switch (direction) {\r
1146         case VERTICAL:\r
1147                 if (pPos->bMax[direction]) {\r
1148                         Y = pPos->nOriginalY;\r
1149                         nHeight = pPos->nOriginalHeight;\r
1150                 } else {\r
1151                         pPos->nOriginalY = Y;\r
1152                         pPos->nOriginalHeight = nHeight;\r
1153 \r
1154                         Y = workarea.top;\r
1155                         nHeight = workarea.bottom - workarea.top;\r
1156                 }\r
1157                 break;\r
1158         case HORIZONTAL:\r
1159                 if (pPos->bMax[direction]) {\r
1160                         X = pPos->nOriginalX;\r
1161                         nWidth = pPos->nOriginalWidth;\r
1162                 } else {\r
1163                         pPos->nOriginalX = X;\r
1164                         pPos->nOriginalWidth = nWidth;\r
1165 \r
1166                         X = workarea.left;\r
1167                         nWidth = workarea.right - workarea.left;\r
1168                 }\r
1169                 break;\r
1170         case ROLL_UP_UNROLL:\r
1171                 if (pPos->bMax[direction]) {\r
1172                         nHeight = pPos->nOriginalHeight;\r
1173                 } else {\r
1174                         pPos->nOriginalHeight = nHeight;\r
1175 \r
1176                         nHeight = 0x15;\r
1177                 }\r
1178                 break;\r
1179         default:\r
1180                 ASSERT(0);\r
1181                 break;\r
1182         }\r
1183 \r
1184         MoveWindow(hWnd, X, Y, nWidth, nHeight, TRUE);\r
1185         pPos->bMax[direction] = !pPos->bMax[direction];\r
1186         return Reset(GOTO_HOOK);\r
1187 }\r
1188 \r
1189 int CCommands::MaximizeVertically()\r
1190 {\r
1191         return Maximize(VERTICAL);\r
1192 }\r
1193 \r
1194 int CCommands::MaximizeHorizontally()\r
1195 {\r
1196         return Maximize(HORIZONTAL);\r
1197 }\r
1198 \r
1199 // C-Space: \r
1200 int CCommands::SetMarkCommand()\r
1201 {\r
1202         ClearNumericArgument();\r
1203         if (m_bSetMark) {\r
1204                 DeactivateMark();\r
1205         }\r
1206         m_bSetMark = TRUE;\r
1207 \r
1208         if (CUtils::IsConsole()) {\r
1209                 SystemMenuEdit(CMD_MARK);\r
1210         }\r
1211 \r
1212         return Reset(GOTO_HOOK);\r
1213 }\r
1214 \r
1215 // C-g: Keyboard quit\r
1216 int CCommands::KeyboardQuit()\r
1217 {\r
1218         ClearNumericArgument();\r
1219         if (CUtils::IsFindDialog()) {\r
1220                 Kdu(VK_ESCAPE);\r
1221         }\r
1222         if (m_bSetMark) {\r
1223                 m_bSetMark = FALSE;\r
1224                 DeactivateMark();\r
1225         }\r
1226         SetTemporarilyDisableXKeymacs(FALSE);\r
1227         return Reset(GOTO_HOOK);\r
1228 }\r
1229 \r
1230 DWORD CCommands::ClickCaret()\r
1231 {\r
1232         HWND hWnd = GetFocus();\r
1233 \r
1234         POINT CaretPos = {'\0'};\r
1235         if (!GetCaretPos(&CaretPos)) {\r
1236                 return GetLastError();\r
1237         }\r
1238 //      CUtils::Log(_T("client: x = %d, y = %d"), CaretPos.x, CaretPos.y);\r
1239 \r
1240         if (!ClientToScreen(hWnd, &CaretPos)) {\r
1241                 return GetLastError();\r
1242         }\r
1243 //      CUtils::Log(_T("screen: x = %d, y = %d"), CaretPos.x, CaretPos.y);\r
1244 \r
1245         POINT Delta = {0, 1};\r
1246         if (CUtils::IsSakuraEditor()) {\r
1247                 Delta.x = 1;\r
1248                 Delta.y = 29;   // OK: 29-42 NG: 28, 43\r
1249         }\r
1250 \r
1251         const POINT clickPoint = {CaretPos.x + Delta.x, CaretPos.y + Delta.y};\r
1252         return Click(&clickPoint);\r
1253 }\r
1254 \r
1255 DWORD CCommands::DeactivateMark()\r
1256 {\r
1257         if (CUtils::IsOpenOffice() || CUtils::IsVisualStudio() || CUtils::IsVisualBasicEditor()) {\r
1258                 // GetCaretPos always returen (x,y) = (0,0) on OpenOffice and Visual Studio, so ...\r
1259                 // GetCaretPos always returen (x,y) = (-2199,*) on M$ Excel VBE, so ...\r
1260                 Kdu(VK_ESCAPE);\r
1261                 return ERROR_SUCCESS;   // i.e. return 0;\r
1262         }\r
1263         if (CUtils::IsFlash() || CUtils::IsInternetExplorer() || CUtils::IsMicrosoftPowerPoint() ||\r
1264                         CUtils::IsMicrosoftWord() || CUtils::IsSleipnir() || CUtils::IsThunderbird()) {\r
1265                 // GetCaretPos always returen (x,y) = (0,0) on M$ Word and Thunderbird, so ...\r
1266                 // GetCaretPos always returen start point on IE (and Sleipnir that uses IE), so ...\r
1267                 Kdu(VK_RIGHT);\r
1268                 return ERROR_SUCCESS;   // i.e. return 0;\r
1269         }\r
1270         if (CUtils::IsDirector()) {\r
1271                 // GetCaretPos always returen (x,y) = (0,0) on Macromedia Director, so ...\r
1272                 Kdu(VK_RIGHT, VK_LEFT);\r
1273                 return ERROR_SUCCESS;   // i.e. return 0;\r
1274         }\r
1275         if (CUtils::IsExplorer()) {\r
1276                 AdKduAu('E', 'A');\r
1277                 AdKduAu('E', 'I');\r
1278                 return ERROR_SUCCESS;   // i.e. return 0;\r
1279         }\r
1280         return ClickCaret();\r
1281 }\r
1282 \r
1283 // C-x C-f: Alt-F, Alt-O\r
1284 int CCommands::FindFile()\r
1285 {\r
1286         ClearNumericArgument();\r
1287         if (CUtils::IsFlash()\r
1288          || CUtils::IsSleipnir()) {\r
1289                 CdKduCu('O');\r
1290         } else if (CUtils::IsVisualStudio()) {\r
1291                 AdKduAu('F', 'O', 'F');\r
1292         } else {\r
1293                 AdKduAu('F', 'O');\r
1294         }\r
1295         return Reset(GOTO_HOOK);\r
1296 }\r
1297 \r
1298 // C-i: Tab\r
1299 int CCommands::TabToTabStop()\r
1300 {\r
1301         ClearNumericArgument();\r
1302         if (m_bSetMark) {\r
1303                 m_bSetMark = FALSE;\r
1304         }\r
1305         Kdu(VK_TAB);\r
1306         return Reset(GOTO_HOOK);\r
1307 }\r
1308 \r
1309 // C-m: Enter\r
1310 int CCommands::Newline()\r
1311 {\r
1312         Kdu(VK_RETURN);\r
1313         return Reset(GOTO_HOOK);\r
1314 }\r
1315 \r
1316 // C-x h: Ctrl-End, Ctrl-Shift-Home\r
1317 int CCommands::MarkWholeBuffer()\r
1318 {\r
1319         ClearNumericArgument();\r
1320         if (CUtils::IsConsole()) {\r
1321                 SystemMenuEdit(CMD_SELECT_ALL);\r
1322         } else if (CUtils::IsDreamweaver()\r
1323                         || CUtils::IsFireworks()\r
1324                         || CUtils::IsFlash()\r
1325                         || CUtils::IsIllustrator()\r
1326                         || CUtils::IsPaint()\r
1327                         || CUtils::IsPhotoshop()) {\r
1328                 CdKduCu('A');\r
1329         } else if (CUtils::IsExplorer()\r
1330                         || CUtils::IsReget()) {\r
1331                 Kdu(VK_END);\r
1332                 m_bSetMark = TRUE;\r
1333                 return Reset(MoveCaret(VK_HOME));\r
1334         } else {\r
1335                 CdKduCu(VK_END);\r
1336                 m_bSetMark = TRUE;\r
1337                 return Reset(MoveCaret(VK_HOME, TRUE));\r
1338         }\r
1339         return Reset(GOTO_HOOK);\r
1340 }\r
1341 \r
1342 // C-x C-p:\r
1343 int CCommands::MarkPage()\r
1344 {\r
1345         return MarkWholeBuffer();\r
1346 }\r
1347 \r
1348 // C-x C-s: Alt-F, Alt-S\r
1349 int CCommands::SaveBuffer()\r
1350 {\r
1351         ClearNumericArgument();\r
1352         if (CUtils::IsFlash()\r
1353          || CUtils::IsSleipnir()\r
1354          || CUtils::IsThunderbird()) {\r
1355                 CdKduCu('S');\r
1356                 return Reset(GOTO_HOOK);\r
1357         } else {\r
1358                 // default\r
1359                 AdKduAu('F', 'S');\r
1360                 return Reset(GOTO_HOOK);\r
1361         }\r
1362 }\r
1363 \r
1364 // C-v: Page Down\r
1365 int CCommands::ScrollUp()\r
1366 {\r
1367         if (m_bNegativeNumericArgument) {\r
1368                 m_bNegativeNumericArgument = FALSE;\r
1369                 return ScrollDown();\r
1370         }\r
1371 \r
1372         if (m_bDefaultNumericArgument) {\r
1373                 return Reset(MoveCaret(VK_NEXT));\r
1374         } else {\r
1375                 while (m_nNumericArgument--) {\r
1376                         SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
1377                 }\r
1378         }\r
1379         return Reset(GOTO_HOOK);\r
1380 }\r
1381 \r
1382 // M-v: Page Up\r
1383 int CCommands::ScrollDown()\r
1384 {\r
1385         if (m_bNegativeNumericArgument) {\r
1386                 m_bNegativeNumericArgument = FALSE;\r
1387                 return ScrollUp();\r
1388         }\r
1389 \r
1390         if (m_bDefaultNumericArgument)\r
1391                 return Reset(MoveCaret(VK_PRIOR));\r
1392         while (m_nNumericArgument--)\r
1393                 SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
1394         return Reset(GOTO_HOOK);\r
1395 }\r
1396 \r
1397 BOOL CCommands::bC_()\r
1398 {\r
1399         return m_bC_;\r
1400 }\r
1401 \r
1402 void CCommands::bC_(BOOL b)\r
1403 {\r
1404         m_bC_ = b;\r
1405 }\r
1406 \r
1407 BOOL CCommands::bC_x()\r
1408 {\r
1409         return m_bC_x;\r
1410 }\r
1411 \r
1412 void CCommands::bC_x(BOOL b)\r
1413 {\r
1414         m_bC_x = b;\r
1415 }\r
1416 \r
1417 BOOL CCommands::bM_x()\r
1418 {\r
1419         return m_bM_x;\r
1420 }\r
1421 \r
1422 void CCommands::bM_x(const BOOL b)\r
1423 {\r
1424         m_bM_x = b;\r
1425 \r
1426         if (b) {\r
1427                 CXkeymacsDll::SetM_xTip("");\r
1428         } else {\r
1429                 CXkeymacsDll::SetM_xTip(NULL);\r
1430         }\r
1431 }\r
1432 \r
1433 // C-x: only set flag\r
1434 int CCommands::C_x()\r
1435 {\r
1436         if (CXkeymacsDll::GetEnableCUA() && m_bSetMark) {\r
1437                 Cut();\r
1438         } else {\r
1439                 bC_x(TRUE);\r
1440         }\r
1441         return Reset(GOTO_HOOKX);\r
1442 }\r
1443 \r
1444 // C-x C-w: Alt-F, Alt-A\r
1445 int CCommands::WriteFile()\r
1446 {\r
1447         ClearNumericArgument();\r
1448         if (CUtils::IsSleipnir()) {\r
1449                 CdKduCu('S');\r
1450         } else if (CUtils::IsFlash()) {\r
1451                 CdSdKduSuCu('S');\r
1452         } else {\r
1453                 AdKduAu('F', 'A');\r
1454         }\r
1455         return Reset(GOTO_HOOK);\r
1456 }\r
1457 \r
1458 int CCommands::Paste()\r
1459 {\r
1460         ClearNumericArgument();\r
1461         m_bSetMark = FALSE;\r
1462         if (CUtils::IsConsole()) {\r
1463                 SystemMenuEdit(CMD_PASTE);\r
1464         } else {\r
1465                 CdKduCu('V');\r
1466         }\r
1467         return Reset(GOTO_HOOK);\r
1468 }\r
1469 \r
1470 // C-w: Ctrl-X\r
1471 int CCommands::KillRegion()\r
1472 {\r
1473         static int nStep = 0;\r
1474         switch (nStep) {\r
1475         case 0:\r
1476                 m_bSetMark = FALSE;\r
1477                 ClearNumericArgument();\r
1478                 CdKduCu('X');\r
1479                 if (CUtils::IsExplorer()) {\r
1480                         return Reset(GOTO_HOOK);\r
1481                 }\r
1482                 nStep = 1;\r
1483                 return Reset(GOTO_RECURSIVE);\r
1484         case 1:\r
1485                 nStep = 0;\r
1486                 CXkeymacsDll::AddKillRing();\r
1487                 return Reset(GOTO_HOOK);\r
1488         }\r
1489         // dummy\r
1490         return Reset(GOTO_HOOK);\r
1491 }\r
1492 \r
1493 // M-w: Ctrl-C\r
1494 int CCommands::KillRingSave()\r
1495 {\r
1496         static int nStep = 0;\r
1497         switch (nStep) {\r
1498         case 0:\r
1499                 ClearNumericArgument();\r
1500                 m_bSetMark = FALSE;\r
1501                 if (CUtils::IsConsole()) {\r
1502                         SystemMenuEdit(CMD_COPY);\r
1503                         return Reset(GOTO_HOOK);\r
1504                 } else if (CUtils::IsMicrosoftPowerPoint()) {   // PowerPoint did not want to deactivate-mark. Temporary code?\r
1505                         CdKduCu('X');\r
1506                 } else {\r
1507                         CdKduCu('C');\r
1508                 }\r
1509                 if (CUtils::IsExplorer()) {\r
1510                         return Reset(GOTO_HOOK);\r
1511                 }\r
1512                 nStep = 1;\r
1513                 return Reset(GOTO_RECURSIVE);\r
1514         case 1:\r
1515                 nStep = 0;\r
1516                 CXkeymacsDll::AddKillRing();\r
1517                 if (CUtils::IsMicrosoftPowerPoint()) {  // Because DeactivateMark move object like graph.\r
1518                         CdKduCu('V');\r
1519                 } else {\r
1520                         DeactivateMark();\r
1521                 }\r
1522                 return Reset(GOTO_HOOK);\r
1523         }\r
1524         // dummy\r
1525         return Reset(GOTO_HOOK);\r
1526 }\r
1527 \r
1528 // C-y: Ctrl-V\r
1529 int CCommands::Yank()\r
1530 {\r
1531         m_bSetMark = FALSE;\r
1532         if (CUtils::IsConsole()) {\r
1533                 SystemMenuEdit(CMD_PASTE);\r
1534         } else {\r
1535                 static CClipboardSnap* pSnap = NULL;\r
1536                 if (!m_bDefaultNumericArgument) {\r
1537                         DecreaseNumericArgument();\r
1538                         CXkeymacsDll::IncreaseKillRingIndex(m_nNumericArgument);\r
1539                         pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
1540                 } else if (pSnap) {\r
1541                         pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
1542                 } else {\r
1543                         if (CUtils::IsExcel() && m_LastKillCommand == KillRegion) {\r
1544                                 // do nothing to work C-w not Copy but Cut\r
1545                         } else if (CUtils::IsLotusNotes() && (m_LastKillCommand == KillRegion || m_LastKillCommand == KillRingSave)) {\r
1546                                 // do nothing\r
1547                         } else {\r
1548                                 pSnap = CXkeymacsDll::GetKillRing(pSnap, FALSE);\r
1549                         }\r
1550                 }\r
1551                 CdKduCu('V');\r
1552                 if (pSnap) {\r
1553                         return Reset(GOTO_RECURSIVE);\r
1554                 }\r
1555         }\r
1556         return Reset(GOTO_HOOK);\r
1557 }\r
1558 \r
1559 // M-y: yank-pop\r
1560 int CCommands::YankPop()\r
1561 {\r
1562         ClearNumericArgument();\r
1563 \r
1564         if (m_LastCommand == YankPop\r
1565          || m_LastCommand == Yank) {\r
1566                 static CClipboardSnap* pSnap = NULL;\r
1567                 if (!pSnap) {\r
1568                         CClipboardSnap* pOldSnap = NULL;\r
1569                         pOldSnap = CXkeymacsDll::GetKillRing(pOldSnap);\r
1570                         if (pOldSnap) {\r
1571                                 for (int i = 0; i < pOldSnap->GetCount(); ++i) {\r
1572                                         CdKduCu('Z');\r
1573                                 }\r
1574                         } else {\r
1575                                 CdKduCu('Z');\r
1576                         }\r
1577                         CXkeymacsDll::IncreaseKillRingIndex();\r
1578                 }\r
1579                 pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
1580                 CdKduCu('V');\r
1581                 if (pSnap) {\r
1582                         return Reset(GOTO_RECURSIVE);\r
1583                 }\r
1584         }\r
1585 \r
1586         return Reset(GOTO_HOOK);\r
1587 }\r
1588 \r
1589 // M-!: cmd.exe/command.com\r
1590 int CCommands::ShellCommand()\r
1591 {\r
1592         TCHAR szShell[MAX_PATH];\r
1593         size_t len;\r
1594         !_tgetenv_s(&len, szShell, _T("XKEYMACS_SHELL")) && len != 0 && CUtils::Run(szShell) ||\r
1595                 !_tgetenv_s(&len, szShell, _T("COMSPEC")) && len != 0 && CUtils::Run(szShell);\r
1596         return Reset(GOTO_HOOK);\r
1597 }\r
1598 \r
1599 int CCommands::Ignore()\r
1600 {\r
1601         Reset();        // If you delete this line, Ignore() works as Enable/Disable XKeymacs only on Release build. Why?\r
1602         return Reset(GOTO_HOOK);\r
1603 }\r
1604 \r
1605 void CCommands::bM_(BOOL b)\r
1606 {\r
1607         m_bM_ = b;\r
1608 }\r
1609 \r
1610 BOOL CCommands::bM_()\r
1611 {\r
1612         return m_bM_;\r
1613 }\r
1614 \r
1615 // C-[\r
1616 int CCommands::Meta()\r
1617 {\r
1618         bM_(TRUE);\r
1619         return Reset(GOTO_HOOKX);\r
1620 }\r
1621 \r
1622 // Esc\r
1623 int CCommands::MetaEscape()\r
1624 {\r
1625         Meta();\r
1626         return Reset(GOTO_DO_NOTHING);\r
1627 }\r
1628 \r
1629 // Alt\r
1630 int CCommands::MetaAlt()\r
1631 {\r
1632         return Reset(GOTO_DO_NOTHING);\r
1633 }\r
1634 \r
1635 // C-0\r
1636 int CCommands::NumericArgument0()\r
1637 {\r
1638         return NumericArgument(0);\r
1639 }\r
1640 \r
1641 // C-1\r
1642 int CCommands::NumericArgument1()\r
1643 {\r
1644         return NumericArgument(1);\r
1645 }\r
1646 \r
1647 // C-2\r
1648 int CCommands::NumericArgument2()\r
1649 {\r
1650         return NumericArgument(2);\r
1651 }\r
1652 \r
1653 // C-3\r
1654 int CCommands::NumericArgument3()\r
1655 {\r
1656         return NumericArgument(3);\r
1657 }\r
1658 \r
1659 // C-4\r
1660 int CCommands::NumericArgument4()\r
1661 {\r
1662         return NumericArgument(4);\r
1663 }\r
1664 \r
1665 // C-5\r
1666 int CCommands::NumericArgument5()\r
1667 {\r
1668         return NumericArgument(5);\r
1669 }\r
1670 \r
1671 // C-6\r
1672 int CCommands::NumericArgument6()\r
1673 {\r
1674         return NumericArgument(6);\r
1675 }\r
1676 \r
1677 // C-7\r
1678 int CCommands::NumericArgument7()\r
1679 {\r
1680         return NumericArgument(7);\r
1681 }\r
1682 \r
1683 // C-8\r
1684 int CCommands::NumericArgument8()\r
1685 {\r
1686         return NumericArgument(8);\r
1687 }\r
1688 \r
1689 // C-9\r
1690 int CCommands::NumericArgument9()\r
1691 {\r
1692         return NumericArgument(9);\r
1693 }\r
1694 \r
1695 // C-#\r
1696 int CCommands::NumericArgument(int n)\r
1697 {\r
1698         if (m_bDefaultNumericArgument) {\r
1699                 m_nNumericArgument = n;\r
1700                 m_bDefaultNumericArgument = FALSE;\r
1701         } else {\r
1702                 m_nNumericArgument = m_nNumericArgument * 10 + n;\r
1703         }\r
1704         return Reset(GOTO_HOOK0_9);\r
1705 }\r
1706 \r
1707 // C--, M--\r
1708 int CCommands::NumericArgumentMinus()\r
1709 {\r
1710         m_bNegativeNumericArgument = !m_bNegativeNumericArgument;\r
1711         return Reset(GOTO_HOOK0_9);\r
1712 }\r
1713 \r
1714 // C-u\r
1715 int CCommands::UniversalArgument()\r
1716 {\r
1717         if (m_bC_u) {\r
1718                 m_nNumericArgument *= 4;\r
1719         } else {\r
1720                 m_nNumericArgument = 4;\r
1721                 m_bC_u = TRUE;\r
1722         }\r
1723         return Reset(GOTO_HOOKX);\r
1724 }\r
1725 \r
1726 // change function name and member variable name like bUniversalArgument()\r
1727 BOOL CCommands::bC_u()\r
1728 {\r
1729         return m_bC_u;\r
1730 }\r
1731 \r
1732 void CCommands::bC_u(BOOL b)\r
1733 {\r
1734         m_bC_u = b;\r
1735 }\r
1736 \r
1737 int CCommands::Repeat(BYTE bVk)\r
1738 {\r
1739         if (m_bDefaultNumericArgument) {\r
1740                 return Reset(GOTO_DO_NOTHING);\r
1741         } else {\r
1742                 CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
1743                 return Reset(GOTO_HOOK);\r
1744         }\r
1745 }\r
1746 \r
1747 // C-l: Recenter\r
1748 int CCommands::Recenter()\r
1749 {\r
1750         if (CUtils::IsBecky()) {\r
1751                 static int nStep = 0;\r
1752                 RECT ClientRect = {'\0'};\r
1753                 GetClientRect(GetFocus(), &ClientRect);\r
1754                 static int gap = INT_MAX;\r
1755 \r
1756                 static POINT CaretPos = {'\0'};\r
1757                 GetCaretPos(&CaretPos);\r
1758 \r
1759                 switch (nStep) {\r
1760                 case 0:\r
1761                         nStep = 0;      // omaginai\r
1762                         if (CaretPos.y < ClientRect.bottom / 2) {\r
1763                                 SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
1764                         } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
1765                                 SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
1766                         } else {\r
1767                                 gap = INT_MAX;\r
1768                                 return Reset(GOTO_HOOK);\r
1769                                 break;\r
1770                         }\r
1771 \r
1772                         Kdu(VK_DOWN);\r
1773                         nStep = 1;\r
1774                         return Reset(GOTO_RECURSIVE);\r
1775 \r
1776                 case 1:\r
1777                         nStep = 0;\r
1778                         // When a client screen can display 2n lines, the center line is (n + 1)th line.\r
1779                         int newgap = CaretPos.y - ClientRect.bottom / 2;\r
1780                         if (fabs((double)gap) <= fabs((double)newgap)) {\r
1781                                 if ((fabs((double)gap) == fabs((double)newgap)) && (gap != newgap) && newgap < 0) {\r
1782                                         SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
1783                                 }\r
1784                                 gap = INT_MAX;\r
1785                                 return Reset(GOTO_HOOK);\r
1786                                 break;\r
1787                         }\r
1788 \r
1789                         gap = newgap;\r
1790                         return Reset(GOTO_RECURSIVE);\r
1791                 }\r
1792         } else if (CUtils::IsMicrosoftWord()\r
1793                         || CUtils::IsThunderbird()) {\r
1794                 RECT ClientRect = {'\0'};\r
1795                 GetClientRect(GetFocus(), &ClientRect);\r
1796 //              CUtils::Log(_T("top = %d, bottom = %d, left = %d, right = %d"), ClientRect.top, ClientRect.bottom, ClientRect.left, ClientRect.right);\r
1797 \r
1798                 POINT CaretPos = {'\0'};\r
1799                 GetCaretPos(&CaretPos);\r
1800 \r
1801                 static const int LENGTH_PER_SCROLL = 32;\r
1802 \r
1803                 if (CaretPos.y < ClientRect.bottom / 2) {\r
1804                         VScroll(SB_LINEUP, (ClientRect.bottom / 2 - CaretPos.y) / (LENGTH_PER_SCROLL / 2) + 1);\r
1805                 } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
1806                         VScroll(SB_LINEDOWN, (CaretPos.y - ClientRect.bottom / 2) / (LENGTH_PER_SCROLL / 2));\r
1807                 }\r
1808 \r
1809                 return Reset(GOTO_HOOK);\r
1810         } else {\r
1811                 RECT ClientRect = {'\0'};\r
1812                 GetClientRect(GetFocus(), &ClientRect);\r
1813                 int gap = INT_MAX;\r
1814 \r
1815 //              CUtils::Log(_T("top = %d, bottom = %d, left = %d, right = %d"), ClientRect.top, ClientRect.bottom, ClientRect.left, ClientRect.right);\r
1816 \r
1817                 for (;;) {\r
1818                         POINT CaretPos = {'\0'};\r
1819                         GetCaretPos(&CaretPos);\r
1820 \r
1821                         if (CaretPos.y < ClientRect.bottom / 2) {\r
1822                                 VScroll(SB_LINEUP);\r
1823                         } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
1824                                 VScroll(SB_LINEDOWN);\r
1825                         } else {\r
1826                                 break;\r
1827                         }\r
1828 \r
1829                         // When a client screen can display 2n lines, the center line is (n + 1)th line.\r
1830                         int newgap = CaretPos.y - ClientRect.bottom / 2;\r
1831                         if (fabs((double)gap) <= fabs((double)newgap)) {\r
1832                                 if ((fabs((double)gap) == fabs((double)newgap)) && (gap != newgap) && newgap < 0) {\r
1833                                         VScroll(SB_LINEUP);\r
1834                                 }\r
1835                                 break;\r
1836                         }\r
1837                         gap = newgap;\r
1838                 }\r
1839                 return Reset(GOTO_HOOK);\r
1840         }\r
1841         return Reset(GOTO_HOOK);\r
1842 }\r
1843 \r
1844 // C-t: Shift-Left, Shift-Delete, Right Shift-Insert, if the cursor is not at EOL (is End Of Line)\r
1845 //              Left, Shift-Right, Shift-Delete, Left, Shift-Insert, Right, if the cursor is at EOL\r
1846 int CCommands::TransposeChars()\r
1847 {\r
1848         ClearNumericArgument(); // tmp\r
1849 \r
1850         // Do not try to do these command at once.\r
1851         // Clipboard has old data till you go out this function.\r
1852         static int nStep = 0;\r
1853         switch (nStep) {\r
1854         case 0:         // Clear Selection\r
1855                 if (m_bSetMark) {\r
1856                         m_bSetMark = FALSE;\r
1857                         Kdu(VK_RIGHT, VK_LEFT);\r
1858                         nStep = 1;\r
1859                         return Reset(GOTO_RECURSIVE);\r
1860                 } else {\r
1861                         // Do nothing. Go to case 1:\r
1862                 }\r
1863         case 1:         // Get back character to confirm the cursor is at TOF or not.\r
1864                 nStep = 0;\r
1865                 CaptureClipboardData();\r
1866 \r
1867                 // simple version\r
1868                 if (CUtils::IsLotus123()) {\r
1869                         // C-t: Left, Shift-Right, Shift-Delete, Left, Shift-Insert, Right\r
1870                         Kdu(VK_LEFT);\r
1871                         SdKduSu(VK_RIGHT, VK_DELETE);\r
1872                         Kdu(VK_LEFT);\r
1873                         SdKduSu(VK_INSERT);\r
1874                         Kdu(VK_RIGHT);\r
1875                         nStep = 7;\r
1876                         return Reset(GOTO_RECURSIVE);\r
1877                 }\r
1878 \r
1879                 if (!CopyBackCharacter()) {\r
1880                         return Reset(GOTO_DO_NOTHING);\r
1881                 }\r
1882 \r
1883                 nStep = 2;\r
1884                 return Reset(GOTO_RECURSIVE);\r
1885         case 2:         // Get next character to confirm the cursor is at the EOF or not.\r
1886                 {\r
1887                         nStep = 0;\r
1888                         Su();\r
1889 \r
1890                         if (CUtils::IsTOF()) {\r
1891                                 Kdu(VK_LEFT);\r
1892                                 nStep = 7;\r
1893                                 return Reset(GOTO_RECURSIVE);\r
1894                         }\r
1895 \r
1896                         if (CUtils::IsDirector()) {\r
1897                                 // CopyBackCharacter move cursor right\r
1898                                 Kdu(VK_LEFT);\r
1899                                 ReleaseKey(VK_CONTROL);\r
1900                         }\r
1901 \r
1902                         if (CUtils::IsEudora()) {\r
1903                                 // CopyBackCharacter move cursor right\r
1904                                 Kdu(VK_LEFT);\r
1905                         }\r
1906 \r
1907                         if (!CopyNextCharacter()) {\r
1908                                 nStep = 7;\r
1909                                 return Reset(GOTO_RECURSIVE);\r
1910                         }\r
1911 \r
1912                         if (CUtils::IsDirector()) {\r
1913                                 DepressKey(VK_CONTROL);\r
1914                         }\r
1915 \r
1916                         nStep = 3;\r
1917                         return Reset(GOTO_RECURSIVE);\r
1918                 }\r
1919         case 3:         // Cut Left Character\r
1920                 {\r
1921                         nStep = 0;\r
1922                         Su();\r
1923 \r
1924                         CString szClipboardText;\r
1925                         CUtils::GetClipboardText(&szClipboardText);\r
1926 //                      CUtils::Log(_T("%x, %d, %s"), szClipboardText.GetAt(0), szClipboardText.GetLength(), szClipboardText);\r
1927 \r
1928                         if (CUtils::IsDirector()\r
1929                          ||     CUtils::IsEudora()) {\r
1930                                 // CopyNextCharacter move cursor left\r
1931                                 Kdu(VK_RIGHT);\r
1932                         }\r
1933 \r
1934                         if (!szClipboardText.IsEmpty()\r
1935                          && szClipboardText.GetAt(0) != VK_RETURN) {\r
1936                                 if (CUtils::IseMemoPad()\r
1937                                  || CUtils::IsFlash()\r
1938                                  || CUtils::IsK2Editor()\r
1939                                  || CUtils::IsShuriken()) {\r
1940                                         SdKduSu(VK_LEFT);\r
1941                                         CdKduCu('X');\r
1942                                 } else if (CUtils::IsDirector()) {\r
1943                                         ReleaseKey(VK_CONTROL);\r
1944                                         SdKduSu(VK_LEFT);\r
1945                                         CdKduCu('X');\r
1946                                         Kdu(VK_RIGHT);\r
1947                                         DepressKey(VK_CONTROL);\r
1948                                 } else {\r
1949                                         SdKduSu(VK_LEFT, VK_DELETE);\r
1950                                 }\r
1951                                 nStep = 4;\r
1952                                 return Reset(GOTO_RECURSIVE);\r
1953                         } else {\r
1954                                 if (szClipboardText.IsEmpty()) {        // EOF\r
1955                                         if (CUtils::IsLotusNotes()\r
1956                                          || CUtils::IsLotusWordPro()\r
1957                                          || CUtils::IsMicrosoftFrontPage()\r
1958                                          || CUtils::IsMicrosoftWord()) {\r
1959                                                 // These applications say "EOL is EOF".\r
1960                                                 Kdu(VK_END);\r
1961                                         } else {\r
1962                                                 // default\r
1963                                                 Kdu(VK_RIGHT);\r
1964                                         }\r
1965                                 }\r
1966 \r
1967                                 nStep = 5;\r
1968                                 return Reset(GOTO_RECURSIVE);\r
1969                         }\r
1970                 }\r
1971         case 4:         // Paste the cut character\r
1972                 nStep = 0;\r
1973                 Su();\r
1974                 Kdu(VK_RIGHT);\r
1975                 if (CUtils::IsDirector()\r
1976                  || CUtils::IseMemoPad()\r
1977                  || CUtils::IsFlash()\r
1978                  || CUtils::IsK2Editor()\r
1979                  || CUtils::IsShuriken()) {\r
1980                         CdKduCu('V');\r
1981                 } else {\r
1982                         SdKduSu(VK_INSERT);\r
1983                 }\r
1984                 nStep = 7;\r
1985                 return Reset(GOTO_RECURSIVE);\r
1986         case 5:         // Cut character at the EOF.\r
1987                 nStep = 0;\r
1988                 if (CUtils::IsDirector()\r
1989                  || CUtils::IseMemoPad()\r
1990                  || CUtils::IsFlash()\r
1991                  || CUtils::IsK2Editor()\r
1992                  || CUtils::IsShuriken()) {\r
1993                         SdKduSu(VK_LEFT);\r
1994                         CdKduCu('X');\r
1995                 } else {\r
1996                         SdKduSu(VK_LEFT, VK_DELETE);\r
1997                 }\r
1998                 nStep = 6;\r
1999                 return Reset(GOTO_RECURSIVE);\r
2000         case 6:         // Paste the cut character near the EOF.\r
2001                 nStep = 0;\r
2002                 Su();\r
2003                 Kdu(VK_LEFT);\r
2004                 if (CUtils::IsDirector()\r
2005                  || CUtils::IseMemoPad()\r
2006                  || CUtils::IsFlash()\r
2007                  || CUtils::IsK2Editor()\r
2008                  || CUtils::IsShuriken()) {\r
2009                         DepressKey(VK_CONTROL);         // Why is this code needed?\r
2010                         CdKduCu('V');\r
2011                 } else {\r
2012                         SdKduSu(VK_INSERT);\r
2013                 }\r
2014                 Kdu(VK_RIGHT);\r
2015                 nStep = 7;\r
2016                 return Reset(GOTO_RECURSIVE);\r
2017         case 7:         // Set the original data on the clipboard.\r
2018                 nStep = 0;\r
2019                 Su();\r
2020                 RestoreClipboardData();\r
2021                 return Reset(GOTO_HOOK);\r
2022         }\r
2023         return Reset(GOTO_HOOK);\r
2024 }\r
2025 \r
2026 void CCommands::Cut_()\r
2027 {\r
2028         CdKduCu('X');\r
2029 }\r
2030 \r
2031 int CCommands::Cut()\r
2032 {\r
2033         ClearNumericArgument();\r
2034         m_bSetMark = FALSE;\r
2035         Cut_();\r
2036         return Reset(GOTO_HOOK);\r
2037 }\r
2038 \r
2039 void CCommands::Copy_()\r
2040 {\r
2041         if (CUtils::IsConsole()) {\r
2042                 SystemMenuEdit(CMD_COPY);\r
2043         } else if (CUtils::IsEclipse()\r
2044                         || CUtils::IsStoryEditor()) {\r
2045                 CdKduCu(VK_INSERT);\r
2046         } else {\r
2047                 CdKduCu('C');\r
2048         }\r
2049 }\r
2050 \r
2051 int CCommands::Copy()\r
2052 {\r
2053         ClearNumericArgument();\r
2054         m_bSetMark = FALSE;\r
2055         Copy_();\r
2056         return Reset(GOTO_HOOK);\r
2057 }\r
2058 \r
2059 // Copy next character of the cursor if the caret is NOT at end of the file\r
2060 // Move the caret to left if caret is at end of the file\r
2061 BOOL CCommands::CopyNextCharacter()\r
2062 {\r
2063         if (!CUtils::OpenClipboard()) {\r
2064                 ASSERT(0);\r
2065                 return FALSE;\r
2066         }\r
2067         if (!EmptyClipboard()) {\r
2068                 ASSERT(0);\r
2069                 return FALSE;\r
2070         }\r
2071         if (!CloseClipboard()) {\r
2072                 ASSERT(0);\r
2073                 return FALSE;\r
2074         }\r
2075 \r
2076         SdKduSu(VK_RIGHT);\r
2077         Copy_();\r
2078         Kdu(VK_LEFT);\r
2079 \r
2080         return TRUE;\r
2081 }\r
2082 \r
2083 BOOL CCommands::CopyBackCharacter()\r
2084 {\r
2085         if (!CUtils::OpenClipboard()) {\r
2086                 ASSERT(0);\r
2087                 return FALSE;\r
2088         }\r
2089         if (!EmptyClipboard()) {\r
2090                 ASSERT(0);\r
2091                 return FALSE;\r
2092         }\r
2093         if (!CloseClipboard()) {\r
2094                 ASSERT(0);\r
2095                 return FALSE;\r
2096         }\r
2097 \r
2098         SdKduSu(VK_LEFT);\r
2099         Copy_();\r
2100         Kdu(VK_RIGHT);\r
2101 \r
2102         return TRUE;\r
2103 }\r
2104 \r
2105 BOOL CCommands::CopyPreviousLine()\r
2106 {\r
2107         if (!CUtils::OpenClipboard()) {\r
2108                 ASSERT(0);\r
2109                 return FALSE;\r
2110         }\r
2111         if (!EmptyClipboard()) {\r
2112                 ASSERT(0);\r
2113                 return FALSE;\r
2114         }\r
2115         if (!CloseClipboard()) {\r
2116                 ASSERT(0);\r
2117                 return FALSE;\r
2118         }\r
2119 \r
2120         SdKduSu(VK_UP);\r
2121         Copy_();\r
2122 \r
2123         return TRUE;\r
2124 }\r
2125 \r
2126 BOOL CCommands::CopyCurrentLine()\r
2127 {\r
2128         if (!CUtils::OpenClipboard()) {\r
2129                 ASSERT(0);\r
2130                 return FALSE;\r
2131         }\r
2132         if (!EmptyClipboard()) {\r
2133                 ASSERT(0);\r
2134                 return FALSE;\r
2135         }\r
2136         if (!CloseClipboard()) {\r
2137                 ASSERT(0);\r
2138                 return FALSE;\r
2139         }\r
2140 \r
2141         SdKduSu(VK_HOME);\r
2142         Copy_();\r
2143 \r
2144         return TRUE;\r
2145 }\r
2146 \r
2147 void CCommands::DecreaseNumericArgument()\r
2148 {\r
2149         if (m_bNegativeNumericArgument) {\r
2150                 ++m_nNumericArgument;\r
2151         } else {\r
2152                 if (m_nNumericArgument == 0) {\r
2153                         ++m_nNumericArgument;\r
2154                         m_bNegativeNumericArgument = TRUE;\r
2155                 } else {\r
2156                         --m_nNumericArgument;\r
2157                 }\r
2158         }\r
2159 }\r
2160 \r
2161 void CCommands::ClearNumericArgument()\r
2162 {\r
2163         m_bDefaultNumericArgument = TRUE;\r
2164         m_nNumericArgument = 1;\r
2165         m_bNegativeNumericArgument = FALSE;\r
2166 }\r
2167 \r
2168 void CCommands::Reset()\r
2169 {\r
2170         Reset(GOTO_HOOK);\r
2171 }\r
2172 \r
2173 int CCommands::Reset(int rc)\r
2174 {\r
2175         switch(rc) {\r
2176         case GOTO_HOOK:\r
2177                 ClearNumericArgument();\r
2178                 m_bC_u = FALSE;\r
2179         case GOTO_HOOK0_9:\r
2180                 bC_(FALSE);\r
2181                 bC_x(FALSE);\r
2182                 bM_(FALSE);\r
2183                 bM_x(FALSE);\r
2184         case GOTO_HOOKX:\r
2185                 break;\r
2186 \r
2187         case GOTO_RECURSIVE:\r
2188                 break;\r
2189 \r
2190         case GOTO_DO_NOTHING:\r
2191                 break;\r
2192 \r
2193         default:\r
2194                 break;\r
2195         }\r
2196         return rc;\r
2197 }\r
2198 \r
2199 // C-q\r
2200 int CCommands::EnableOrDisableXKeymacs()\r
2201 {\r
2202         // dummy\r
2203         ASSERT(0);\r
2204         static int i = 0;       // If there is not this 2 line, EnableOrDisableXKeymacs, EnableXKeymacs and DisableXKeymacs has same function pointer.\r
2205         ++i;\r
2206         return Reset(GOTO_HOOK);\r
2207 }\r
2208 \r
2209 int CCommands::EnableXKeymacs()\r
2210 {\r
2211         // dummy\r
2212         ASSERT(0);\r
2213         static int i = 0;\r
2214         ++i;\r
2215         return Reset(GOTO_HOOK);\r
2216 }\r
2217 \r
2218 int CCommands::DisableXKeymacs()\r
2219 {\r
2220         // dummy\r
2221         ASSERT(0);\r
2222         static int i = 0;\r
2223         ++i;\r
2224         return Reset(GOTO_HOOK);\r
2225 }\r
2226 \r
2227 int CCommands::GetNumericArgument()\r
2228 {\r
2229         return m_nNumericArgument;\r
2230 }\r
2231 \r
2232 // C-r\r
2233 int CCommands::IsearchBackward()\r
2234 {\r
2235         return Search(BACKWARD);\r
2236 }\r
2237 \r
2238 // C-s\r
2239 int CCommands::IsearchForward()\r
2240 {\r
2241         return Search(FORWARD);\r
2242 }\r
2243 \r
2244 void CCommands::OpenFindDialog()\r
2245 {\r
2246         if (CUtils::IsAutla()\r
2247          || CUtils::IsBorlandCppBuilder()\r
2248          || CUtils::IsCodeWarrior()\r
2249          || CUtils::IsDana()\r
2250          || CUtils::IseMemoPad()\r
2251          || CUtils::IsJmEditor()\r
2252          || CUtils::IsK2Editor()\r
2253          || CUtils::IsOedit()\r
2254          || CUtils::IsOpenJane()\r
2255          || CUtils::IsPHPEditor()\r
2256          || CUtils::IsStoryEditor()\r
2257          || CUtils::IsTeraPad()) {\r
2258                 AdKduAu('S', 'F');\r
2259         } else if (CUtils::IsConsole()) {\r
2260                 SystemMenuEdit(CMD_FIND);\r
2261         } else if (CUtils::IsSakuraEditor()) {\r
2262                 AdKduAu('S', VK_RETURN);\r
2263         } else if (CUtils::IsNami2000()) {\r
2264                 AdKduAu('D', 'F');\r
2265         } else if (CUtils::IsVisualStudio()) {\r
2266                 AdKduAu('E', 'F', 'F');\r
2267         } else if (CUtils::IsDirector()) {\r
2268                 AdKduAu('E', 'F', 'T');\r
2269         } else if (CUtils::IsAdobeReader()) {\r
2270                 AdKduAu('E', 'S');\r
2271         } else if (CUtils::IsDWFM()\r
2272                         || CUtils::IsEggExplorer()\r
2273                         || CUtils::IsExplorer()\r
2274                         || CUtils::IsOutlookExpress()) {\r
2275                 Kdu(VK_F3);\r
2276         } else if (CUtils::IsHidemaru()\r
2277                         || CUtils::IsLunascape()\r
2278                         || CUtils::IsMicrosoftPowerPoint()\r
2279                         || CUtils::IsMozilla()\r
2280                         || CUtils::IsNetscape()\r
2281                         || CUtils::IsOpera()\r
2282                         || CUtils::IsSleipnir()) {\r
2283                 CdKduCu('F');\r
2284         } else if (CUtils::IsDreamweaver()\r
2285                         || CUtils::IsezHTML()\r
2286                         || CUtils::IsFlash()) {\r
2287                 DepressKey(VK_CONTROL);         // Why is this coad needed?\r
2288                 CdKduCu('F');\r
2289         } else if (CUtils::IsIPMessenger()) {\r
2290                 DepressKey(VK_CONTROL);\r
2291                 PostMessage(GetFocus(), WM_KEYDOWN, 'F', 0);\r
2292                 PostMessage(GetFocus(), WM_KEYUP, 'F', 0);\r
2293                 ReleaseKey(VK_CONTROL);\r
2294         } else {\r
2295                 // default\r
2296                 AdKduAu('E', 'F');\r
2297         }\r
2298 \r
2299         // Set Direction if Find dialog already exist\r
2300         if (CUtils::IsDWFM()\r
2301          || CUtils::IsEggExplorer()\r
2302          || CUtils::IsExplorer()\r
2303          || CUtils::IsFirefox()\r
2304          || CUtils::IsHidemaru()\r
2305          || CUtils::IsK2Editor()\r
2306          || CUtils::IsLotusWordPro()\r
2307          || CUtils::IsMicrosoftPowerPoint()\r
2308          || CUtils::IsMozilla()\r
2309          || CUtils::IsMSDN()\r
2310          || CUtils::IsNetscape()\r
2311          || CUtils::IsOpera()\r
2312          || CUtils::IsSakuraEditor()) {\r
2313         } else if (CUtils::IsInternetExplorer()\r
2314                         || CUtils::IsSleipnir()) {\r
2315                 // I want to set direction but IE does not allow me.\r
2316         } else {\r
2317                 SetSearchDirection();\r
2318         }\r
2319 }\r
2320 \r
2321 int CCommands::Search(SEARCH_DIRECTION direction)\r
2322 {\r
2323 //      CUtils::Log(_T("%s"), CUtils::GetApplicationName());\r
2324 \r
2325         if (CUtils::IsIllustrator()\r
2326          || CUtils::IsPaint()\r
2327          || CUtils::IsPhotoshop()) {\r
2328                 return Reset(GOTO_DO_NOTHING);\r
2329         }\r
2330 \r
2331         ClearNumericArgument();\r
2332 \r
2333         if ((direction != FORWARD) && (direction != BACKWARD)) {\r
2334                 ASSERT(0);\r
2335         }\r
2336 \r
2337         if (CUtils::IsVisualCpp()\r
2338          || CUtils::IsVisualStudio()) {\r
2339                 switch (direction) {\r
2340                 case FORWARD:\r
2341                         CdKduCu('I');\r
2342                         break;\r
2343                 case BACKWARD:\r
2344                         CdSdKduSuCu('I');\r
2345                         break;\r
2346                 default:\r
2347                         ASSERT(0);\r
2348                         break;\r
2349                 }\r
2350                 return Reset(GOTO_HOOK);\r
2351         }\r
2352 \r
2353         if (!CUtils::IsFindDialog()) {\r
2354 //              CUtils::Log(_T("Find Dialog is not."));\r
2355 \r
2356                 // F3 or Shift+F3\r
2357                 if (m_LastCommand == IsearchForward\r
2358                  || m_LastCommand == IsearchBackward) {\r
2359                         if (CUtils::IsBecky()\r
2360                          || CUtils::IsFirefox()\r
2361                          || CUtils::IsHidemaru()\r
2362                          || CUtils::IsPHPEditor()) {\r
2363                                 if (m_LastCommand == IsearchForward && direction != FORWARD\r
2364                                  || m_LastCommand == IsearchBackward && direction != BACKWARD) {\r
2365                                         // do nothing\r
2366                                 } else if (direction == FORWARD) {\r
2367                                         Kdu(VK_F3);\r
2368                                 } else if (direction == BACKWARD) {\r
2369                                         SdKduSu(VK_F3);\r
2370                                 }\r
2371                                 return Reset(GOTO_HOOK);\r
2372                         } else if (CUtils::IsBorlandCppBuilder()) {\r
2373                                 if (m_LastCommand == IsearchForward && direction != FORWARD\r
2374                                  || m_LastCommand == IsearchBackward && direction != BACKWARD) {\r
2375                                         AdKduAu('S', 'F');\r
2376                                         SetSearchDirection(direction);\r
2377                                         Kdu(VK_RETURN);\r
2378                                 } else {\r
2379                                         Kdu(VK_F3);\r
2380                                 }\r
2381                                 return Reset(GOTO_HOOK);\r
2382                         }\r
2383                 }\r
2384 \r
2385                 m_SearchDirection = direction;\r
2386                 if (CUtils::IsNotepadPP()) {\r
2387                         if (direction == FORWARD) // only forward incremental search supported\r
2388                                 AdCdKduCuAu('I');\r
2389                 } else if (CUtils::IsEclipse()) {\r
2390                         if (direction == FORWARD)\r
2391                                 CdKduCu('J');\r
2392                         else\r
2393                                 CdSdKduSuCu('J');\r
2394                 } else\r
2395                         OpenFindDialog();\r
2396         } else {\r
2397 //              CUtils::Log(_T("Find Dialog is opened."));\r
2398 \r
2399                 if (CUtils::IsHidemaru()\r
2400                  || CUtils::IsK2Editor()\r
2401                  || CUtils::IsOedit()\r
2402                  || CUtils::IsSakuraEditor()) {\r
2403                         BYTE bDirection = 0;\r
2404 \r
2405                         if (direction == FORWARD) {\r
2406                                 bDirection = GetDirectionForwardKey();\r
2407                         } else if (direction == BACKWARD) {\r
2408                                 bDirection = GetDirectionBackwardKey();\r
2409                         } else {\r
2410                                 ASSERT(0);\r
2411                         }\r
2412                         AdKduAu(bDirection);\r
2413                 } else if (CUtils::IsBorlandCppBuilder()) {\r
2414                         if (m_SearchDirection != direction) {\r
2415                                 SetSearchDirection(direction);\r
2416                         } else {\r
2417                                 Kdu(VK_RETURN);\r
2418                         }\r
2419                 } else if (CUtils::IsJmEditor()\r
2420                                 || CUtils::IsPHPEditor()) {\r
2421                         Kdu(VK_RETURN);\r
2422                 } else if (CUtils::IsAutla()) {\r
2423                         if (direction == FORWARD) {\r
2424                                 Kdu(VK_F3);\r
2425                         } else if (direction == BACKWARD) {\r
2426                                 SdKduSu(VK_F3);\r
2427                         } else {\r
2428                                 ASSERT(0);\r
2429                         }\r
2430                 } else {\r
2431                         if (m_SearchDirection != direction) {\r
2432                                 // Set Direction if Find dialog already exist\r
2433                                 if (CUtils::IsConsole()) {\r
2434                                         SetSearchDirection(BACKWARD);   // bad style\r
2435                                         m_SearchDirection = direction;\r
2436                                 } else {\r
2437                                         SetSearchDirection(direction);\r
2438                                 }\r
2439                                 return Reset(GOTO_HOOK);\r
2440                         }\r
2441 \r
2442                         // "Find Next(F)" if Find dialog already exist\r
2443                         if (CUtils::IsStoryEditor()) {\r
2444                                 AdKduAu('F');\r
2445                         } else {\r
2446                                 Kdu(VK_RETURN);\r
2447                         }\r
2448 \r
2449                         // open Find dialog again\r
2450                         CString szDialogTitle;\r
2451                         CUtils::GetFindDialogTitle(&szDialogTitle);\r
2452                         if (CUtils::IsNami2000()) {\r
2453                                 AdKduAu('D', 'F');\r
2454                                 SetSearchDirection();\r
2455                         } else if (CUtils::IsOutlook()\r
2456                                         && szDialogTitle.Compare(_T("\8c\9f\8dõ"))) {\r
2457                                 // Outlook (w/o Japanese version)\r
2458                                 AdKduAu('E', 'F');\r
2459                         } else if (CUtils::IsVisualCpp()) {\r
2460                                 CdKduCu('F');\r
2461                                 DepressKey(VK_CONTROL);         // Why is this need???\r
2462                         } else if (CUtils::IsCodeWarrior()\r
2463                                         || CUtils::IsDana()\r
2464                                         || CUtils::IsStoryEditor()\r
2465                                         || CUtils::IsTeraPad()) {\r
2466                                 AdKduAu('S', 'F');\r
2467                         } else if (CUtils::IsezHTML()) {\r
2468                                 CdKduCu('F');\r
2469                         }\r
2470 \r
2471                         // set cursor at end of FindWhat\r
2472                         if (CUtils::IsMozilla()\r
2473                          || CUtils::IsNetscape()) {\r
2474                                 // do nothing\r
2475                         } else if (CUtils::IsMicrosoftWord()) {\r
2476                                 UINT before = CXkeymacsDll::GetModifierState();\r
2477                                 CXkeymacsDll::SetModifierState(before & ~CONTROL, before);\r
2478                                 AdKduAu('N');\r
2479                                 Kdu(VK_ESCAPE);\r
2480                                 Kdu(VK_END);\r
2481                                 CXkeymacsDll::SetModifierState(before, before & ~CONTROL);\r
2482                         } else {\r
2483                                 AdKduAu(GetFindWhatKey());\r
2484                         }\r
2485                         Kdu(VK_END);\r
2486                 }\r
2487         }\r
2488         return Reset(GOTO_HOOK);\r
2489 }\r
2490 \r
2491 void CCommands::SetSearchDirection(SEARCH_DIRECTION direction)\r
2492 {\r
2493 //      CUtils::Log(_T("SetSearchDirection: %d"), direction);\r
2494         if ((direction != FORWARD) && (direction != BACKWARD)) {\r
2495                 return;\r
2496         }\r
2497 \r
2498         m_SearchDirection = direction;\r
2499 \r
2500         if (GetDirectionForwardKey() == 0 && GetDirectionBackwardKey() == 0) {\r
2501                 Kdu(VK_END);\r
2502                 return;\r
2503         } else if (CUtils::IsConsole()) {\r
2504                 if (direction == BACKWARD) {    // bad style\r
2505                         Kdu(VK_TAB, VK_TAB);\r
2506                         Kdu(VK_RIGHT);\r
2507                         SdKduSu(VK_TAB, VK_TAB);\r
2508                 }\r
2509         } else if (CUtils::IsMicrosoftWord()) {\r
2510                 UINT before = CXkeymacsDll::GetModifierState();\r
2511                 CXkeymacsDll::SetModifierState(before & ~CONTROL, before);\r
2512 \r
2513                 AdKduAu('M');\r
2514                 AdKduAu(0xBA);  // VK_OEM_1     Used for miscellaneous characters; it can vary by keyboard. \r
2515                                                 //                      Windows 2000/XP: For the US standard keyboard, the ';:' key\r
2516                 Kdu(VK_UP, VK_UP);\r
2517                 if (direction == BACKWARD) {\r
2518                         Kdu(VK_DOWN);\r
2519                 }\r
2520                 AdKduAu('N');\r
2521                 Kdu(VK_ESCAPE);\r
2522                 Kdu(VK_END);\r
2523 \r
2524                 CXkeymacsDll::SetModifierState(before, before & ~CONTROL);\r
2525         } else if (CUtils::IsLotusNotes()) {\r
2526                 BYTE bDirection = 0;\r
2527 \r
2528                 if (direction == FORWARD) {\r
2529                         bDirection = GetDirectionForwardKey();\r
2530                 } else if (direction == BACKWARD) {\r
2531                         bDirection = GetDirectionBackwardKey();\r
2532                 }\r
2533 \r
2534                 AdKduAu(GetSearchOptionKey(), bDirection, GetSearchOptionKey());\r
2535                 {\r
2536                         CString szDialogTitle;\r
2537                         CUtils::GetFindDialogTitle(&szDialogTitle);\r
2538 \r
2539                         if (!szDialogTitle.Compare(_T("\8c\9f\8dõ"))\r
2540                          || !szDialogTitle.Compare(_T("Find"))) {\r
2541                                 SdKduSu(VK_TAB);\r
2542                         } else {\r
2543                                 SdKduSu(VK_TAB, VK_TAB);\r
2544                         }\r
2545                 }\r
2546                 Kdu(VK_END);\r
2547         } else if (CUtils::IsBecky()) {\r
2548                 AdKduAu(GetDirectionForwardKey());\r
2549                 if (direction == BACKWARD) {\r
2550                         Kdu(VK_UP);\r
2551                 }\r
2552                 Kdu(VK_TAB, VK_TAB, VK_TAB, VK_TAB);\r
2553                 Kdu(VK_END);\r
2554         } else if (CUtils::IsMozilla()\r
2555                         || CUtils::IsNetscape()) {\r
2556                 Kdu(VK_TAB, VK_TAB, VK_TAB, VK_SPACE);\r
2557                 SdKduSu(VK_TAB, VK_TAB, VK_TAB);\r
2558         } else if (CUtils::IsezHTML()) {\r
2559                 BYTE bDirection = 0;\r
2560 \r
2561                 if (direction == FORWARD) {\r
2562                         bDirection = GetDirectionForwardKey();\r
2563                 } else if (direction == BACKWARD) {\r
2564                         bDirection = GetDirectionBackwardKey();\r
2565                 }\r
2566 \r
2567                 AdKduAu(bDirection);\r
2568                 SdKduSu(VK_TAB, VK_TAB, VK_TAB, VK_TAB);\r
2569         } else {\r
2570                 // default\r
2571                 BYTE bDirection = 0;\r
2572 \r
2573                 if (direction == FORWARD) {\r
2574                         bDirection = GetDirectionForwardKey();\r
2575                 } else if (direction == BACKWARD) {\r
2576                         bDirection = GetDirectionBackwardKey();\r
2577                 }\r
2578 \r
2579 //              CUtils::Log(_T("aSetSearchDirection: Direction = %c, FindWhatKey = %c"), bDirection, GetFindWhatKey());\r
2580                 AdKduAu(bDirection, GetFindWhatKey());\r
2581         }\r
2582 }\r
2583 \r
2584 // C-x C-j, C-o, C-\, C-BACKSLASH\r
2585 int CCommands::ToggleInputMethod()\r
2586 {\r
2587         SetInputMethodOpenStatus(TOGGLE_INPUT_METHOD);\r
2588         return Reset(GOTO_HOOK);\r
2589 }\r
2590 \r
2591 int CCommands::CompleteToggleInputMethod()\r
2592 {\r
2593         SetInputMethodOpenStatus(TOGGLE_INPUT_METHOD, TRUE);\r
2594         return Reset(GOTO_HOOK);\r
2595 }\r
2596 \r
2597 int CCommands::OpenInputMethod()\r
2598 {\r
2599         SetInputMethodOpenStatus(OPEN_INPUT_METHOD);\r
2600         return Reset(GOTO_HOOK);\r
2601 }\r
2602 \r
2603 int CCommands::CloseInputMethod()\r
2604 {\r
2605         SetInputMethodOpenStatus(CLOSE_INPUT_METHOD);\r
2606         return Reset(GOTO_HOOK);\r
2607 }\r
2608 \r
2609 int CCommands::CompleteCloseInputMethod()\r
2610 {\r
2611         SetInputMethodOpenStatus(CLOSE_INPUT_METHOD, TRUE);\r
2612         return Reset(GOTO_HOOK);\r
2613 }\r
2614 \r
2615 void CCommands::SetInputMethodOpenStatus(INPUT_METHOD_OPEN_STATUS status, BOOL isComplete)\r
2616 {\r
2617         ClearNumericArgument();\r
2618         HKL hKL = GetKeyboardLayout(0);\r
2619         if (CUtils::IsConsole()) {\r
2620                 Kdu(VK_KANJI);\r
2621         } else if (ImmIsIME(hKL)) {\r
2622                 // default\r
2623                 HWND hWnd = GetFocus();\r
2624                 HIMC hIMC = ImmGetContext(hWnd);\r
2625                 //CUtils::Log(_T(" do ime manip, %d, %d, %d, %p, %p"), status, isComplete, ImmGetOpenStatus(hIMC), hWnd, hIMC);\r
2626 \r
2627                 if (isComplete && ImmGetOpenStatus(hIMC)) {\r
2628                         ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);\r
2629                 }\r
2630 \r
2631                 switch (status) {\r
2632                 case CLOSE_INPUT_METHOD:\r
2633                         ImmSetOpenStatus(hIMC, FALSE);\r
2634                         break;\r
2635                 case OPEN_INPUT_METHOD:\r
2636                         ImmSetOpenStatus(hIMC, TRUE);\r
2637                         break;\r
2638                 case TOGGLE_INPUT_METHOD:\r
2639                         ImmSetOpenStatus(hIMC, !ImmGetOpenStatus(hIMC));\r
2640                         break;\r
2641                 default:\r
2642                         ASSERT(0);\r
2643                         break;\r
2644                 }\r
2645 \r
2646                 ImmReleaseContext(hWnd, hIMC);\r
2647         } else {\r
2648                 Kdu(VK_KANJI);\r
2649         }\r
2650 }\r
2651 \r
2652 // C-x k: Ctrl+F4\r
2653 int CCommands::KillBuffer()\r
2654 {\r
2655         CdKduCu(VK_F4);\r
2656         return Reset(GOTO_HOOK);\r
2657 }\r
2658 \r
2659 BOOL CCommands::IsKillCommand(int (*nFunctionPointer)())\r
2660 {\r
2661         for (int nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
2662                 if (Commands[nComID].fCommand == nFunctionPointer) {\r
2663                         return !_tcsncmp(Commands[nComID].szCommandName, _T("kill-"), 5);\r
2664                 }\r
2665         }\r
2666         return FALSE;\r
2667 }\r
2668 \r
2669 void CCommands::SetLastCommand(int (__cdecl *LastCommand)(void))\r
2670 {\r
2671         m_LastCommand = LastCommand;\r
2672 \r
2673         if (IsKillCommand(LastCommand)) {\r
2674                 m_LastKillCommand = LastCommand;\r
2675         }\r
2676 }\r
2677 \r
2678 // M-d: \r
2679 int CCommands::KillWord()\r
2680 {\r
2681         if (CUtils::IsMicrosoftPowerPoint()\r
2682          || CUtils::IsThunderbird()) {\r
2683                 CdKduCu(VK_DELETE);\r
2684                 return Reset(GOTO_HOOK);\r
2685         }\r
2686 \r
2687         static int nStep = 0;\r
2688         static CString szClipboardText;\r
2689         static int nWhiteSpace = 0;\r
2690         switch (nStep) {\r
2691         case 0:\r
2692 //              CUtils::Log(_T("M-d: 0"));\r
2693                 ClearNumericArgument();\r
2694                 szClipboardText.Empty();\r
2695                 nWhiteSpace = 0;\r
2696                 CdSdKduSuCu(VK_RIGHT);\r
2697                 CdKduCu('X');\r
2698                 nStep = 1;\r
2699                 return Reset(GOTO_RECURSIVE);\r
2700         case 1:\r
2701                 {\r
2702 //                      CUtils::Log(_T("M-d: 1"));\r
2703                         nStep = 0;\r
2704                         CUtils::GetClipboardText(&szClipboardText);\r
2705                         int nWordEnd = szClipboardText.GetLength();\r
2706                         int nFirstSpace = szClipboardText.Find(_T(' '));\r
2707 //                      CUtils::Log(_T("M-d: 1-1 _%s_%c"), szClipboardText, szClipboardText.GetAt(szClipboardText.GetLength() - 1));\r
2708                         if (nFirstSpace == 0) {\r
2709 //                              CUtils::Log(_T("M-d: 1-1-1"));\r
2710                                 nStep = 0;\r
2711                                 return Reset(GOTO_RECURSIVE);\r
2712                         } else if (0 < nFirstSpace) {\r
2713 //                              CUtils::Log(_T("M-d: 1-1-2"));\r
2714                                 nWordEnd = nFirstSpace; // (nFirstSpace + 1) - 1\r
2715                         }\r
2716                         int nFirstTab = szClipboardText.Find(_T('\t'));\r
2717                         if (nFirstTab == 0) {\r
2718 //                              CUtils::Log(_T("M-d: 1-2-1"));\r
2719                                 nStep = 0;\r
2720                                 return Reset(GOTO_RECURSIVE);\r
2721                         } else if (0 < nFirstTab && nFirstTab < nWordEnd) {\r
2722 //                              CUtils::Log(_T("M-d: 1-2-2"));\r
2723                                 nWordEnd = nFirstTab;   // (nFirstTab + 1) - 1\r
2724                         }\r
2725                         if (nWordEnd == szClipboardText.GetLength()) {\r
2726 //                              CUtils::Log(_T("M-d: 1-3-1"));\r
2727                                 nStep = 4;\r
2728                         } else {\r
2729 //                              CUtils::Log(_T("M-d: 1-3-2"));\r
2730                                 CString szEndWhiteSpace;\r
2731                                 nWhiteSpace = szClipboardText.GetLength() - nWordEnd;\r
2732                                 szEndWhiteSpace = szClipboardText.Right(nWhiteSpace);\r
2733                                 CUtils::SetClipboardText(&szEndWhiteSpace);\r
2734                                 szClipboardText = szClipboardText.Left(nWordEnd);\r
2735                                 nStep = 2;\r
2736                         }\r
2737                         return Reset(GOTO_RECURSIVE);\r
2738                 }\r
2739         case 2:\r
2740 //              CUtils::Log(_T("M-d: 2"));\r
2741                 nStep = 0;\r
2742                 CdKduCu('V');\r
2743                 nStep = 3;\r
2744                 return Reset(GOTO_RECURSIVE);\r
2745         case 3:\r
2746 //              CUtils::Log(_T("M-d: 3"));\r
2747                 nStep = 0;\r
2748                 m_bDefaultNumericArgument = FALSE;\r
2749                 m_nNumericArgument = nWhiteSpace;\r
2750                 Kdu(VK_LEFT);\r
2751                 nStep = 4;\r
2752                 return Reset(GOTO_RECURSIVE);\r
2753         case 4:\r
2754 //              CUtils::Log(_T("M-d: 4"));\r
2755                 nStep = 0;\r
2756                 CUtils::SetClipboardText(&szClipboardText);\r
2757                 nStep = 5;\r
2758                 return Reset(GOTO_RECURSIVE);\r
2759         case 5:\r
2760 //              CUtils::Log(_T("M-d: 5"));\r
2761                 nStep = 0;\r
2762                 CXkeymacsDll::AddKillRing();\r
2763                 m_bSetMark = FALSE;\r
2764                 return Reset(GOTO_HOOK);\r
2765         }\r
2766         // dummy\r
2767         return Reset(GOTO_HOOK);\r
2768 }\r
2769 \r
2770 // M-DEL\r
2771 int CCommands::BackwardKillWord()\r
2772 {\r
2773         CdSdKduSuCu(VK_LEFT);\r
2774         Cut_();\r
2775         return Reset(GOTO_HOOK);\r
2776 }\r
2777 \r
2778 // Select All\r
2779 int CCommands::SelectAll()\r
2780 {\r
2781         if (CUtils::IsConsole()) {\r
2782                 SystemMenuEdit(CMD_SELECT_ALL);\r
2783         } else {\r
2784                 CdKduCu('A');\r
2785         }\r
2786         return Reset(GOTO_HOOK);\r
2787 }\r
2788 \r
2789 // C-x (\r
2790 int CCommands::StartKbdMacro()\r
2791 {\r
2792         if (CUtils::IsMicrosoftWord()) {\r
2793                 AdKduAu('T', 'M', 'R');\r
2794         } else if (CUtils::IsHidemaru()) {\r
2795                 SdKduSu(VK_F1);\r
2796         } else {\r
2797                 CXkeymacsDll::StartRecordMacro();\r
2798         }\r
2799         return Reset(GOTO_HOOK);\r
2800 }\r
2801 \r
2802 // C-x )\r
2803 int CCommands::EndKbdMacro()\r
2804 {\r
2805         if (CUtils::IsMicrosoftWord()) {\r
2806                 AdKduAu('T', 'M', 'R');\r
2807         } else if (CUtils::IsHidemaru()) {\r
2808                 SdKduSu(VK_F1);\r
2809         } else {\r
2810                 CXkeymacsDll::EndRecordMacro();\r
2811         }\r
2812         return Reset(GOTO_HOOK);\r
2813 }\r
2814 \r
2815 // C-x e\r
2816 int CCommands::CallLastKbdMacro()\r
2817 {\r
2818         if (CUtils::IsMicrosoftWord()) {\r
2819                 AdKduAu('T', 'M', 'M');\r
2820         } else if (CUtils::IsHidemaru()) {\r
2821                 int n = 1;\r
2822                 if (!m_bDefaultNumericArgument) {\r
2823                         n = m_nNumericArgument;\r
2824                 }\r
2825                 ClearNumericArgument();\r
2826                 while (n--) {\r
2827                         AdKduAu('M', 'P');\r
2828                 }\r
2829         } else {\r
2830                 while (m_nNumericArgument--) {\r
2831                         CXkeymacsDll::CallMacro();\r
2832                 }\r
2833         }\r
2834         return Reset(GOTO_HOOK);\r
2835 }\r
2836 \r
2837 int CCommands::SwitchBetweenInputLocales()\r
2838 {\r
2839         UINT before = CXkeymacsDll::GetModifierState();\r
2840         CXkeymacsDll::SetModifierState(0, before);\r
2841 \r
2842         // Alt+Shift\r
2843         CXkeymacsDll::SetModifierState(SHIFT | META, 0);\r
2844         CXkeymacsDll::SetModifierState(0, SHIFT | META);\r
2845 \r
2846         CXkeymacsDll::SetModifierState(before, 0);\r
2847 \r
2848         return Reset(GOTO_HOOK);\r
2849 }\r
2850 \r
2851 // C-x b\r
2852 int CCommands::SwitchToBuffer()\r
2853 {\r
2854         ClearNumericArgument();\r
2855         // GetWindowInfo does not get information to find out if the window is MDI or SDI.\r
2856         CdKduCu(VK_TAB);\r
2857         return Reset(GOTO_HOOK);\r
2858 }\r
2859 \r
2860 int CCommands::C_()\r
2861 {\r
2862         return Reset(GOTO_HOOKX);\r
2863 }\r
2864 \r
2865 int CCommands::C_Eisu()\r
2866 {\r
2867         bC_(TRUE);\r
2868         return Reset(GOTO_HOOKX);\r
2869 }\r
2870 \r
2871 int CCommands::Escape()\r
2872 {\r
2873         ClearNumericArgument();\r
2874         Kdu(VK_ESCAPE);\r
2875         return Reset(GOTO_HOOK);\r
2876 }\r
2877 \r
2878 int CCommands::Tilde()\r
2879 {\r
2880         ClearNumericArgument();\r
2881         if (CXkeymacsDll::Is106Keyboard()) {\r
2882                 SdKduSu(0xDE);  // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
2883                 Su();                   //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
2884         } else {\r
2885                 SdKduSu(0xC0);  // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
2886                 Su();                   //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
2887         }\r
2888         return Reset(GOTO_HOOK);\r
2889 }\r
2890 \r
2891 int CCommands::BackQuote()\r
2892 {\r
2893         ClearNumericArgument();\r
2894         if (CXkeymacsDll::Is106Keyboard()) {\r
2895                 SdKduSu(0xC0);\r
2896                 Su();\r
2897         } else {\r
2898                 ReleaseKey(VK_SHIFT);\r
2899                 Kdu(0xC0);      // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
2900                                         //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
2901         }\r
2902         return Reset(GOTO_HOOK);\r
2903 }\r
2904 \r
2905 BOOL CCommands::IsSetMark()\r
2906 {\r
2907         return m_bSetMark;\r
2908 }\r
2909 \r
2910 BYTE CCommands::GetFindWhatKey()\r
2911 {\r
2912         BYTE bFindWhat = 'N';\r
2913 \r
2914         if (CUtils::IsBecky()\r
2915          || CUtils::IsDana()\r
2916          || CUtils::IsEclipse()\r
2917          || CUtils::IsezHTML()\r
2918          || CUtils::IsLotusNotes()\r
2919          || CUtils::IsVisualBasicEditor()) {\r
2920                 bFindWhat = 'F';\r
2921         } else if (CUtils::IseMemoPad()) {\r
2922                 bFindWhat = 'K';\r
2923         } else if (CUtils::IsHidemaru()\r
2924                         || CUtils::IsJmEditor()) {\r
2925                 bFindWhat = 'S';\r
2926         } else if (CUtils::IsBorlandCppBuilder()\r
2927                         || CUtils::IsNami2000()\r
2928                         || CUtils::IsStoryEditor()\r
2929                         || CUtils::IsTeraPad()) {\r
2930                 bFindWhat = 'T';\r
2931         } else if (CUtils::IsAdobeReader()\r
2932                         || CUtils::IsAutla()\r
2933                         || CUtils::IsCodeWarrior()\r
2934                         || CUtils::IsFirefox()\r
2935                         || CUtils::IsFlash()\r
2936                         || CUtils::IsIPMessenger()\r
2937                         || CUtils::IsK2Editor()\r
2938                         || CUtils::IsOedit()\r
2939                         || CUtils::IsOpera()\r
2940                         || CUtils::IsOpenJane()\r
2941                         || CUtils::IsPHPEditor()\r
2942                         || CUtils::IsSakuraEditor()) {\r
2943                 bFindWhat = 0;\r
2944         }\r
2945 \r
2946         return bFindWhat;\r
2947 }\r
2948 \r
2949 BYTE CCommands::GetSearchOptionKey()\r
2950 {\r
2951         BYTE bSearchOption = 0;\r
2952 \r
2953         if (CUtils::IsLotusNotes()) {\r
2954                 bSearchOption = 'O';\r
2955         }\r
2956 \r
2957         return bSearchOption;\r
2958 }\r
2959 \r
2960 BYTE CCommands::GetDirectionForwardKey()\r
2961 {\r
2962         BYTE bDirectionForward = 'D';\r
2963         CString szDialogTitle;\r
2964         CUtils::GetFindDialogTitle(&szDialogTitle);\r
2965 \r
2966         if (CUtils::IsAdobeReader()\r
2967          || CUtils::IsAutla()\r
2968          || CUtils::IsCodeWarrior()\r
2969          || CUtils::IsDirector()\r
2970          || CUtils::IsDreamweaver()\r
2971          || CUtils::IsExcel()\r
2972          || CUtils::IsFirefox()\r
2973          || CUtils::IsFireworks()\r
2974          || CUtils::IsFlash()\r
2975          || CUtils::IsIPMessenger()\r
2976          || CUtils::IsJmEditor()\r
2977          || CUtils::IsLotus123()\r
2978          || CUtils::IsMicrosoftPowerPoint()\r
2979          || CUtils::IsOpera()\r
2980          || CUtils::IsOpenJane()\r
2981          || CUtils::IsStoryEditor()\r
2982          || CUtils::IsVisualBasicEditor()\r
2983          || CUtils::IsWordpad()) {\r
2984                 bDirectionForward = 0;\r
2985         } else if (CUtils::IsLotusNotes()\r
2986                         || CUtils::IsNami2000()\r
2987                         || CUtils::IsSakuraEditor()) {\r
2988                 bDirectionForward = 'D';\r
2989         } else if (CUtils::IsOedit()) {\r
2990                 bDirectionForward = 'F';\r
2991         } else if (CUtils::IsBecky()) {\r
2992                 if (!szDialogTitle.Compare(_T("\96{\95¶\93à\8c\9f\8dõ"))) {\r
2993                         bDirectionForward = 'O';\r
2994                 } else {\r
2995                         bDirectionForward = 0;\r
2996                 }\r
2997         } else if (CUtils::IsK2Editor()) {\r
2998                 bDirectionForward = 'L';\r
2999         } else if (CUtils::IseMemoPad()\r
3000                         || CUtils::IsHidemaru()) {\r
3001                 bDirectionForward = 'N';\r
3002         } else if (CUtils::IsEclipse()) {\r
3003                 bDirectionForward = 'O';\r
3004         }\r
3005 \r
3006         if (CUtils::IsOutlook()\r
3007          && !szDialogTitle.Compare(_T("Find"))) {\r
3008                 // Outlook (English version)\r
3009                 bDirectionForward = 0;\r
3010         }\r
3011 \r
3012         return bDirectionForward;\r
3013 }\r
3014 \r
3015 BYTE CCommands::GetDirectionBackwardKey()\r
3016 {\r
3017         BYTE bDirectionBackward = 'U';\r
3018         CString szDialogTitle;\r
3019         CUtils::GetFindDialogTitle(&szDialogTitle);\r
3020 \r
3021         if (CUtils::IsAdobeReader()\r
3022          || CUtils::IsAutla()\r
3023          || CUtils::IsCodeWarrior()\r
3024          || CUtils::IsDirector()\r
3025          || CUtils::IsDreamweaver()\r
3026          || CUtils::IsExcel()\r
3027          || CUtils::IsFirefox()\r
3028          || CUtils::IsFireworks()\r
3029          || CUtils::IsFlash()\r
3030          || CUtils::IsIPMessenger()\r
3031          || CUtils::IsJmEditor()\r
3032          || CUtils::IsLotus123()\r
3033          || CUtils::IsMicrosoftPowerPoint()\r
3034          || CUtils::IsOpera()\r
3035          || CUtils::IsOpenJane()\r
3036          || CUtils::IsStoryEditor()\r
3037          || CUtils::IsVisualBasicEditor()\r
3038          || CUtils::IsWordpad()) {\r
3039                 bDirectionBackward = 0;\r
3040         } else if (CUtils::IsBorlandCppBuilder()\r
3041                         || CUtils::IsEclipse()\r
3042                         || CUtils::IseMemoPad()\r
3043                         || CUtils::IsLotusNotes()\r
3044                         || CUtils::IsNami2000()) {\r
3045                 bDirectionBackward = 'B';\r
3046         } else if (CUtils::IsBecky()) {\r
3047                 if (!szDialogTitle.Compare(_T("\96{\95¶\93à\8c\9f\8dõ"))) {\r
3048                         bDirectionBackward = 'B';\r
3049                 } else {\r
3050                         bDirectionBackward = 0;\r
3051                 }\r
3052         } else if (CUtils::IsHidemaru()\r
3053                         || CUtils::IsOedit()) {\r
3054                 bDirectionBackward = 'P';\r
3055         } else if (CUtils::IsK2Editor()\r
3056                         || CUtils::IsSakuraEditor()) {\r
3057                 bDirectionBackward = 'U';\r
3058         }\r
3059 \r
3060         if (CUtils::IsOutlook()\r
3061          && !szDialogTitle.Compare(_T("Find"))) {\r
3062                 // Outlook (English version)\r
3063                 bDirectionBackward = 0;\r
3064         }\r
3065 \r
3066         return bDirectionBackward;\r
3067 }\r
3068 \r
3069 void CCommands::SetMark(BOOL bSetMark)\r
3070 {\r
3071         m_bSetMark = bSetMark;\r
3072 }\r
3073 \r
3074 GOTO CCommands::MoveCaret(BYTE bVk, BOOL bCtrl)\r
3075 {\r
3076         switch (bVk) {\r
3077         case VK_PRIOR:\r
3078         case VK_NEXT:\r
3079         case VK_END:\r
3080         case VK_HOME:\r
3081         case VK_LEFT:\r
3082         case VK_UP:\r
3083         case VK_RIGHT:\r
3084         case VK_DOWN:\r
3085                 break;\r
3086         default:\r
3087                 return CONTINUE;\r
3088         }\r
3089 \r
3090         struct {\r
3091                 BYTE bVk;\r
3092                 BOOL bCtrl;\r
3093                 DWORD time;\r
3094         } static last;\r
3095 \r
3096         const DWORD time = GetTickCount();\r
3097 //      CUtils::Log(_T("%d - %d = %d, %d, %d"), time, last.time, time - last.time, CXkeymacsDll::GetMaxKeyInterval(), CXkeymacsDll::GetAccelerate());\r
3098         if (CXkeymacsDll::GetAccelerate() && bVk == last.bVk && bCtrl == last.bCtrl && time - last.time < CXkeymacsDll::GetMaxKeyInterval()) {\r
3099                 NumericArgument(CXkeymacsDll::GetAccelerate());\r
3100         }\r
3101         last.bVk = bVk;\r
3102         last.bCtrl = bCtrl;\r
3103         last.time = time;\r
3104 \r
3105         if (bCtrl) {\r
3106                 if (m_bSetMark)\r
3107                         CdSdKduSuCu(bVk);\r
3108                 else\r
3109                         CdKduCu(bVk);\r
3110                 return GOTO_HOOK;\r
3111         }\r
3112         if (!m_bSetMark) {\r
3113                 Kdu(bVk);\r
3114                 return GOTO_HOOK;\r
3115         }\r
3116         if (CUtils::IsShuriken()) {\r
3117                 static UINT before;\r
3118                 static int nStep = 0;\r
3119                 switch (nStep) {\r
3120                 case 0:\r
3121                         before = CXkeymacsDll::GetModifierState();\r
3122                         CXkeymacsDll::SetModifierState(SHIFT, before);\r
3123                         CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
3124                         CXkeymacsDll::SetModifierState(before | SHIFT, SHIFT);\r
3125                         nStep = 1;\r
3126                         return GOTO_RECURSIVE;\r
3127                 case 1:\r
3128                         nStep = 0;\r
3129                         if (!(before & SHIFT))\r
3130                                 ReleaseKey(VK_SHIFT);\r
3131                         return GOTO_HOOK;\r
3132                 }\r
3133         }\r
3134         SdKduSu(bVk);\r
3135         return GOTO_HOOK;\r
3136 }\r
3137 \r
3138 int CCommands::PassThrough()\r
3139 {\r
3140         Reset();        // Why?\r
3141         return Reset(GOTO_HOOK);\r
3142 }\r
3143 \r
3144 int CCommands::Redo()\r
3145 {\r
3146         if (CUtils::IsCorelDRAW()) {\r
3147                 CdSdKduSuCu('Z');\r
3148         } else {\r
3149                 CdKduCu('Y');\r
3150         }\r
3151         return Reset(GOTO_HOOK);\r
3152 }\r
3153 \r
3154 int CCommands::TemporarilyDisableXKeymacs()\r
3155 {\r
3156 //      CUtils::Log(_T("SetTemporarilyDisableXKeymacs"));\r
3157         SetTemporarilyDisableXKeymacs(TRUE);\r
3158         Reset();        // Why?\r
3159         return Reset(GOTO_HOOK);\r
3160 }\r
3161 \r
3162 BOOL CCommands::IsTemporarilyDisableXKeymacs()\r
3163 {\r
3164         return m_bTemporarilyDisableXKeymacs;\r
3165 }\r
3166 \r
3167 void CCommands::SetTemporarilyDisableXKeymacs(BOOL bTemporarilyDisableXKeymacs)\r
3168 {\r
3169         m_bTemporarilyDisableXKeymacs = bTemporarilyDisableXKeymacs;\r
3170         CXkeymacsDll::ShowKeyboardHookState();\r
3171 }\r
3172 \r
3173 int CCommands::New()\r
3174 {\r
3175         ClearNumericArgument();\r
3176         m_bSetMark = FALSE;\r
3177         CdKduCu('N');\r
3178         return Reset(GOTO_HOOK);\r
3179 }\r
3180 \r
3181 int CCommands::Print()\r
3182 {\r
3183         ClearNumericArgument();\r
3184         m_bSetMark = FALSE;\r
3185         CdKduCu('P');\r
3186         return Reset(GOTO_HOOK);\r
3187 }\r
3188 \r
3189 int CCommands::Find()\r
3190 {\r
3191         ClearNumericArgument();\r
3192         m_bSetMark = FALSE;\r
3193         CdKduCu('F');\r
3194         return Reset(GOTO_HOOK);\r
3195 }\r
3196 \r
3197 int CCommands::FindNext()\r
3198 {\r
3199         ClearNumericArgument();\r
3200         m_bSetMark = FALSE;\r
3201         Kdu(VK_F3);\r
3202         return Reset(GOTO_HOOK);\r
3203 }\r
3204 \r
3205 int CCommands::SystemMenu(const CONSOLE_MENU nDown)\r
3206 {\r
3207 //      CUtils::Log(_T("SystemMenu"));\r
3208         if (!CUtils::IsConsole()) {\r
3209                 return ERROR_SUCCESS;\r
3210         }\r
3211 \r
3212         RECT consoleWindowRect = {'\0'};\r
3213         if (!GetWindowRect(GetForegroundWindow(), &consoleWindowRect)) {\r
3214                 return GetLastError();\r
3215         }\r
3216 //      CUtils::Log(_T("t = %d, l = %d"), consoleWindowRect.top, consoleWindowRect.left);\r
3217 \r
3218         const POINT clickPoint = {consoleWindowRect.left + 5, consoleWindowRect.top + 5};\r
3219         int rc = Click(&clickPoint);\r
3220         if (rc != ERROR_SUCCESS) {\r
3221                 return rc;\r
3222         }\r
3223 \r
3224         if (nDown != CMD_EDIT) {\r
3225                 for (int i = 0; i <= nDown; ++i) {\r
3226                         Kdu(VK_DOWN);\r
3227                 }\r
3228                 Kdu(VK_UP);\r
3229                 Kdu(VK_RETURN);\r
3230         }\r
3231         return ERROR_SUCCESS;   // i.e. return 0;\r
3232 }\r
3233 \r
3234 int CCommands::SystemMenuEdit(const CONSOLE_MENU_EDIT nDown)\r
3235 {\r
3236         if (!CUtils::IsConsole()) {\r
3237                 return ERROR_SUCCESS;\r
3238         }\r
3239 \r
3240         SystemMenu(CMD_EDIT);\r
3241         RECT consoleWindowRect = {'\0'};\r
3242         if (!GetWindowRect(GetForegroundWindow(), &consoleWindowRect)) {\r
3243                 return GetLastError();\r
3244         }\r
3245 \r
3246         const int y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) * 6 + 20;    // y = A + B * 6 + 20\r
3247         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
3248         int rc = Click(&clickPoint);                                                                                                            // 157 <= y <= 172 on WXP       (157 + 172 + 1) / 2 = 165 = 26 + 20 x 6 + 19\r
3249         if (rc != ERROR_SUCCESS) {\r
3250                 return rc;\r
3251         }\r
3252 \r
3253         for (int i = 0; i <= nDown; ++i) {\r
3254                 Kdu(VK_DOWN);\r
3255         }\r
3256         Kdu(VK_UP);     // Why? Because Mark did not work well only one VK_DOWN (or seven VK_DOWNs).\r
3257 \r
3258         Kdu(VK_RETURN);\r
3259         return ERROR_SUCCESS;   // i.e. return 0;\r
3260 }\r
3261 \r
3262 int CCommands::Click(const POINT *const pClickPoint)\r
3263 {\r
3264         BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
3265 \r
3266         POINT CursorPos = {'\0'};\r
3267         if (!GetCursorPos(&CursorPos)) {\r
3268                 return GetLastError();\r
3269         }\r
3270 \r
3271         if (!SetCursorPos(pClickPoint->x, pClickPoint->y)) {\r
3272                 return GetLastError();\r
3273         }\r
3274         if (CUtils::IsConsole()\r
3275          && bIsAltDown) {\r
3276                 ReleaseKey(VK_MENU);\r
3277         }\r
3278         mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo());\r
3279         mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo());\r
3280         if (!SetCursorPos(CursorPos.x, CursorPos.y)) {\r
3281                 return GetLastError();\r
3282         }\r
3283         return ERROR_SUCCESS;\r
3284 }\r
3285 \r
3286 // C-x C-t\r
3287 int CCommands::TransposeLines()\r
3288 {\r
3289         static int nStep = 0;\r
3290         switch (nStep) {\r
3291         case 0:\r
3292                 nStep = 0;\r
3293 //              CUtils::Log(_T("C-x C-t: 0"));\r
3294                 Kdu(VK_END);\r
3295                 CaptureClipboardData();\r
3296                 nStep = 1;\r
3297                 return Reset(GOTO_RECURSIVE);\r
3298         case 1:\r
3299                 nStep = 0;\r
3300 //              CUtils::Log(_T("C-x C-t: 1"));\r
3301                 if (!CopyNextCharacter()) {\r
3302                         return Reset(GOTO_DO_NOTHING);\r
3303                 }\r
3304                 nStep = 2;\r
3305                 return Reset(GOTO_RECURSIVE);\r
3306         case 2:\r
3307                 nStep = 0;\r
3308 //              CUtils::Log(_T("C-x C-t: 2"));\r
3309                 Su();\r
3310                 if (CUtils::IsEOF()) {\r
3311                         Kdu(VK_END, VK_RETURN, VK_UP, VK_END);\r
3312                 }\r
3313                 Kdu(VK_HOME);\r
3314                 nStep = 3;\r
3315                 return Reset(GOTO_RECURSIVE);\r
3316         case 3:\r
3317                 nStep = 0;\r
3318 //              CUtils::Log(_T("C-x C-t: 3"));\r
3319                 if (!CopyBackCharacter()) {\r
3320                         return Reset(GOTO_DO_NOTHING);\r
3321                 }\r
3322                 nStep = 4;\r
3323                 return Reset(GOTO_RECURSIVE);\r
3324         case 4:\r
3325                 nStep = 0;\r
3326 //              CUtils::Log(_T("C-x C-t: 4"));\r
3327                 Su();\r
3328                 if (CUtils::IsTOF()) {  // TOF\r
3329                         Kdu(VK_DOWN, VK_END);\r
3330 //                      CUtils::Log(_T("C-x C-t: TOF"));\r
3331                         nStep = 5;\r
3332                 } else {\r
3333                         nStep = 7;\r
3334                 }\r
3335                 return Reset(GOTO_RECURSIVE);\r
3336         case 5:\r
3337                 nStep = 0;\r
3338 //              CUtils::Log(_T("C-x C-t: 5"));\r
3339                 if (!CopyNextCharacter()) {\r
3340                         return Reset(GOTO_DO_NOTHING);\r
3341                 }\r
3342                 nStep = 6;\r
3343                 return Reset(GOTO_RECURSIVE);\r
3344         case 6:\r
3345                 nStep = 0;\r
3346 //              CUtils::Log(_T("C-x C-t: 6"));\r
3347                 Su();\r
3348                 if (CUtils::IsEOF()) {\r
3349                         Kdu(VK_END, VK_RETURN, VK_UP, VK_END);\r
3350 //                      CUtils::Log(_T("C-x C-t: EOF2"));\r
3351                 }\r
3352                 nStep = 7;\r
3353                 return Reset(GOTO_RECURSIVE);\r
3354         case 7:\r
3355                 nStep = 0;\r
3356 //              CUtils::Log(_T("C-x C-t: 7"));\r
3357                 Kdu(VK_UP, VK_HOME);\r
3358                 SdKduSu(VK_DOWN);\r
3359                 CdKduCu('X');\r
3360                 nStep = 8;\r
3361                 return Reset(GOTO_RECURSIVE);\r
3362         case 8:\r
3363                 nStep = 0;\r
3364 //              CUtils::Log(_T("C-x C-t: 8"));\r
3365                 Su();\r
3366                 Kdu(VK_DOWN);\r
3367                 CdKduCu('V');\r
3368                 nStep = 9;\r
3369                 return Reset(GOTO_RECURSIVE);\r
3370         case 9:\r
3371                 nStep = 0;\r
3372 //              CUtils::Log(_T("C-x C-t: 9"));\r
3373                 RestoreClipboardData();\r
3374                 break;\r
3375         }\r
3376         return Reset(GOTO_HOOK);\r
3377 }\r
3378 \r
3379 void CCommands::CaptureClipboardData(const int nID, const BOOL bTextOnly)\r
3380 {\r
3381 //      CUtils::Log("CaptureClipboardData: 1");\r
3382         {\r
3383                 int nSize = nID + 1;\r
3384                 if (m_oClipboardData.GetSize() < nSize) {\r
3385 //                      CUtils::Log("CaptureClipboardData: 2");\r
3386                         try {\r
3387                                 m_oClipboardData.SetSize(nSize);\r
3388                         }\r
3389                         catch (CMemoryException* e) {\r
3390                                 e->Delete();\r
3391 //                              CUtils::Log("CaptureClipboardData: SetSize() threw an exception");\r
3392                         }\r
3393                 }\r
3394         }\r
3395 \r
3396 //      CUtils::Log("CaptureClipboardData: 3");\r
3397         if (!m_oClipboardData[nID]) {\r
3398 //              CUtils::Log("CaptureClipboardData: 4");\r
3399                 try {\r
3400                         CClipboardSnap *pSnap = new CClipboardSnap;\r
3401                         if (!pSnap) {\r
3402 //                              CUtils::Log("CaptureClipboardData: 5");\r
3403                                 return;\r
3404                         }\r
3405                         m_oClipboardData.SetAt(nID, pSnap);\r
3406                 }\r
3407                 catch (CMemoryException* e) {\r
3408                         e->Delete();\r
3409 //                      CUtils::Log("CaptureClipboardData: 'new' threw an exception");\r
3410                 }\r
3411         }\r
3412 \r
3413 //      CUtils::Log("CaptureClipboardData: 6: nID=%d, size=%d", nID, m_oClipboardData.GetSize());\r
3414         BOOL bCapture = m_oClipboardData[nID]->Capture(bTextOnly);\r
3415 //      CUtils::Log("CaptureClipboardData: 7");\r
3416         Sleep(0);       // for OpenOffice\r
3417         bCapture = m_oClipboardData[nID]->Capture(bTextOnly);   // for "office drawing shape format". Can CClipboardSnap care this problem?\r
3418 \r
3419 //      CUtils::Log("CaptureClipboardData: 8");\r
3420         if (!bCapture) {\r
3421 //              CUtils::Log(_T("Can not Capture in CaptureClipboardData"));\r
3422                 delete m_oClipboardData[nID];\r
3423 //              CUtils::Log("CaptureClipboardData: 9");\r
3424                 m_oClipboardData.SetAt(nID, NULL);\r
3425 //              CUtils::Log("CaptureClipboardData: 10");\r
3426         }\r
3427 }\r
3428 \r
3429 void CCommands::RestoreClipboardData(const int nID)\r
3430 {\r
3431         if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
3432                 m_oClipboardData[nID]->Restore();\r
3433         }\r
3434 }\r
3435 \r
3436 int CCommands::FindReturnFromClipboardData(const int nID)\r
3437 {\r
3438         if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
3439                 return m_oClipboardData[nID]->FindReturn();\r
3440         }\r
3441         return -1;\r
3442 }\r
3443 \r
3444 BOOL CCommands::IsEmptyClipboardData(const int nID)\r
3445 {\r
3446         if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
3447                 return m_oClipboardData[nID]->IsEmpty();\r
3448         }\r
3449         return FALSE;\r
3450 }\r
3451 \r
3452 void CCommands::PrintFunctionName(int (*nFunctionPointer)())\r
3453 {\r
3454         for (int nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
3455                 if (Commands[nComID].fCommand == nFunctionPointer) {\r
3456                         CUtils::Log(_T("m_LastCommand: %s"), Commands[nComID].szCommandName);\r
3457                 }\r
3458         }\r
3459 }\r
3460 \r
3461 int CCommands::CapsLock()\r
3462 {\r
3463         ClearNumericArgument();\r
3464         Kdu(VK_CAPITAL);\r
3465         return Reset(GOTO_HOOK);\r
3466 }\r
3467 \r
3468 int CCommands::Underscore()\r
3469 {\r
3470         ClearNumericArgument();\r
3471         if (CXkeymacsDll::Is106Keyboard()) {\r
3472                 SdKduSu(0xE2);  // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
3473                 Su();\r
3474         } else {\r
3475                 SdKduSu(0xBD);  // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
3476                 Su();\r
3477         }\r
3478         return Reset(GOTO_HOOK);\r
3479 }\r
3480 \r
3481 int CCommands::RollUpUnroll()\r
3482 {\r
3483         return Maximize(ROLL_UP_UNROLL);\r
3484 }\r
3485 \r
3486 int CCommands::Retop()\r
3487 {\r
3488         RECT ClientRect = {'\0'};\r
3489         GetClientRect(GetFocus(), &ClientRect);\r
3490 \r
3491         for (int i = 0; i < 0x10000; ++i) {\r
3492                 POINT CaretPos = {'\0'};\r
3493                 GetCaretPos(&CaretPos);\r
3494                 if (ClientRect.top + 10 < CaretPos.y) {\r
3495                         SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
3496                 } else {\r
3497                         return Reset(GOTO_HOOK);\r
3498                 }\r
3499         }\r
3500 \r
3501         Kdu(VK_UP, VK_DOWN);\r
3502         return Reset(GOTO_HOOK);\r
3503 }\r
3504 \r
3505 int CCommands::OneShotModifierShift()\r
3506 {\r
3507         // dummy\r
3508         ASSERT(0);\r
3509         static int i = 0;\r
3510         ++i;\r
3511         return Reset(GOTO_HOOK);\r
3512 }\r
3513 \r
3514 int CCommands::OneShotModifierShiftRepeat()\r
3515 {\r
3516         // dummy\r
3517         ASSERT(0);\r
3518         static int i = 0;\r
3519         ++i;\r
3520         return Reset(GOTO_HOOK);\r
3521 }\r
3522 \r
3523 int CCommands::OneShotModifierCtrl()\r
3524 {\r
3525         // dummy\r
3526         ASSERT(0);\r
3527         static int i = 0;\r
3528         ++i;\r
3529         return Reset(GOTO_HOOK);\r
3530 }\r
3531 \r
3532 int CCommands::OneShotModifierCtrlRepeat()\r
3533 {\r
3534         // dummy\r
3535         ASSERT(0);\r
3536         static int i = 0;\r
3537         ++i;\r
3538         return Reset(GOTO_HOOK);\r
3539 }\r
3540 \r
3541 int CCommands::OneShotModifierAlt()\r
3542 {\r
3543         // dummy\r
3544         ASSERT(0);\r
3545         static int i = 0;\r
3546         ++i;\r
3547         return Reset(GOTO_HOOK);\r
3548 }\r
3549 \r
3550 int CCommands::OneShotModifierAltRepeat()\r
3551 {\r
3552         // dummy\r
3553         ASSERT(0);\r
3554         static int i = 0;\r
3555         ++i;\r
3556         return Reset(GOTO_HOOK);\r
3557 }\r
3558 \r
3559 int CCommands::CycleItems()\r
3560 {\r
3561         ClearNumericArgument();\r
3562         AdKduAu(VK_ESCAPE);\r
3563         return Reset(GOTO_HOOK);\r
3564 }\r
3565 \r
3566 int CCommands::CycleItemsInversely()\r
3567 {\r
3568         ClearNumericArgument();\r
3569         AdSdKduSuAu(VK_ESCAPE);\r
3570         return Reset(GOTO_HOOK);\r
3571 }\r
3572 \r
3573 // M-t\r
3574 int CCommands::TransposeWords()\r
3575 {\r
3576         static int nStep = 0;\r
3577         switch (nStep) {\r
3578         case 0:\r
3579                 nStep = 0;\r
3580 //              CUtils::Log(_T("M-t: 0"));\r
3581                 CdKduCu(VK_LEFT);\r
3582                 CaptureClipboardData();\r
3583                 nStep = 1;\r
3584                 return Reset(GOTO_RECURSIVE);\r
3585         case 1:\r
3586                 nStep = 0;\r
3587 //              CUtils::Log(_T("M-t: 1"));\r
3588                 CdSdKduSuCu(VK_RIGHT);\r
3589                 CdKduCu('X');\r
3590                 nStep = 2;\r
3591                 return Reset(GOTO_RECURSIVE);\r
3592         case 2:\r
3593                 nStep = 0;\r
3594 //              CUtils::Log(_T("M-t: 2"));\r
3595                 Su();\r
3596                 CdKduCu(VK_RIGHT);\r
3597                 CdKduCu('V');\r
3598                 Kdu(VK_LEFT);\r
3599                 nStep = 3;\r
3600                 return Reset(GOTO_RECURSIVE);\r
3601         case 3:\r
3602                 nStep = 0;\r
3603 //              CUtils::Log(_T("M-t: 3"));\r
3604                 RestoreClipboardData();\r
3605                 break;\r
3606         }\r
3607         return Reset(GOTO_HOOK);\r
3608 }\r
3609 \r
3610 LRESULT CCommands::VScroll(UINT nSBCode, const int nTimes)\r
3611 {\r
3612         if (CUtils::IsMicrosoftWord()\r
3613          || CUtils::IsThunderbird()) {\r
3614                 RECT ClientRect = {'\0'};\r
3615                 GetClientRect(GetFocus(), &ClientRect);\r
3616 \r
3617                 POINT righttop = {ClientRect.right, ClientRect.top};\r
3618                 ClientToScreen(GetFocus(), &righttop);\r
3619 //              CUtils::Log(_T("righttop: x = %d, y = %d"), righttop.x, righttop.y);\r
3620 \r
3621                 POINT rightbottom = {ClientRect.right, ClientRect.bottom};\r
3622                 ClientToScreen(GetFocus(), &rightbottom);\r
3623 //              CUtils::Log(_T("rightbottom: x = %d, y = %d"), rightbottom.x, rightbottom.y);\r
3624 \r
3625 //              POINT CursorPos = {'\0'};\r
3626 //              GetCursorPos(&CursorPos);\r
3627 //              CUtils::Log(_T("VScroll: x = %d, y = %d"), CursorPos.x, CursorPos.y);\r
3628 \r
3629                 POINT scrollpos = {'\0'};\r
3630 \r
3631                 switch (nSBCode) {\r
3632                 case SB_LINEUP:\r
3633                         if (CUtils::IsMicrosoftWord()) {\r
3634                                 scrollpos.x = righttop.x + 8;   // 0 to 16\r
3635                                 scrollpos.y = righttop.y - 9;   // 1 to 17\r
3636                         } else if (CUtils::IsThunderbird()) {\r
3637                                 scrollpos.x = righttop.x - 10;  // 2 to 18\r
3638                                 scrollpos.y = righttop.y + 8;   // 0 to 16\r
3639                         }\r
3640                         break;\r
3641                 case SB_LINEDOWN:\r
3642                         if (CUtils::IsMicrosoftWord()) {\r
3643                                 scrollpos.x = rightbottom.x + 8;        //  0 to 16\r
3644                                 scrollpos.y = rightbottom.y - 60;       // 52 to 68\r
3645                         } else if (CUtils::IsThunderbird()) {\r
3646                                 scrollpos.x = rightbottom.x - 10;       // 2 to 18\r
3647                                 scrollpos.y = rightbottom.y - 9;        // 1 to 17\r
3648                         }\r
3649                         break;\r
3650                 default:\r
3651                         return 1;\r
3652                 }\r
3653 \r
3654                 int i = 0;\r
3655                 for (i = 0; i < nTimes; ++i) {\r
3656                         Click(&scrollpos);\r
3657                 }\r
3658 \r
3659                 return 0;\r
3660         }\r
3661 \r
3662         return SendMessage(GetFocus(), WM_VSCROLL, nSBCode, NULL);\r
3663 }\r
3664 \r
3665 // M-q\r
3666 int CCommands::FillParagraph()\r
3667 {\r
3668         static const int nFillColumn = 70; // tmp\r
3669         static CString szClipboardText;\r
3670         static int nOldLineLength = 0;\r
3671 \r
3672         ClearNumericArgument(); // tmp\r
3673 \r
3674         static int nStep = 0;\r
3675         switch (nStep) {\r
3676         case 0:         // Clear Selection\r
3677 //              CUtils::Log(_T("M-q: 0"));\r
3678                 nStep = 0;\r
3679 \r
3680                 CaptureClipboardData();\r
3681                 if (m_bSetMark) {\r
3682                         m_bSetMark = FALSE;\r
3683                 }\r
3684                 Kdu(VK_HOME);\r
3685                 nOldLineLength = 0;\r
3686 \r
3687                 nStep = 1;\r
3688                 return Reset(GOTO_RECURSIVE);\r
3689         case 1:         // Copy previous line\r
3690 //              CUtils::Log(_T("M-q: 1"));\r
3691                 nStep = 0;\r
3692 \r
3693                 if (!CopyPreviousLine()) {\r
3694                         return Reset(GOTO_DO_NOTHING);\r
3695                 }\r
3696 \r
3697                 nStep = 2;\r
3698                 return Reset(GOTO_RECURSIVE);\r
3699         case 2:         // Check previous line to find TOP (top of paragraph)\r
3700 //              CUtils::Log(_T("M-q: 2"));\r
3701                 nStep = 0;\r
3702 \r
3703                 CUtils::GetClipboardText(&szClipboardText);\r
3704 //              CUtils::Log(_T("M-q: 2-1: _%s_"), szClipboardText);\r
3705                 if (szClipboardText.IsEmpty()) {\r
3706                         // TOF\r
3707 //                      CUtils::Log(_T("M-q: 2: TOF"));\r
3708                         Kdu(VK_HOME);\r
3709                         nStep = 3;\r
3710                 } else if (szClipboardText == _T("\r\n")\r
3711                                 || szClipboardText == _T("\r")\r
3712                                 || szClipboardText == _T("\n")) {\r
3713                         // blank line i.e. top of paragraph\r
3714                         // UNIX: LF "\n"\r
3715                         // WINDOWS: CR LF "\r\n"\r
3716                         // MAC: CR "\r"\r
3717 //                      CUtils::Log(_T("M-q: 2: TOP"));\r
3718                         Kdu(VK_DOWN);\r
3719                         nStep = 3;\r
3720                 } else {\r
3721                         // middle of paragraph\r
3722 //                      CUtils::Log(_T("M-q: 2: MOP_%d_"), szClipboardText.GetLength());\r
3723 //                      CUtils::Log(_T("M-q: 2: MOP_%c(%d)%c(%d)"), szClipboardText.GetAt(0), szClipboardText.GetAt(0), szClipboardText.GetAt(1), szClipboardText.GetAt(1));\r
3724                         Kdu(VK_HOME);\r
3725                         nStep = 1;\r
3726                 }\r
3727 \r
3728                 return Reset(GOTO_RECURSIVE);\r
3729         case 3:         // Go to EOL to copy a current line at the next step\r
3730 //              CUtils::Log(_T("M-q: 3"));\r
3731                 nStep = 0;\r
3732 \r
3733                 Kdu(VK_END);\r
3734 \r
3735                 nStep = 4;\r
3736                 return Reset(GOTO_RECURSIVE);\r
3737         case 4:         // Copy a current line\r
3738 //              CUtils::Log(_T("M-q: 4"));\r
3739                 nStep = 0;\r
3740 \r
3741                 if (!CopyCurrentLine()) {\r
3742                         return Reset(GOTO_DO_NOTHING);\r
3743                 }\r
3744 \r
3745                 nStep = 5;\r
3746                 return Reset(GOTO_RECURSIVE);\r
3747         case 5:         // Just release shift\r
3748 //              CUtils::Log(_T("M-q: 5"));\r
3749                 nStep = 0;\r
3750 \r
3751                 ReleaseKey(VK_SHIFT);\r
3752 \r
3753                 nStep = 6;\r
3754                 return Reset(GOTO_RECURSIVE);\r
3755         case 6:         // Check current line and fill paragraph\r
3756 //              CUtils::Log(_T("M-q: 6"));\r
3757                 nStep = 0;\r
3758 \r
3759                 CUtils::GetClipboardText(&szClipboardText);\r
3760                 if (szClipboardText.GetLength() == nOldLineLength + 1) {\r
3761 //                      CUtils::Log(_T("M-q: 6-1 Finished"));\r
3762                         Kdu(VK_END, VK_BACK, VK_RETURN);\r
3763                         nStep = 8;\r
3764                 } else if (szClipboardText.GetLength() < nFillColumn) {\r
3765 //                      CUtils::Log(_T("M-q: 6-2 This line is too small"));\r
3766                         Kdu(VK_END, VK_SPACE, VK_DELETE, VK_HOME);\r
3767                         nStep = 3;\r
3768                 } else {\r
3769 //                      CUtils::Log(_T("M-q: 6-3 %d_%s_%d"), szClipboardText.Left(nFillColumn).GetLength(), szClipboardText.Left(nFillColumn), szClipboardText.Left(nFillColumn).ReverseFind(_T(' ')));\r
3770                         const int offset = szClipboardText.Left(nFillColumn).ReverseFind(_T(' '));\r
3771                         if (offset == 0) {\r
3772 //                              CUtils::Log(_T("M-q: 6-3-1 TOL is space"));\r
3773                                 Kdu(VK_DELETE);\r
3774                         } else if (0 < offset) {\r
3775 //                              CUtils::Log(_T("M-q: 6-3-2"));\r
3776                                 ReleaseKey(VK_MENU); // FIXME\r
3777                                 for (int i = 0; i < offset; ++i) {\r
3778                                         Kdu(VK_RIGHT);\r
3779                                 }\r
3780                                 nStep = 7;\r
3781                                 return Reset(GOTO_RECURSIVE);\r
3782                         } else {\r
3783 //                              CUtils::Log(_T("M-q: 6-3-3 No space in first fill-column"));\r
3784                                 const int offset = szClipboardText.Find(_T(' '));\r
3785                                 if (offset < 0) {\r
3786                                         Kdu(VK_HOME, VK_DOWN);\r
3787                                 } else {\r
3788                                         ReleaseKey(VK_MENU); // FIXME\r
3789                                         for (int i = 0; i < offset; ++i) {\r
3790                                                 Kdu(VK_RIGHT);\r
3791                                         }\r
3792                                         nStep = 7;\r
3793                                         return Reset(GOTO_RECURSIVE);\r
3794                                 }\r
3795                         }\r
3796                         nStep = 3;\r
3797                 }\r
3798                 nOldLineLength = szClipboardText.GetLength();\r
3799 \r
3800                 return Reset(GOTO_RECURSIVE);\r
3801         case 7:         // Linefeed\r
3802 //              CUtils::Log(_T("M-q: 7"));\r
3803                 nStep = 0;\r
3804 \r
3805                 Kdu(VK_RETURN, VK_DELETE);\r
3806 \r
3807                 nStep = 3;\r
3808                 return Reset(GOTO_RECURSIVE);\r
3809         case 8:         // Restore clipboard data\r
3810 //              CUtils::Log(_T("M-q: 8"));\r
3811                 nStep = 0;\r
3812 \r
3813                 RestoreClipboardData();\r
3814 \r
3815                 return Reset(GOTO_HOOK);\r
3816         }\r
3817         return Reset(GOTO_HOOK);\r
3818 }\r
3819 \r
3820 // M-l\r
3821 int CCommands::DowncaseWord()\r
3822 {\r
3823         return CaseWord(DOWNCASE);\r
3824 }\r
3825 \r
3826 // M-u\r
3827 int CCommands::UpcaseWord()\r
3828 {\r
3829         return CaseWord(UPCASE);\r
3830 }\r
3831 \r
3832 // M-c\r
3833 int CCommands::CapitalizeWord()\r
3834 {\r
3835         return CaseWord(CAPITALIZE);\r
3836 }\r
3837 \r
3838 int CCommands::CaseWord(CASE_WORD nCase)\r
3839 {\r
3840         ClearNumericArgument(); // tmp\r
3841 \r
3842         // Do not try to do these command at once.\r
3843         // Clipboard has old data till you go out this function.\r
3844         static GOTO nNext = GOTO_HOOK;\r
3845         static int nStep = 0;\r
3846         static int nLastWhiteSpace = 0;\r
3847         static BOOL bFirstCharacter = TRUE;\r
3848         switch (nStep) {\r
3849         case 0:         // Clear Selection\r
3850                 nLastWhiteSpace = 0;\r
3851 \r
3852                 if (m_bSetMark) {\r
3853                         m_bSetMark = FALSE;\r
3854                         Kdu(VK_RIGHT, VK_LEFT);\r
3855                         nStep = 1;\r
3856                         return Reset(GOTO_RECURSIVE);\r
3857                 } else {\r
3858                         // Do nothing. Go to case 1:\r
3859                 }\r
3860         case 1:         // Get back character to confirm the cursor is at TOF or not.\r
3861                 nStep = 0;\r
3862 \r
3863                 CaptureClipboardData();\r
3864 \r
3865                 if (!CutFollowingWord()) {\r
3866                         return Reset(GOTO_DO_NOTHING);\r
3867                 }\r
3868 \r
3869                 nStep = 2;\r
3870                 return Reset(GOTO_RECURSIVE);\r
3871         case 2:\r
3872                 {\r
3873                         nStep = 0;\r
3874 \r
3875                         CString szClipboardText;\r
3876                         CUtils::GetClipboardText(&szClipboardText);\r
3877 \r
3878                         CString szTrimmed = szClipboardText;\r
3879                         szTrimmed.TrimLeft();\r
3880                         if (szClipboardText.IsEmpty()) {\r
3881                                 nNext = GOTO_HOOK;\r
3882                                 RestoreClipboardData();\r
3883                                 return Reset(GOTO_HOOK);\r
3884                         } else if (szTrimmed.IsEmpty()) {\r
3885                                 if (nNext == GOTO_HOOK) {\r
3886                                         nNext = GOTO_RECURSIVE;\r
3887                                 } else {\r
3888                                         if (CUtils::IsHidemaru()) {\r
3889                                                 nLastWhiteSpace = 1;\r
3890                                         }\r
3891                                         nNext = GOTO_HOOK;\r
3892                                 }\r
3893                                 CUtils::SetClipboardText(&szClipboardText);\r
3894                                 nStep = 3;\r
3895                                 return Reset(GOTO_RECURSIVE);\r
3896                         } else if (CUtils::IsHidemaru()) {\r
3897                                 nNext = GOTO_RECURSIVE;\r
3898                         } else {\r
3899                                 nNext = GOTO_HOOK;\r
3900                         }\r
3901 \r
3902                         switch (nCase) {\r
3903                         case DOWNCASE:\r
3904                                 szClipboardText.MakeLower();\r
3905                                 break;\r
3906                         case UPCASE:\r
3907                                 szClipboardText.MakeUpper();\r
3908                                 break;\r
3909                         case CAPITALIZE:\r
3910                                 {\r
3911                                         for (int i = 0; i < szClipboardText.GetLength(); ++i) {\r
3912                                                 if (_istspace(szClipboardText.GetAt(i))) {\r
3913                                                         continue;\r
3914                                                 } else if (bFirstCharacter) {\r
3915                                                         bFirstCharacter = FALSE;\r
3916                                                         if (_istlower(szClipboardText.GetAt(i))) {\r
3917                                                                 szClipboardText.SetAt(i, (TCHAR) toupper(szClipboardText.GetAt(i)));\r
3918                                                         }\r
3919                                                 } else {\r
3920                                                         if (_istupper(szClipboardText.GetAt(i))) {\r
3921                                                                 szClipboardText.SetAt(i, (TCHAR) tolower(szClipboardText.GetAt(i)));\r
3922                                                         }\r
3923                                                 }\r
3924                                         }\r
3925                                         break;\r
3926                                 }\r
3927                         default:\r
3928                                 ASSERT(0);\r
3929                         }\r
3930 \r
3931                         CUtils::SetClipboardText(&szClipboardText);\r
3932 \r
3933                         nLastWhiteSpace = 0;\r
3934                         for (int j = szClipboardText.GetLength() - 1; !szClipboardText.IsEmpty() && 0 <= j; --j) {\r
3935                                 if (_istspace(szClipboardText.GetAt(j))) {\r
3936                                         ++nLastWhiteSpace;\r
3937                                 } else {\r
3938                                         break;\r
3939                                 }\r
3940                         }\r
3941 \r
3942                         nStep = 3;\r
3943                         return Reset(GOTO_RECURSIVE);\r
3944                 }\r
3945         case 3:\r
3946                 {\r
3947                         nStep = 0;\r
3948 \r
3949                         Paste();\r
3950 \r
3951                         for (int i = 0; i < nLastWhiteSpace; ++i) {\r
3952                                 Kdu(VK_LEFT);\r
3953                         }\r
3954 \r
3955                         nStep = 4;\r
3956                         return Reset(GOTO_RECURSIVE);\r
3957                 }\r
3958         case 4:\r
3959                 nStep = 0;\r
3960 \r
3961                 RestoreClipboardData();\r
3962 \r
3963                 if (nNext == GOTO_HOOK) {\r
3964                         bFirstCharacter = TRUE;\r
3965                 }\r
3966                 return Reset(nNext);\r
3967         }\r
3968 \r
3969         return Reset(GOTO_HOOK);\r
3970 }\r
3971 \r
3972 BOOL CCommands::CutFollowingWord()\r
3973 {\r
3974         if (!CUtils::OpenClipboard()) {\r
3975                 ASSERT(0);\r
3976                 return FALSE;\r
3977         }\r
3978         if (!EmptyClipboard()) {\r
3979                 ASSERT(0);\r
3980                 return FALSE;\r
3981         }\r
3982         if (!CloseClipboard()) {\r
3983                 ASSERT(0);\r
3984                 return FALSE;\r
3985         }\r
3986 \r
3987         if (CUtils::IsHidemaru()) {\r
3988                 // On Hidemaru, Cut_() does not work well after CdSdKduSuCu(). I do not know why.\r
3989                 SdKduSu(VK_RIGHT);\r
3990         } else {\r
3991                 CdSdKduSuCu(VK_RIGHT);\r
3992         }\r
3993         Cut_();\r
3994 \r
3995         return TRUE;\r
3996 }\r
3997 \r
3998 // M-x: execute-extended-command\r
3999 int CCommands::ExecuteExtendedCommand()\r
4000 {\r
4001 //      CUtils::Log(_T("ExecuteExtendedCommand"));\r
4002         bM_x(TRUE);\r
4003         return Reset(GOTO_HOOKX);\r
4004 }\r
4005 \r
4006 LPCSTR CCommands::GetCommandName(int nComID)\r
4007 {\r
4008         return Commands[nComID].szCommandName;\r
4009 }\r
4010 \r
4011 int CCommands::GetCategoryID(int nComID)\r
4012 {\r
4013         return Commands[nComID].nCategoryID;\r
4014 }\r
4015 \r
4016 int CCommands::GetDescriptionID(int nComID)\r
4017 {\r
4018         return Commands[nComID].nDescriptionID;\r
4019 }\r
4020 \r
4021 int CCommands::GetToolTipID(int nComID)\r
4022 {\r
4023         return Commands[nComID].nToolTipID;\r
4024 }\r
4025 \r
4026 int CCommands::GetDefaultCommandType(int nComID, int nIndex)\r
4027 {\r
4028         if (nComID < 0 || MAX_COMMAND <= nComID\r
4029          || nIndex < 0 || MAX_KEY_BIND <= nIndex) {\r
4030                 ASSERT(0);\r
4031                 return NONE;\r
4032         }\r
4033 \r
4034         int nType       = Commands[nComID].keybind[nIndex].nType;\r
4035         int bVk                         = Commands[nComID].keybind[nIndex].bVk;\r
4036 \r
4037         if (CXkeymacsDll::Is106Keyboard()) {\r
4038                 if (nType & SHIFT) {    // Shift\r
4039                         switch (bVk) {\r
4040                         case '2':\r
4041                         case '6':\r
4042                         case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
4043                                                         //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
4044                                 nType &= ~SHIFT;\r
4045                                 break;\r
4046                         default:\r
4047                                 break;\r
4048                         }\r
4049                 } else {                                        // Normal\r
4050                         switch (bVk) {\r
4051                         case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
4052                         case 0xC0:              // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
4053                                                         //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
4054                         case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4055                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4056                                 nType |= SHIFT;\r
4057                                 break;\r
4058                         default:\r
4059                                 break;\r
4060                         }\r
4061                 }\r
4062         }\r
4063 \r
4064         return nType;\r
4065 }\r
4066 \r
4067 int CCommands::GetDefaultCommandKey(int nComID, int nIndex)\r
4068 {\r
4069         if (nComID < 0 || MAX_COMMAND <= nComID\r
4070          || nIndex < 0 || MAX_KEY_BIND <= nIndex) {\r
4071                 ASSERT(0);\r
4072                 return 0;\r
4073         }\r
4074 \r
4075         int nType       = Commands[nComID].keybind[nIndex].nType;\r
4076         int bVk                         = Commands[nComID].keybind[nIndex].bVk;\r
4077 \r
4078         if (CXkeymacsDll::Is106Keyboard()) {\r
4079                 if (nType & SHIFT) {    // Shift\r
4080                         switch (bVk) {\r
4081                         case '0':\r
4082                                 bVk = '9';\r
4083                                 break;\r
4084                         case '2':\r
4085                                 bVk = 0xC0;     // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
4086                                                         //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
4087                                 break;\r
4088                         case '6':\r
4089                                 bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4090                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4091                                 break;\r
4092                         case '7':\r
4093                                 bVk = '6';\r
4094                                 break;\r
4095                         case '8':\r
4096                                 bVk = 0xBA;     // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
4097                                                         //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
4098                                 break;\r
4099                         case '9':\r
4100                                 bVk = '8';\r
4101                                 break;\r
4102                         case 0xBD:              // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
4103                                 bVk = 0xE2;     // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
4104                                 break;\r
4105                         case 0xC0:\r
4106                                 bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4107                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4108                                 break;\r
4109                         case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4110                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4111                                 bVk = '2';\r
4112                                 break;\r
4113                         default:\r
4114                                 break;\r
4115                         }\r
4116                 } else {                                        // Normal\r
4117                         switch (bVk) {\r
4118                         case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
4119                                                         //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
4120                                 bVk = 0xBB;     // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
4121                                 break;\r
4122                         case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
4123                                 bVk = 0xBD;     // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
4124                                 break;\r
4125                         case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4126                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4127                                 bVk = '7';\r
4128                                 break;\r
4129                         default:\r
4130                                 break;\r
4131                         }\r
4132                 }\r
4133         }\r
4134 \r
4135         return bVk;\r
4136 }\r
4137 \r
4138 int CCommands::GetDefaultControlID(int nComID, int nIndex)\r
4139 {\r
4140         if (nComID < 0 || MAX_COMMAND <= nComID\r
4141          || nIndex < 0 || MAX_KEY_BIND <= nIndex) {\r
4142                 ASSERT(0);\r
4143                 return 0;\r
4144         }\r
4145 \r
4146         return Commands[nComID].keybind[nIndex].nControlID;\r
4147 }\r