Code

Added update command.
[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   { { 'w',   0,   0 }, CMD_TOGGLE_FIND_WRAP, "Toggle find mode" },
56   { { ' ',   0,   0 }, CMD_SELECT, "Select/deselect song in playlist" },
57   { { DEL,   0,   0 }, CMD_DELETE, "Delete song from playlist" },
58   { { 's',   0,   0 }, CMD_SHUFFLE, "Shuffle playlist" },
59   { { 'c',   0,   0 }, CMD_CLEAR, "Clear playlist" },
60   { { 'r',   0,   0 }, CMD_REPEAT, "Toggle repeat mode" },
61   { { 'z',   0,   0 }, CMD_RANDOM, "Toggle random mode" },
62   { { 'S',   0,   0 }, CMD_SAVE_PLAYLIST, "Save playlist" },
64   { {  UP,   0,   0 }, CMD_LIST_PREVIOUS,      "Move: Up" },
65   { { DWN,   0,   0 }, CMD_LIST_NEXT,          "Move: Down" },
66   { { HOME,  0,   0 }, CMD_LIST_FIRST,         "Move: Home" },
67   { { END,   0,   0 }, CMD_LIST_LAST,          "Move: End" },
68   { { PGUP,  0,   0 }, CMD_LIST_PREVIOUS_PAGE, "Move: Page Up" },
69   { { PGDN,  0,   0 }, CMD_LIST_NEXT_PAGE,     "Move: Page Down" },
70   { { '/',   0,   0 }, CMD_LIST_FIND,          "Forward Find" },
71   { { 'n',   0,   0 }, CMD_LIST_FIND_NEXT,     "Forward Find Next" },
72   { { '?',   0,   0 }, CMD_LIST_RFIND,         "Backward Find" },
73   { { 'p',   0,   0 }, CMD_LIST_RFIND_NEXT,    "Backward Find Previous" },
76   { { TAB,   0,   0 }, CMD_SCREEN_NEXT,   "Next screen" },
77   { { STAB,  0,   0 }, CMD_SCREEN_PREVIOUS, "Previous screen" },
78   { { F1, '1', 'h' }, CMD_SCREEN_HELP,   "Help screen" },
79   { { F2, '2',   0 }, CMD_SCREEN_PLAY,   "Playlist screen" },
80   { { F3, '3',   0 }, CMD_SCREEN_FILE,   "Browse screen" },
81   //  { { F4, '4',   0 }, CMD_SCREEN_SEARCH, "Search screen" },
82   { {'u',   0,   0 }, CMD_SCREEN_UPDATE,   "Update screen" },
84   { { 'q',  0,   0 }, CMD_QUIT,   "Quit " PACKAGE },  
86   { { -1,  -1,  -1 }, CMD_NONE, NULL }
87 };
89 char *
90 key2str(int key)
91 {
92   static char buf[2];
94   buf[0] = 0;
95   switch(key)
96     {
97     case ' ':
98       return "Space";
99     case 13:
100       return "Enter";
101     case BS:
102       return "Backspace";
103     case DEL:
104       return "Delete";
105     case UP: 
106       return "Up";
107     case DWN:
108       return "Down";
109     case LEFT:
110       return "Left";
111     case RGHT:
112       return "Right";
113     case HOME:
114       return "Home";
115     case END:
116       return "End";
117     case PGDN:
118       return "PageDown";
119     case PGUP:
120       return "PageUp";
121     case TAB: 
122       return "Tab";
123     case STAB:
124       return "Shift+Tab";
125     case ESC:
126       return "Esc";
127     case F1:
128       return "F1";
129     case F2:
130       return "F2";
131     case F3:
132       return "F3";
133     case F4:
134       return "F4";
135     case F5:
136       return "F5";
137     case F6:
138       return "F6";
139     default:
140       snprintf(buf, 2, "%c", key);
141     }
142   return buf;
145 void
146 command_dump_keys(void)
148   int i;
150   i=0;
151   while( cmds[i].description )
152     {
153       if( cmds[i].command != CMD_NONE )
154         {
155           int j;
156           char keystr[80];
158           strcpy(keystr, key2str(cmds[i].keys[0]));
159           j=1;
160           while( j<3 && cmds[i].keys[j]>0 )
161             {
162               strcat(keystr, " ");
163               strcat(keystr, key2str(cmds[i].keys[j]));
164               j++;
165             }
166           printf(" %20s : %s\n", keystr, cmds[i].description);
167  
168         }
169       i++;
170     }
173 char *
174 command_get_keys(command_t command)
176   int i;
178   i=0;
179   while( cmds[i].description )
180     {
181       if( cmds[i].command == command )
182         {
183           int j;
184           static char keystr[80];
186           strcpy(keystr, key2str(cmds[i].keys[0]));
187           j=1;
188           while( j<3 && cmds[i].keys[j]>0 )
189             {
190               strcat(keystr, " ");
191               strcat(keystr, key2str(cmds[i].keys[j]));
192               j++;
193             }
194           return keystr;
195         }
196       i++;
197     }
198   return NULL;
201 command_t
202 get_keyboard_command(void)
204   int i;
205   int key;
207   key = wgetch(stdscr);
209   if( key==ERR )
210     return CMD_NONE;
212   DK(fprintf(stderr, "key = 0x%02X\t", key));
214   //  if( isalpha(key) )
215   //    key=tolower(key);
217   i=0;
218   while( cmds[i].description )
219     {
220       if( cmds[i].keys[0] == key || 
221           cmds[i].keys[1] == key ||
222           cmds[i].keys[2] == key )
223         {
224           DK(fprintf(stderr, "Match - %s\n", cmds[i].description));
225           return cmds[i].command;
226         }
227       i++;
228     } 
229   DK(fprintf(stderr, "NO MATCH\n"));
230   return CMD_NONE;