ali@0
|
1 |
/*
|
ali@0
|
2 |
* $Id: menu.c,v 1.5 2004/12/30 09:07:47 ali Exp $
|
ali@0
|
3 |
* Copyright (C) 2007 J. Ali Harlow
|
ali@0
|
4 |
* Min Hack may be freely redistributed. See license for details.
|
ali@0
|
5 |
*/
|
ali@0
|
6 |
|
ali@0
|
7 |
#include <stdlib.h>
|
ali@0
|
8 |
#include <stdio.h>
|
ali@0
|
9 |
#include <string.h>
|
ali@0
|
10 |
#include "minhack.h"
|
ali@0
|
11 |
|
ali@0
|
12 |
void minhack_free_menu(int window)
|
ali@0
|
13 |
{
|
ali@0
|
14 |
struct minhack_menu *menu=windows[window].menu;
|
ali@0
|
15 |
struct minhack_mitem *item,*next;
|
ali@0
|
16 |
if (menu)
|
ali@0
|
17 |
{
|
ali@0
|
18 |
if (menu->menu)
|
ali@0
|
19 |
{
|
ali@0
|
20 |
#if 0
|
ali@0
|
21 |
delwin(menu_win(menu->menu));
|
ali@0
|
22 |
delwin(menu_sub(menu->menu));
|
ali@0
|
23 |
#endif
|
ali@0
|
24 |
free_menu(menu->menu);
|
ali@0
|
25 |
}
|
ali@0
|
26 |
for(item=menu->mitems;item;item=next)
|
ali@0
|
27 |
{
|
ali@0
|
28 |
next=item->next;
|
ali@0
|
29 |
free_item(item->item);
|
ali@0
|
30 |
free(item->str);
|
ali@0
|
31 |
free(item);
|
ali@0
|
32 |
}
|
ali@0
|
33 |
free(menu->items);
|
ali@0
|
34 |
}
|
ali@0
|
35 |
windows[window].menu=NULL;
|
ali@0
|
36 |
}
|
ali@0
|
37 |
|
ali@0
|
38 |
void minhack_start_menu(int window)
|
ali@0
|
39 |
{
|
ali@0
|
40 |
minhack_free_menu(window);
|
ali@0
|
41 |
windows[window].menu=
|
ali@0
|
42 |
(struct minhack_menu *)calloc(1,sizeof(struct minhack_menu));
|
ali@0
|
43 |
}
|
ali@0
|
44 |
|
ali@0
|
45 |
void minhack_add_menu(int window, int glyph, int identifier, char accelerator,
|
ali@0
|
46 |
char groupacc, int attr, const char *str, nhproxy_bool_t preselected)
|
ali@0
|
47 |
{
|
ali@0
|
48 |
struct minhack_mitem *item;
|
ali@0
|
49 |
item=(struct minhack_mitem *)malloc(sizeof(*item));
|
ali@0
|
50 |
item->next=windows[window].menu->mitems;
|
ali@0
|
51 |
item->identifier=identifier;
|
ali@0
|
52 |
if (accelerator)
|
ali@0
|
53 |
item->accelerator=accelerator;
|
ali@0
|
54 |
else if (!item->next)
|
ali@0
|
55 |
item->accelerator='a';
|
ali@0
|
56 |
else if (!identifier)
|
ali@0
|
57 |
item->accelerator=item->next->accelerator;
|
ali@0
|
58 |
else if (item->next->accelerator=='z')
|
ali@0
|
59 |
item->accelerator='A';
|
ali@0
|
60 |
else
|
ali@0
|
61 |
item->accelerator=item->next->accelerator+1;
|
ali@0
|
62 |
item->groupacc=groupacc;
|
ali@0
|
63 |
if (identifier)
|
ali@0
|
64 |
{
|
ali@0
|
65 |
item->str=malloc(strlen(str)+5);
|
ali@0
|
66 |
sprintf(item->str,"%c - %s",item->accelerator,str);
|
ali@0
|
67 |
}
|
ali@0
|
68 |
else if (*str)
|
ali@0
|
69 |
item->str=strdup(str);
|
ali@0
|
70 |
else
|
ali@0
|
71 |
item->str=strdup(" ");
|
ali@0
|
72 |
item->selected=preselected;
|
ali@0
|
73 |
item->item=new_item(item->str,item->str);
|
ali@0
|
74 |
if (!identifier)
|
ali@0
|
75 |
item_opts_off(item->item,O_SELECTABLE);
|
ali@0
|
76 |
windows[window].menu->mitems=item;
|
ali@0
|
77 |
}
|
ali@0
|
78 |
|
ali@0
|
79 |
static struct minhack_mitem *reverse(struct minhack_mitem *curr)
|
ali@0
|
80 |
{
|
ali@0
|
81 |
struct minhack_mitem *next,*head=0;
|
ali@0
|
82 |
while (curr)
|
ali@0
|
83 |
{
|
ali@0
|
84 |
next=curr->next;
|
ali@0
|
85 |
curr->next=head;
|
ali@0
|
86 |
head=curr;
|
ali@0
|
87 |
curr=next;
|
ali@0
|
88 |
}
|
ali@0
|
89 |
return head;
|
ali@0
|
90 |
}
|
ali@0
|
91 |
|
ali@0
|
92 |
void minhack_end_menu(int window, const char *prompt)
|
ali@0
|
93 |
{
|
ali@0
|
94 |
int i,rows,cols;
|
ali@0
|
95 |
struct minhack_mitem *item;
|
ali@0
|
96 |
WINDOW *win;
|
ali@0
|
97 |
windows[window].menu->mitems=reverse(windows[window].menu->mitems);
|
ali@0
|
98 |
if (*prompt)
|
ali@0
|
99 |
{
|
ali@0
|
100 |
minhack_add_menu(window,-1,0,0,0,0,"",FALSE);
|
ali@0
|
101 |
minhack_add_menu(window,-1,0,0,0,0,prompt,FALSE);
|
ali@0
|
102 |
}
|
ali@0
|
103 |
for(i=0,item=windows[window].menu->mitems;item;i++,item=item->next)
|
ali@0
|
104 |
;
|
ali@0
|
105 |
windows[window].menu->items=malloc((i+1)*sizeof(ITEM *));
|
ali@0
|
106 |
for(i=0,item=windows[window].menu->mitems;item;i++,item=item->next)
|
ali@0
|
107 |
windows[window].menu->items[i]=item->item;
|
ali@0
|
108 |
windows[window].menu->items[i]=NULL;
|
ali@0
|
109 |
windows[window].menu->menu=new_menu(windows[window].menu->items);
|
ali@0
|
110 |
scale_menu(windows[window].menu->menu,&rows,&cols);
|
ali@0
|
111 |
{
|
ali@0
|
112 |
char buf[100];
|
ali@0
|
113 |
sprintf(buf,"(%dx%d)",rows,cols);
|
ali@0
|
114 |
minhack_putstr(message_win,0,buf);
|
ali@0
|
115 |
}
|
ali@0
|
116 |
#if 0
|
ali@0
|
117 |
win=newwin(rows,cols,0,0);
|
ali@0
|
118 |
set_menu_win(windows[window].menu->menu,win);
|
ali@0
|
119 |
#endif
|
ali@0
|
120 |
win=newwin(rows,cols,0,0);
|
ali@0
|
121 |
set_menu_sub(windows[window].menu->menu,win);
|
ali@0
|
122 |
set_menu_win(windows[window].menu->menu,windows[map_win].win);
|
ali@0
|
123 |
}
|
ali@0
|
124 |
|
ali@0
|
125 |
int minhack_select_menu(int window, int how, struct nhproxy_mi **selected)
|
ali@0
|
126 |
{
|
ali@0
|
127 |
int i,j,ch;
|
ali@0
|
128 |
struct minhack_mitem *item;
|
ali@0
|
129 |
if (how==MINHACK_PICK_ANY)
|
ali@0
|
130 |
menu_opts_off(windows[window].menu->menu,O_ONEVALUE);
|
ali@0
|
131 |
menu_opts_off(windows[window].menu->menu,O_IGNORECASE);
|
ali@0
|
132 |
menu_opts_off(windows[window].menu->menu,O_SHOWDESC);
|
ali@0
|
133 |
i=post_menu(windows[window].menu->menu);
|
ali@0
|
134 |
for(;;)
|
ali@0
|
135 |
{
|
ali@0
|
136 |
wrefresh(menu_win(windows[window].menu->menu));
|
ali@0
|
137 |
#if 1
|
ali@0
|
138 |
wrefresh(menu_sub(windows[window].menu->menu));
|
ali@0
|
139 |
#endif
|
ali@0
|
140 |
ch=getch();
|
ali@0
|
141 |
if (ch=='\033')
|
ali@0
|
142 |
{
|
ali@0
|
143 |
i=how==MINHACK_PICK_NONE?0:-1;
|
ali@0
|
144 |
break;
|
ali@0
|
145 |
}
|
ali@0
|
146 |
else if (ch>=' ' && ch<='~')
|
ali@0
|
147 |
if (menu_driver(windows[window].menu->menu,ch)==E_OK)
|
ali@0
|
148 |
{
|
ali@0
|
149 |
for(i=0,item=windows[window].menu->mitems;item;item=item->next)
|
ali@0
|
150 |
if (item_value(item->item))
|
ali@0
|
151 |
i++;
|
ali@0
|
152 |
*selected=(struct nhproxy_mi *)calloc(i,
|
ali@0
|
153 |
sizeof(struct nhproxy_mi));
|
ali@0
|
154 |
for(i=0,item=windows[window].menu->mitems;item;item=item->next)
|
ali@0
|
155 |
if (item_value(item->item))
|
ali@0
|
156 |
{
|
ali@0
|
157 |
(*selected)[i].item=item->identifier;
|
ali@0
|
158 |
(*selected)[i].count=-1; /* FIXME */
|
ali@0
|
159 |
}
|
ali@0
|
160 |
break;
|
ali@0
|
161 |
}
|
ali@0
|
162 |
}
|
ali@0
|
163 |
unpost_menu(windows[window].menu->menu);
|
ali@0
|
164 |
redrawwin(menu_win(windows[window].menu->menu));
|
ali@0
|
165 |
#if 0
|
ali@0
|
166 |
for(j=0;j<no_windows;j++)
|
ali@0
|
167 |
if (windows[j].win)
|
ali@0
|
168 |
redrawwin(windows[j].win);
|
ali@0
|
169 |
#endif
|
ali@0
|
170 |
return i;
|
ali@0
|
171 |
}
|
ali@0
|
172 |
|
ali@0
|
173 |
int minhack_message_menu(int let, int how, const char *mesg)
|
ali@0
|
174 |
{
|
ali@0
|
175 |
return -1;
|
ali@0
|
176 |
}
|