123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- /*
- Definitions of key bindings.
- Copyright (C) 2005-2024
- Free Software Foundation, Inc.
- Written by:
- Vitja Makarov, 2005
- Ilia Maslakov <il.smind@gmail.com>, 2009, 2012
- Andrew Borodin <aborodin@vmail.ru>, 2009-2020
- This file is part of the Midnight Commander.
- The Midnight Commander is free software: you can redistribute it
- and/or modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
- The Midnight Commander is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- #include <config.h>
- #include <ctype.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- #include "lib/global.h"
- #include "lib/tty/key.h" /* KEY_M_ */
- #include "lib/keybind.h"
- /*** global variables ****************************************************************************/
- /*** file scope macro definitions ****************************************************************/
- #define ADD_KEYMAP_NAME(name) { #name, CK_##name }
- /*** file scope type declarations ****************************************************************/
- typedef struct name_keymap_t
- {
- const char *name;
- long val;
- } name_keymap_t;
- /*** forward declarations (file scope functions) *************************************************/
- /*** file scope variables ************************************************************************/
- static name_keymap_t command_names[] = {
- /* common */
- ADD_KEYMAP_NAME (InsertChar),
- ADD_KEYMAP_NAME (Enter),
- ADD_KEYMAP_NAME (ChangePanel),
- ADD_KEYMAP_NAME (Up),
- ADD_KEYMAP_NAME (Down),
- ADD_KEYMAP_NAME (Left),
- ADD_KEYMAP_NAME (Right),
- ADD_KEYMAP_NAME (LeftQuick),
- ADD_KEYMAP_NAME (RightQuick),
- ADD_KEYMAP_NAME (Home),
- ADD_KEYMAP_NAME (End),
- ADD_KEYMAP_NAME (PageUp),
- ADD_KEYMAP_NAME (PageDown),
- ADD_KEYMAP_NAME (HalfPageUp),
- ADD_KEYMAP_NAME (HalfPageDown),
- ADD_KEYMAP_NAME (Top),
- ADD_KEYMAP_NAME (Bottom),
- ADD_KEYMAP_NAME (TopOnScreen),
- ADD_KEYMAP_NAME (MiddleOnScreen),
- ADD_KEYMAP_NAME (BottomOnScreen),
- ADD_KEYMAP_NAME (WordLeft),
- ADD_KEYMAP_NAME (WordRight),
- ADD_KEYMAP_NAME (Copy),
- ADD_KEYMAP_NAME (Move),
- ADD_KEYMAP_NAME (Delete),
- ADD_KEYMAP_NAME (MakeDir),
- ADD_KEYMAP_NAME (ChangeMode),
- ADD_KEYMAP_NAME (ChangeOwn),
- ADD_KEYMAP_NAME (ChangeOwnAdvanced),
- #ifdef ENABLE_EXT2FS_ATTR
- ADD_KEYMAP_NAME (ChangeAttributes),
- #endif
- ADD_KEYMAP_NAME (Remove),
- ADD_KEYMAP_NAME (BackSpace),
- ADD_KEYMAP_NAME (Redo),
- ADD_KEYMAP_NAME (Clear),
- ADD_KEYMAP_NAME (Menu),
- ADD_KEYMAP_NAME (MenuLastSelected),
- ADD_KEYMAP_NAME (UserMenu),
- ADD_KEYMAP_NAME (EditUserMenu),
- ADD_KEYMAP_NAME (Search),
- ADD_KEYMAP_NAME (SearchContinue),
- ADD_KEYMAP_NAME (Replace),
- ADD_KEYMAP_NAME (ReplaceContinue),
- ADD_KEYMAP_NAME (Help),
- ADD_KEYMAP_NAME (Shell),
- ADD_KEYMAP_NAME (Edit),
- ADD_KEYMAP_NAME (EditNew),
- #ifdef HAVE_CHARSET
- ADD_KEYMAP_NAME (SelectCodepage),
- #endif
- ADD_KEYMAP_NAME (EditorViewerHistory),
- ADD_KEYMAP_NAME (History),
- ADD_KEYMAP_NAME (HistoryNext),
- ADD_KEYMAP_NAME (HistoryPrev),
- ADD_KEYMAP_NAME (Complete),
- ADD_KEYMAP_NAME (Save),
- ADD_KEYMAP_NAME (SaveAs),
- ADD_KEYMAP_NAME (Goto),
- ADD_KEYMAP_NAME (Reread),
- ADD_KEYMAP_NAME (Refresh),
- ADD_KEYMAP_NAME (Suspend),
- ADD_KEYMAP_NAME (Swap),
- ADD_KEYMAP_NAME (HotList),
- ADD_KEYMAP_NAME (SelectInvert),
- ADD_KEYMAP_NAME (ScreenList),
- ADD_KEYMAP_NAME (ScreenNext),
- ADD_KEYMAP_NAME (ScreenPrev),
- ADD_KEYMAP_NAME (FileNext),
- ADD_KEYMAP_NAME (FilePrev),
- ADD_KEYMAP_NAME (DeleteToHome),
- ADD_KEYMAP_NAME (DeleteToEnd),
- ADD_KEYMAP_NAME (DeleteToWordBegin),
- ADD_KEYMAP_NAME (DeleteToWordEnd),
- ADD_KEYMAP_NAME (Cut),
- ADD_KEYMAP_NAME (Store),
- ADD_KEYMAP_NAME (Paste),
- ADD_KEYMAP_NAME (Mark),
- ADD_KEYMAP_NAME (MarkLeft),
- ADD_KEYMAP_NAME (MarkRight),
- ADD_KEYMAP_NAME (MarkUp),
- ADD_KEYMAP_NAME (MarkDown),
- ADD_KEYMAP_NAME (MarkToWordBegin),
- ADD_KEYMAP_NAME (MarkToWordEnd),
- ADD_KEYMAP_NAME (MarkToHome),
- ADD_KEYMAP_NAME (MarkToEnd),
- ADD_KEYMAP_NAME (ToggleNavigation),
- ADD_KEYMAP_NAME (Sort),
- ADD_KEYMAP_NAME (Options),
- ADD_KEYMAP_NAME (LearnKeys),
- ADD_KEYMAP_NAME (Bookmark),
- ADD_KEYMAP_NAME (Quit),
- ADD_KEYMAP_NAME (QuitQuiet),
- ADD_KEYMAP_NAME (ExtendedKeyMap),
- /* main commands */
- #ifdef USE_INTERNAL_EDIT
- ADD_KEYMAP_NAME (EditForceInternal),
- #endif
- ADD_KEYMAP_NAME (View),
- ADD_KEYMAP_NAME (ViewRaw),
- ADD_KEYMAP_NAME (ViewFile),
- ADD_KEYMAP_NAME (ViewFiltered),
- ADD_KEYMAP_NAME (Find),
- ADD_KEYMAP_NAME (DirSize),
- ADD_KEYMAP_NAME (CompareDirs),
- #ifdef USE_DIFF_VIEW
- ADD_KEYMAP_NAME (CompareFiles),
- #endif
- ADD_KEYMAP_NAME (OptionsVfs),
- ADD_KEYMAP_NAME (OptionsConfirm),
- ADD_KEYMAP_NAME (OptionsDisplayBits),
- ADD_KEYMAP_NAME (EditExtensionsFile),
- ADD_KEYMAP_NAME (EditFileHighlightFile),
- ADD_KEYMAP_NAME (LinkSymbolicEdit),
- ADD_KEYMAP_NAME (ExternalPanelize),
- ADD_KEYMAP_NAME (Filter),
- #ifdef ENABLE_VFS_SHELL
- ADD_KEYMAP_NAME (ConnectShell),
- #endif
- #ifdef ENABLE_VFS_FTP
- ADD_KEYMAP_NAME (ConnectFtp),
- #endif
- #ifdef ENABLE_VFS_SFTP
- ADD_KEYMAP_NAME (ConnectSftp),
- #endif
- ADD_KEYMAP_NAME (PanelInfo),
- #ifdef ENABLE_BACKGROUND
- ADD_KEYMAP_NAME (Jobs),
- #endif
- ADD_KEYMAP_NAME (OptionsLayout),
- ADD_KEYMAP_NAME (OptionsAppearance),
- ADD_KEYMAP_NAME (Link),
- ADD_KEYMAP_NAME (SetupListingFormat),
- ADD_KEYMAP_NAME (PanelListing),
- #ifdef LISTMODE_EDITOR
- ADD_KEYMAP_NAME (ListMode),
- #endif
- ADD_KEYMAP_NAME (OptionsPanel),
- ADD_KEYMAP_NAME (CdQuick),
- ADD_KEYMAP_NAME (PanelQuickView),
- ADD_KEYMAP_NAME (LinkSymbolicRelative),
- ADD_KEYMAP_NAME (VfsList),
- ADD_KEYMAP_NAME (SaveSetup),
- ADD_KEYMAP_NAME (LinkSymbolic),
- ADD_KEYMAP_NAME (PanelTree),
- ADD_KEYMAP_NAME (Tree),
- #ifdef ENABLE_VFS_UNDELFS
- ADD_KEYMAP_NAME (Undelete),
- #endif
- ADD_KEYMAP_NAME (PutCurrentLink),
- ADD_KEYMAP_NAME (PutOtherLink),
- ADD_KEYMAP_NAME (HotListAdd),
- ADD_KEYMAP_NAME (ShowHidden),
- ADD_KEYMAP_NAME (SplitVertHoriz),
- ADD_KEYMAP_NAME (SplitEqual),
- ADD_KEYMAP_NAME (SplitMore),
- ADD_KEYMAP_NAME (SplitLess),
- ADD_KEYMAP_NAME (PutCurrentPath),
- ADD_KEYMAP_NAME (PutOtherPath),
- ADD_KEYMAP_NAME (PutCurrentSelected),
- ADD_KEYMAP_NAME (PutCurrentFullSelected),
- ADD_KEYMAP_NAME (PutCurrentTagged),
- ADD_KEYMAP_NAME (PutOtherTagged),
- ADD_KEYMAP_NAME (Select),
- ADD_KEYMAP_NAME (Unselect),
- /* panel */
- ADD_KEYMAP_NAME (SelectExt),
- ADD_KEYMAP_NAME (ScrollLeft),
- ADD_KEYMAP_NAME (ScrollRight),
- ADD_KEYMAP_NAME (PanelOtherCd),
- ADD_KEYMAP_NAME (PanelOtherCdLink),
- ADD_KEYMAP_NAME (CopySingle),
- ADD_KEYMAP_NAME (MoveSingle),
- ADD_KEYMAP_NAME (DeleteSingle),
- ADD_KEYMAP_NAME (CdParent),
- ADD_KEYMAP_NAME (CdChild),
- ADD_KEYMAP_NAME (Panelize),
- ADD_KEYMAP_NAME (PanelOtherSync),
- ADD_KEYMAP_NAME (SortNext),
- ADD_KEYMAP_NAME (SortPrev),
- ADD_KEYMAP_NAME (SortReverse),
- ADD_KEYMAP_NAME (SortByName),
- ADD_KEYMAP_NAME (SortByExt),
- ADD_KEYMAP_NAME (SortBySize),
- ADD_KEYMAP_NAME (SortByMTime),
- ADD_KEYMAP_NAME (CdParentSmart),
- ADD_KEYMAP_NAME (CycleListingFormat),
- /* dialog */
- ADD_KEYMAP_NAME (Ok),
- ADD_KEYMAP_NAME (Cancel),
- /* input line */
- ADD_KEYMAP_NAME (Yank),
- /* help */
- ADD_KEYMAP_NAME (Index),
- ADD_KEYMAP_NAME (Back),
- ADD_KEYMAP_NAME (LinkNext),
- ADD_KEYMAP_NAME (LinkPrev),
- ADD_KEYMAP_NAME (NodeNext),
- ADD_KEYMAP_NAME (NodePrev),
- /* tree */
- ADD_KEYMAP_NAME (Forget),
- #if defined(USE_INTERNAL_EDIT) || defined(USE_DIFF_VIEW)
- ADD_KEYMAP_NAME (ShowNumbers),
- #endif
- /* chattr dialog */
- ADD_KEYMAP_NAME (MarkAndDown),
- #ifdef USE_INTERNAL_EDIT
- ADD_KEYMAP_NAME (Close),
- ADD_KEYMAP_NAME (Tab),
- ADD_KEYMAP_NAME (Undo),
- ADD_KEYMAP_NAME (ScrollUp),
- ADD_KEYMAP_NAME (ScrollDown),
- ADD_KEYMAP_NAME (Return),
- ADD_KEYMAP_NAME (ParagraphUp),
- ADD_KEYMAP_NAME (ParagraphDown),
- ADD_KEYMAP_NAME (EditFile),
- ADD_KEYMAP_NAME (MarkWord),
- ADD_KEYMAP_NAME (MarkLine),
- ADD_KEYMAP_NAME (MarkAll),
- ADD_KEYMAP_NAME (Unmark),
- ADD_KEYMAP_NAME (MarkColumn),
- ADD_KEYMAP_NAME (BlockSave),
- ADD_KEYMAP_NAME (InsertFile),
- ADD_KEYMAP_NAME (InsertOverwrite),
- ADD_KEYMAP_NAME (Date),
- ADD_KEYMAP_NAME (DeleteLine),
- ADD_KEYMAP_NAME (EditMail),
- ADD_KEYMAP_NAME (ParagraphFormat),
- ADD_KEYMAP_NAME (MatchBracket),
- ADD_KEYMAP_NAME (ExternalCommand),
- ADD_KEYMAP_NAME (MacroStartRecord),
- ADD_KEYMAP_NAME (MacroStopRecord),
- ADD_KEYMAP_NAME (MacroStartStopRecord),
- ADD_KEYMAP_NAME (MacroDelete),
- ADD_KEYMAP_NAME (RepeatStartStopRecord),
- #ifdef HAVE_ASPELL
- ADD_KEYMAP_NAME (SpellCheck),
- ADD_KEYMAP_NAME (SpellCheckCurrentWord),
- ADD_KEYMAP_NAME (SpellCheckSelectLang),
- #endif /* HAVE_ASPELL */
- ADD_KEYMAP_NAME (BookmarkFlush),
- ADD_KEYMAP_NAME (BookmarkNext),
- ADD_KEYMAP_NAME (BookmarkPrev),
- ADD_KEYMAP_NAME (MarkPageUp),
- ADD_KEYMAP_NAME (MarkPageDown),
- ADD_KEYMAP_NAME (MarkToFileBegin),
- ADD_KEYMAP_NAME (MarkToFileEnd),
- ADD_KEYMAP_NAME (MarkToPageBegin),
- ADD_KEYMAP_NAME (MarkToPageEnd),
- ADD_KEYMAP_NAME (MarkScrollUp),
- ADD_KEYMAP_NAME (MarkScrollDown),
- ADD_KEYMAP_NAME (MarkParagraphUp),
- ADD_KEYMAP_NAME (MarkParagraphDown),
- ADD_KEYMAP_NAME (MarkColumnPageUp),
- ADD_KEYMAP_NAME (MarkColumnPageDown),
- ADD_KEYMAP_NAME (MarkColumnLeft),
- ADD_KEYMAP_NAME (MarkColumnRight),
- ADD_KEYMAP_NAME (MarkColumnUp),
- ADD_KEYMAP_NAME (MarkColumnDown),
- ADD_KEYMAP_NAME (MarkColumnScrollUp),
- ADD_KEYMAP_NAME (MarkColumnScrollDown),
- ADD_KEYMAP_NAME (MarkColumnParagraphUp),
- ADD_KEYMAP_NAME (MarkColumnParagraphDown),
- ADD_KEYMAP_NAME (BlockShiftLeft),
- ADD_KEYMAP_NAME (BlockShiftRight),
- ADD_KEYMAP_NAME (InsertLiteral),
- ADD_KEYMAP_NAME (ShowTabTws),
- ADD_KEYMAP_NAME (SyntaxOnOff),
- ADD_KEYMAP_NAME (SyntaxChoose),
- ADD_KEYMAP_NAME (ShowMargin),
- ADD_KEYMAP_NAME (OptionsSaveMode),
- ADD_KEYMAP_NAME (About),
- /* An action to run external script from macro */
- { "ExecuteScript", CK_PipeBlock (0) },
- ADD_KEYMAP_NAME (WindowMove),
- ADD_KEYMAP_NAME (WindowResize),
- ADD_KEYMAP_NAME (WindowFullscreen),
- ADD_KEYMAP_NAME (WindowList),
- ADD_KEYMAP_NAME (WindowNext),
- ADD_KEYMAP_NAME (WindowPrev),
- #endif /* USE_INTERNAL_EDIT */
- /* viewer */
- ADD_KEYMAP_NAME (WrapMode),
- ADD_KEYMAP_NAME (HexEditMode),
- ADD_KEYMAP_NAME (HexMode),
- ADD_KEYMAP_NAME (MagicMode),
- ADD_KEYMAP_NAME (NroffMode),
- ADD_KEYMAP_NAME (BookmarkGoto),
- ADD_KEYMAP_NAME (Ruler),
- ADD_KEYMAP_NAME (SearchForward),
- ADD_KEYMAP_NAME (SearchBackward),
- ADD_KEYMAP_NAME (SearchForwardContinue),
- ADD_KEYMAP_NAME (SearchBackwardContinue),
- ADD_KEYMAP_NAME (SearchOppositeContinue),
- #ifdef USE_DIFF_VIEW
- /* diff viewer */
- ADD_KEYMAP_NAME (ShowSymbols),
- ADD_KEYMAP_NAME (SplitFull),
- ADD_KEYMAP_NAME (Tab2),
- ADD_KEYMAP_NAME (Tab3),
- ADD_KEYMAP_NAME (Tab4),
- ADD_KEYMAP_NAME (Tab8),
- ADD_KEYMAP_NAME (HunkNext),
- ADD_KEYMAP_NAME (HunkPrev),
- ADD_KEYMAP_NAME (EditOther),
- ADD_KEYMAP_NAME (Merge),
- ADD_KEYMAP_NAME (MergeOther),
- #endif /* USE_DIFF_VIEW */
- { NULL, CK_IgnoreKey }
- };
- /* *INDENT-OFF* */
- static const size_t num_command_names = G_N_ELEMENTS (command_names) - 1;
- /* *INDENT-ON* */
- /* --------------------------------------------------------------------------------------------- */
- /*** file scope functions ************************************************************************/
- /* --------------------------------------------------------------------------------------------- */
- static int
- name_keymap_comparator (const void *p1, const void *p2)
- {
- const name_keymap_t *m1 = (const name_keymap_t *) p1;
- const name_keymap_t *m2 = (const name_keymap_t *) p2;
- return g_ascii_strcasecmp (m1->name, m2->name);
- }
- /* --------------------------------------------------------------------------------------------- */
- static inline void
- sort_command_names (void)
- {
- static gboolean has_been_sorted = FALSE;
- if (!has_been_sorted)
- {
- qsort (command_names, num_command_names, sizeof (command_names[0]),
- &name_keymap_comparator);
- has_been_sorted = TRUE;
- }
- }
- /* --------------------------------------------------------------------------------------------- */
- static void
- keymap_add (GArray *keymap, long key, long cmd, const char *caption)
- {
- if (key != 0 && cmd != CK_IgnoreKey)
- {
- global_keymap_t new_bind;
- new_bind.key = key;
- new_bind.command = cmd;
- g_snprintf (new_bind.caption, sizeof (new_bind.caption), "%s", caption);
- g_array_append_val (keymap, new_bind);
- }
- }
- /* --------------------------------------------------------------------------------------------- */
- /*** public functions ****************************************************************************/
- /* --------------------------------------------------------------------------------------------- */
- void
- keybind_cmd_bind (GArray *keymap, const char *keybind, long action)
- {
- char *caption = NULL;
- long key;
- key = tty_keyname_to_keycode (keybind, &caption);
- keymap_add (keymap, key, action, caption);
- g_free (caption);
- }
- /* --------------------------------------------------------------------------------------------- */
- long
- keybind_lookup_action (const char *name)
- {
- const name_keymap_t key = { name, 0 };
- name_keymap_t *res;
- sort_command_names ();
- res = bsearch (&key, command_names, num_command_names, sizeof (command_names[0]),
- name_keymap_comparator);
- return (res != NULL) ? res->val : CK_IgnoreKey;
- }
- /* --------------------------------------------------------------------------------------------- */
- const char *
- keybind_lookup_actionname (long action)
- {
- size_t i;
- for (i = 0; command_names[i].name != NULL; i++)
- if (command_names[i].val == action)
- return command_names[i].name;
- return NULL;
- }
- /* --------------------------------------------------------------------------------------------- */
- const char *
- keybind_lookup_keymap_shortcut (const global_keymap_t *keymap, long action)
- {
- if (keymap != NULL)
- {
- size_t i;
- for (i = 0; keymap[i].key != 0; i++)
- if (keymap[i].command == action)
- return (keymap[i].caption[0] != '\0') ? keymap[i].caption : NULL;
- }
- return NULL;
- }
- /* --------------------------------------------------------------------------------------------- */
- long
- keybind_lookup_keymap_command (const global_keymap_t *keymap, long key)
- {
- if (keymap != NULL)
- {
- size_t i;
- for (i = 0; keymap[i].key != 0; i++)
- if (keymap[i].key == key)
- return keymap[i].command;
- }
- return CK_IgnoreKey;
- }
- /* --------------------------------------------------------------------------------------------- */
|