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 0x161
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 { { ESC, BS, 's' }, 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, 'd', 0 }, CMD_DELETE, "Delete song from playlist" },
58 { { 'Z', 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, 0x01, 0 }, CMD_LIST_FIRST, "Move: Home" },
67 { { END, 0x05, 0 }, CMD_LIST_LAST, "Move: End" },
68 { { PGUP, 'A', 0 }, CMD_LIST_PREVIOUS_PAGE, "Move: Page Up" },
69 { { PGDN, 'B', 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;
143 }
145 void
146 command_dump_keys(void)
147 {
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);
168 }
169 i++;
170 }
171 }
173 char *
174 command_get_keys(command_t command)
175 {
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;
199 }
201 command_t
202 get_keyboard_command(void)
203 {
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;
231 }