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