X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcommand.c;h=656bb18e389db0bd89a1389be818a861d2a7a3e1;hb=a023de1cdf0ebcd19b1236c4132175402fc7d4b6;hp=c73f26fead3692bcebbf54615513f03b9de28896;hpb=5a7177e0337b40804f4aaf59630ef7df36b4b998;p=ncmpc.git diff --git a/src/command.c b/src/command.c index c73f26f..656bb18 100644 --- a/src/command.c +++ b/src/command.c @@ -1,5 +1,6 @@ -/* - * (c) 2004 by Kalle Wallin +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2010 The Music Player Daemon Project + * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -10,10 +11,10 @@ * 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "command.h" @@ -39,50 +40,71 @@ #define DK(x) #endif -#define BS KEY_BACKSPACE -#define DEL KEY_DC -#define UP KEY_UP -#define DWN KEY_DOWN +#define KEY_CTL(x) ((x) & 0x1f) /* KEY_CTL(A) == ^A == \1 */ + +#define BS KEY_BACKSPACE +#define DEL KEY_DC +#define UP KEY_UP +#define DWN KEY_DOWN #define LEFT KEY_LEFT #define RGHT KEY_RIGHT #define HOME KEY_HOME -#define END KEY_END +#define END KEY_END #define PGDN KEY_NPAGE #define PGUP KEY_PPAGE -#define TAB 0x09 +#define TAB 0x09 #define STAB 0x161 -#define ESC 0x1B -#define F1 KEY_F(1) -#define F2 KEY_F(2) -#define F3 KEY_F(3) -#define F4 KEY_F(4) -#define F5 KEY_F(5) -#define F6 KEY_F(6) -#define F7 KEY_F(7) -#define F8 KEY_F(8) - +#define ESC 0x1B +#define RET '\r' +#define F1 KEY_F(1) +#define F2 KEY_F(2) +#define F3 KEY_F(3) +#define F4 KEY_F(4) +#define F5 KEY_F(5) +#define F6 KEY_F(6) +#define F7 KEY_F(7) +#define F8 KEY_F(8) +#define C(x) KEY_CTL(x) static command_definition_t cmds[] = { #ifdef ENABLE_KEYDEF_SCREEN { {'K', 0, 0 }, 0, CMD_SCREEN_KEYDEF, "screen-keyedit", N_("Key configuration screen") }, #endif - { { 'q', 'Q', 3 }, 0, CMD_QUIT, "quit", + { { 'q', 'Q', C('C') }, 0, CMD_QUIT, "quit", N_("Quit") }, - /* movment */ + /* movement */ { { UP, 'k', 0 }, 0, CMD_LIST_PREVIOUS, "up", N_("Move cursor up") }, { { DWN, 'j', 0 }, 0, CMD_LIST_NEXT, "down", N_("Move cursor down") }, - { { HOME, 0x01, 0 }, 0, CMD_LIST_FIRST, "home", - N_("Home") }, - { { END, 0x05, 0 }, 0, CMD_LIST_LAST, "end", - N_("End") }, + { { 'H', 0, 0 }, 0, CMD_LIST_TOP, "top", + N_("Move cursor to the top of screen") }, + { { 'M', 0, 0 }, 0, CMD_LIST_MIDDLE, "middle", + N_("Move cursor to the middle of screen") }, + { { 'L', 0, 0 }, 0, CMD_LIST_BOTTOM, "bottom", + N_("Move cursor to the bottom of screen") }, + { { HOME, C('A'), 0 }, 0, CMD_LIST_FIRST, "home", + N_("Move cursor to the top of the list") }, + { { END, C('E'), 0 }, 0, CMD_LIST_LAST, "end", + N_("Move cursor to the bottom of the list") }, { { PGUP, 0, 0 }, 0, CMD_LIST_PREVIOUS_PAGE, "pgup", N_("Page up") }, { { PGDN, 0, 0 }, 0, CMD_LIST_NEXT_PAGE, "pgdn", N_("Page down") }, + { { 'v', 0, 0 }, 0, CMD_LIST_RANGE_SELECT, "range-select", + N_("Range selection") }, + { { C('N'), 0, 0 }, 0, CMD_LIST_SCROLL_DOWN_LINE, "scroll-down-line", + N_("Scroll up one line") }, + { { C('B'), 0, 0 }, 0, CMD_LIST_SCROLL_UP_LINE, "scroll-up-line", + N_("Scroll down one line") }, + { { 'N', 0, 0 }, 0, CMD_LIST_SCROLL_DOWN_HALF, "scroll-down-half", + N_("Scroll up half a screen") }, + { { 'B', 0, 0 }, 0, CMD_LIST_SCROLL_UP_HALF, "scroll-up-half", + N_("Scroll down half a screen") }, + { { 'l', 0, 0 }, 0, CMD_SELECT_PLAYING, "select-playing", + N_("Select currently playing song") }, /* basic screens */ @@ -95,7 +117,7 @@ static command_definition_t cmds[] = { /* player commands */ - { { 13, 0, 0 }, 0, CMD_PLAY, "play", + { { RET, 0, 0 }, 0, CMD_PLAY, "play", N_("Play/Enter directory") }, { { 'P', 0, 0 }, 0, CMD_PAUSE,"pause", N_("Pause") }, @@ -129,9 +151,13 @@ static command_definition_t cmds[] = { N_("Toggle repeat mode") }, { { 'z', 0, 0 }, 0, CMD_RANDOM, "random", N_("Toggle random mode") }, + { { 'y', 0, 0 }, 0, CMD_SINGLE, "single", + N_("Toggle single mode") }, + { { 'C', 0, 0 }, 0, CMD_CONSUME, "consume", + N_("Toggle consume mode") }, { { 'x', 0, 0 }, 0, CMD_CROSSFADE, "crossfade", N_("Toggle crossfade mode") }, - { { 21, 0, 0 }, 0, CMD_DB_UPDATE, "db-update", + { { C('U'), 0, 0 }, 0, CMD_DB_UPDATE, "db-update", N_("Start a music database update") }, { { 'S', 0, 0 }, 0, CMD_SAVE_PLAYLIST, "save", N_("Save playlist") }, @@ -143,20 +169,15 @@ static command_definition_t cmds[] = { { { '"', 0, 0 }, 0, CMD_GO_PARENT_DIRECTORY, "go-parent-directory", N_("Go to parent directory") }, -#ifdef ENABLE_SONG_SCREEN - { { 'i', 0, 0 }, 0, CMD_VIEW, "view", - N_("View the song") }, -#endif - { { 'G', 0, 0 }, 0, CMD_LOCATE, "locate", N_("Locate song in browser") }, /* lists */ - { { 11, 0, 0 }, 0, CMD_LIST_MOVE_UP, "move-up", + { { C('K'), 0, 0 }, 0, CMD_LIST_MOVE_UP, "move-up", N_("Move item up") }, - { { 10, 0, 0 }, 0, CMD_LIST_MOVE_DOWN, "move-down", + { { C('J'), 0, 0 }, 0, CMD_LIST_MOVE_DOWN, "move-down", N_("Move item down") }, - { { 12, 0, 0 }, 0, CMD_SCREEN_UPDATE, "update", + { { C('L'), 0, 0 }, 0, CMD_SCREEN_UPDATE, "update", N_("Refresh screen") }, @@ -176,6 +197,8 @@ static command_definition_t cmds[] = { N_("Next screen") }, { { STAB, 0, 0 }, 0, CMD_SCREEN_PREVIOUS, "screen-prev", N_("Previous screen") }, + { { '`', 0, 0 }, 0, CMD_SCREEN_SWAP, "screen-swap", + N_("Swap to most recent screen") }, /* find */ @@ -187,6 +210,11 @@ static command_definition_t cmds[] = { N_("Backward find") }, { { 'p', 0, 0 }, 0, CMD_LIST_RFIND_NEXT, "rfind-next", N_("Backward find previous") }, + { { '.', 0, 0 }, 0, CMD_LIST_JUMP, "jump", + /* translators: this queries the user for a string + * and jumps directly (while the user is typing) + * to the entry which begins with this string */ + N_("Jump to") }, /* extra screens */ @@ -200,7 +228,10 @@ static command_definition_t cmds[] = { { {'m', 0, 0 }, 0, CMD_SEARCH_MODE, "search-mode", N_("Change search mode") }, #endif - +#ifdef ENABLE_SONG_SCREEN + { { 'i', 0, 0 }, 0, CMD_SCREEN_SONG, "view", + N_("View the selected and the currently playing song") }, +#endif #ifdef ENABLE_LYRICS_SCREEN { {'7', F7, 0 }, 0, CMD_SCREEN_LYRICS, "screen-lyrics", N_("Lyrics screen") }, @@ -210,6 +241,10 @@ static command_definition_t cmds[] = { N_("Interrupt action") }, { {'u', 0, 0 }, 0, CMD_LYRICS_UPDATE, "lyrics-update", N_("Update Lyrics") }, + /* this command may move out of #ifdef ENABLE_LYRICS_SCREEN + at some point */ + { {'e', 0, 0 }, 0, CMD_EDIT, "edit", + N_("Edit the current item") }, #endif #ifdef ENABLE_OUTPUTS_SCREEN @@ -241,7 +276,7 @@ key2str(int key) return _("Undefined"); case ' ': return _("Space"); - case 13: + case RET: return _("Enter"); case BS: return _("Backspace"); @@ -274,13 +309,13 @@ key2str(int key) default: for (i = 0; i <= 63; i++) if (key == KEY_F(i)) { - g_snprintf(buf, 32, "F%d", i ); + g_snprintf(buf, 32, _("F%d"), i ); return buf; } if (!(key & ~037)) - g_snprintf(buf, 32, "Ctrl-%c", 'A'+(key & 037)-1 ); + g_snprintf(buf, 32, _("Ctrl-%c"), 'A'+(key & 037)-1 ); else if ((key & ~037) == 224) - g_snprintf(buf, 32, "Alt-%c", 'A'+(key & 037)-1 ); + g_snprintf(buf, 32, _("Alt-%c"), 'A'+(key & 037)-1 ); else if (key > 32 && key < 256) g_snprintf(buf, 32, "%c", key); else @@ -293,75 +328,56 @@ key2str(int key) void command_dump_keys(void) { - int i; - - i = 0; - while (cmds[i].description) { + for (int i = 0; cmds[i].description; i++) if (cmds[i].command != CMD_NONE) - printf(" %20s : %s\n", get_key_names(cmds[i].command,1),cmds[i].name); - i++; - } + printf(" %20s : %s\n", + get_key_names(cmds[i].command, true), + cmds[i].name); } #ifndef NCMPC_MINI -static int +static void set_key_flags(command_definition_t *cp, command_t command, int flags) { - int i; - - i = 0; - while (cp[i].name) { + for (int i = 0; cp[i].name; i++) { if (cp[i].command == command) { cp[i].flags |= flags; - return 0; + break; } - i++; } - - return 1; } #endif const char * -get_key_names(command_t command, int all) +get_key_names(command_t command, bool all) { - int i; - - i=0; - while (cmds[i].description) { - if (cmds[i].command == command) { - int j; - static char keystr[80]; - - g_strlcpy(keystr, key2str(cmds[i].keys[0]), sizeof(keystr)); - if (!all) - return keystr; - j=1; - while (j < MAX_COMMAND_KEYS && cmds[i].keys[j] > 0) { - g_strlcat(keystr, " ", sizeof(keystr)); - g_strlcat(keystr, key2str(cmds[i].keys[j]), sizeof(keystr)); - j++; - } - return keystr; - } - i++; - } - return NULL; + for (int i = 0; cmds[i].description; i++) { + if (cmds[i].command == command) { + static char keystr[80]; + + g_strlcpy(keystr, key2str(cmds[i].keys[0]), sizeof(keystr)); + if (!all) + return keystr; + + for (int j = 1; j < MAX_COMMAND_KEYS && + cmds[i].keys[j] > 0; j++) { + g_strlcat(keystr, " ", sizeof(keystr)); + g_strlcat(keystr, key2str(cmds[i].keys[j]), sizeof(keystr)); + } + return keystr; + } + } + return NULL; } const char * get_key_description(command_t command) { - int i; - - i=0; - while (cmds[i].description) { + for (int i = 0; cmds[i].description; i++) if (cmds[i].command == command) return _(cmds[i].description); - i++; - } return NULL; } @@ -369,28 +385,19 @@ get_key_description(command_t command) const char * get_key_command_name(command_t command) { - int i; - - i=0; - while (cmds[i].name) { + for (int i = 0; cmds[i].name; i++) if (cmds[i].command == command) return cmds[i].name; - i++; - } + return NULL; } command_t get_key_command_from_name(char *name) { - int i; - - i=0; - while (cmds[i].name) { + for (int i = 0; cmds[i].name; i++) if (strcmp(name, cmds[i].name) == 0) return cmds[i].command; - i++; - } return CMD_NONE; } @@ -398,15 +405,13 @@ get_key_command_from_name(char *name) command_t find_key_command(int key, command_definition_t *c) { - int i; + assert(key != 0); + assert(c != NULL); - i=0; - while (key && c && c[i].name) { - if (c[i].keys[0] == key || - c[i].keys[1] == key || - c[i].keys[2] == key) - return c[i].command; - i++; + for (int i = 0; c[i].name; i++) { + for (int j = 0; j < MAX_COMMAND_KEYS; j++) + if (c[i].keys[j] == key) + return c[i].command; } return CMD_NONE; @@ -438,10 +443,7 @@ get_keyboard_command(void) int assign_keys(command_t command, int keys[MAX_COMMAND_KEYS]) { - int i; - - i=0; - while (cmds[i].name) { + for (int i = 0; cmds[i].name; i++) { if (cmds[i].command == command) { memcpy(cmds[i].keys, keys, sizeof(int)*MAX_COMMAND_KEYS); #ifndef NCMPC_MINI @@ -449,8 +451,8 @@ assign_keys(command_t command, int keys[MAX_COMMAND_KEYS]) #endif return 0; } - i++; } + return -1; } @@ -465,67 +467,54 @@ check_key_bindings(command_definition_t *cp, char *buf, size_t bufsize) if (cp == NULL) cp = cmds; - i=0; - while (cp[i].name) { + for (i = 0; cp[i].name; i++) cp[i].flags &= ~COMMAND_KEY_CONFLICT; - i++; - } - i=0; - while (cp[i].name) { + for (i = 0; cp[i].name; i++) { int j; command_t cmd; - for(j=0; j