mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-10 04:05:43 +01:00
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 <braph93@gmx.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
706a64c7a0
commit
6e9e84ba60
8 changed files with 296 additions and 207 deletions
|
@ -3,6 +3,7 @@ LDADD = @CURSESLIB@
|
||||||
|
|
||||||
bin_PROGRAMS = alsamixer
|
bin_PROGRAMS = alsamixer
|
||||||
alsamixer_SOURCES = card_select.c card_select.h \
|
alsamixer_SOURCES = card_select.c card_select.h \
|
||||||
|
bindings.c bindings.h \
|
||||||
cli.c \
|
cli.c \
|
||||||
colors.c colors.h \
|
colors.c colors.h \
|
||||||
device_name.c device_name.h \
|
device_name.c device_name.h \
|
||||||
|
|
132
alsamixer/bindings.c
Normal file
132
alsamixer/bindings.c
Normal file
|
@ -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,
|
||||||
|
};
|
76
alsamixer/bindings.h
Normal file
76
alsamixer/bindings.h
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
#ifndef BINDINGS_H_INCLUDED
|
||||||
|
#define BINDINGS_H_INCLUDED
|
||||||
|
|
||||||
|
#include CURSESINC
|
||||||
|
#include <menu.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* 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
|
|
@ -31,6 +31,7 @@
|
||||||
#include "mixer_widget.h"
|
#include "mixer_widget.h"
|
||||||
#include "device_name.h"
|
#include "device_name.h"
|
||||||
#include "card_select.h"
|
#include "card_select.h"
|
||||||
|
#include "bindings.h"
|
||||||
|
|
||||||
struct card {
|
struct card {
|
||||||
struct card *next;
|
struct card *next;
|
||||||
|
@ -61,25 +62,12 @@ static void on_key_enter(void)
|
||||||
|
|
||||||
static void on_menu_key(int key)
|
static void on_menu_key(int key)
|
||||||
{
|
{
|
||||||
static const struct {
|
if (key < ARRAY_SIZE(textbox_bindings)) {
|
||||||
int key;
|
key = textbox_bindings[key];
|
||||||
int request;
|
if (key >= CMD_TEXTBOX___MIN_MENU_COMMAND &&
|
||||||
} key_map[] = {
|
key <= CMD_TEXTBOX___MAX_MENU_COMMAND)
|
||||||
{ KEY_DOWN, REQ_DOWN_ITEM },
|
menu_driver(menu, key + KEY_MAX);
|
||||||
{ 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void on_handle_key(int key)
|
static void on_handle_key(int key)
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "mixer_controls.h"
|
#include "mixer_controls.h"
|
||||||
#include "mixer_display.h"
|
#include "mixer_display.h"
|
||||||
#include "mixer_widget.h"
|
#include "mixer_widget.h"
|
||||||
|
#include "bindings.h"
|
||||||
|
|
||||||
snd_mixer_t *mixer;
|
snd_mixer_t *mixer;
|
||||||
char *mixer_device_name;
|
char *mixer_device_name;
|
||||||
|
@ -53,11 +54,6 @@ unsigned int current_control_flags;
|
||||||
bool control_values_changed;
|
bool control_values_changed;
|
||||||
bool controls_changed;
|
bool controls_changed;
|
||||||
|
|
||||||
enum channel_mask {
|
|
||||||
LEFT = 1,
|
|
||||||
RIGHT = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int elem_callback(snd_mixer_elem_t *elem, unsigned int mask)
|
static int elem_callback(snd_mixer_elem_t *elem, unsigned int mask)
|
||||||
{
|
{
|
||||||
if (mask == SND_CTL_EVENT_MASK_REMOVE) {
|
if (mask == SND_CTL_EVENT_MASK_REMOVE) {
|
||||||
|
@ -468,145 +464,74 @@ static void balance_volumes(void)
|
||||||
|
|
||||||
static void on_handle_key(int key)
|
static void on_handle_key(int key)
|
||||||
{
|
{
|
||||||
switch (key) {
|
int arg;
|
||||||
case 27:
|
command_enum cmd;
|
||||||
case KEY_CANCEL:
|
|
||||||
case KEY_F(10):
|
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();
|
mixer_widget.close();
|
||||||
break;
|
break;
|
||||||
case KEY_F(1):
|
case CMD_MIXER_HELP:
|
||||||
case KEY_HELP:
|
|
||||||
case 'H':
|
|
||||||
case 'h':
|
|
||||||
case '?':
|
|
||||||
show_help();
|
show_help();
|
||||||
break;
|
break;
|
||||||
case KEY_F(2):
|
case CMD_MIXER_SYSTEM_INFORMATION:
|
||||||
case '/':
|
|
||||||
create_proc_files_list();
|
create_proc_files_list();
|
||||||
break;
|
break;
|
||||||
case KEY_F(3):
|
case CMD_MIXER_TOGGLE_VIEW_MODE:
|
||||||
set_view_mode(VIEW_MODE_PLAYBACK);
|
arg = (view_mode + 1) % VIEW_MODE_COUNT;
|
||||||
|
case CMD_MIXER_SET_VIEW_MODE:
|
||||||
|
set_view_mode((enum view_mode)(arg));
|
||||||
break;
|
break;
|
||||||
case KEY_F(4):
|
case CMD_MIXER_SELECT_CARD:
|
||||||
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':
|
|
||||||
create_card_select_list();
|
create_card_select_list();
|
||||||
break;
|
break;
|
||||||
case KEY_REFRESH:
|
case CMD_MIXER_REFRESH:
|
||||||
case 12:
|
|
||||||
case 'L':
|
|
||||||
case 'l':
|
|
||||||
clearok(mixer_widget.window, TRUE);
|
clearok(mixer_widget.window, TRUE);
|
||||||
display_controls();
|
display_controls();
|
||||||
break;
|
break;
|
||||||
case KEY_LEFT:
|
case CMD_MIXER_PREVIOUS:
|
||||||
case 'P':
|
arg = (-arg);
|
||||||
case 'p':
|
case CMD_MIXER_NEXT:
|
||||||
if (focus_control_index > 0) {
|
arg = focus_control_index + arg;
|
||||||
--focus_control_index;
|
case CMD_MIXER_FOCUS_CONTROL:
|
||||||
refocus_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;
|
break;
|
||||||
case KEY_RIGHT:
|
case CMD_MIXER_TOGGLE_MUTE:
|
||||||
case 'N':
|
toggle_mute(arg);
|
||||||
case 'n':
|
|
||||||
if (focus_control_index < controls_count - 1) {
|
|
||||||
++focus_control_index;
|
|
||||||
refocus_control();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case KEY_PPAGE:
|
case CMD_MIXER_TOGGLE_CAPTURE:
|
||||||
change_control_relative(5, LEFT | RIGHT);
|
toggle_capture(arg);
|
||||||
break;
|
break;
|
||||||
case KEY_NPAGE:
|
case CMD_MIXER_BALANCE_CONTROL:
|
||||||
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 '=':
|
|
||||||
balance_volumes();
|
balance_volumes();
|
||||||
break;
|
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,11 @@ enum view_mode {
|
||||||
VIEW_MODE_COUNT,
|
VIEW_MODE_COUNT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum channel_mask {
|
||||||
|
LEFT = 1,
|
||||||
|
RIGHT = 2,
|
||||||
|
};
|
||||||
|
|
||||||
extern snd_mixer_t *mixer;
|
extern snd_mixer_t *mixer;
|
||||||
extern char *mixer_device_name;
|
extern char *mixer_device_name;
|
||||||
extern bool unplugged;
|
extern bool unplugged;
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "widget.h"
|
#include "widget.h"
|
||||||
#include "textbox.h"
|
#include "textbox.h"
|
||||||
#include "proc_files.h"
|
#include "proc_files.h"
|
||||||
|
#include "bindings.h"
|
||||||
|
|
||||||
static struct widget proc_widget;
|
static struct widget proc_widget;
|
||||||
static ITEM *items[7];
|
static ITEM *items[7];
|
||||||
|
@ -36,25 +37,12 @@ static MENU *menu;
|
||||||
|
|
||||||
static void on_menu_key(int key)
|
static void on_menu_key(int key)
|
||||||
{
|
{
|
||||||
static const struct {
|
if (key < ARRAY_SIZE(textbox_bindings)) {
|
||||||
int key;
|
key = textbox_bindings[key];
|
||||||
int request;
|
if (key >= CMD_TEXTBOX___MIN_MENU_COMMAND &&
|
||||||
} key_map[] = {
|
key <= CMD_TEXTBOX___MAX_MENU_COMMAND)
|
||||||
{ KEY_DOWN, REQ_DOWN_ITEM },
|
menu_driver(menu, key + KEY_MAX);
|
||||||
{ 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void on_handle_key(int key)
|
static void on_handle_key(int key)
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "colors.h"
|
#include "colors.h"
|
||||||
#include "widget.h"
|
#include "widget.h"
|
||||||
#include "textbox.h"
|
#include "textbox.h"
|
||||||
|
#include "bindings.h"
|
||||||
|
|
||||||
#define MAX_FILE_SIZE 1048576
|
#define MAX_FILE_SIZE 1048576
|
||||||
|
|
||||||
|
@ -251,68 +252,41 @@ static void move_y(int delta)
|
||||||
|
|
||||||
static void on_handle_key(int key)
|
static void on_handle_key(int key)
|
||||||
{
|
{
|
||||||
switch (key) {
|
if (key >= ARRAY_SIZE(textbox_bindings))
|
||||||
case 10:
|
return;
|
||||||
case 13:
|
|
||||||
case 27:
|
switch (textbox_bindings[key]) {
|
||||||
case KEY_CANCEL:
|
case CMD_TEXTBOX_CLOSE:
|
||||||
case KEY_ENTER:
|
|
||||||
case KEY_CLOSE:
|
|
||||||
case KEY_EXIT:
|
|
||||||
text_widget.close();
|
text_widget.close();
|
||||||
break;
|
break;
|
||||||
case KEY_DOWN:
|
case CMD_TEXTBOX_DOWN:
|
||||||
case KEY_SF:
|
|
||||||
case 'J':
|
|
||||||
case 'j':
|
|
||||||
case 'X':
|
|
||||||
case 'x':
|
|
||||||
move_y(1);
|
move_y(1);
|
||||||
break;
|
break;
|
||||||
case KEY_UP:
|
case CMD_TEXTBOX_UP:
|
||||||
case KEY_SR:
|
|
||||||
case 'K':
|
|
||||||
case 'k':
|
|
||||||
case 'W':
|
|
||||||
case 'w':
|
|
||||||
move_y(-1);
|
move_y(-1);
|
||||||
break;
|
break;
|
||||||
case KEY_LEFT:
|
case CMD_TEXTBOX_LEFT:
|
||||||
case 'H':
|
|
||||||
case 'h':
|
|
||||||
case 'P':
|
|
||||||
case 'p':
|
|
||||||
move_x(-1);
|
move_x(-1);
|
||||||
break;
|
break;
|
||||||
case KEY_RIGHT:
|
case CMD_TEXTBOX_RIGHT:
|
||||||
case 'L':
|
|
||||||
case 'l':
|
|
||||||
case 'N':
|
|
||||||
case 'n':
|
|
||||||
move_x(1);
|
move_x(1);
|
||||||
break;
|
break;
|
||||||
case KEY_NPAGE:
|
case CMD_TEXTBOX_PAGE_DOWN:
|
||||||
case ' ':
|
|
||||||
move_y(text_box_y);
|
move_y(text_box_y);
|
||||||
break;
|
break;
|
||||||
case KEY_PPAGE:
|
case CMD_TEXTBOX_PAGE_UP:
|
||||||
case KEY_BACKSPACE:
|
|
||||||
case 'B':
|
|
||||||
case 'b':
|
|
||||||
move_y(-text_box_y);
|
move_y(-text_box_y);
|
||||||
break;
|
break;
|
||||||
case KEY_HOME:
|
case CMD_TEXTBOX_TOP:
|
||||||
case KEY_BEG:
|
|
||||||
move_x(-max_scroll_x);
|
move_x(-max_scroll_x);
|
||||||
break;
|
break;
|
||||||
case KEY_LL:
|
case CMD_TEXTBOX_BOTTOM:
|
||||||
case KEY_END:
|
|
||||||
move_x(max_scroll_x);
|
move_x(max_scroll_x);
|
||||||
break;
|
break;
|
||||||
case '\t':
|
case CMD_TEXTBOX_PAGE_RIGHT:
|
||||||
move_x(8);
|
move_x(8);
|
||||||
break;
|
break;
|
||||||
case KEY_BTAB:
|
case CMD_TEXTBOX_PAGE_LEFT:
|
||||||
move_x(-8);
|
move_x(-8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue