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