1 /* Scrolling Menus
2 
3  * Copyright (C) 1998 J.A. Bezemer
4  *
5  * Licensed under the terms of the GNU General Public License.
6  * ABSOLUTELY NO WARRANTY.
7  * See the file `COPYING' in this directory.
8  */
9 
10 #include "scrollmenu.h"
11 #include <stdlib.h>
12 #ifndef OLD_CURSES
13 #include <ncurses.h>
14 #else
15 #include <curses.h>
16 #endif
17 
18 
19 void
scrollmenu_display(scrollmenu_t * menu)20 scrollmenu_display (scrollmenu_t * menu)
21 {
22   int i, j, x1, y1;
23 
24   if (menu->selected >= menu->number)
25     menu->selected = menu->number - 1;
26   /* May get selected=-1 if number==0... */
27   if (menu->selected < 0)	/* ...so this one must be last! */
28     menu->selected = 0;
29   if (menu->selected < menu->firstonscreen)
30     menu->firstonscreen = menu->selected;
31   if (menu->selected >= menu->firstonscreen + menu->h)
32     menu->firstonscreen = menu->selected - menu->h + 1;
33 
34   for (i = 0; i < menu->h; i++)
35     {
36       if (menu->firstonscreen + i == menu->selected && menu->hasfocus)
37 	attron (A_STANDOUT);
38 
39       if (menu->firstonscreen + i < menu->number)
40 	mvaddnstr (menu->y + i,
41 		   menu->x,
42 		   menu->items[menu->firstonscreen + i],
43 		   menu->w);
44       else
45 	move (menu->y + i, menu->x);
46 
47       getyx (stdscr, y1, x1);
48 
49       for (j = x1; j < menu->x + menu->w; j++)
50 	addch (' ');
51 
52       if (menu->firstonscreen + i == menu->selected && menu->hasfocus)
53 	attroff (A_STANDOUT);
54     }
55 
56   move (menu->y + menu->selected - menu->firstonscreen, menu->x);
57 }
58 
59 int
scrollmenu_stdkeys(int key,scrollmenu_t * menu)60 scrollmenu_stdkeys (int key, scrollmenu_t * menu)
61 /* Returns >0: item was selected;
62    Returns -1 if nothing serious has happened.
63  */
64 
65 {
66   int returnval = -1;
67 
68   switch (key)
69     {
70     case 'k':			/* Well, `less'-keys here also... */
71     case 'K':
72     case KEY_UP:
73       (menu->selected)--;
74       break;
75 
76     case 'j':
77     case 'J':
78     case KEY_DOWN:
79       (menu->selected)++;
80       break;
81 
82     case KEY_NPAGE:
83       if (menu->selected < menu->firstonscreen +
84 	  menu->h - 1)
85 	menu->selected = menu->firstonscreen +
86 	  menu->h - 1;
87       else
88 	menu->selected += menu->h - 1;
89       break;
90 
91     case KEY_PPAGE:
92       if (menu->selected > menu->firstonscreen)
93 	menu->selected = menu->firstonscreen;
94       else
95 	menu->selected -= (menu->h - 1);
96       break;
97 
98     case 13:
99     case KEY_ENTER:
100       returnval = menu->selected;
101       break;
102     }
103 
104   if (menu->selected < 0)
105     menu->selected = 0;
106   if (menu->selected >= menu->number)
107     menu->selected = menu->number - 1;
108 
109   return returnval;
110 }
111 
112 void
scrollmenu_delete_menu(scrollmenu_t * menu)113 scrollmenu_delete_menu (scrollmenu_t * menu)
114 {
115   int i;
116 
117   if (menu->items != NULL)
118     {
119       for (i = 0; i < menu->number; i++)
120 	free (menu->items[i]);
121 
122       free (menu->items);
123       menu->items = NULL;
124     }
125 }
126