1 /* Editor key translation.
3 Copyright (C) 1996, 1997 the Free Software Foundation
5 Authors: 1996, 1997 Paul Sheer
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
25 #include "edit-widget.h" /* edit->macro_i */
26 #include "editcmddef.h" /* list of commands */
27 #include "../src/key.h" /* KEY_M_SHIFT */
28 #include "../src/tty.h" /* keys */
29 #include "../src/charsets.h" /* convert_from_input_c() */
30 #include "../src/selcodepage.h" /* do_select_codepage() */
33 * Ordinary translations. Note that the keys listed first take priority
34 * when the key is assigned to more than one command.
36 static const long cooledit_key_map
[] = {
37 ALT ('b'), CK_Match_Bracket
,
39 XCTRL ('f'), CK_Save_Block
,
41 XCTRL ('p'), CK_Pipe_Block (1), /* spell check */
42 XCTRL ('x'), CK_Word_Right
,
43 XCTRL ('y'), CK_Delete_Line
,
44 XCTRL ('z'), CK_Word_Left
,
48 static long const emacs_key_map
[] = {
49 ALT ('$'), CK_Pipe_Block (1), /* spell check */
50 ALT ('b'), CK_Word_Left
,
51 ALT ('f'), CK_Word_Right
,
52 ALT ('v'), CK_Page_Up
,
58 XCTRL ('f'), CK_Right
,
62 XCTRL ('v'), CK_Page_Down
,
64 XCTRL ('y'), CK_XPaste
,
68 static long const common_key_map
[] = {
73 KEY_BACKSPACE
, CK_BackSpace
,
78 KEY_IC
, CK_Toggle_Insert
,
80 KEY_NPAGE
, CK_Page_Down
,
81 KEY_PPAGE
, CK_Page_Up
,
85 ALT ('\n'), CK_Return
,
86 ALT ('\t'), CK_Complete_Word
,
89 ALT ('p'), CK_Paragraph_Format
,
92 ALT ('<'), CK_Beginning_Of_Text
,
93 ALT ('>'), CK_End_Of_Text
,
94 ALT (KEY_BACKSPACE
), CK_Delete_Word_Left
,
96 XCTRL ('k'), CK_Delete_To_Line_End
,
97 XCTRL ('l'), CK_Refresh
,
98 XCTRL ('o'), CK_Shell
,
104 KEY_F (4), CK_Replace
,
108 KEY_F (8), CK_Remove
,
110 KEY_F (11), CK_User_Menu
, /* edit user menu */
111 KEY_F (12), CK_Save_As
,
112 KEY_F (13), CK_Column_Mark
,
113 KEY_F (14), CK_Replace_Again
,
114 KEY_F (15), CK_Insert_File
,
115 KEY_F (17), CK_Find_Again
,
116 KEY_F (19), CK_Pipe_Block (0), /* C formatter */
119 KEY_M_SHIFT
| KEY_PPAGE
, CK_Page_Up_Highlight
,
120 KEY_M_SHIFT
| KEY_NPAGE
, CK_Page_Down_Highlight
,
121 KEY_M_SHIFT
| KEY_LEFT
, CK_Left_Highlight
,
122 KEY_M_SHIFT
| KEY_RIGHT
, CK_Right_Highlight
,
123 KEY_M_SHIFT
| KEY_UP
, CK_Up_Highlight
,
124 KEY_M_SHIFT
| KEY_DOWN
, CK_Down_Highlight
,
125 KEY_M_SHIFT
| KEY_HOME
, CK_Home_Highlight
,
126 KEY_M_SHIFT
| KEY_END
, CK_End_Highlight
,
127 KEY_M_SHIFT
| KEY_IC
, CK_XPaste
,
128 KEY_M_SHIFT
| KEY_DC
, CK_XCut
,
129 KEY_M_SHIFT
| '\n', CK_Return
, /* useful for pasting multiline text */
132 KEY_M_CTRL
| (KEY_F (2)), CK_Save_As
,
133 KEY_M_CTRL
| (KEY_F (4)), CK_Replace_Again
,
134 KEY_M_CTRL
| (KEY_F (7)), CK_Find_Again
,
135 KEY_M_CTRL
| KEY_BACKSPACE
, CK_Undo
,
136 KEY_M_CTRL
| KEY_PPAGE
, CK_Beginning_Of_Text
,
137 KEY_M_CTRL
| KEY_NPAGE
, CK_End_Of_Text
,
138 KEY_M_CTRL
| KEY_HOME
, CK_Beginning_Of_Text
,
139 KEY_M_CTRL
| KEY_END
, CK_End_Of_Text
,
140 KEY_M_CTRL
| KEY_UP
, CK_Scroll_Up
,
141 KEY_M_CTRL
| KEY_DOWN
, CK_Scroll_Down
,
142 KEY_M_CTRL
| KEY_LEFT
, CK_Word_Left
,
143 KEY_M_CTRL
| KEY_RIGHT
, CK_Word_Right
,
144 KEY_M_CTRL
| KEY_IC
, CK_XStore
,
145 KEY_M_CTRL
| KEY_DC
, CK_Remove
,
148 KEY_M_SHIFT
| KEY_M_CTRL
| KEY_PPAGE
, CK_Beginning_Of_Text_Highlight
,
149 KEY_M_SHIFT
| KEY_M_CTRL
| KEY_NPAGE
, CK_End_Of_Text_Highlight
,
150 KEY_M_SHIFT
| KEY_M_CTRL
| KEY_LEFT
, CK_Word_Left_Highlight
,
151 KEY_M_SHIFT
| KEY_M_CTRL
| KEY_RIGHT
, CK_Word_Right_Highlight
,
152 KEY_M_SHIFT
| KEY_M_CTRL
| KEY_UP
, CK_Scroll_Up_Highlight
,
153 KEY_M_SHIFT
| KEY_M_CTRL
| KEY_DOWN
, CK_Scroll_Down_Highlight
,
160 * Translate the keycode into either 'command' or 'char_for_insertion'.
161 * 'command' is one of the editor commands from editcmddef.h.
164 edit_translate_key (WEdit
*edit
, long x_key
, int *cmd
, int *ch
)
167 int char_for_insertion
= -1;
169 static const long *key_map
;
171 switch (edit_key_emulation
) {
172 case EDIT_KEY_EMULATION_NORMAL
:
173 key_map
= cooledit_key_map
;
175 case EDIT_KEY_EMULATION_EMACS
:
176 key_map
= emacs_key_map
;
177 if (x_key
== XCTRL ('x')) {
180 edit_raw_key_query (" Ctrl-X ", _(" Emacs key: "), 0);
193 CK_Macro (edit_raw_key_query
194 (_(" Execute Macro "),
195 _(" Press macro hotkey: "), 1));
196 if (command
== CK_Macro (0))
206 if (x_key
== XCTRL ('t')) {
207 do_select_codepage ();
209 edit
->force
= REDRAW_COMPLETELY
;
210 command
= CK_Refresh
;
215 if (x_key
== XCTRL ('q')) {
217 edit_raw_key_query (_(" Insert Literal "),
218 _(" Press any key: "), 0);
221 if (x_key
== XCTRL ('a')
222 && edit_key_emulation
!= EDIT_KEY_EMULATION_EMACS
) {
224 CK_Macro (edit_raw_key_query
225 (_(" Execute Macro "), _(" Press macro hotkey: "),
227 if (command
== CK_Macro (0))
231 /* edit is a pointer to the widget */
233 if (x_key
== XCTRL ('r')) {
236 0 ? CK_Begin_Record_Macro
: CK_End_Record_Macro
;
241 /* an ordinary insertable character */
243 int c
= convert_from_input_c (x_key
);
245 if (is_printable (c
)) {
246 char_for_insertion
= c
;
251 /* Commands specific to the key emulation */
253 while (key_map
[i
] != x_key
&& (key_map
[i
] || key_map
[i
+ 1]))
255 command
= key_map
[i
+ 1];
259 /* Commands common for the key emulations */
260 key_map
= common_key_map
;
262 while (key_map
[i
] != x_key
&& (key_map
[i
] || key_map
[i
+ 1]))
264 command
= key_map
[i
+ 1];
268 /* Function still not found for this key, so try macros */
269 /* This allows the same macro to be
270 enabled by either eg "ALT('f')" or "XCTRL('f')" or "XCTRL('a'), 'f'" */
272 if (x_key
& ALT (0)) { /* is an alt key ? */
273 command
= CK_Macro (x_key
- ALT (0));
276 if (x_key
< ' ') { /* is a ctrl key ? */
277 command
= CK_Macro (x_key
);
283 *ch
= char_for_insertion
;
285 if ((command
== -1 || command
== 0) && char_for_insertion
== -1) {
286 /* unchanged, key has no function here */