1 /*
2 Any and all routines to worry about managing the screen using ncurses.
3 Dickey rules.
4 */
5
6 #include "cmp3funcs.h"
7 #include "keydef.h"
8
9 /****************************************************************************
10 * NCurses initialization
11 * Returns: nothing
12 ****************************************************************************/
curs_init()13 extern void curs_init()
14 {
15 initscr();
16 cbreak();
17 nonl();
18 keypad(stdscr,TRUE);
19 curs_set(0);
20 noecho();
21 pad_left = newpad(MAX_LIST,MAX_WIDTH);
22 pad_right = newpad(MAX_LIST,MAX_WIDTH);
23 pad_list = newpad(MAX_LIST, MAX_FULL);
24 win_right = newwin(LINES-9,COLS/2-1,3,COLS/2);
25 win_left = newwin(LINES-9,COLS/2-2,3,1);
26 win_list = newwin(LINES-9,COLS-2,3,1);
27 if (has_colors() &&
28 ini_getValueBool(cmp3rc, "cmp3_options", "show_colors", 1))
29 {
30 start_color();
31 init_pair(CCOLOR_STD,COLOR_BLUE,COLOR_BLACK); /* stdwin */
32 init_pair(CCOLOR_LEFT,COLOR_GREEN,COLOR_BLACK); /* win_left */
33 init_pair(CCOLOR_RIGHT,COLOR_RED,COLOR_BLACK); /* rghtshel */
34 init_pair(CCOLOR_LIST,COLOR_CYAN,COLOR_BLACK); /* listwin */
35 init_pair(CCOLOR_HIGHLIGHT,COLOR_CYAN,COLOR_YELLOW); /* grabbed file */
36 init_pair(CCOLOR_HELP,COLOR_MAGENTA,COLOR_BLACK); /* help window */
37 init_pair(CCOLOR_DIALOG,COLOR_CYAN,COLOR_BLACK); /* dialog box */
38 attron(COLOR_PAIR(CCOLOR_STD));
39 wattron(pad_list, COLOR_PAIR(CCOLOR_LIST));
40 wattron(win_list, COLOR_PAIR(CCOLOR_LIST));
41 wattron(pad_left, COLOR_PAIR(CCOLOR_LEFT));
42 wattron(win_left, COLOR_PAIR(CCOLOR_LEFT));
43 wattron(pad_right, COLOR_PAIR(CCOLOR_RIGHT));
44 wattron(win_right, COLOR_PAIR(CCOLOR_RIGHT));
45 }
46
47 box(stdscr, 0, 0);
48 box(win_list, 0, 0);
49
50 if (shmptr->repeat == 1) {
51 mvprintw(LINES - 2, 3, "R");
52 }
53
54 return;
55 }
56
57 /****************************************************************************
58 * Make a dialog box with the message displayed, get yes or no
59 * Returns: PASS or FAIL
60 ****************************************************************************/
dialogbox(char * message)61 extern int dialogbox(char *message)
62 {
63 WINDOW *dialog;
64 char answer;
65
66 dialog=newwin(LINES/6,COLS/3,LINES/3,COLS/3);
67 wattron(dialog,COLOR_PAIR(CCOLOR_DIALOG));
68 mvwaddstr(dialog, 1, (COLS/6) - (strlen(message)/2), message);
69 mvwaddstr(dialog, 2, (COLS/6) - 2, "(y/n)");
70 box(dialog,0,0);
71 wrefresh(dialog);
72 answer=getch();
73 while ((answer != 'y') && (answer != CMP3_KEY_ENTER) &&
74 (answer != 'n') && (answer != CMP3_KEY_ESCAPE)) {
75 wattron(dialog,A_BLINK);
76 mvwaddstr(dialog,2,5,"No you WHORE! (y,n)");
77 wattroff(dialog,A_BLINK);
78 wrefresh(dialog);
79 answer=getch();
80 }
81 delwin(dialog);
82 if ((answer == 'n') || (answer == CMP3_KEY_ESCAPE))
83 return(0);
84 return(1);
85 }
86
87 /* XXX - try forms */
form_virtualize(FORM * f,WINDOW * w,int * thechar)88 static int form_virtualize(FORM *f, WINDOW *w, int *thechar)
89 {
90 static const struct {
91 int code;
92 int result;
93 } lookup[] = {
94 { CTRL('Z'), REQ_PREV_WORD },
95 { CTRL('J'), REQ_CLR_EOL },
96 { CTRL('G'), REQ_DEL_WORD },
97 { CTRL('H'), REQ_DEL_PREV },
98 { CTRL(' '), REQ_INS_CHAR },
99 { CTRL('K'), REQ_CLR_EOF },
100 { CTRL('A'), REQ_BEG_LINE },
101 { CTRL('D'), REQ_DEL_CHAR },
102 { CTRL('X'), REQ_NEXT_WORD },
103 { CTRL('Y'), REQ_CLR_FIELD },
104 { CTRL('Y'), REQ_DEL_LINE },
105 { CTRL('F'), REQ_RIGHT_CHAR },
106 { CTRL('B'), REQ_LEFT_CHAR },
107 { CTRL('E'), REQ_END_LINE },
108 { KEY_BACKSPACE, REQ_DEL_PREV },
109 { 127, REQ_DEL_PREV },
110 { KEY_DC, REQ_DEL_PREV },
111 /* { KEY_DOWN, REQ_DOWN_CHAR }, */
112 { KEY_END, REQ_LAST_FIELD },
113 { KEY_HOME, REQ_FIRST_FIELD },
114 { KEY_LEFT, REQ_LEFT_CHAR },
115 { KEY_RIGHT, REQ_RIGHT_CHAR },
116 /* { KEY_UP, REQ_UP_CHAR }, */
117 { CMP3_KEY_ENTER, MAX_FORM_COMMAND + 1 },
118 { CMP3_KEY_ESCAPE, MAX_FORM_COMMAND + 1 },
119 { CTRL('Q'), MAX_FORM_COMMAND + 1 },
120 { 0, 0}
121 };
122
123 int c;
124 int n;
125
126 c = wgetch(w);
127 *thechar = c;
128
129 for (n = 0; (lookup[n].code != 0) || (lookup[n].result != 0); n++)
130 {
131 if (lookup[n].code == c) {
132 c = lookup[n].result;
133 if (lookup[n].result == MAX_FORM_COMMAND + 1)
134 {
135 if (*thechar != CMP3_KEY_ENTER)
136 {
137 *thechar = CMP3_KEY_ESCAPE;
138 }
139 }
140 break;
141 }
142 }
143
144 return c;
145 }
146
inputbox(char * message,char * buffer,int bufflen)147 extern int inputbox(char *message, char *buffer, int bufflen)
148 {
149 WINDOW *dialog;
150 FORM *form;
151 FIELD *field[3];
152 int c;
153 int finished;
154 int toreturn;
155
156 dialog=newwin(LINES/6, COLS/3, LINES/3, COLS/3);
157 wattron(dialog,COLOR_PAIR(CCOLOR_DIALOG));
158
159 curs_set(1);
160
161 field[0] = new_field(1, COLS/3 - 4, 2, 2, 3, 1);
162 if (field[0] == NULL)
163 return(0);
164 set_field_back(field[0], A_REVERSE | COLOR_PAIR(CCOLOR_DIALOG));
165 set_field_buffer(field[0], 0, buffer);
166 field[1] = new_field(1, strlen(message), 1,
167 (COLS/6) - (strlen(message)/2), 0, 0);
168 set_field_buffer(field[1], 0, message);
169 set_field_fore(field[1], COLOR_PAIR(CCOLOR_DIALOG));
170 field[2] = NULL;
171
172 form = new_form(field);
173 set_form_win(form, dialog);
174
175 post_form(form);
176 /* mvwaddstr(dialog, 1, (COLS/6) - (strlen(message)/2), message); */
177 box(dialog, 0, 0);
178
179 wrefresh(dialog);
180
181 finished = 0;
182 while (!finished)
183 {
184 switch(form_driver(form, form_virtualize(form, dialog, &c)))
185 {
186 case E_OK:
187 break;
188 case E_UNKNOWN_COMMAND:
189 finished = 1;
190 form_driver(form, REQ_VALIDATION);
191 switch(c)
192 {
193 case CMP3_KEY_ENTER:
194 toreturn = 1;
195 break;
196 case CMP3_KEY_ESCAPE:
197 toreturn = 0;
198 break;
199 default:
200 toreturn = 0;
201 break;
202 }
203 break;
204 default:
205 beep();
206 break;
207 }
208 }
209
210 strcpy(buffer, field_buffer(field[0], 0));
211 for (finished = 80; (buffer[finished] == ' ') && (finished >= 0);
212 finished--)
213 ;
214 if (finished >= 0)
215 buffer[++finished] = '\0';
216 else
217 toreturn = 0;
218
219 /*
220 fprintf(stderr, "return %d: %s", toreturn, field_buffer(field[0], 0));
221 sleep(2);
222 */
223
224 free_form(form);
225 free_field(field[0]);
226 delwin(dialog);
227
228 curs_set(0);
229
230 return(toreturn);
231 }
232
233 #if 0
234 /****************************************************************************
235 * Make an input box with the message displayed, get response
236 * Returns: PASS or FAIL
237 ****************************************************************************/
238 extern int inputbox(char *message, char *buffer, int bufflen)
239 {
240 WINDOW *dialog;
241 int answer;
242 int i;
243 int cleared = 0;
244
245 dialog=newwin(LINES/6, COLS/3, LINES/3, COLS/3);
246 wattron(dialog,COLOR_PAIR(CCOLOR_DIALOG));
247 curs_set(1);
248 box(dialog,0,0);
249 mvwaddstr(dialog, 1, (COLS/6) - (strlen(message)/2), message);
250 wattron(dialog, COLOR_PAIR(CCOLOR_HIGHLIGHT));
251 mvwprintw(dialog, 2, 3, "%.*s", COLS/3 - 5, buffer);
252
253 wmove(dialog, 2, 3);
254 wrefresh(dialog);
255 i = 0;
256 answer=getch();
257 while((answer != CMP3_KEY_ENTER) && (answer != CMP3_KEY_ESCAPE)) {
258 switch(answer)
259 {
260 case KEY_BACKSPACE: case KEY_DC:
261 if (i == 0)
262 break;
263 i--;
264 wprintw(dialog, "\b \b");
265 break;
266 case KEY_LEFT:
267 wprintw(dialog, "\b");
268 i--;
269 break;
270 case KEY_RIGHT:
271 wprintw(dialog, "%c", buffer[i]);
272 i++;
273 break;
274 default:
275 if (isprint(answer)) {
276 if ((i == 0) && (cleared == 0)) {
277 memset(buffer, ' ', bufflen);
278 cleared = 1;
279 }
280 wprintw(dialog, "%c", answer);
281 buffer[i] = answer;
282 i++;
283 }
284 break;
285 }
286 wrefresh(dialog);
287 answer=getch();
288 }
289 curs_set(0);
290 wattron(dialog,COLOR_PAIR(CCOLOR_DIALOG));
291 if (answer == CMP3_KEY_ESCAPE)
292 return(0);
293 buffer[i] = '\0';
294 return(1);
295 }
296 #endif
297
298 /****************************************************************************
299 * Switch left and right windows
300 * Returns: pointer to current window
301 ****************************************************************************/
switchwin(int thewin)302 extern int switchwin(int thewin)
303 {
304 if (thewin == FOCUSED_LEFT) {
305 curwin = FOCUSED_RIGHT;
306 wattron(win_right,A_REVERSE);
307 mvwprintw(win_right,1,2,".mp3 files:");
308 wattroff(win_right,A_REVERSE);
309 mvwprintw(win_left,1,2,"Directory:");
310 } else {
311 curwin = FOCUSED_LEFT;
312 wattron(win_left,A_REVERSE);
313 mvwprintw(win_left,1,2,"Directory:");
314 wattroff(win_left,A_REVERSE);
315 mvwprintw(win_right,1,2,".mp3 files:");
316 }
317 ll_prncur(list_left);
318 ll_prncur(list_right);
319 refreshpad(FOCUSED_LEFT);
320 refreshpad(FOCUSED_RIGHT);
321 wnoutrefresh(win_left);
322 wrefresh(win_right);
323 return(curwin);
324 }
325
326 /****************************************************************************
327 * Show help information
328 * Returns: nothing
329 ****************************************************************************/
showhelp()330 extern void showhelp()
331 {
332 int curwinbackup;
333 WINDOW *helpwin;
334
335 curwinbackup = curwin;
336 helpwin = newwin(LINES-9,COLS-2,3,1);
337 wattron(helpwin, COLOR_PAIR(CCOLOR_HELP));
338 wattron(helpwin, A_REVERSE);
339 mvwprintw(helpwin, 1, ((COLS-2)/2)-3, " Help ");
340 wattroff(helpwin, A_REVERSE);
341
342 if (curwin == FOCUSED_LIST) {
343 curwin = FOCUSED_HELP;
344 mvwprintw(helpwin, 3, 0,
345 " %c\t\t - Remove file from list\n", CMP3_KEY_LISTDEL);
346 wprintw(helpwin, " %c\t\t - grab/let go of a file\n", CMP3_KEY_GRABFILE);
347 wprintw(helpwin, " %c\t\t - Randomize the playlist (starting at grab)\n",
348 CMP3_KEY_RANDOMIZE);
349 wprintw(helpwin, " %c\t\t - Quit List Mode\n", CMP3_KEY_LISTQUIT);
350
351 } else {
352 curwin = FOCUSED_HELP;
353 mvwprintw(helpwin, 3, 0,
354 " %c\t\t - Kill song\n", CMP3_KEY_KILL1);
355 wprintw(helpwin, " %c\t\t - Pause song\n", CMP3_KEY_PAUSE);
356 wprintw(helpwin, " F5\t\t - Restart song\n");
357 wprintw(helpwin, " %c\t\t - suspend display\n", CMP3_KEY_SUSPEND);
358 wprintw(helpwin, " %c\t\t - enter list mode\n", CMP3_KEY_LISTMODE);
359 wprintw(helpwin, " %c\t\t - add all mp3s in dir to playlist\n",
360 CMP3_KEY_ADDDIR);
361 wprintw(helpwin, " %c\t\t - recursively add all mp3s to playlist\n",
362 CMP3_KEY_RECURADDIR);
363 wprintw(helpwin, " %c\t\t - clear playlist\n", CMP3_KEY_CLEARPL);
364 wprintw(helpwin, " %c\t\t - write playlist\n", CMP3_KEY_WRITEPL);
365 wprintw(helpwin, " %c/%c\t\t - volume control\n", CMP3_KEY_VOLUP1,
366 CMP3_KEY_VOLDWN1);
367 wprintw(helpwin, " %c\t\t - toggle repeat mode\n", CMP3_KEY_REPEAT);
368 wprintw(helpwin, " F2\t\t - change dir dialog\n");
369 wprintw(helpwin, " %c\t\t - change dir to home\n", CMP3_KEY_CHDIRHOME);
370 #ifdef ASS_LOC
371 wprintw(helpwin, " %c\t\t - change dir to ass home\n",
372 CMP3_KEY_CHDIRASS);
373 #endif /* ASS_LOC */
374 wprintw(helpwin, " %c\t\t - refresh screen\n", CMP3_KEY_REFRESH);
375 wprintw(helpwin, " delete\t - delete file\n");
376 }
377 mvwprintw(helpwin, LINES-11, (COLS-2)-20, "hit any key to exit");
378 box(helpwin, 0, 0);
379 wrefresh(helpwin);
380 getch();
381 curwin = curwinbackup;
382 delwin(helpwin);
383 }
384
385 /****************************************************************************
386 * Do refreshing of a pad
387 * Returns: nothing
388 ****************************************************************************/
refreshpad(int curwin)389 extern void refreshpad(int curwin)
390 {
391 void *infoptr;
392
393 if (curwin == FOCUSED_LEFT) {
394 infoptr = ll_info(list_left, NULL);
395 prefresh(pad_left, ((info_left_t*) infoptr)->line, 0, 6, 3,
396 LINES-8, COLS/2-4);
397 } else {
398 infoptr = ll_info(list_right, NULL);
399 prefresh(pad_right, ((info_right_t*) infoptr)->line, 0, 6, COLS/2+2,
400 LINES-8,COLS-4);
401 }
402 }
403
404 /****************************************************************************
405 * Refresh both pads
406 * Returns: nothing
407 ****************************************************************************/
refreshpads()408 void refreshpads()
409 {
410 void *infoptr;
411
412 infoptr = ll_info(list_left, NULL);
413 pnoutrefresh(pad_left, ((info_left_t*) infoptr)->line, 0, 6, 3,
414 LINES-8, COLS/2-4);
415
416 infoptr = ll_info(list_right, NULL);
417 prefresh(pad_right, ((info_right_t*) infoptr)->line, 0, 6, COLS/2+2,
418 LINES-8,COLS-4);
419 }
420
421 /****************************************************************************
422 * Clean pads
423 * Returns: nothing
424 ****************************************************************************/
pads_clean()425 extern void pads_clean()
426 {
427 int i;
428
429 if (ll_total(list_right) > 0) {
430 mvwprintw(pad_right, 0, 0, "\n");
431 for (i=0; i < ll_total(list_right) - 1; i++)
432 wprintw(pad_right, "\n");
433 }
434 if (ll_total(list_left) > 0) {
435 mvwprintw(pad_left, 0, 0, "\n");
436 for (i=0; i < ll_total(list_left) - 1; i++)
437 wprintw(pad_left, "\n");
438 }
439 }
440
441 /****************************************************************************
442 * Refresh parts after a dialog box was drawn
443 * Returns: nothing
444 ****************************************************************************/
dialog_clean()445 void dialog_clean()
446 {
447 volclean();
448 wredrawln(win_left,LINES/3-3,LINES/6);
449 wredrawln(win_right,LINES/3-3,LINES/6);
450
451 wnoutrefresh(stdscr);
452 wnoutrefresh(win_left);
453 wnoutrefresh(win_right);
454
455 refreshpad(FOCUSED_LEFT);
456 refreshpad(FOCUSED_RIGHT);
457 }
458
459 /****************************************************************************
460 * Refresh left and right windows after the list box was drawn
461 * Returns: nothing
462 ****************************************************************************/
after_list()463 void after_list()
464 {
465 volclean();
466 redrawwin(stdscr);
467 redrawwin(win_left);
468 redrawwin(win_right);
469
470 wnoutrefresh(stdscr);
471 wnoutrefresh(win_left);
472 wnoutrefresh(win_right);
473
474 refreshpad(FOCUSED_LEFT);
475 refreshpad(FOCUSED_RIGHT);
476 }
477
478 /* EOF */
479