keybind.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. /*
  2. Copyright (C) 2009 The Free Software Foundation, Inc.
  3. Written by: 2005 Vitja Makarov
  4. 2009 Ilia Maslakov
  5. This file is part of the Midnight Commander.
  6. The Midnight Commander is free software; you can redistribute it
  7. and/or modify it under the terms of the GNU General Public License as
  8. published by the Free Software Foundation; either version 2 of the
  9. License, or (at your option) any later version.
  10. The Midnight Commander is distributed in the hope that it will be
  11. useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  12. of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  17. MA 02110-1301, USA.
  18. */
  19. #include <config.h>
  20. #include <ctype.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <sys/types.h>
  24. #include "lib/global.h"
  25. #include "lib/tty/key.h" /* KEY_M_ */
  26. #include "lib/strutil.h" /* str_casecmp() */
  27. #include "lib/keybind.h"
  28. /*** global variables ****************************************************************************/
  29. /*** file scope macro definitions ****************************************************************/
  30. /*** file scope type declarations ****************************************************************/
  31. /*** file scope variables ************************************************************************/
  32. static name_keymap_t command_names[] = {
  33. #ifdef USE_INTERNAL_EDIT
  34. {"EditNoCommand", CK_Ignore_Key},
  35. {"EditIgnoreKey", CK_Ignore_Key},
  36. {"EditBackSpace", CK_BackSpace},
  37. {"EditDelete", CK_Delete},
  38. {"EditEnter", CK_Enter},
  39. {"EditPageUp", CK_Page_Up},
  40. {"EditPageDown", CK_Page_Down},
  41. {"EditLeft", CK_Left},
  42. {"EditRight", CK_Right},
  43. {"EditWordLeft", CK_Word_Left},
  44. {"EditWordRight", CK_Word_Right},
  45. {"EditUp", CK_Up},
  46. {"EditDown", CK_Down},
  47. {"EditHome", CK_Home},
  48. {"EditEnd", CK_End},
  49. {"EditTab", CK_Tab},
  50. {"EditUndo", CK_Undo},
  51. {"EditRedo", CK_Redo},
  52. {"EditBeginningOfText", CK_Beginning_Of_Text},
  53. {"EditEndOfText", CK_End_Of_Text},
  54. {"EditScrollUp", CK_Scroll_Up},
  55. {"EditScrollDown", CK_Scroll_Down},
  56. {"EditReturn", CK_Return},
  57. {"EditBeginPage", CK_Begin_Page},
  58. {"EditEndPage", CK_End_Page},
  59. {"EditDeleteWordLeft", CK_Delete_Word_Left},
  60. {"EditDeleteWordRight", CK_Delete_Word_Right},
  61. {"EditParagraphUp", CK_Paragraph_Up},
  62. {"EditParagraphDown", CK_Paragraph_Down},
  63. {"EditMenu", CK_Menu},
  64. {"EditSave", CK_Save},
  65. {"EditLoad", CK_Load},
  66. {"EditNew", CK_New},
  67. {"EditSaveas", CK_Save_As},
  68. {"EditMark", CK_Mark},
  69. {"EditCopy", CK_Copy},
  70. {"EditMove", CK_Move},
  71. {"EditRemove", CK_Remove},
  72. {"EditMarkAll", CK_Mark_All},
  73. {"EditUnmark", CK_Unmark},
  74. {"EditSaveBlock", CK_Save_Block},
  75. {"EditColumnMark", CK_Column_Mark},
  76. {"EditFind", CK_Find},
  77. {"EditFindAgain", CK_Find_Again},
  78. {"EditReplace", CK_Replace},
  79. {"EditReplaceAgain", CK_Replace_Again},
  80. {"EditCompleteWord", CK_Complete_Word},
  81. #if 0
  82. {"EditDebugStart", CK_Debug_Start},
  83. {"EditDebugStop", CK_Debug_Stop},
  84. {"EditDebugToggleBreak", CK_Debug_Toggle_Break},
  85. {"EditDebugClear", CK_Debug_Clear},
  86. {"EditDebugNext", CK_Debug_Next},
  87. {"EditDebugStep", CK_Debug_Step},
  88. {"EditDebugBackTrace", CK_Debug_Back_Trace},
  89. {"EditDebugContinue", CK_Debug_Continue},
  90. {"EditDebugEnterCommand", CK_Debug_Enter_Command},
  91. {"EditDebugUntilCurser", CK_Debug_Until_Curser},
  92. #endif
  93. {"EditInsertFile", CK_Insert_File},
  94. {"EditQuit", CK_Quit},
  95. {"EditToggleInsert", CK_Toggle_Insert},
  96. {"EditHelp", CK_Help},
  97. {"EditDate", CK_Date},
  98. {"EditRefresh", CK_Refresh},
  99. {"EditGoto", CK_Goto},
  100. {"EditDeleteLine", CK_Delete_Line},
  101. {"EditDeleteToLineEnd", CK_Delete_To_Line_End},
  102. {"EditDeleteToLineBegin", CK_Delete_To_Line_Begin},
  103. {"EditManPage", CK_Man_Page},
  104. {"EditSort", CK_Sort},
  105. {"EditMail", CK_Mail},
  106. {"EditCancel", CK_Cancel},
  107. {"EditComplete", CK_Complete},
  108. {"EditParagraphFormat", CK_Paragraph_Format},
  109. {"EditUtil", CK_Util},
  110. {"EditTypeLoadPython", CK_Type_Load_Python},
  111. {"EditFindFile", CK_Find_File},
  112. {"EditCtags", CK_Ctags},
  113. {"EditMatchBracket", CK_Match_Bracket},
  114. {"EditTerminal", CK_Terminal},
  115. {"EditTerminalApp", CK_Terminal_App},
  116. {"EditExtCmd", CK_ExtCmd},
  117. {"EditUserMenu", CK_User_Menu},
  118. {"EditBeginRecordMacro", CK_Begin_Record_Macro},
  119. {"EditEndRecordMacro", CK_End_Record_Macro},
  120. {"EditDeleteMacro", CK_Delete_Macro},
  121. {"EditToggleBookmark", CK_Toggle_Bookmark},
  122. {"EditFlushBookmarks", CK_Flush_Bookmarks},
  123. {"EditNextBookmark", CK_Next_Bookmark},
  124. {"EditPrevBookmark", CK_Prev_Bookmark},
  125. {"EditPageUpHighlight", CK_Page_Up_Highlight},
  126. {"EditPageDownHighlight", CK_Page_Down_Highlight},
  127. {"EditLeftHighlight", CK_Left_Highlight},
  128. {"EditRightHighlight", CK_Right_Highlight},
  129. {"EditWordLeftHighlight", CK_Word_Left_Highlight},
  130. {"EditWordRightHighlight", CK_Word_Right_Highlight},
  131. {"EditUpHighlight", CK_Up_Highlight},
  132. {"EditDownHighlight", CK_Down_Highlight},
  133. {"EditHomeHighlight", CK_Home_Highlight},
  134. {"EditEndHighlight", CK_End_Highlight},
  135. {"EditBeginningOfTextHighlight", CK_Beginning_Of_Text_Highlight},
  136. {"EditEndOfTextHighlight", CK_End_Of_Text_Highlight},
  137. {"EditBeginPageHighlight", CK_Begin_Page_Highlight},
  138. {"EditEndPageHighlight", CK_End_Page_Highlight},
  139. {"EditScrollUpHighlight", CK_Scroll_Up_Highlight},
  140. {"EditScrollDownHighlight", CK_Scroll_Down_Highlight},
  141. {"EditParagraphUpHighlight", CK_Paragraph_Up_Highlight},
  142. {"EditParagraphDownHighlight", CK_Paragraph_Down_Highlight},
  143. {"EditPageUpAltHighlight", CK_Page_Up_Alt_Highlight},
  144. {"EditPageDownAltHighlight", CK_Page_Down_Alt_Highlight},
  145. {"EditLeftAltHighlight", CK_Left_Alt_Highlight},
  146. {"EditRightAltHighlight", CK_Right_Alt_Highlight},
  147. {"EditWordLeftAltHighlight", CK_Word_Left_Alt_Highlight},
  148. {"EditWordRightAltHighlight", CK_Word_Right_Alt_Highlight},
  149. {"EditUpAltHighlight", CK_Up_Alt_Highlight},
  150. {"EditDownAltHighlight", CK_Down_Alt_Highlight},
  151. {"EditHomeAltHighlight", CK_Home_Alt_Highlight},
  152. {"EditEndAltHighlight", CK_End_Alt_Highlight},
  153. {"EditBeginningOfTextAltHighlight", CK_Beginning_Of_Text_Alt_Highlight},
  154. {"EditEndOfTextAltHighlight", CK_End_Of_Text_Alt_Highlight},
  155. {"EditBeginPageAltHighlight", CK_Begin_Page_Alt_Highlight},
  156. {"EditEndPageAltHighlight", CK_End_Page_Alt_Highlight},
  157. {"EditScrollUpAltHighlight", CK_Scroll_Up_Alt_Highlight},
  158. {"EditScrollDownAltHighlight", CK_Scroll_Down_Alt_Highlight},
  159. {"EditParagraphUpAltHighlight", CK_Paragraph_Up_Alt_Highlight},
  160. {"EditParagraphDownAltHighlight", CK_Paragraph_Down_Alt_Highlight},
  161. {"EditShiftBlockLeft", CK_Shift_Block_Left},
  162. {"EditShiftBlockRight", CK_Shift_Block_Right},
  163. {"EditXStore", CK_XStore},
  164. {"EditXCut", CK_XCut},
  165. {"EditXPaste", CK_XPaste},
  166. {"EditSelectionHistory", CK_Selection_History},
  167. {"EditShell", CK_Shell},
  168. {"EditInsertLiteral", CK_Insert_Literal},
  169. {"EditExecuteMacro", CK_Execute_Macro},
  170. {"EditBeginOrEndMacro", CK_Begin_End_Macro},
  171. {"EditExtMode", CK_Ext_Mode},
  172. {"EditToggleLineState", CK_Toggle_Line_State},
  173. {"EditToggleTabTWS", CK_Toggle_Tab_TWS},
  174. {"EditToggleSyntax", CK_Toggle_Syntax},
  175. {"EditToggleShowMargin", CK_Toggle_Show_Margin},
  176. {"EditFindDefinition", CK_Find_Definition},
  177. {"EditLoadPrevFile", CK_Load_Prev_File},
  178. {"EditLoadNextFile", CK_Load_Next_File},
  179. {"EditOptions", CK_Edit_Options},
  180. {"EditSaveMode", CK_Edit_Save_Mode},
  181. {"EditChooseSyntax", CK_Choose_Syntax},
  182. {"EditAbout", CK_About},
  183. #if 0
  184. {"EditFocusNext", CK_Focus_Next},
  185. {"EditFocusPrev", CK_Focus_Prev},
  186. {"EditHeightInc", CK_Height_Inc},
  187. {"EditHeightDec", CK_Height_Dec},
  188. {"EditMake", CK_Make},
  189. {"EditErrorNext", CK_Error_Next},
  190. {"EditErrorPrev", CK_Error_Prev},
  191. #endif
  192. #if 0
  193. {"EditSaveDesktop", CK_Save_Desktop},
  194. {"EditNewWindow", CK_New_Window},
  195. {"EditCycle", CK_Cycle},
  196. {"EditSaveAndQuit", CK_Save_And_Quit},
  197. {"EditRunAnother", CK_Run_Another},
  198. {"EditCheckSaveAndQuit", CK_Check_Save_And_Quit},
  199. {"EditMaximize", CK_Maximize},
  200. #endif
  201. #endif /* USE_INTERNAL_EDIT */
  202. /* viewer */
  203. {"ViewHelp", CK_ViewHelp},
  204. {"ViewToggleWrapMode", CK_ViewToggleWrapMode},
  205. {"ViewToggleHexEditMode", CK_ViewToggleHexEditMode},
  206. {"ViewQuit", CK_ViewQuit},
  207. {"ViewToggleHexMode", CK_ViewToggleHexMode},
  208. {"ViewGoto", CK_ViewGoto},
  209. {"ViewHexEditSave", CK_ViewHexEditSave},
  210. {"ViewSearch", CK_ViewSearch},
  211. {"ViewToggleMagicMode", CK_ViewToggleMagicMode},
  212. {"ViewToggleNroffMode", CK_ViewToggleNroffMode},
  213. {"ViewContinueSearch", CK_ViewContinueSearch},
  214. {"ViewGotoBookmark", CK_ViewGotoBookmark},
  215. {"ViewNewBookmark", CK_ViewNewBookmark},
  216. {"ViewMoveUp", CK_ViewMoveUp},
  217. {"ViewMoveDown", CK_ViewMoveDown},
  218. {"ViewMoveLeft", CK_ViewMoveLeft},
  219. {"ViewMoveRight", CK_ViewMoveRight},
  220. {"ViewMoveLeft10", CK_ViewMoveLeft10},
  221. {"ViewMoveRight10", CK_ViewMoveRight10},
  222. {"ViewMovePgDn", CK_ViewMovePgDn},
  223. {"ViewMovePgUp", CK_ViewMovePgUp},
  224. {"ViewMoveHalfPgDn", CK_ViewMoveHalfPgDn},
  225. {"ViewMoveHalfPgUp", CK_ViewMoveHalfPgUp},
  226. {"ViewMoveToBol", CK_ViewMoveToBol},
  227. {"ViewMoveToEol", CK_ViewMoveToEol},
  228. {"ViewMoveTop", CK_ViewMoveTop},
  229. {"ViewMoveBottom", CK_ViewMoveBottom},
  230. {"ViewNextFile", CK_ViewNextFile},
  231. {"ViewPrevFile", CK_ViewPrevFile},
  232. {"ViewToggleRuler", CK_ViewToggleRuler},
  233. {"ViewToggleHexNavMode", CK_ViewToggleHexNavMode},
  234. /* help */
  235. {"HelpHelp", CK_HelpHelp},
  236. {"HelpIndex", CK_HelpIndex},
  237. {"HelpBack", CK_HelpBack},
  238. {"HelpQuit", CK_HelpQuit},
  239. {"HelpMoveUp", CK_HelpMoveUp},
  240. {"HelpMoveDown", CK_HelpMoveDown},
  241. {"HelpMovePgDn", CK_HelpMovePgDn},
  242. {"HelpMovePgUp", CK_HelpMovePgUp},
  243. {"HelpMoveHalfPgDn", CK_HelpMoveHalfPgDn},
  244. {"HelpMoveHalfPgUp", CK_HelpMoveHalfPgUp},
  245. {"HelpMoveTop", CK_HelpMoveTop},
  246. {"HelpMoveBottom", CK_HelpMoveBottom},
  247. {"HelpSelectLink", CK_HelpSelectLink},
  248. {"HelpNextLink", CK_HelpNextLink},
  249. {"HelpPrevLink", CK_HelpPrevLink},
  250. {"HelpNextNode", CK_HelpNextNode},
  251. {"HelpPrevNode", CK_HelpPrevNode},
  252. /* tree */
  253. {"TreeHelp", CK_TreeHelp},
  254. {"TreeForget", CK_TreeForget},
  255. {"TreeToggleNav", CK_TreeToggleNav},
  256. {"TreeCopy", CK_TreeCopy},
  257. {"TreeMove", CK_TreeMove},
  258. {"TreeMake", CK_TreeMake},
  259. {"TreeMoveUp", CK_TreeMoveUp},
  260. {"TreeMoveDown", CK_TreeMoveDown},
  261. {"TreeMoveLeft", CK_TreeMoveLeft},
  262. {"TreeMoveRight", CK_TreeMoveRight},
  263. {"TreeMoveHome", CK_TreeMoveHome},
  264. {"TreeMoveEnd", CK_TreeMoveEnd},
  265. {"TreeMovePgUp", CK_TreeMovePgUp},
  266. {"TreeMovePgDn", CK_TreeMovePgDn},
  267. {"TreeOpen", CK_TreeOpen},
  268. {"TreeRescan", CK_TreeRescan},
  269. {"TreeStartSearch", CK_TreeStartSearch},
  270. {"TreeRemove", CK_TreeRemove},
  271. /* main commands */
  272. {"CmdHelp", CK_HelpCmd},
  273. {"CmdMenu", CK_MenuCmd},
  274. {"CmdChmod", CK_ChmodCmd},
  275. {"CmdMenuLastSelected", CK_MenuLastSelectedCmd},
  276. {"CmdSingleDirsize", CK_SingleDirsizeCmd},
  277. {"CmdCopyCurrentPathname", CK_CopyCurrentPathname},
  278. {"CmdCopyOtherPathname", CK_CopyOtherPathname},
  279. {"CmdSuspend", CK_SuspendCmd},
  280. {"CmdToggleListing", CK_ToggleListingCmd},
  281. {"CmdChownAdvanced", CK_ChownAdvancedCmd},
  282. {"CmdChown", CK_ChownCmd},
  283. {"CmdCompareDirs", CK_CompareDirsCmd},
  284. {"CmdConfigureBox", CK_ConfigureBox},
  285. {"CmdConfigureVfs", CK_ConfigureVfs},
  286. {"CmdConfirmBox", CK_ConfirmBox},
  287. {"CmdCopy", CK_CopyCmd},
  288. {"CmdDelete", CK_DeleteCmd},
  289. {"CmdDirsizes", CK_DirsizesCmd},
  290. {"CmdDisplayBitsBox", CK_DisplayBitsBox},
  291. {"CmdEdit", CK_EditCmd},
  292. #ifdef USE_INTERNAL_EDIT
  293. {"CmdEditForceInternal", CK_EditForceInternalCmd},
  294. #endif
  295. {"CmdEditExtFile", CK_EditExtFileCmd},
  296. {"CmdEditFhlFile", CK_EditFhlFileCmd},
  297. {"CmdEditMcMenu", CK_EditMcMenuCmd},
  298. {"CmdEditSymlink", CK_EditSymlinkCmd},
  299. {"CmdEditSyntax", CK_EditSyntaxCmd},
  300. {"CmdEditUserMenu", CK_EditUserMenuCmd},
  301. {"CmdExternalPanelize", CK_ExternalPanelize},
  302. {"CmdFilter", CK_FilterCmd},
  303. {"CmdFilteredView", CK_FilteredViewCmd},
  304. {"CmdFind", CK_FindCmd},
  305. #ifdef ENABLE_VFS_FISH
  306. {"CmdFishlink", CK_FishlinkCmd},
  307. #endif
  308. #ifdef ENABLE_VFS_FTP
  309. {"CmdFtplink", CK_FtplinkCmd},
  310. #endif
  311. {"CmdHistory", CK_HistoryCmd},
  312. {"CmdInfo", CK_InfoCmd},
  313. #ifdef WITH_BACKGROUND
  314. {"CmdJobs", CK_JobsCmd},
  315. #endif
  316. {"CmdLayout", CK_LayoutBox},
  317. {"CmdLearnKeys", CK_LearnKeys},
  318. {"CmdLink", CK_LinkCmd},
  319. {"CmdChangeListing", CK_ChangeListingCmd},
  320. {"CmdListing", CK_ListingCmd},
  321. #ifdef LISTMODE_EDITOR
  322. {"CmdListmodeCmd", CK_ListmodeCmd}.
  323. #endif
  324. {"CmdMkdir", CK_MkdirCmd},
  325. {"CmdPanelOptions", CK_PanelOptionsBox},
  326. {"CmdQuickCd", CK_QuickCdCmd},
  327. {"CmdQuickChdir", CK_QuickChdirCmd},
  328. {"CmdQuickView", CK_QuickViewCmd},
  329. {"CmdQuietQuit", CK_QuietQuitCmd},
  330. {"CmdRelativeSymlink", CK_RelativeSymlinkCmd},
  331. {"CmdRename", CK_RenameCmd},
  332. {"CmdReread", CK_RereadCmd},
  333. {"CmdReselectVfs", CK_ReselectVfs},
  334. {"CmdReverseSelection", CK_ReverseSelectionCmd},
  335. {"CmdSaveSetup", CK_SaveSetupCmd},
  336. {"CmdSelect", CK_SelectCmd},
  337. #ifdef ENABLE_VFS_SMB
  338. {"CmdSmblinkCmd", CK_SmblinkCmd},
  339. #endif
  340. {"CmdSwapPanel", CK_SwapCmd},
  341. {"CmdSymlink", CK_SymlinkCmd},
  342. {"CmdTree", CK_TreeCmd},
  343. {"CmdTreeBox", CK_TreeBoxCmd},
  344. #ifdef ENABLE_VFS_UNDELFS
  345. {"CmdUndelete", CK_UndeleteCmd},
  346. #endif
  347. {"CmdUnselect", CK_UnselectCmd},
  348. {"CmdUserMenu", CK_UserMenuCmd},
  349. {"CmdUserFileMenu", CK_UserFileMenuCmd},
  350. {"CmdView", CK_ViewCmd},
  351. {"CmdViewFile", CK_ViewFileCmd},
  352. {"CmdCopyCurrentReadlink", CK_CopyCurrentReadlink},
  353. {"CmdCopyOtherReadlink", CK_CopyOtherReadlink},
  354. {"CmdAddHotlist", CK_AddHotlist},
  355. {"CmdQuit", CK_QuitCmd},
  356. {"CmdCopyCurrentTagged", CK_CopyCurrentTagged},
  357. {"CmdCopyOtherTagged", CK_CopyOtherTagged},
  358. {"CmdToggleShowHidden", CK_ToggleShowHidden},
  359. {"CmdTogglePanelsSplit", CK_TogglePanelsSplit},
  360. #ifdef USE_DIFF_VIEW
  361. {"CmdDiffView", CK_DiffViewCmd},
  362. #endif
  363. {"CmdDialogList", CK_DialogListCmd},
  364. {"CmdDialogNext", CK_DialogNextCmd},
  365. {"CmdDialogPrev", CK_DialogPrevCmd},
  366. /* panel */
  367. {"PanelChdirOtherPanel", CK_PanelChdirOtherPanel},
  368. {"PanelChdirToReadlink", CK_PanelChdirToReadlink},
  369. {"PanelCopyLocal", CK_PanelCmdCopyLocal},
  370. {"PanelDeleteLocal", CK_PanelCmdDeleteLocal},
  371. {"PanelDoEnter", CK_PanelCmdDoEnter},
  372. {"PanelEditNew", CK_PanelCmdEditNew},
  373. {"PanelRenameLocal", CK_PanelCmdRenameLocal},
  374. {"PanelReverseSelection", CK_PanelCmdReverseSelection},
  375. {"PanelSelect", CK_PanelCmdSelect},
  376. {"PanelUnselect", CK_PanelCmdUnselect},
  377. {"PanelViewSimple", CK_PanelCmdViewSimple},
  378. {"PanelGotoParentDir", CK_PanelGotoParentDir},
  379. {"PanelGotoChildDir", CK_PanelGotoChildDir},
  380. {"PanelDirectoryHistoryList", CK_PanelDirectoryHistoryList},
  381. {"PanelDirectoryHistoryNext", CK_PanelDirectoryHistoryNext},
  382. {"PanelDirectoryHistoryPrev", CK_PanelDirectoryHistoryPrev},
  383. {"PanelGotoBottomFile", CK_PanelGotoBottomFile},
  384. {"PanelGotoMiddleFile", CK_PanelGotoMiddleFile},
  385. {"PanelGotoTopFile", CK_PanelGotoTopFile},
  386. {"PanelMarkFile", CK_PanelMarkFile},
  387. {"PanelMarkFileDown", CK_PanelMarkFileDown},
  388. {"PanelMarkFileUp", CK_PanelMarkFileUp},
  389. {"PanelMoveUp", CK_PanelMoveUp},
  390. {"PanelMoveDown", CK_PanelMoveDown},
  391. {"PanelMoveLeft", CK_PanelMoveLeft},
  392. {"PanelMoveRight", CK_PanelMoveRight},
  393. {"PanelMoveEnd", CK_PanelMoveEnd},
  394. {"PanelMoveHome", CK_PanelMoveHome},
  395. {"PanelNextPage", CK_PanelNextPage},
  396. {"PanelPrevPage", CK_PanelPrevPage},
  397. #ifdef HAVE_CHARSET
  398. {"PanelSetPanelEncoding", CK_PanelSetPanelEncoding},
  399. #endif
  400. {"PanelStartSearch", CK_PanelStartSearch},
  401. {"PanelSyncOtherPanel", CK_PanelSyncOtherPanel},
  402. {"PanelToggleSortOrderNext", CK_PanelToggleSortOrderNext},
  403. {"PanelToggleSortOrderPrev", CK_PanelToggleSortOrderPrev},
  404. {"PanelSelectSortOrder", CK_PanelSelectSortOrder},
  405. {"PanelReverseSort", CK_PanelReverseSort},
  406. {"PanelSortOrderByName", CK_PanelSortOrderByName},
  407. {"PanelSortOrderByExt", CK_PanelSortOrderByExt},
  408. {"PanelSortOrderBySize", CK_PanelSortOrderBySize},
  409. {"PanelSortOrderByMTime", CK_PanelSortOrderByMTime},
  410. {"PanelSmartGotoParentDir", CK_PanelSmartGotoParentDir},
  411. /* input line */
  412. {"InputBol", CK_InputBol},
  413. {"InputEol", CK_InputEol},
  414. {"InputMoveLeft", CK_InputMoveLeft},
  415. {"InputWordLeft", CK_InputWordLeft},
  416. {"InputBackwardChar", CK_InputBackwardChar},
  417. {"InputBackwardWord", CK_InputBackwardWord},
  418. {"InputMoveRight", CK_InputMoveRight},
  419. {"InputWordRight", CK_InputWordRight},
  420. {"InputForwardChar", CK_InputForwardChar},
  421. {"InputForwardWord", CK_InputForwardWord},
  422. {"InputBackwardDelete", CK_InputBackwardDelete},
  423. {"InputDeleteChar", CK_InputDeleteChar},
  424. {"InputKillWord", CK_InputKillWord},
  425. {"InputBackwardKillWord", CK_InputBackwardKillWord},
  426. {"InputSetMark", CK_InputSetMark},
  427. {"InputKillRegion", CK_InputKillRegion},
  428. {"InputYank", CK_InputYank},
  429. {"InputKillLine", CK_InputKillLine},
  430. {"InputHistoryPrev", CK_InputHistoryPrev},
  431. {"InputHistoryNext", CK_InputHistoryNext},
  432. {"InputHistoryShow", CK_InputHistoryShow},
  433. {"InputComplete", CK_InputComplete},
  434. {"InputXStore", CK_InputKillSave},
  435. {"InputXPaste", CK_InputPaste},
  436. {"InputClearLine", CK_InputClearLine},
  437. {"InputLeftHighlight", CK_InputLeftHighlight},
  438. {"InputRightHighlight", CK_InputRightHighlight},
  439. {"InputWordLeftHighlight", CK_InputWordLeftHighlight},
  440. {"InputWordRightHighlight", CK_InputWordRightHighlight},
  441. {"InputBolHighlight", CK_InputBolHighlight},
  442. {"InputEolHighlight", CK_InputEolHighlight},
  443. /* listbox */
  444. {"ListboxMoveUp", CK_ListboxMoveUp},
  445. {"ListboxMoveDown", CK_ListboxMoveDown},
  446. {"ListboxMoveHome", CK_ListboxMoveHome},
  447. {"ListboxMoveEnd", CK_ListboxMoveEnd},
  448. {"ListboxMovePgUp", CK_ListboxMovePgUp},
  449. {"ListboxMovePgDn", CK_ListboxMovePgDn},
  450. {"ListboxDeleteItem", CK_ListboxDeleteItem},
  451. {"ListboxDeleteAll", CK_ListboxDeleteAll},
  452. /* common */
  453. {"ExtMap1", CK_StartExtMap1},
  454. {"ExtMap2", CK_StartExtMap2},
  455. {"ShowCommandLine", CK_ShowCommandLine},
  456. {"SelectCodepage", CK_SelectCodepage},
  457. /* dialog */
  458. {"DialogOK", CK_DialogOK},
  459. {"DialogCancel", CK_DialogCancel},
  460. {"DialogPrevItem", CK_DialogPrevItem},
  461. {"DialogNextItem", CK_DialogNextItem},
  462. {"DialogHelp", CK_DialogHelp},
  463. {"DialogSuspend", CK_DialogSuspend},
  464. {"DialogRefresh", CK_DialogRefresh},
  465. #ifdef USE_DIFF_VIEW
  466. /* diff viewer */
  467. {"DiffDisplaySymbols", CK_DiffDisplaySymbols},
  468. {"DiffDisplayNumbers", CK_DiffDisplayNumbers},
  469. {"DiffFull", CK_DiffFull},
  470. {"DiffEqual", CK_DiffEqual},
  471. {"DiffSplitMore", CK_DiffSplitMore},
  472. {"DiffSplitLess", CK_DiffSplitLess},
  473. {"DiffShowDiff", CK_DiffShowDiff},
  474. {"DiffSetTab2", CK_DiffSetTab2},
  475. {"DiffSetTab3", CK_DiffSetTab3},
  476. {"DiffSetTab4", CK_DiffSetTab4},
  477. {"DiffSetTab8", CK_DiffSetTab8},
  478. {"DiffSwapPanel", CK_DiffSwapPanel},
  479. {"DiffRedo", CK_DiffRedo},
  480. {"DiffNextHunk", CK_DiffNextHunk},
  481. {"DiffPrevHunk", CK_DiffPrevHunk},
  482. {"DiffGoto", CK_DiffGoto},
  483. {"DiffEditCurrent", CK_DiffEditCurrent},
  484. {"DiffEditOther", CK_DiffEditOther},
  485. {"DiffSearch", CK_DiffSearch},
  486. {"DiffContinueSearch", CK_DiffContinueSearch},
  487. {"DiffEOF", CK_DiffEOF},
  488. {"DiffBOF", CK_DiffBOF},
  489. {"DiffDown", CK_DiffDown},
  490. {"DiffUp", CK_DiffUp},
  491. {"DiffLeft", CK_DiffLeft},
  492. {"DiffRight", CK_DiffRight},
  493. {"DiffPageDown", CK_DiffPageDown},
  494. {"DiffPageUp", CK_DiffPageUp},
  495. {"DiffHome", CK_DiffHome},
  496. {"DiffEnd", CK_DiffEnd},
  497. {"DiffQuit", CK_DiffQuit},
  498. {"DiffHelp", CK_DiffHelp},
  499. {"SelectCodepage", CK_SelectCodepage},
  500. {"DiffMergeCurrentHunk", CK_DiffMergeCurrentHunk},
  501. {"DiffSave", CK_DiffSave},
  502. {"DiffOptions", CK_DiffOptions},
  503. #endif
  504. {NULL, CK_Ignore_Key}
  505. };
  506. static const size_t num_command_names = sizeof (command_names) / sizeof (command_names[0]) - 1;
  507. /*** file scope functions ************************************************************************/
  508. /* --------------------------------------------------------------------------------------------- */
  509. static int
  510. name_keymap_comparator (const void *p1, const void *p2)
  511. {
  512. const name_keymap_t *m1 = (const name_keymap_t *) p1;
  513. const name_keymap_t *m2 = (const name_keymap_t *) p2;
  514. return str_casecmp (m1->name, m2->name);
  515. }
  516. /* --------------------------------------------------------------------------------------------- */
  517. static inline void
  518. sort_command_names (void)
  519. {
  520. static gboolean has_been_sorted = FALSE;
  521. if (!has_been_sorted)
  522. {
  523. qsort (command_names, num_command_names,
  524. sizeof (command_names[0]), &name_keymap_comparator);
  525. has_been_sorted = TRUE;
  526. }
  527. }
  528. /* --------------------------------------------------------------------------------------------- */
  529. static void
  530. keymap_add (GArray * keymap, long key, unsigned long cmd, const char *caption)
  531. {
  532. if (key != 0 && cmd != CK_Ignore_Key)
  533. {
  534. global_keymap_t new_bind;
  535. new_bind.key = key;
  536. new_bind.command = cmd;
  537. g_snprintf (new_bind.caption, sizeof (new_bind.caption), "%s", caption);
  538. g_array_append_val (keymap, new_bind);
  539. }
  540. }
  541. /* --------------------------------------------------------------------------------------------- */
  542. /*** public functions ****************************************************************************/
  543. /* --------------------------------------------------------------------------------------------- */
  544. void
  545. keybind_cmd_bind (GArray * keymap, const char *keybind, unsigned long action)
  546. {
  547. char *caption = NULL;
  548. long key;
  549. key = lookup_key (keybind, &caption);
  550. keymap_add (keymap, key, action, caption);
  551. g_free (caption);
  552. }
  553. /* --------------------------------------------------------------------------------------------- */
  554. unsigned long
  555. keybind_lookup_action (const char *name)
  556. {
  557. const name_keymap_t key = { name, 0 };
  558. name_keymap_t *res;
  559. sort_command_names ();
  560. res = bsearch (&key, command_names, num_command_names,
  561. sizeof (command_names[0]), name_keymap_comparator);
  562. return (res != NULL) ? res->val : CK_Ignore_Key;
  563. }
  564. /* --------------------------------------------------------------------------------------------- */
  565. const char *
  566. keybind_lookup_keymap_shortcut (const global_keymap_t * keymap, unsigned long action)
  567. {
  568. size_t i;
  569. for (i = 0; keymap[i].key != 0; i++)
  570. if (keymap[i].command == action)
  571. return (keymap[i].caption[0] != '\0') ? keymap[i].caption : NULL;
  572. return NULL;
  573. }
  574. /* --------------------------------------------------------------------------------------------- */
  575. unsigned long
  576. keybind_lookup_keymap_command (const global_keymap_t * keymap, long key)
  577. {
  578. size_t i;
  579. for (i = 0; keymap[i].key != 0; i++)
  580. if (keymap[i].key == key)
  581. return keymap[i].command;
  582. return CK_Ignore_Key;
  583. }
  584. /* --------------------------------------------------------------------------------------------- */