From 44d07b20ab76d5085a0cc326d25b7160b5385a47 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Thu, 12 Aug 2010 13:17:58 +0400 Subject: [PATCH] Implementation of keybindings for WListbox. Signed-off-by: Andrew Borodin --- misc/mc.keymap.default | 10 +++ misc/mc.keymap.emacs | 10 +++ src/cmddef.h | 19 ++++-- src/keybind.c | 51 +++++++++++++-- src/keybind.h | 3 + src/setup.c | 9 +++ src/widget.c | 140 +++++++++++++++++++---------------------- 7 files changed, 154 insertions(+), 88 deletions(-) diff --git a/misc/mc.keymap.default b/misc/mc.keymap.default index 374c3d285..d7d70563e 100644 --- a/misc/mc.keymap.default +++ b/misc/mc.keymap.default @@ -337,6 +337,16 @@ InputWordRightHighlight = ctrl-shift-right InputBolHighlight = shift-home InputEolHighlight = shift-end +[listbox] +ListboxMoveUp = up; ctrl-p +ListboxMoveDown = down; ctrl-n +ListboxMoveHome = home; alt-lt; a1 +ListboxMoveEnd = end; alt-gt; c1 +ListboxMovePgUp = pgup; alt-v +ListboxMovePgDn = pgdn; ctrl-v +ListboxDeleteItem = delete; d +ListboxDeleteAll = shift-delete; shift-d + [tree] TreeHelp = f1 TreeForget = f3 diff --git a/misc/mc.keymap.emacs b/misc/mc.keymap.emacs index b84dee8b1..4cd5d1a6b 100644 --- a/misc/mc.keymap.emacs +++ b/misc/mc.keymap.emacs @@ -341,6 +341,16 @@ InputWordRightHighlight = InputBolHighlight = InputEolHighlight = +[listbox] +ListboxMoveUp = up; ctrl-p +ListboxMoveDown = down; ctrl-n +ListboxMoveHome = home; alt-lt; a1 +ListboxMoveEnd = end; alt-gt; c1 +ListboxMovePgUp = pgup; alt-v +ListboxMovePgDn = pgdn; ctrl-v +ListboxDeleteItem = delete; d +ListboxDeleteAll = shift-delete; shift-d + [tree] TreeHelp = f1 TreeForget = f3 diff --git a/src/cmddef.h b/src/cmddef.h index 8dd186233..37c813b8a 100644 --- a/src/cmddef.h +++ b/src/cmddef.h @@ -219,7 +219,7 @@ #define CK_StartExtMap1 2021 #define CK_StartExtMap2 2022 -/* Dialog */ +/* dialog */ #define CK_DialogOK 3001 #define CK_DialogCancel 3002 #define CK_DialogPrevItem 3003 @@ -228,7 +228,7 @@ #define CK_DialogSuspend 3006 #define CK_DialogRefresh 3007 -/* text fields*/ +/* text fields */ #define CK_InputBol 4001 #define CK_InputEol 4002 #define CK_InputMoveLeft 4003 @@ -254,7 +254,6 @@ #define CK_InputComplete 4024 #define CK_InputPaste 4025 #define CK_InputClearLine 4026 - #define CK_InputLeftHighlight 4027 #define CK_InputRightHighlight 4028 #define CK_InputWordLeftHighlight 4029 @@ -262,7 +261,17 @@ #define CK_InputBolHighlight 4031 #define CK_InputEolHighlight 4032 -/* Viewer */ +/* listbox */ +#define CK_ListboxMoveUp 4500 +#define CK_ListboxMoveDown 4501 +#define CK_ListboxMoveHome 4502 +#define CK_ListboxMoveEnd 4503 +#define CK_ListboxMovePgUp 4504 +#define CK_ListboxMovePgDn 4505 +#define CK_ListboxDeleteItem 4506 +#define CK_ListboxDeleteAll 4507 + +/* viewer */ #define CK_ViewHelp 5001 #define CK_ViewToggleWrapMode 5002 #define CK_ViewToggleHexEditMode 5003 @@ -291,7 +300,7 @@ #define CK_ViewToggleRuler 5026 #define CK_ViewToggleHexNavMode 5027 -/* Tree */ +/* tree */ #define CK_TreeHelp 6001 #define CK_TreeForget 6003 #define CK_TreeToggleNav 6004 diff --git a/src/keybind.c b/src/keybind.c index e6bfb001c..23aae6c1d 100644 --- a/src/keybind.c +++ b/src/keybind.c @@ -58,6 +58,7 @@ GArray *viewer_keymap = NULL; GArray *viewer_hex_keymap = NULL; GArray *panel_keymap = NULL; GArray *input_keymap = NULL; +GArray *listbox_keymap = NULL; GArray *tree_keymap = NULL; GArray *help_keymap = NULL; GArray *dialog_keymap = NULL; @@ -72,6 +73,7 @@ const global_keymap_t *main_map; const global_keymap_t *main_x_map; const global_keymap_t *panel_map; const global_keymap_t *input_map; +const global_keymap_t *listbox_map; const global_keymap_t *tree_map; const global_keymap_t *help_map; const global_keymap_t *dialog_map; @@ -483,11 +485,21 @@ static name_keymap_t command_names[] = { { "InputXPaste", CK_InputPaste }, { "InputClearLine", CK_InputClearLine }, { "InputLeftHighlight", CK_InputLeftHighlight }, - { "InputRightHighlight", CK_InputRightHighlight}, - { "InputWordLeftHighlight", CK_InputWordLeftHighlight}, - { "InputWordRightHighlight", CK_InputWordRightHighlight}, - { "InputBolHighlight", CK_InputBolHighlight}, - { "InputEolHighlight", CK_InputEolHighlight}, + { "InputRightHighlight", CK_InputRightHighlight }, + { "InputWordLeftHighlight", CK_InputWordLeftHighlight }, + { "InputWordRightHighlight", CK_InputWordRightHighlight }, + { "InputBolHighlight", CK_InputBolHighlight }, + { "InputEolHighlight", CK_InputEolHighlight }, + + /* listbox */ + { "ListboxMoveUp", CK_ListboxMoveUp }, + { "ListboxMoveDown", CK_ListboxMoveDown }, + { "ListboxMoveHome", CK_ListboxMoveHome }, + { "ListboxMoveEnd", CK_ListboxMoveEnd }, + { "ListboxMovePgUp", CK_ListboxMovePgUp }, + { "ListboxMovePgDn", CK_ListboxMovePgDn }, + { "ListboxDeleteItem", CK_ListboxDeleteItem }, + { "ListboxDeleteAll", CK_ListboxDeleteAll }, /* common */ { "ExtMap1", CK_StartExtMap1 }, @@ -504,6 +516,7 @@ static name_keymap_t command_names[] = { { "DialogSuspend", CK_DialogSuspend }, { "DialogRefresh", CK_DialogRefresh }, +#ifdef USE_DIFF_VIEW /* diff viewer */ { "DiffDisplaySymbols", CK_DiffDisplaySymbols}, { "DiffDisplayNumbers", CK_DiffDisplayNumbers}, @@ -541,6 +554,7 @@ static name_keymap_t command_names[] = { { "DiffMergeCurrentHunk", CK_DiffMergeCurrentHunk}, { "DiffSave", CK_DiffSave}, { "DiffOptions", CK_DiffOptions}, +#endif { NULL, CK_Ignore_Key } }; @@ -871,7 +885,7 @@ const global_keymap_t default_help_keymap[] = { { 0, CK_Ignore_Key, "" } }; -/* screen.c */ +/* panel */ const global_keymap_t default_panel_keymap[] = { { ALT ('o'), CK_PanelChdirOtherPanel, "M-o" }, { ALT ('l'), CK_PanelChdirToReadlink, "M-l" }, @@ -1033,6 +1047,30 @@ const global_keymap_t default_input_keymap[] = { { 0, CK_Ignore_Key, "" } }; +const global_keymap_t default_listbox_keymap[] = { + { KEY_UP, CK_ListboxMoveUp, "Up" }, + { XCTRL ('p'), CK_ListboxMoveUp, "C-p" }, + { KEY_DOWN, CK_ListboxMoveDown, "Down" }, + { XCTRL ('n'), CK_ListboxMoveDown, "C-n" }, + { KEY_HOME, CK_ListboxMoveHome, "Home" }, + { ALT ('<'), CK_ListboxMoveHome, "M-<" }, + { KEY_A1, CK_ListboxMoveHome, "A1" }, + { KEY_END, CK_ListboxMoveEnd, "End" }, + { ALT ('>'), CK_ListboxMoveEnd, "M->" }, + { KEY_C1, CK_ListboxMoveEnd, "C1" }, + { KEY_PPAGE, CK_ListboxMovePgUp, "PgUp" }, + { ALT ('v'), CK_ListboxMovePgUp, "M-v" }, + { KEY_NPAGE, CK_ListboxMovePgDn, "PgDn" }, + { XCTRL ('v'), CK_ListboxMovePgDn, "C-v" }, + { KEY_DC, CK_ListboxDeleteItem, "Delete" }, + { 'd', CK_ListboxDeleteItem, "d" }, + { KEY_M_SHIFT | KEY_DC, CK_ListboxDeleteAll, "S-Delete" }, + { 'D', CK_ListboxDeleteAll, "D" }, + + { 0, CK_Ignore_Key, "" } +}; + +#ifdef USE_DIFF_VIEW /* diff viewer */ const global_keymap_t default_diff_keymap[] = { @@ -1081,6 +1119,7 @@ const global_keymap_t default_diff_keymap[] = { { 0, CK_Ignore_Key, "" } }; +#endif static int name_keymap_comparator (const void *p1, const void *p2) diff --git a/src/keybind.h b/src/keybind.h index 6c599149c..d0da37d44 100644 --- a/src/keybind.h +++ b/src/keybind.h @@ -43,6 +43,7 @@ extern GArray *main_keymap; extern GArray *main_x_keymap; extern GArray *panel_keymap; extern GArray *input_keymap; +extern GArray *listbox_keymap; extern GArray *tree_keymap; extern GArray *help_keymap; extern GArray *dialog_keymap; @@ -54,6 +55,7 @@ extern const global_keymap_t *main_map; extern const global_keymap_t *main_x_map; extern const global_keymap_t *panel_map; extern const global_keymap_t *input_map; +extern const global_keymap_t *listbox_map; extern const global_keymap_t *tree_map; extern const global_keymap_t *help_map; extern const global_keymap_t *dialog_map; @@ -76,6 +78,7 @@ extern const global_keymap_t default_panel_keymap[]; /* widget.c */ extern const global_keymap_t default_input_keymap[]; +extern const global_keymap_t default_listbox_keymap[]; /* main.c */ extern const global_keymap_t default_main_map[]; diff --git a/src/setup.c b/src/setup.c index c201b381b..a307a90e3 100644 --- a/src/setup.c +++ b/src/setup.c @@ -1031,6 +1031,9 @@ load_keymap_defs (void) input_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t)); load_keymap_from_section ("input", input_keymap, mc_global_keymap); + listbox_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t)); + load_keymap_from_section ("listbox", listbox_keymap, mc_global_keymap); + tree_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t)); load_keymap_from_section ("tree", tree_keymap, mc_global_keymap); @@ -1063,6 +1066,10 @@ load_keymap_defs (void) if (input_keymap && input_keymap->len > 0) input_map = (global_keymap_t *) input_keymap->data; + listbox_map = default_listbox_keymap; + if (listbox_keymap && listbox_keymap->len > 0) + listbox_map = (global_keymap_t *) listbox_keymap->data; + tree_map = default_tree_keymap; if (tree_keymap && tree_keymap->len > 0) tree_map = (global_keymap_t *) tree_keymap->data; @@ -1104,6 +1111,8 @@ free_keymap_defs (void) g_array_free (panel_keymap, TRUE); if (input_keymap != NULL) g_array_free (input_keymap, TRUE); + if (listbox_keymap != NULL) + g_array_free (listbox_keymap, TRUE); if (tree_keymap != NULL) g_array_free (tree_keymap, TRUE); if (help_keymap != NULL) diff --git a/src/widget.c b/src/widget.c index bf052cda3..406eb02a4 100644 --- a/src/widget.c +++ b/src/widget.c @@ -2220,7 +2220,7 @@ handle_char (WInput * in, int key) break; } } - if (input_map[i].command == 0) + if (input_map[i].command == CK_Ignore_Key) { if (key > 255) return MSG_NOT_HANDLED; @@ -2649,13 +2649,65 @@ listbox_back (WListbox * l) listbox_select_entry (l, l->pos - 1); } +static cb_ret_t +listbox_execute_cmd (WListbox * l, unsigned long command) +{ + cb_ret_t ret = MSG_HANDLED; + int i; + + switch (command) + { + case CK_ListboxMoveUp: + listbox_back (l); + break; + case CK_ListboxMoveDown: + listbox_fwd (l); + break; + case CK_ListboxMoveHome: + listbox_select_first (l); + break; + case CK_ListboxMoveEnd: + listbox_select_last (l); + break; + case CK_ListboxMovePgUp: + for (i = 0; (i < l->widget.lines - 1) && (l->pos > 0); i++) + listbox_back (l); + break; + case CK_ListboxMovePgDn: + for (i = 0; (i < l->widget.lines - 1) && (l->pos < l->count - 1); i++) + listbox_fwd (l); + break; + case CK_ListboxDeleteItem: + if (l->deletable) + { + gboolean is_last = (l->pos + 1 >= l->count); + gboolean is_more = (l->top + l->widget.lines >= l->count); + + listbox_remove_current (l); + if ((l->top > 0) && (is_last || is_more)) + l->top--; + } + break; + case CK_ListboxDeleteAll: + if (l->deletable && confirm_history_cleanup + /* TRANSLATORS: no need to translate 'DialogTitle', it's just a context prefix */ + && (query_dialog (Q_ ("DialogTitle|History cleanup"), + _("Do you want clean this history?"), + D_ERROR, 2, _("&Yes"), _("&No")) == 0)) + listbox_remove_list (l); + break; + default: + ret = MSG_NOT_HANDLED; + } + + return ret; +} + /* Return MSG_HANDLED if we want a redraw */ static cb_ret_t listbox_key (WListbox * l, int key) { - int i; - - cb_ret_t j = MSG_NOT_HANDLED; + unsigned long command; if (l->list == NULL) return MSG_NOT_HANDLED; @@ -2673,79 +2725,10 @@ listbox_key (WListbox * l, int key) return MSG_HANDLED; } - switch (key) - { - case KEY_HOME: - case KEY_A1: - case ALT ('<'): - listbox_select_first (l); - return MSG_HANDLED; - - case KEY_END: - case KEY_C1: - case ALT ('>'): - listbox_select_last (l); - return MSG_HANDLED; - - case XCTRL ('p'): - case KEY_UP: - listbox_back (l); - return MSG_HANDLED; - - case XCTRL ('n'): - case KEY_DOWN: - listbox_fwd (l); - return MSG_HANDLED; - - case KEY_NPAGE: - case XCTRL ('v'): - for (i = 0; (i < l->widget.lines - 1) && (l->pos < l->count - 1); i++) - { - listbox_fwd (l); - j = MSG_HANDLED; - } - break; - - case KEY_PPAGE: - case ALT ('v'): - for (i = 0; (i < l->widget.lines - 1) && (l->pos > 0); i++) - { - listbox_back (l); - j = MSG_HANDLED; - } - break; - - case KEY_DC: - case 'd': - if (l->deletable) - { - gboolean is_last = (l->pos + 1 >= l->count); - gboolean is_more = (l->top + l->widget.lines >= l->count); - - listbox_remove_current (l); - if ((l->top > 0) && (is_last || is_more)) - l->top--; - } - return MSG_HANDLED; - - case (KEY_M_SHIFT | KEY_DC): - case 'D': - if (l->deletable && confirm_history_cleanup - /* TRANSLATORS: no need to translate 'DialogTitle', it's just a context prefix */ - && (query_dialog (Q_ ("DialogTitle|History cleanup"), - _("Do you want clean this history?"), - D_ERROR, 2, _("&Yes"), _("&No")) == 0)) - { - listbox_remove_list (l); - j = MSG_HANDLED; - } - break; - - default: - break; - } - - return j; + command = lookup_keymap_command (listbox_map, key); + if (command == CK_Ignore_Key) + return MSG_NOT_HANDLED; + return listbox_execute_cmd (l, command); } static inline void @@ -2800,6 +2783,9 @@ listbox_callback (Widget * w, widget_msg_t msg, int parm) } return ret_code; + case WIDGET_COMMAND: + return listbox_execute_cmd (l, parm); + case WIDGET_CURSOR: widget_move (&l->widget, l->cursor_y, 0); h->callback (h, w, DLG_ACTION, l->pos, NULL);