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;
136 }
138 void
139 command_dump_keys(void)
140 {
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);
161 }
162 i++;
163 }
164 }
166 char *
167 command_get_keys(command_t command)
168 {
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;
192 }
194 command_t
195 get_keyboard_command(void)
196 {
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;
224 }