This source file includes following definitions.
- name_keymap_comparator
- sort_command_names
- keymap_add
- keybind_cmd_bind
- keybind_lookup_action
- keybind_lookup_actionname
- keybind_lookup_keymap_shortcut
- keybind_lookup_keymap_command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <config.h>
29
30 #include <ctype.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <sys/types.h>
34
35 #include "lib/global.h"
36 #include "lib/tty/key.h"
37 #include "lib/keybind.h"
38
39
40
41
42
43 #define ADD_KEYMAP_NAME(name) { #name, CK_##name }
44
45
46
47 typedef struct name_keymap_t
48 {
49 const char *name;
50 long val;
51 } name_keymap_t;
52
53
54
55
56
57 static name_keymap_t command_names[] = {
58
59 ADD_KEYMAP_NAME (InsertChar),
60 ADD_KEYMAP_NAME (Enter),
61 ADD_KEYMAP_NAME (ChangePanel),
62 ADD_KEYMAP_NAME (Up),
63 ADD_KEYMAP_NAME (Down),
64 ADD_KEYMAP_NAME (Left),
65 ADD_KEYMAP_NAME (Right),
66 ADD_KEYMAP_NAME (LeftQuick),
67 ADD_KEYMAP_NAME (RightQuick),
68 ADD_KEYMAP_NAME (Home),
69 ADD_KEYMAP_NAME (End),
70 ADD_KEYMAP_NAME (PageUp),
71 ADD_KEYMAP_NAME (PageDown),
72 ADD_KEYMAP_NAME (HalfPageUp),
73 ADD_KEYMAP_NAME (HalfPageDown),
74 ADD_KEYMAP_NAME (Top),
75 ADD_KEYMAP_NAME (Bottom),
76 ADD_KEYMAP_NAME (TopOnScreen),
77 ADD_KEYMAP_NAME (MiddleOnScreen),
78 ADD_KEYMAP_NAME (BottomOnScreen),
79 ADD_KEYMAP_NAME (WordLeft),
80 ADD_KEYMAP_NAME (WordRight),
81 ADD_KEYMAP_NAME (Copy),
82 ADD_KEYMAP_NAME (Move),
83 ADD_KEYMAP_NAME (Delete),
84 ADD_KEYMAP_NAME (MakeDir),
85 ADD_KEYMAP_NAME (ChangeMode),
86 ADD_KEYMAP_NAME (ChangeOwn),
87 ADD_KEYMAP_NAME (ChangeOwnAdvanced),
88 #ifdef ENABLE_EXT2FS_ATTR
89 ADD_KEYMAP_NAME (ChangeAttributes),
90 #endif
91 ADD_KEYMAP_NAME (Remove),
92 ADD_KEYMAP_NAME (BackSpace),
93 ADD_KEYMAP_NAME (Redo),
94 ADD_KEYMAP_NAME (Clear),
95 ADD_KEYMAP_NAME (Menu),
96 ADD_KEYMAP_NAME (MenuLastSelected),
97 ADD_KEYMAP_NAME (UserMenu),
98 ADD_KEYMAP_NAME (EditUserMenu),
99 ADD_KEYMAP_NAME (Search),
100 ADD_KEYMAP_NAME (SearchContinue),
101 ADD_KEYMAP_NAME (Replace),
102 ADD_KEYMAP_NAME (ReplaceContinue),
103 ADD_KEYMAP_NAME (Help),
104 ADD_KEYMAP_NAME (Shell),
105 ADD_KEYMAP_NAME (Edit),
106 ADD_KEYMAP_NAME (EditNew),
107 ADD_KEYMAP_NAME (SelectCodepage),
108 ADD_KEYMAP_NAME (EditorViewerHistory),
109 ADD_KEYMAP_NAME (History),
110 ADD_KEYMAP_NAME (HistoryNext),
111 ADD_KEYMAP_NAME (HistoryPrev),
112 ADD_KEYMAP_NAME (Complete),
113 ADD_KEYMAP_NAME (Save),
114 ADD_KEYMAP_NAME (SaveAs),
115 ADD_KEYMAP_NAME (Goto),
116 ADD_KEYMAP_NAME (Reread),
117 ADD_KEYMAP_NAME (Refresh),
118 ADD_KEYMAP_NAME (Suspend),
119 ADD_KEYMAP_NAME (Swap),
120 ADD_KEYMAP_NAME (HotList),
121 ADD_KEYMAP_NAME (SelectInvert),
122 ADD_KEYMAP_NAME (ScreenList),
123 ADD_KEYMAP_NAME (ScreenNext),
124 ADD_KEYMAP_NAME (ScreenPrev),
125 ADD_KEYMAP_NAME (FileNext),
126 ADD_KEYMAP_NAME (FilePrev),
127 ADD_KEYMAP_NAME (DeleteToHome),
128 ADD_KEYMAP_NAME (DeleteToEnd),
129 ADD_KEYMAP_NAME (DeleteToWordBegin),
130 ADD_KEYMAP_NAME (DeleteToWordEnd),
131 ADD_KEYMAP_NAME (Cut),
132 ADD_KEYMAP_NAME (Store),
133 ADD_KEYMAP_NAME (Paste),
134 ADD_KEYMAP_NAME (Mark),
135 ADD_KEYMAP_NAME (MarkLeft),
136 ADD_KEYMAP_NAME (MarkRight),
137 ADD_KEYMAP_NAME (MarkUp),
138 ADD_KEYMAP_NAME (MarkDown),
139 ADD_KEYMAP_NAME (MarkToWordBegin),
140 ADD_KEYMAP_NAME (MarkToWordEnd),
141 ADD_KEYMAP_NAME (MarkToHome),
142 ADD_KEYMAP_NAME (MarkToEnd),
143 ADD_KEYMAP_NAME (ToggleNavigation),
144 ADD_KEYMAP_NAME (Sort),
145 ADD_KEYMAP_NAME (Options),
146 ADD_KEYMAP_NAME (LearnKeys),
147 ADD_KEYMAP_NAME (Bookmark),
148 ADD_KEYMAP_NAME (Quit),
149 ADD_KEYMAP_NAME (QuitQuiet),
150 ADD_KEYMAP_NAME (ExtendedKeyMap),
151
152
153 #ifdef USE_INTERNAL_EDIT
154 ADD_KEYMAP_NAME (EditForceInternal),
155 #endif
156 ADD_KEYMAP_NAME (View),
157 ADD_KEYMAP_NAME (ViewRaw),
158 ADD_KEYMAP_NAME (ViewFile),
159 ADD_KEYMAP_NAME (ViewFiltered),
160 ADD_KEYMAP_NAME (Find),
161 ADD_KEYMAP_NAME (DirSize),
162 ADD_KEYMAP_NAME (CompareDirs),
163 #ifdef USE_DIFF_VIEW
164 ADD_KEYMAP_NAME (CompareFiles),
165 #endif
166 ADD_KEYMAP_NAME (OptionsVfs),
167 ADD_KEYMAP_NAME (OptionsConfirm),
168 ADD_KEYMAP_NAME (OptionsDisplayBits),
169 ADD_KEYMAP_NAME (EditExtensionsFile),
170 ADD_KEYMAP_NAME (EditFileHighlightFile),
171 ADD_KEYMAP_NAME (LinkSymbolicEdit),
172 ADD_KEYMAP_NAME (ExternalPanelize),
173 ADD_KEYMAP_NAME (Filter),
174 #ifdef ENABLE_VFS_SHELL
175 ADD_KEYMAP_NAME (ConnectShell),
176 #endif
177 #ifdef ENABLE_VFS_FTP
178 ADD_KEYMAP_NAME (ConnectFtp),
179 #endif
180 #ifdef ENABLE_VFS_SFTP
181 ADD_KEYMAP_NAME (ConnectSftp),
182 #endif
183 ADD_KEYMAP_NAME (PanelInfo),
184 #ifdef ENABLE_BACKGROUND
185 ADD_KEYMAP_NAME (Jobs),
186 #endif
187 ADD_KEYMAP_NAME (OptionsLayout),
188 ADD_KEYMAP_NAME (OptionsAppearance),
189 ADD_KEYMAP_NAME (Link),
190 ADD_KEYMAP_NAME (SetupListingFormat),
191 ADD_KEYMAP_NAME (PanelListing),
192 #ifdef LISTMODE_EDITOR
193 ADD_KEYMAP_NAME (ListMode),
194 #endif
195 ADD_KEYMAP_NAME (OptionsPanel),
196 ADD_KEYMAP_NAME (CdQuick),
197 ADD_KEYMAP_NAME (PanelQuickView),
198 ADD_KEYMAP_NAME (LinkSymbolicRelative),
199 ADD_KEYMAP_NAME (VfsList),
200 ADD_KEYMAP_NAME (SaveSetup),
201 ADD_KEYMAP_NAME (LinkSymbolic),
202 ADD_KEYMAP_NAME (PanelTree),
203 ADD_KEYMAP_NAME (Tree),
204 #ifdef ENABLE_VFS_UNDELFS
205 ADD_KEYMAP_NAME (Undelete),
206 #endif
207 ADD_KEYMAP_NAME (PutCurrentLink),
208 ADD_KEYMAP_NAME (PutOtherLink),
209 ADD_KEYMAP_NAME (HotListAdd),
210 ADD_KEYMAP_NAME (ShowHidden),
211 ADD_KEYMAP_NAME (SplitVertHoriz),
212 ADD_KEYMAP_NAME (SplitEqual),
213 ADD_KEYMAP_NAME (SplitMore),
214 ADD_KEYMAP_NAME (SplitLess),
215 ADD_KEYMAP_NAME (PutCurrentPath),
216 ADD_KEYMAP_NAME (PutOtherPath),
217 ADD_KEYMAP_NAME (PutCurrentSelected),
218 ADD_KEYMAP_NAME (PutCurrentFullSelected),
219 ADD_KEYMAP_NAME (PutCurrentTagged),
220 ADD_KEYMAP_NAME (PutOtherTagged),
221 ADD_KEYMAP_NAME (Select),
222 ADD_KEYMAP_NAME (Unselect),
223
224
225 ADD_KEYMAP_NAME (SelectExt),
226 ADD_KEYMAP_NAME (ScrollLeft),
227 ADD_KEYMAP_NAME (ScrollRight),
228 ADD_KEYMAP_NAME (PanelOtherCd),
229 ADD_KEYMAP_NAME (PanelOtherCdLink),
230 ADD_KEYMAP_NAME (CopySingle),
231 ADD_KEYMAP_NAME (MoveSingle),
232 ADD_KEYMAP_NAME (DeleteSingle),
233 ADD_KEYMAP_NAME (CdParent),
234 ADD_KEYMAP_NAME (CdChild),
235 ADD_KEYMAP_NAME (Panelize),
236 ADD_KEYMAP_NAME (PanelOtherSync),
237 ADD_KEYMAP_NAME (SortNext),
238 ADD_KEYMAP_NAME (SortPrev),
239 ADD_KEYMAP_NAME (SortReverse),
240 ADD_KEYMAP_NAME (SortByName),
241 ADD_KEYMAP_NAME (SortByExt),
242 ADD_KEYMAP_NAME (SortBySize),
243 ADD_KEYMAP_NAME (SortByMTime),
244 ADD_KEYMAP_NAME (CdParentSmart),
245 ADD_KEYMAP_NAME (CycleListingFormat),
246
247
248 ADD_KEYMAP_NAME (Ok),
249 ADD_KEYMAP_NAME (Cancel),
250
251
252 ADD_KEYMAP_NAME (Yank),
253
254
255 ADD_KEYMAP_NAME (Index),
256 ADD_KEYMAP_NAME (Back),
257 ADD_KEYMAP_NAME (LinkNext),
258 ADD_KEYMAP_NAME (LinkPrev),
259 ADD_KEYMAP_NAME (NodeNext),
260 ADD_KEYMAP_NAME (NodePrev),
261
262
263 ADD_KEYMAP_NAME (Forget),
264
265 #if defined(USE_INTERNAL_EDIT) || defined(USE_DIFF_VIEW)
266 ADD_KEYMAP_NAME (ShowNumbers),
267 #endif
268
269
270 ADD_KEYMAP_NAME (MarkAndDown),
271
272 #ifdef USE_INTERNAL_EDIT
273 ADD_KEYMAP_NAME (Close),
274 ADD_KEYMAP_NAME (Tab),
275 ADD_KEYMAP_NAME (Undo),
276 ADD_KEYMAP_NAME (ScrollUp),
277 ADD_KEYMAP_NAME (ScrollDown),
278 ADD_KEYMAP_NAME (Return),
279 ADD_KEYMAP_NAME (ParagraphUp),
280 ADD_KEYMAP_NAME (ParagraphDown),
281 ADD_KEYMAP_NAME (EditFile),
282 ADD_KEYMAP_NAME (MarkWord),
283 ADD_KEYMAP_NAME (MarkLine),
284 ADD_KEYMAP_NAME (MarkAll),
285 ADD_KEYMAP_NAME (Unmark),
286 ADD_KEYMAP_NAME (MarkColumn),
287 ADD_KEYMAP_NAME (BlockSave),
288 ADD_KEYMAP_NAME (InsertFile),
289 ADD_KEYMAP_NAME (InsertOverwrite),
290 ADD_KEYMAP_NAME (Date),
291 ADD_KEYMAP_NAME (DeleteLine),
292 ADD_KEYMAP_NAME (EditMail),
293 ADD_KEYMAP_NAME (ParagraphFormat),
294 ADD_KEYMAP_NAME (MatchBracket),
295 ADD_KEYMAP_NAME (ExternalCommand),
296 ADD_KEYMAP_NAME (MacroStartRecord),
297 ADD_KEYMAP_NAME (MacroStopRecord),
298 ADD_KEYMAP_NAME (MacroStartStopRecord),
299 ADD_KEYMAP_NAME (MacroDelete),
300 ADD_KEYMAP_NAME (RepeatStartStopRecord),
301 #ifdef HAVE_ASPELL
302 ADD_KEYMAP_NAME (SpellCheck),
303 ADD_KEYMAP_NAME (SpellCheckCurrentWord),
304 ADD_KEYMAP_NAME (SpellCheckSelectLang),
305 #endif
306 ADD_KEYMAP_NAME (BookmarkFlush),
307 ADD_KEYMAP_NAME (BookmarkNext),
308 ADD_KEYMAP_NAME (BookmarkPrev),
309 ADD_KEYMAP_NAME (MarkPageUp),
310 ADD_KEYMAP_NAME (MarkPageDown),
311 ADD_KEYMAP_NAME (MarkToFileBegin),
312 ADD_KEYMAP_NAME (MarkToFileEnd),
313 ADD_KEYMAP_NAME (MarkToPageBegin),
314 ADD_KEYMAP_NAME (MarkToPageEnd),
315 ADD_KEYMAP_NAME (MarkScrollUp),
316 ADD_KEYMAP_NAME (MarkScrollDown),
317 ADD_KEYMAP_NAME (MarkParagraphUp),
318 ADD_KEYMAP_NAME (MarkParagraphDown),
319 ADD_KEYMAP_NAME (MarkColumnPageUp),
320 ADD_KEYMAP_NAME (MarkColumnPageDown),
321 ADD_KEYMAP_NAME (MarkColumnLeft),
322 ADD_KEYMAP_NAME (MarkColumnRight),
323 ADD_KEYMAP_NAME (MarkColumnUp),
324 ADD_KEYMAP_NAME (MarkColumnDown),
325 ADD_KEYMAP_NAME (MarkColumnScrollUp),
326 ADD_KEYMAP_NAME (MarkColumnScrollDown),
327 ADD_KEYMAP_NAME (MarkColumnParagraphUp),
328 ADD_KEYMAP_NAME (MarkColumnParagraphDown),
329 ADD_KEYMAP_NAME (BlockShiftLeft),
330 ADD_KEYMAP_NAME (BlockShiftRight),
331 ADD_KEYMAP_NAME (InsertLiteral),
332 ADD_KEYMAP_NAME (ShowTabTws),
333 ADD_KEYMAP_NAME (SyntaxOnOff),
334 ADD_KEYMAP_NAME (SyntaxChoose),
335 ADD_KEYMAP_NAME (ShowMargin),
336 ADD_KEYMAP_NAME (OptionsSaveMode),
337 ADD_KEYMAP_NAME (About),
338
339 { "ExecuteScript", CK_PipeBlock (0) },
340 ADD_KEYMAP_NAME (WindowMove),
341 ADD_KEYMAP_NAME (WindowResize),
342 ADD_KEYMAP_NAME (WindowFullscreen),
343 ADD_KEYMAP_NAME (WindowList),
344 ADD_KEYMAP_NAME (WindowNext),
345 ADD_KEYMAP_NAME (WindowPrev),
346 #endif
347
348
349 ADD_KEYMAP_NAME (WrapMode),
350 ADD_KEYMAP_NAME (HexEditMode),
351 ADD_KEYMAP_NAME (HexMode),
352 ADD_KEYMAP_NAME (MagicMode),
353 ADD_KEYMAP_NAME (NroffMode),
354 ADD_KEYMAP_NAME (BookmarkGoto),
355 ADD_KEYMAP_NAME (Ruler),
356 ADD_KEYMAP_NAME (SearchForward),
357 ADD_KEYMAP_NAME (SearchBackward),
358 ADD_KEYMAP_NAME (SearchForwardContinue),
359 ADD_KEYMAP_NAME (SearchBackwardContinue),
360 ADD_KEYMAP_NAME (SearchOppositeContinue),
361
362 #ifdef USE_DIFF_VIEW
363
364 ADD_KEYMAP_NAME (ShowSymbols),
365 ADD_KEYMAP_NAME (SplitFull),
366 ADD_KEYMAP_NAME (Tab2),
367 ADD_KEYMAP_NAME (Tab3),
368 ADD_KEYMAP_NAME (Tab4),
369 ADD_KEYMAP_NAME (Tab8),
370 ADD_KEYMAP_NAME (HunkNext),
371 ADD_KEYMAP_NAME (HunkPrev),
372 ADD_KEYMAP_NAME (EditOther),
373 ADD_KEYMAP_NAME (Merge),
374 ADD_KEYMAP_NAME (MergeOther),
375 #endif
376
377 { NULL, CK_IgnoreKey }
378 };
379
380 static const size_t num_command_names = G_N_ELEMENTS (command_names) - 1;
381
382
383
384
385
386 static int
387 name_keymap_comparator (const void *p1, const void *p2)
388 {
389 const name_keymap_t *m1 = (const name_keymap_t *) p1;
390 const name_keymap_t *m2 = (const name_keymap_t *) p2;
391
392 return g_ascii_strcasecmp (m1->name, m2->name);
393 }
394
395
396
397 static inline void
398 sort_command_names (void)
399 {
400 static gboolean has_been_sorted = FALSE;
401
402 if (!has_been_sorted)
403 {
404 qsort (command_names, num_command_names, sizeof (command_names[0]),
405 &name_keymap_comparator);
406 has_been_sorted = TRUE;
407 }
408 }
409
410
411
412 static void
413 keymap_add (GArray *keymap, long key, long cmd, const char *caption)
414 {
415 if (key != 0 && cmd != CK_IgnoreKey)
416 {
417 global_keymap_t new_bind;
418
419 new_bind.key = key;
420 new_bind.command = cmd;
421 g_snprintf (new_bind.caption, sizeof (new_bind.caption), "%s", caption);
422 g_array_append_val (keymap, new_bind);
423 }
424 }
425
426
427
428
429
430 void
431 keybind_cmd_bind (GArray *keymap, const char *keybind, long action)
432 {
433 char *caption = NULL;
434 int key;
435
436 key = tty_keyname_to_keycode (keybind, &caption);
437 keymap_add (keymap, key, action, caption);
438 g_free (caption);
439 }
440
441
442
443 long
444 keybind_lookup_action (const char *name)
445 {
446 const name_keymap_t key = { name, 0 };
447 name_keymap_t *res;
448
449 sort_command_names ();
450
451 res = bsearch (&key, command_names, num_command_names, sizeof (command_names[0]),
452 name_keymap_comparator);
453
454 return (res != NULL) ? res->val : CK_IgnoreKey;
455 }
456
457
458
459 const char *
460 keybind_lookup_actionname (long action)
461 {
462 size_t i;
463
464 for (i = 0; command_names[i].name != NULL; i++)
465 if (command_names[i].val == action)
466 return command_names[i].name;
467
468 return NULL;
469 }
470
471
472
473 const char *
474 keybind_lookup_keymap_shortcut (const global_keymap_t *keymap, long action)
475 {
476 if (keymap != NULL)
477 {
478 size_t i;
479
480 for (i = 0; keymap[i].key != 0; i++)
481 if (keymap[i].command == action)
482 return (keymap[i].caption[0] != '\0') ? keymap[i].caption : NULL;
483 }
484 return NULL;
485 }
486
487
488
489 long
490 keybind_lookup_keymap_command (const global_keymap_t *keymap, long key)
491 {
492 if (keymap != NULL)
493 {
494 size_t i;
495
496 for (i = 0; keymap[i].key != 0; i++)
497 if (keymap[i].key == key)
498 return keymap[i].command;
499 }
500
501 return CK_IgnoreKey;
502 }
503
504