Skip to content

Commit 5180922

Browse files
committed
API and example simplification
1 parent 88dbf7e commit 5180922

File tree

5 files changed

+334
-21
lines changed

5 files changed

+334
-21
lines changed

Makefile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
all: libst_menu.so libst_menu.a demo
1+
all: libst_menu.so libst_menu.a demo simple
22

33
# possible to use gcc flag -DNCURSES_WIDECHAR=1 where is possible
44
# then any unicode char can be a accelerator
@@ -15,14 +15,19 @@ libst_menu.so: st_menu_styles.o st_menu.o
1515
libst_menu.a: st_menu_styles.o st_menu.o
1616
ar rcs libst_menu.a st_menu_styles.o st_menu.o
1717

18-
demo: demo.c libst_menu.so
18+
demo: demo.c libst_menu.so libst_menu.a
1919
gcc demo.c -o demo libst_menu.a -Wall -lncursesw -lpanel -lunistring
2020
gcc demo.c -o demo_sl -Wall -lncursesw -lpanel -lunistring -L. -lst_menu
2121

22+
simple: simple.c libst_menu.a
23+
gcc simple.c -o simple libst_menu.a -Wall -lncursesw -lpanel -lunistring
24+
25+
2226
clean:
2327
rm st_menu_styles.o
2428
rm st_menu.o
2529
rm libst_menu.so
2630
rm libst_menu.a
2731
rm demo
2832
rm demo_sl
33+
rm simple

demo.c

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -321,17 +321,6 @@ main()
321321
{
322322
bool processed = false;
323323

324-
/*
325-
* test of possible shortcuts should be done before
326-
* st_menu_driver call. Here is test on F10 displayed on exit
327-
* field.
328-
*/
329-
if (c == KEY_F(10))
330-
{
331-
requested_exit = true;
332-
break;
333-
}
334-
335324
if (c == KEY_RESIZE)
336325
{
337326
int cursor_store[1024];
@@ -365,7 +354,7 @@ main()
365354
doupdate();
366355

367356
active_item = st_menu_selected_item(&activated);
368-
if (processed && active_item && activated)
357+
if (processed && activated)
369358
{
370359
if (active_item->code >= 70 && active_item->code <= 82)
371360
{
@@ -400,7 +389,7 @@ main()
400389
}
401390

402391
/* q is common command for exit (when it is not used like accelerator */
403-
if (c == 'q' && !activated)
392+
if (!processed && (c == 'q' || c == KEY_F(10)))
404393
{
405394
requested_exit = true;
406395
break;

doc/API.md

Lines changed: 158 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,168 @@ extern bool st_menu_reset_option(struct ST_MENU_STATE *mstate, int code, int opt
161161
configuration, and load state data.
162162
163163
* The selected menu item can be accessed via function `st_menu_selected_item`. When `activated` flag
164-
is true, then selected item was touched by mouse, accelerator or enter key.
164+
is true, then selected item was touched by mouse, accelerator or enter key. The activated flag will
165+
be false every time when no item is selected.
165166
166167
* the menu state can be updated by function `st_menu_set_option` or function `st_menu_reset_option`.
167168
168-
169+
## Example:
170+
```c
171+
#include <langinfo.h>
172+
#include <locale.h>
173+
#include <ncurses.h>
174+
#include <panel.h>
175+
#include <string.h>
176+
#include <unicase.h>
177+
178+
#include "st_menu.h"
179+
180+
/*
181+
* Read event. When event is mouse event, read mouse data
182+
*/
183+
static inline int
184+
get_event(MEVENT *mevent, bool *alt)
185+
{
186+
bool first_event = true;
187+
int c;
188+
189+
*alt = false;
190+
191+
repeat:
192+
193+
c = getch();
194+
195+
/*
196+
* Read mouse event when it is possible. Do it now, before st_meny_driver call,
197+
* as protection to unwanted multiple call of getmouse function. For one mouse
198+
* event, it returns data only once time.
199+
*/
200+
if (c == KEY_MOUSE)
201+
{
202+
int ok = getmouse(mevent);
203+
204+
if (ok != OK)
205+
goto repeat;
206+
}
207+
208+
if (c == ST_MENU_ESCAPE)
209+
{
210+
if (first_event)
211+
{
212+
first_event = false;
213+
goto repeat;
214+
}
215+
}
216+
217+
*alt = !first_event;
218+
219+
return c;
220+
}
221+
222+
/*
223+
* Application demo
224+
*/
225+
int
226+
main()
227+
{
228+
PANEL *mainpanel;
229+
ST_MENU_CONFIG config;
230+
ST_MENU *active_item;
231+
struct ST_MENU_STATE *mstate;
232+
bool activated;
233+
int c;
234+
MEVENT mevent;
235+
bool alt;
236+
237+
ST_MENU _file[] = {
238+
{"E~x~it", 34, "Alt-x"},
239+
{NULL, -1, NULL}
240+
};
241+
242+
ST_MENU menubar[] = {
243+
{"~F~ile", 61, NULL, 0, _file},
244+
{NULL, -1, NULL}
245+
};
246+
247+
setlocale(LC_ALL, "");
248+
249+
/* Don't use UTF when terminal doesn't use UTF */
250+
config.encoding = nl_langinfo(CODESET);
251+
config.language = uc_locale_language();
252+
config.force8bit = strcmp(config.encoding, "UTF-8") != 0;
253+
254+
initscr();
255+
start_color();
256+
clear();
257+
cbreak();
258+
noecho();
259+
keypad(stdscr, TRUE);
260+
261+
#ifdef NCURSES_EXT_FUNCS
262+
263+
set_escdelay(25);
264+
265+
#endif
266+
267+
refresh();
268+
269+
init_pair(1, COLOR_WHITE, COLOR_BLUE);
270+
271+
/* load style, possible alternatives: ST_MENU_STYLE_MC, ST_MENU_STYLE_DOS */
272+
st_menu_load_style(&config, ST_MENU_STYLE_VISION, 2);
169273
274+
mousemask(BUTTON1_PRESSED | BUTTON1_RELEASED, NULL);
275+
mouseinterval(0);
170276
171-
277+
/* prepare main window */
278+
wbkgd(stdscr, COLOR_PAIR(1));
279+
wrefresh(stdscr);
172280
281+
/*
282+
* main window should be panelized. Only panels can be
283+
* overlapped without unwanted effects.
284+
*/
285+
mainpanel = new_panel(stdscr);
286+
st_menu_set_desktop_panel(mainpanel);
173287
288+
/* prepare state variable for menubar */
289+
mstate = st_menu_new_menubar(&config, menubar);
290+
291+
/* post meubar (display it) */
292+
st_menu_post(mstate);
293+
294+
c = get_event(&mevent, &alt);
295+
296+
refresh();
297+
298+
while (1)
299+
{
300+
bool processed = false;
301+
302+
processed = st_menu_driver(mstate, c, alt, &mevent);
303+
304+
doupdate();
305+
306+
active_item = st_menu_selected_item(&activated);
307+
if (processed && activated)
308+
{
309+
/* here is processing of menucode related to Exit menu item */
310+
if (active_item->code == 34)
311+
break;
312+
}
313+
314+
if (!processed && alt && c == 'x')
315+
break;
316+
317+
/* get new event */
318+
c = get_event(&mevent, &alt);
319+
}
320+
321+
endwin();
322+
323+
st_menu_unpost(mstate, true);
324+
st_menu_delete(mstate);
325+
326+
return 0;
327+
}
328+
```

simple.c

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
#include <langinfo.h>
2+
#include <locale.h>
3+
#include <ncurses.h>
4+
#include <panel.h>
5+
#include <string.h>
6+
#include <unicase.h>
7+
8+
#include "st_menu.h"
9+
10+
/*
11+
* Read event. When event is mouse event, read mouse data
12+
*/
13+
static inline int
14+
get_event(MEVENT *mevent, bool *alt)
15+
{
16+
bool first_event = true;
17+
int c;
18+
19+
*alt = false;
20+
21+
repeat:
22+
23+
c = getch();
24+
25+
/*
26+
* Read mouse event when it is possible. Do it now, before st_meny_driver call,
27+
* as protection to unwanted multiple call of getmouse function. For one mouse
28+
* event, it returns data only once time.
29+
*/
30+
if (c == KEY_MOUSE)
31+
{
32+
int ok = getmouse(mevent);
33+
34+
if (ok != OK)
35+
goto repeat;
36+
}
37+
38+
if (c == ST_MENU_ESCAPE)
39+
{
40+
if (first_event)
41+
{
42+
first_event = false;
43+
goto repeat;
44+
}
45+
}
46+
47+
*alt = !first_event;
48+
49+
return c;
50+
}
51+
52+
/*
53+
* Application demo
54+
*/
55+
int
56+
main()
57+
{
58+
PANEL *mainpanel;
59+
ST_MENU_CONFIG config;
60+
ST_MENU *active_item;
61+
struct ST_MENU_STATE *mstate;
62+
bool activated;
63+
int c;
64+
MEVENT mevent;
65+
bool alt;
66+
67+
ST_MENU _file[] = {
68+
{"E~x~it", 34, "Alt-x"},
69+
{NULL, -1, NULL}
70+
};
71+
72+
ST_MENU menubar[] = {
73+
{"~F~ile", 61, NULL, 0, _file},
74+
{NULL, -1, NULL}
75+
};
76+
77+
setlocale(LC_ALL, "");
78+
79+
/* Don't use UTF when terminal doesn't use UTF */
80+
config.encoding = nl_langinfo(CODESET);
81+
config.language = uc_locale_language();
82+
config.force8bit = strcmp(config.encoding, "UTF-8") != 0;
83+
84+
initscr();
85+
start_color();
86+
clear();
87+
cbreak();
88+
noecho();
89+
keypad(stdscr, TRUE);
90+
91+
#ifdef NCURSES_EXT_FUNCS
92+
93+
set_escdelay(25);
94+
95+
#endif
96+
97+
refresh();
98+
99+
init_pair(1, COLOR_WHITE, COLOR_BLUE);
100+
101+
/* load style, possible alternatives: ST_MENU_STYLE_MC, ST_MENU_STYLE_DOS */
102+
st_menu_load_style(&config, ST_MENU_STYLE_VISION, 2);
103+
104+
mousemask(BUTTON1_PRESSED | BUTTON1_RELEASED, NULL);
105+
mouseinterval(0);
106+
107+
/* prepare main window */
108+
wbkgd(stdscr, COLOR_PAIR(1));
109+
wrefresh(stdscr);
110+
111+
/*
112+
* main window should be panelized. Only panels can be
113+
* overlapped without unwanted effects.
114+
*/
115+
mainpanel = new_panel(stdscr);
116+
st_menu_set_desktop_panel(mainpanel);
117+
118+
/* prepare state variable for menubar */
119+
mstate = st_menu_new_menubar(&config, menubar);
120+
121+
/* post meubar (display it) */
122+
st_menu_post(mstate);
123+
124+
c = get_event(&mevent, &alt);
125+
126+
refresh();
127+
128+
while (1)
129+
{
130+
bool processed = false;
131+
132+
processed = st_menu_driver(mstate, c, alt, &mevent);
133+
134+
doupdate();
135+
136+
active_item = st_menu_selected_item(&activated);
137+
if (processed && activated)
138+
{
139+
/* here is processing of menucode related to Exit menu item */
140+
if (active_item->code == 34)
141+
break;
142+
}
143+
144+
if (!processed && alt && c == 'x')
145+
break;
146+
147+
/* get new event */
148+
c = get_event(&mevent, &alt);
149+
}
150+
151+
endwin();
152+
153+
st_menu_unpost(mstate, true);
154+
st_menu_delete(mstate);
155+
156+
return 0;
157+
}

0 commit comments

Comments
 (0)