Code

Added commands FIND and FIND_NEXT.
[ncmpc.git] / command.c
1 /* 
2  * $Id: command.c,v 1.9 2004/03/17 14:59:32 kalle Exp $ 
3  *
4  */
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <ctype.h>
9 #include <glib.h>
10 #include <ncurses.h>
12 #include "config.h"
13 #include "command.h"
15 #undef DEBUG_KEYS
17 #ifdef DEBUG_KEYS
18 #define DK(x) x
19 #else
20 #define DK(x)
21 #endif
23 #define BS   KEY_BACKSPACE
24 #define DEL  KEY_DC
25 #define UP   KEY_UP
26 #define DWN  KEY_DOWN
27 #define LEFT KEY_LEFT
28 #define RGHT KEY_RIGHT
29 #define HOME KEY_HOME
30 #define END  KEY_END
31 #define PGDN KEY_NPAGE
32 #define PGUP KEY_PPAGE
33 #define TAB  0x09
34 #define STAB 0x5A
35 #define ESC  0x1B
36 #define F1   KEY_F(1)
37 #define F2   KEY_F(2)
38 #define F3   KEY_F(3)
39 #define F4   KEY_F(4)
40 #define F5   KEY_F(5)
41 #define F6   KEY_F(6)
43 static command_definition_t cmds[] =
44 {
45   { {  13,   0,   0 }, CMD_PLAY, "Play/Enter directory" },
46   { { 'p',   0,   0 }, CMD_PAUSE, "Pause" },
47   { {  BS, ESC,   0 }, CMD_STOP, "Stop" },
48   { { '>',   0,   0 }, CMD_TRACK_NEXT, "Next song" },
49   { { '<',   0,   0 }, CMD_TRACK_PREVIOUS, "Previous song" },
51   { { '+', RGHT,  0 }, CMD_VOLUME_UP, "Increase volume" },
52   { { '-', LEFT,  0 }, CMD_VOLUME_DOWN, "Decrease volume" },
54   { { ' ',   0,  0 }, CMD_SELECT, "Select/deselect song in playlist" },
55   { { DEL,   0,   0 }, CMD_DELETE, "Delete song from playlist" },
56   { { 's',   0,   0 }, CMD_SHUFFLE, "Shuffle playlist" },
57   { { 'c',   0,   0 }, CMD_CLEAR, "Clear playlist" },
58   { { 'r',   0,   0 }, CMD_REPEAT, "Toggle repeat mode" },
59   { { 'z',   0,   0 }, CMD_RANDOM, "Toggle random mode" },
61   { {  UP,   0,   0 }, CMD_LIST_PREVIOUS,      "Move: Up" },
62   { { DWN,   0,   0 }, CMD_LIST_NEXT,          "Move: Down" },
63   { { HOME,  0,   0 }, CMD_LIST_FIRST,         "Move: Home" },
64   { { END,   0,   0 }, CMD_LIST_LAST,          "Move: End" },
65   { { PGUP,  0,   0 }, CMD_LIST_PREVIOUS_PAGE, "Move: Page Up" },
66   { { PGDN,  0,   0 }, CMD_LIST_NEXT_PAGE,     "Move: Page Down" },
67   { { '/',   0,   0 }, CMD_LIST_FIND,          "Find" },
68   { { 'n',   0,   0 }, CMD_LIST_FIND_NEXT,     "Find Next" },
70   { { TAB,   0,   0 }, CMD_SCREEN_NEXT,   "Next screen" },
71   { { STAB,  0,   0 }, CMD_SCREEN_PREVIOUS, "Previous screen" },
72   { { F1, '1', 'h' }, CMD_SCREEN_HELP,   "Help screen" },
73   { { F2, '2',   0 }, CMD_SCREEN_PLAY,   "Playlist screen" },
74   { { F3, '3',   0 }, CMD_SCREEN_FILE,   "Browse screen" },
75   //  { { F4, '4',   0 }, CMD_SCREEN_SEARCH, "Search screen" },
77   { { 'q',  0,   0 }, CMD_QUIT,   "Quit " PACKAGE },  
79   { { -1,  -1,  -1 }, CMD_NONE, NULL }
80 };
82 char *
83 key2str(int key)
84 {
85   static char buf[2];
87   buf[0] = 0;
88   switch(key)
89     {
90     case ' ':
91       return "Space";
92     case 13:
93       return "Enter";
94     case BS:
95       return "Backspace";
96     case DEL:
97       return "Delete";
98     case UP: 
99       return "Up";
100     case DWN:
101       return "Down";
102     case LEFT:
103       return "Left";
104     case RGHT:
105       return "Right";
106     case HOME:
107       return "Home";
108     case END:
109       return "End";
110     case PGDN:
111       return "PageDown";
112     case PGUP:
113       return "PageUp";
114     case TAB: 
115       return "Tab";
116     case STAB:
117       return "Shift+Tab";
118     case ESC:
119       return "Esc";
120     case F1:
121       return "F1";
122     case F2:
123       return "F2";
124     case F3:
125       return "F3";
126     case F4:
127       return "F4";
128     case F5:
129       return "F5";
130     case F6:
131       return "F6";
132     default:
133       snprintf(buf, 2, "%c", key);
134     }
135   return buf;
138 void
139 command_dump_keys(void)
141   int i;
143   i=0;
144   while( cmds[i].description )
145     {
146       if( cmds[i].command != CMD_NONE )
147         {
148           int j;
149           char keystr[80];
151           strcpy(keystr, key2str(cmds[i].keys[0]));
152           j=1;
153           while( j<3 && cmds[i].keys[j]>0 )
154             {
155               strcat(keystr, " ");
156               strcat(keystr, key2str(cmds[i].keys[j]));
157               j++;
158             }
159           printf(" %20s : %s\n", keystr, cmds[i].description);
160  
161         }
162       i++;
163     }
166 char *
167 command_get_keys(command_t command)
169   int i;
171   i=0;
172   while( cmds[i].description )
173     {
174       if( cmds[i].command == command )
175         {
176           int j;
177           static char keystr[80];
179           strcpy(keystr, key2str(cmds[i].keys[0]));
180           j=1;
181           while( j<3 && cmds[i].keys[j]>0 )
182             {
183               strcat(keystr, " ");
184               strcat(keystr, key2str(cmds[i].keys[j]));
185               j++;
186             }
187           return keystr;
188         }
189       i++;
190     }
191   return NULL;
194 command_t
195 get_keyboard_command(void)
197   int i;
198   int key;
200   key = wgetch(stdscr);
202   if( key==ERR )
203     return CMD_NONE;
205   DK(fprintf(stderr, "key = 0x%02X\t", key));
207   if( isalpha(key) )
208     key=tolower(key);
210   i=0;
211   while( cmds[i].description )
212     {
213       if( cmds[i].keys[0] == key || 
214           cmds[i].keys[1] == key ||
215           cmds[i].keys[2] == key )
216         {
217           DK(fprintf(stderr, "Match - %s\n", cmds[i].description));
218           return cmds[i].command;
219         }
220       i++;
221     } 
222   DK(fprintf(stderr, "NO MATCH\n"));
223   return CMD_NONE;