From 6e9e84ba609c8e86a15c0eb17aa89df11de14cdf Mon Sep 17 00:00:00 2001 From: braph Date: Thu, 26 Sep 2019 22:27:25 +0200 Subject: [PATCH] alsamixer: Replaced hardcoded keys by binding arrays This commit is a preparation for making keybindings configurable. The hardcoded keys in the switch statements of mixer_widget.c, textbox.c, proc_files.c and card_select.c have been replaced by command enums. The command that shall be executed is looked up in the arrays `mixer_bindings` and `textbox_bindings`. The channel_mask enum has been made public, since LEFT and RIGHT are used as command arguments in bindings.c. Signed-off-by: Benjamin Abendroth Signed-off-by: Jaroslav Kysela --- alsamixer/Makefile.am | 1 + alsamixer/bindings.c | 132 +++++++++++++++++++++++++++++ alsamixer/bindings.h | 76 +++++++++++++++++ alsamixer/card_select.c | 26 ++---- alsamixer/mixer_widget.c | 179 ++++++++++++--------------------------- alsamixer/mixer_widget.h | 5 ++ alsamixer/proc_files.c | 26 ++---- alsamixer/textbox.c | 58 ++++--------- 8 files changed, 296 insertions(+), 207 deletions(-) create mode 100644 alsamixer/bindings.c create mode 100644 alsamixer/bindings.h diff --git a/alsamixer/Makefile.am b/alsamixer/Makefile.am index 249e8f8..3fe7a74 100644 --- a/alsamixer/Makefile.am +++ b/alsamixer/Makefile.am @@ -3,6 +3,7 @@ LDADD = @CURSESLIB@ bin_PROGRAMS = alsamixer alsamixer_SOURCES = card_select.c card_select.h \ + bindings.c bindings.h \ cli.c \ colors.c colors.h \ device_name.c device_name.h \ diff --git a/alsamixer/bindings.c b/alsamixer/bindings.c new file mode 100644 index 0000000..4c8db18 --- /dev/null +++ b/alsamixer/bindings.c @@ -0,0 +1,132 @@ +#include "bindings.h" +#include "mixer_widget.h" + +#define CNTRL(C) (C%32) + +uint8_t textbox_bindings[KEY_MAX] = { + ['\n'] = CMD_TEXTBOX_CLOSE, + ['\r'] = CMD_TEXTBOX_CLOSE, + [27] = CMD_TEXTBOX_CLOSE, + [KEY_CANCEL] = CMD_TEXTBOX_CLOSE, + [KEY_ENTER] = CMD_TEXTBOX_CLOSE, + [KEY_CLOSE] = CMD_TEXTBOX_CLOSE, + [KEY_EXIT] = CMD_TEXTBOX_CLOSE, + [KEY_DOWN] = CMD_TEXTBOX_DOWN, + [KEY_SF] = CMD_TEXTBOX_DOWN, + ['J'] = CMD_TEXTBOX_DOWN, + ['j'] = CMD_TEXTBOX_DOWN, + ['X'] = CMD_TEXTBOX_DOWN, + ['x'] = CMD_TEXTBOX_DOWN, + [KEY_UP] = CMD_TEXTBOX_UP, + [KEY_SR] = CMD_TEXTBOX_UP, + ['K'] = CMD_TEXTBOX_UP, + ['k'] = CMD_TEXTBOX_UP, + ['W'] = CMD_TEXTBOX_UP, + ['w'] = CMD_TEXTBOX_UP, + [KEY_LEFT] = CMD_TEXTBOX_LEFT, + ['H'] = CMD_TEXTBOX_LEFT, + ['h'] = CMD_TEXTBOX_LEFT, + ['P'] = CMD_TEXTBOX_LEFT, + ['p'] = CMD_TEXTBOX_LEFT, + [KEY_RIGHT] = CMD_TEXTBOX_RIGHT, + ['L'] = CMD_TEXTBOX_RIGHT, + ['l'] = CMD_TEXTBOX_RIGHT, + ['N'] = CMD_TEXTBOX_RIGHT, + ['n'] = CMD_TEXTBOX_RIGHT, + [KEY_NPAGE] = CMD_TEXTBOX_PAGE_DOWN, + [' '] = CMD_TEXTBOX_PAGE_DOWN, + [KEY_PPAGE] = CMD_TEXTBOX_PAGE_UP, + [KEY_BACKSPACE] = CMD_TEXTBOX_PAGE_UP, + ['B'] = CMD_TEXTBOX_PAGE_UP, + ['b'] = CMD_TEXTBOX_PAGE_UP, + [KEY_HOME] = CMD_TEXTBOX_TOP, + [KEY_BEG] = CMD_TEXTBOX_TOP, + [KEY_LL] = CMD_TEXTBOX_BOTTOM, + [KEY_END] = CMD_TEXTBOX_BOTTOM, + ['\t'] = CMD_TEXTBOX_PAGE_RIGHT, + [KEY_BTAB] = CMD_TEXTBOX_PAGE_LEFT, +}; + +command_enum mixer_bindings[] = { + [27] = CMD_MIXER_CLOSE, + [KEY_CANCEL] = CMD_MIXER_CLOSE, + [KEY_F(10)] = CMD_MIXER_CLOSE, + [KEY_F(1)] = CMD_MIXER_HELP, + [KEY_HELP] = CMD_MIXER_HELP, + ['H'] = CMD_MIXER_HELP, + ['h'] = CMD_MIXER_HELP, + ['?'] = CMD_MIXER_HELP, + [KEY_F(2)] = CMD_MIXER_SYSTEM_INFORMATION, + ['/'] = CMD_MIXER_SYSTEM_INFORMATION, + [KEY_F(3)] = CMD_WITH_ARG(CMD_MIXER_SET_VIEW_MODE, VIEW_MODE_PLAYBACK), + [KEY_F(4)] = CMD_WITH_ARG(CMD_MIXER_SET_VIEW_MODE, VIEW_MODE_CAPTURE), + [KEY_F(5)] = CMD_WITH_ARG(CMD_MIXER_SET_VIEW_MODE, VIEW_MODE_ALL), + ['\t'] = CMD_MIXER_TOGGLE_VIEW_MODE, + [KEY_F(6)] = CMD_MIXER_SELECT_CARD, + ['S'] = CMD_MIXER_SELECT_CARD, + ['s'] = CMD_MIXER_SELECT_CARD, + [KEY_REFRESH] = CMD_MIXER_REFRESH, + [CNTRL('L')] = CMD_MIXER_REFRESH, + ['L'] = CMD_MIXER_REFRESH, + ['l'] = CMD_MIXER_REFRESH, + [KEY_LEFT] = CMD_WITH_ARG(CMD_MIXER_PREVIOUS, 1), + ['p'] = CMD_WITH_ARG(CMD_MIXER_PREVIOUS, 1), + ['P'] = CMD_WITH_ARG(CMD_MIXER_PREVIOUS, 1), + [KEY_RIGHT] = CMD_WITH_ARG(CMD_MIXER_NEXT, 1), + ['N'] = CMD_WITH_ARG(CMD_MIXER_NEXT, 1), + ['n'] = CMD_WITH_ARG(CMD_MIXER_NEXT, 1), + [KEY_PPAGE] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP, 5), + [KEY_NPAGE] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN, 5), + [KEY_LL] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 0), + [KEY_END] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 0), + ['0'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 0), + ['1'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 10), + ['2'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 20), + ['3'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 30), + ['4'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 40), + ['5'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 50), + ['6'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 60), + ['7'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 70), + ['8'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 80), + ['9'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 90), +#if 0 + [KEY_BEG] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 100), + [KEY_HELP] = CMD_WITH_ARG(CMD_MIXER_CONTROL_SET_PERCENT, 100), +#endif + [KEY_UP] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP, 1), + ['+'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP, 1), + ['K'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP, 1), + ['k'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP, 1), + ['W'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP, 1), + ['w'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP, 1), + [KEY_DOWN] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN, 1), + ['-'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN, 1), + ['J'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN, 1), + ['j'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN, 1), + ['X'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN, 1), + ['x'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN, 1), + ['Q'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP_LEFT, 1), + ['q'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP_LEFT, 1), + ['Y'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN_LEFT, 1), + ['y'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN_LEFT, 1), + ['Z'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN_LEFT, 1), + ['z'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN_LEFT, 1), + ['E'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP_RIGHT, 1), + ['e'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_UP_RIGHT, 1), + ['C'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN_RIGHT, 1), + ['c'] = CMD_WITH_ARG(CMD_MIXER_CONTROL_DOWN_RIGHT, 1), + ['M'] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_MUTE, LEFT|RIGHT), + ['m'] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_MUTE, LEFT|RIGHT), + ['<'] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_MUTE, LEFT), + [','] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_MUTE, LEFT), + ['>'] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_MUTE, RIGHT), + ['.'] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_MUTE, RIGHT), + [' '] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_CAPTURE, LEFT|RIGHT), + [KEY_IC] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_CAPTURE, LEFT), + [';'] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_CAPTURE, LEFT), + [KEY_DC] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_CAPTURE, RIGHT), + ['\''] = CMD_WITH_ARG(CMD_MIXER_TOGGLE_CAPTURE, RIGHT), + ['B'] = CMD_MIXER_BALANCE_CONTROL, + ['b'] = CMD_MIXER_BALANCE_CONTROL, + ['='] = CMD_MIXER_BALANCE_CONTROL, +}; diff --git a/alsamixer/bindings.h b/alsamixer/bindings.h new file mode 100644 index 0000000..1e9dd6d --- /dev/null +++ b/alsamixer/bindings.h @@ -0,0 +1,76 @@ +#ifndef BINDINGS_H_INCLUDED +#define BINDINGS_H_INCLUDED + +#include CURSESINC +#include +#include + +/* Commands are stored in an uint16_t and may take an unsigned numeric argument. + * The command itself is stored in the lower 7 bits, the argument is stored + * in the higher 9 bits. + * + * The value `0` is used for no (unbound) command. */ + +typedef uint16_t command_enum; +extern command_enum mixer_bindings[KEY_MAX]; +/* No need for a 16bit type, since textbox commands don't take arguments */ +extern uint8_t textbox_bindings[KEY_MAX]; + +#define CMD_WITH_ARG(CMD, ARG) \ + ((CMD) + ((ARG) << 9)) + +#define CMD_GET_COMMAND(CMD) \ + ((CMD) & 0x1FF) + +#define CMD_GET_ARGUMENT(CMD) \ + ((CMD) >> 9) + +enum mixer_command { + // `CMD % 4` should produce the channel mask + CMD_MIXER_CONTROL_DOWN_LEFT = 1, + CMD_MIXER_CONTROL_DOWN_RIGHT, + CMD_MIXER_CONTROL_DOWN, + CMD_MIXER_CONTROL_UP_LEFT = 5, + CMD_MIXER_CONTROL_UP_RIGHT, + CMD_MIXER_CONTROL_UP, + CMD_MIXER_CONTROL_SET_PERCENT_LEFT = 9, + CMD_MIXER_CONTROL_SET_PERCENT_RIGHT, + CMD_MIXER_CONTROL_SET_PERCENT, + + // Keep those in the same order as displayed on screen + CMD_MIXER_HELP, + CMD_MIXER_SYSTEM_INFORMATION, + CMD_MIXER_SELECT_CARD, + CMD_MIXER_CLOSE, + + CMD_MIXER_TOGGLE_VIEW_MODE, + CMD_MIXER_SET_VIEW_MODE, + CMD_MIXER_PREVIOUS, + CMD_MIXER_NEXT, + CMD_MIXER_FOCUS_CONTROL, + CMD_MIXER_TOGGLE_MUTE, + CMD_MIXER_TOGGLE_CAPTURE, + CMD_MIXER_BALANCE_CONTROL, + CMD_MIXER_REFRESH +}; + +enum textbox_command { + /* Since these commands are also used by the menu widget we make use of + * the menu_driver() request constants. + * KEY_MAX is substracted so the value fits in 8 bits. */ + CMD_TEXTBOX___MIN_MENU_COMMAND = MIN_MENU_COMMAND - KEY_MAX, + CMD_TEXTBOX_TOP = REQ_FIRST_ITEM - KEY_MAX, + CMD_TEXTBOX_BOTTOM = REQ_LAST_ITEM - KEY_MAX, + CMD_TEXTBOX_LEFT = REQ_LEFT_ITEM - KEY_MAX, + CMD_TEXTBOX_RIGHT = REQ_RIGHT_ITEM - KEY_MAX, + CMD_TEXTBOX_UP = REQ_UP_ITEM - KEY_MAX, + CMD_TEXTBOX_DOWN = REQ_DOWN_ITEM - KEY_MAX, + CMD_TEXTBOX_PAGE_DOWN = REQ_SCR_DPAGE - KEY_MAX, + CMD_TEXTBOX_PAGE_UP = REQ_SCR_UPAGE - KEY_MAX, + CMD_TEXTBOX___MAX_MENU_COMMAND = MAX_MENU_COMMAND - KEY_MAX, + CMD_TEXTBOX_PAGE_LEFT, + CMD_TEXTBOX_PAGE_RIGHT, + CMD_TEXTBOX_CLOSE, +}; + +#endif diff --git a/alsamixer/card_select.c b/alsamixer/card_select.c index b473dcf..e970203 100644 --- a/alsamixer/card_select.c +++ b/alsamixer/card_select.c @@ -31,6 +31,7 @@ #include "mixer_widget.h" #include "device_name.h" #include "card_select.h" +#include "bindings.h" struct card { struct card *next; @@ -61,25 +62,12 @@ static void on_key_enter(void) static void on_menu_key(int key) { - static const struct { - int key; - int request; - } key_map[] = { - { KEY_DOWN, REQ_DOWN_ITEM }, - { KEY_UP, REQ_UP_ITEM }, - { KEY_HOME, REQ_FIRST_ITEM }, - { KEY_NPAGE, REQ_SCR_DPAGE }, - { KEY_PPAGE, REQ_SCR_UPAGE }, - { KEY_BEG, REQ_FIRST_ITEM }, - { KEY_END, REQ_LAST_ITEM }, - }; - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(key_map); ++i) - if (key_map[i].key == key) { - menu_driver(menu, key_map[i].request); - break; - } + if (key < ARRAY_SIZE(textbox_bindings)) { + key = textbox_bindings[key]; + if (key >= CMD_TEXTBOX___MIN_MENU_COMMAND && + key <= CMD_TEXTBOX___MAX_MENU_COMMAND) + menu_driver(menu, key + KEY_MAX); + } } static void on_handle_key(int key) diff --git a/alsamixer/mixer_widget.c b/alsamixer/mixer_widget.c index 5013861..b1bd61e 100644 --- a/alsamixer/mixer_widget.c +++ b/alsamixer/mixer_widget.c @@ -37,6 +37,7 @@ #include "mixer_controls.h" #include "mixer_display.h" #include "mixer_widget.h" +#include "bindings.h" snd_mixer_t *mixer; char *mixer_device_name; @@ -53,11 +54,6 @@ unsigned int current_control_flags; bool control_values_changed; bool controls_changed; -enum channel_mask { - LEFT = 1, - RIGHT = 2, -}; - static int elem_callback(snd_mixer_elem_t *elem, unsigned int mask) { if (mask == SND_CTL_EVENT_MASK_REMOVE) { @@ -468,145 +464,74 @@ static void balance_volumes(void) static void on_handle_key(int key) { - switch (key) { - case 27: - case KEY_CANCEL: - case KEY_F(10): + int arg; + command_enum cmd; + + if (key < ARRAY_SIZE(mixer_bindings)) + cmd = mixer_bindings[key]; + else + return; + + arg = CMD_GET_ARGUMENT(cmd); + cmd = CMD_GET_COMMAND(cmd); + + switch (cmd) { + case CMD_MIXER_CONTROL_DOWN_LEFT: + case CMD_MIXER_CONTROL_DOWN_RIGHT: + case CMD_MIXER_CONTROL_DOWN: + arg = (-arg); + case CMD_MIXER_CONTROL_UP_LEFT: + case CMD_MIXER_CONTROL_UP_RIGHT: + case CMD_MIXER_CONTROL_UP: + change_control_relative(arg, cmd % 4); + break; + case CMD_MIXER_CONTROL_SET_PERCENT_LEFT: + case CMD_MIXER_CONTROL_SET_PERCENT_RIGHT: + case CMD_MIXER_CONTROL_SET_PERCENT: + change_control_to_percent(arg, cmd % 4); + break; + case CMD_MIXER_CLOSE: mixer_widget.close(); break; - case KEY_F(1): - case KEY_HELP: - case 'H': - case 'h': - case '?': + case CMD_MIXER_HELP: show_help(); break; - case KEY_F(2): - case '/': + case CMD_MIXER_SYSTEM_INFORMATION: create_proc_files_list(); break; - case KEY_F(3): - set_view_mode(VIEW_MODE_PLAYBACK); + case CMD_MIXER_TOGGLE_VIEW_MODE: + arg = (view_mode + 1) % VIEW_MODE_COUNT; + case CMD_MIXER_SET_VIEW_MODE: + set_view_mode((enum view_mode)(arg)); break; - case KEY_F(4): - set_view_mode(VIEW_MODE_CAPTURE); - break; - case KEY_F(5): - set_view_mode(VIEW_MODE_ALL); - break; - case '\t': - set_view_mode((enum view_mode)((view_mode + 1) % VIEW_MODE_COUNT)); - break; - case KEY_F(6): - case 'S': - case 's': + case CMD_MIXER_SELECT_CARD: create_card_select_list(); break; - case KEY_REFRESH: - case 12: - case 'L': - case 'l': + case CMD_MIXER_REFRESH: clearok(mixer_widget.window, TRUE); display_controls(); break; - case KEY_LEFT: - case 'P': - case 'p': - if (focus_control_index > 0) { - --focus_control_index; - refocus_control(); - } + case CMD_MIXER_PREVIOUS: + arg = (-arg); + case CMD_MIXER_NEXT: + arg = focus_control_index + arg; + case CMD_MIXER_FOCUS_CONTROL: + focus_control_index = arg; + if (focus_control_index < 0) + focus_control_index = 0; + else if (focus_control_index >= controls_count) + focus_control_index = controls_count - 1; + refocus_control(); break; - case KEY_RIGHT: - case 'N': - case 'n': - if (focus_control_index < controls_count - 1) { - ++focus_control_index; - refocus_control(); - } + case CMD_MIXER_TOGGLE_MUTE: + toggle_mute(arg); break; - case KEY_PPAGE: - change_control_relative(5, LEFT | RIGHT); + case CMD_MIXER_TOGGLE_CAPTURE: + toggle_capture(arg); break; - case KEY_NPAGE: - change_control_relative(-5, LEFT | RIGHT); - break; -#if 0 - case KEY_BEG: - case KEY_HOME: - change_control_to_percent(100, LEFT | RIGHT); - break; -#endif - case KEY_LL: - case KEY_END: - change_control_to_percent(0, LEFT | RIGHT); - break; - case KEY_UP: - case '+': - case 'K': - case 'k': - case 'W': - case 'w': - change_control_relative(1, LEFT | RIGHT); - break; - case KEY_DOWN: - case '-': - case 'J': - case 'j': - case 'X': - case 'x': - change_control_relative(-1, LEFT | RIGHT); - break; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - change_control_to_percent((key - '0') * 10, LEFT | RIGHT); - break; - case 'Q': - case 'q': - change_control_relative(1, LEFT); - break; - case 'Y': - case 'y': - case 'Z': - case 'z': - change_control_relative(-1, LEFT); - break; - case 'E': - case 'e': - change_control_relative(1, RIGHT); - break; - case 'C': - case 'c': - change_control_relative(-1, RIGHT); - break; - case 'M': - case 'm': - toggle_mute(LEFT | RIGHT); - break; - case 'B': - case 'b': - case '=': + case CMD_MIXER_BALANCE_CONTROL: balance_volumes(); break; - case '<': - case ',': - toggle_mute(LEFT); - break; - case '>': - case '.': - toggle_mute(RIGHT); - break; - case ' ': - toggle_capture(LEFT | RIGHT); - break; - case KEY_IC: - case ';': - toggle_capture(LEFT); - break; - case KEY_DC: - case '\'': - toggle_capture(RIGHT); - break; } } diff --git a/alsamixer/mixer_widget.h b/alsamixer/mixer_widget.h index 086611c..5b1cfcc 100644 --- a/alsamixer/mixer_widget.h +++ b/alsamixer/mixer_widget.h @@ -12,6 +12,11 @@ enum view_mode { VIEW_MODE_COUNT, }; +enum channel_mask { + LEFT = 1, + RIGHT = 2, +}; + extern snd_mixer_t *mixer; extern char *mixer_device_name; extern bool unplugged; diff --git a/alsamixer/proc_files.c b/alsamixer/proc_files.c index b2f5f21..9d3fe3f 100644 --- a/alsamixer/proc_files.c +++ b/alsamixer/proc_files.c @@ -28,6 +28,7 @@ #include "widget.h" #include "textbox.h" #include "proc_files.h" +#include "bindings.h" static struct widget proc_widget; static ITEM *items[7]; @@ -36,25 +37,12 @@ static MENU *menu; static void on_menu_key(int key) { - static const struct { - int key; - int request; - } key_map[] = { - { KEY_DOWN, REQ_DOWN_ITEM }, - { KEY_UP, REQ_UP_ITEM }, - { KEY_HOME, REQ_FIRST_ITEM }, - { KEY_NPAGE, REQ_SCR_DPAGE }, - { KEY_PPAGE, REQ_SCR_UPAGE }, - { KEY_BEG, REQ_FIRST_ITEM }, - { KEY_END, REQ_LAST_ITEM }, - }; - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(key_map); ++i) - if (key_map[i].key == key) { - menu_driver(menu, key_map[i].request); - break; - } + if (key < ARRAY_SIZE(textbox_bindings)) { + key = textbox_bindings[key]; + if (key >= CMD_TEXTBOX___MIN_MENU_COMMAND && + key <= CMD_TEXTBOX___MAX_MENU_COMMAND) + menu_driver(menu, key + KEY_MAX); + } } static void on_handle_key(int key) diff --git a/alsamixer/textbox.c b/alsamixer/textbox.c index a979d3c..23406a4 100644 --- a/alsamixer/textbox.c +++ b/alsamixer/textbox.c @@ -32,6 +32,7 @@ #include "colors.h" #include "widget.h" #include "textbox.h" +#include "bindings.h" #define MAX_FILE_SIZE 1048576 @@ -251,68 +252,41 @@ static void move_y(int delta) static void on_handle_key(int key) { - switch (key) { - case 10: - case 13: - case 27: - case KEY_CANCEL: - case KEY_ENTER: - case KEY_CLOSE: - case KEY_EXIT: + if (key >= ARRAY_SIZE(textbox_bindings)) + return; + + switch (textbox_bindings[key]) { + case CMD_TEXTBOX_CLOSE: text_widget.close(); break; - case KEY_DOWN: - case KEY_SF: - case 'J': - case 'j': - case 'X': - case 'x': + case CMD_TEXTBOX_DOWN: move_y(1); break; - case KEY_UP: - case KEY_SR: - case 'K': - case 'k': - case 'W': - case 'w': + case CMD_TEXTBOX_UP: move_y(-1); break; - case KEY_LEFT: - case 'H': - case 'h': - case 'P': - case 'p': + case CMD_TEXTBOX_LEFT: move_x(-1); break; - case KEY_RIGHT: - case 'L': - case 'l': - case 'N': - case 'n': + case CMD_TEXTBOX_RIGHT: move_x(1); break; - case KEY_NPAGE: - case ' ': + case CMD_TEXTBOX_PAGE_DOWN: move_y(text_box_y); break; - case KEY_PPAGE: - case KEY_BACKSPACE: - case 'B': - case 'b': + case CMD_TEXTBOX_PAGE_UP: move_y(-text_box_y); break; - case KEY_HOME: - case KEY_BEG: + case CMD_TEXTBOX_TOP: move_x(-max_scroll_x); break; - case KEY_LL: - case KEY_END: + case CMD_TEXTBOX_BOTTOM: move_x(max_scroll_x); break; - case '\t': + case CMD_TEXTBOX_PAGE_RIGHT: move_x(8); break; - case KEY_BTAB: + case CMD_TEXTBOX_PAGE_LEFT: move_x(-8); break; }