OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [scripts/] [kconfig/] [lxdialog/] [util.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *  util.c
3
 *
4
 *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5
 *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6
 *
7
 *  This program is free software; you can redistribute it and/or
8
 *  modify it under the terms of the GNU General Public License
9
 *  as published by the Free Software Foundation; either version 2
10
 *  of the License, or (at your option) any later version.
11
 *
12
 *  This program is distributed in the hope that it will be useful,
13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *  GNU General Public License for more details.
16
 *
17
 *  You should have received a copy of the GNU General Public License
18
 *  along with this program; if not, write to the Free Software
19
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
 */
21
 
22
#include "dialog.h"
23
 
24
struct dialog_info dlg;
25
 
26
static void set_mono_theme(void)
27
{
28
        dlg.screen.atr = A_NORMAL;
29
        dlg.shadow.atr = A_NORMAL;
30
        dlg.dialog.atr = A_NORMAL;
31
        dlg.title.atr = A_BOLD;
32
        dlg.border.atr = A_NORMAL;
33
        dlg.button_active.atr = A_REVERSE;
34
        dlg.button_inactive.atr = A_DIM;
35
        dlg.button_key_active.atr = A_REVERSE;
36
        dlg.button_key_inactive.atr = A_BOLD;
37
        dlg.button_label_active.atr = A_REVERSE;
38
        dlg.button_label_inactive.atr = A_NORMAL;
39
        dlg.inputbox.atr = A_NORMAL;
40
        dlg.inputbox_border.atr = A_NORMAL;
41
        dlg.searchbox.atr = A_NORMAL;
42
        dlg.searchbox_title.atr = A_BOLD;
43
        dlg.searchbox_border.atr = A_NORMAL;
44
        dlg.position_indicator.atr = A_BOLD;
45
        dlg.menubox.atr = A_NORMAL;
46
        dlg.menubox_border.atr = A_NORMAL;
47
        dlg.item.atr = A_NORMAL;
48
        dlg.item_selected.atr = A_REVERSE;
49
        dlg.tag.atr = A_BOLD;
50
        dlg.tag_selected.atr = A_REVERSE;
51
        dlg.tag_key.atr = A_BOLD;
52
        dlg.tag_key_selected.atr = A_REVERSE;
53
        dlg.check.atr = A_BOLD;
54
        dlg.check_selected.atr = A_REVERSE;
55
        dlg.uarrow.atr = A_BOLD;
56
        dlg.darrow.atr = A_BOLD;
57
}
58
 
59
#define DLG_COLOR(dialog, f, b, h) \
60
do {                               \
61
        dlg.dialog.fg = (f);       \
62
        dlg.dialog.bg = (b);       \
63
        dlg.dialog.hl = (h);       \
64
} while (0)
65
 
66
static void set_classic_theme(void)
67
{
68
        DLG_COLOR(screen,                COLOR_CYAN,   COLOR_BLUE,   true);
69
        DLG_COLOR(shadow,                COLOR_BLACK,  COLOR_BLACK,  true);
70
        DLG_COLOR(dialog,                COLOR_BLACK,  COLOR_WHITE,  false);
71
        DLG_COLOR(title,                 COLOR_YELLOW, COLOR_WHITE,  true);
72
        DLG_COLOR(border,                COLOR_WHITE,  COLOR_WHITE,  true);
73
        DLG_COLOR(button_active,         COLOR_WHITE,  COLOR_BLUE,   true);
74
        DLG_COLOR(button_inactive,       COLOR_BLACK,  COLOR_WHITE,  false);
75
        DLG_COLOR(button_key_active,     COLOR_WHITE,  COLOR_BLUE,   true);
76
        DLG_COLOR(button_key_inactive,   COLOR_RED,    COLOR_WHITE,  false);
77
        DLG_COLOR(button_label_active,   COLOR_YELLOW, COLOR_BLUE,   true);
78
        DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_WHITE,  true);
79
        DLG_COLOR(inputbox,              COLOR_BLACK,  COLOR_WHITE,  false);
80
        DLG_COLOR(inputbox_border,       COLOR_BLACK,  COLOR_WHITE,  false);
81
        DLG_COLOR(searchbox,             COLOR_BLACK,  COLOR_WHITE,  false);
82
        DLG_COLOR(searchbox_title,       COLOR_YELLOW, COLOR_WHITE,  true);
83
        DLG_COLOR(searchbox_border,      COLOR_WHITE,  COLOR_WHITE,  true);
84
        DLG_COLOR(position_indicator,    COLOR_YELLOW, COLOR_WHITE,  true);
85
        DLG_COLOR(menubox,               COLOR_BLACK,  COLOR_WHITE,  false);
86
        DLG_COLOR(menubox_border,        COLOR_WHITE,  COLOR_WHITE,  true);
87
        DLG_COLOR(item,                  COLOR_BLACK,  COLOR_WHITE,  false);
88
        DLG_COLOR(item_selected,         COLOR_WHITE,  COLOR_BLUE,   true);
89
        DLG_COLOR(tag,                   COLOR_YELLOW, COLOR_WHITE,  true);
90
        DLG_COLOR(tag_selected,          COLOR_YELLOW, COLOR_BLUE,   true);
91
        DLG_COLOR(tag_key,               COLOR_YELLOW, COLOR_WHITE,  true);
92
        DLG_COLOR(tag_key_selected,      COLOR_YELLOW, COLOR_BLUE,   true);
93
        DLG_COLOR(check,                 COLOR_BLACK,  COLOR_WHITE,  false);
94
        DLG_COLOR(check_selected,        COLOR_WHITE,  COLOR_BLUE,   true);
95
        DLG_COLOR(uarrow,                COLOR_GREEN,  COLOR_WHITE,  true);
96
        DLG_COLOR(darrow,                COLOR_GREEN,  COLOR_WHITE,  true);
97
}
98
 
99
static void set_blackbg_theme(void)
100
{
101
        DLG_COLOR(screen, COLOR_RED,   COLOR_BLACK, true);
102
        DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false);
103
        DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false);
104
        DLG_COLOR(title,  COLOR_RED,   COLOR_BLACK, false);
105
        DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true);
106
 
107
        DLG_COLOR(button_active,         COLOR_YELLOW, COLOR_RED,   false);
108
        DLG_COLOR(button_inactive,       COLOR_YELLOW, COLOR_BLACK, false);
109
        DLG_COLOR(button_key_active,     COLOR_YELLOW, COLOR_RED,   true);
110
        DLG_COLOR(button_key_inactive,   COLOR_RED,    COLOR_BLACK, false);
111
        DLG_COLOR(button_label_active,   COLOR_WHITE,  COLOR_RED,   false);
112
        DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_BLACK, true);
113
 
114
        DLG_COLOR(inputbox,         COLOR_YELLOW, COLOR_BLACK, false);
115
        DLG_COLOR(inputbox_border,  COLOR_YELLOW, COLOR_BLACK, false);
116
 
117
        DLG_COLOR(searchbox,        COLOR_YELLOW, COLOR_BLACK, false);
118
        DLG_COLOR(searchbox_title,  COLOR_YELLOW, COLOR_BLACK, true);
119
        DLG_COLOR(searchbox_border, COLOR_BLACK,  COLOR_BLACK, true);
120
 
121
        DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK,  false);
122
 
123
        DLG_COLOR(menubox,          COLOR_YELLOW, COLOR_BLACK, false);
124
        DLG_COLOR(menubox_border,   COLOR_BLACK,  COLOR_BLACK, true);
125
 
126
        DLG_COLOR(item,             COLOR_WHITE, COLOR_BLACK, false);
127
        DLG_COLOR(item_selected,    COLOR_WHITE, COLOR_RED,   false);
128
 
129
        DLG_COLOR(tag,              COLOR_RED,    COLOR_BLACK, false);
130
        DLG_COLOR(tag_selected,     COLOR_YELLOW, COLOR_RED,   true);
131
        DLG_COLOR(tag_key,          COLOR_RED,    COLOR_BLACK, false);
132
        DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED,   true);
133
 
134
        DLG_COLOR(check,            COLOR_YELLOW, COLOR_BLACK, false);
135
        DLG_COLOR(check_selected,   COLOR_YELLOW, COLOR_RED,   true);
136
 
137
        DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false);
138
        DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false);
139
}
140
 
141
static void set_bluetitle_theme(void)
142
{
143
        set_classic_theme();
144
        DLG_COLOR(title,               COLOR_BLUE,   COLOR_WHITE, true);
145
        DLG_COLOR(button_key_active,   COLOR_YELLOW, COLOR_BLUE,  true);
146
        DLG_COLOR(button_label_active, COLOR_WHITE,  COLOR_BLUE,  true);
147
        DLG_COLOR(searchbox_title,     COLOR_BLUE,   COLOR_WHITE, true);
148
        DLG_COLOR(position_indicator,  COLOR_BLUE,   COLOR_WHITE, true);
149
        DLG_COLOR(tag,                 COLOR_BLUE,   COLOR_WHITE, true);
150
        DLG_COLOR(tag_key,             COLOR_BLUE,   COLOR_WHITE, true);
151
 
152
}
153
 
154
/*
155
 * Select color theme
156
 */
157
static int set_theme(const char *theme)
158
{
159
        int use_color = 1;
160
        if (!theme)
161
                set_bluetitle_theme();
162
        else if (strcmp(theme, "classic") == 0)
163
                set_classic_theme();
164
        else if (strcmp(theme, "bluetitle") == 0)
165
                set_bluetitle_theme();
166
        else if (strcmp(theme, "blackbg") == 0)
167
                set_blackbg_theme();
168
        else if (strcmp(theme, "mono") == 0)
169
                use_color = 0;
170
 
171
        return use_color;
172
}
173
 
174
static void init_one_color(struct dialog_color *color)
175
{
176
        static int pair = 0;
177
 
178
        pair++;
179
        init_pair(pair, color->fg, color->bg);
180
        if (color->hl)
181
                color->atr = A_BOLD | COLOR_PAIR(pair);
182
        else
183
                color->atr = COLOR_PAIR(pair);
184
}
185
 
186
static void init_dialog_colors(void)
187
{
188
        init_one_color(&dlg.screen);
189
        init_one_color(&dlg.shadow);
190
        init_one_color(&dlg.dialog);
191
        init_one_color(&dlg.title);
192
        init_one_color(&dlg.border);
193
        init_one_color(&dlg.button_active);
194
        init_one_color(&dlg.button_inactive);
195
        init_one_color(&dlg.button_key_active);
196
        init_one_color(&dlg.button_key_inactive);
197
        init_one_color(&dlg.button_label_active);
198
        init_one_color(&dlg.button_label_inactive);
199
        init_one_color(&dlg.inputbox);
200
        init_one_color(&dlg.inputbox_border);
201
        init_one_color(&dlg.searchbox);
202
        init_one_color(&dlg.searchbox_title);
203
        init_one_color(&dlg.searchbox_border);
204
        init_one_color(&dlg.position_indicator);
205
        init_one_color(&dlg.menubox);
206
        init_one_color(&dlg.menubox_border);
207
        init_one_color(&dlg.item);
208
        init_one_color(&dlg.item_selected);
209
        init_one_color(&dlg.tag);
210
        init_one_color(&dlg.tag_selected);
211
        init_one_color(&dlg.tag_key);
212
        init_one_color(&dlg.tag_key_selected);
213
        init_one_color(&dlg.check);
214
        init_one_color(&dlg.check_selected);
215
        init_one_color(&dlg.uarrow);
216
        init_one_color(&dlg.darrow);
217
}
218
 
219
/*
220
 * Setup for color display
221
 */
222
static void color_setup(const char *theme)
223
{
224
        int use_color;
225
 
226
        use_color = set_theme(theme);
227
        if (use_color && has_colors()) {
228
                start_color();
229
                init_dialog_colors();
230
        } else
231
                set_mono_theme();
232
}
233
 
234
/*
235
 * Set window to attribute 'attr'
236
 */
237
void attr_clear(WINDOW * win, int height, int width, chtype attr)
238
{
239
        int i, j;
240
 
241
        wattrset(win, attr);
242
        for (i = 0; i < height; i++) {
243
                wmove(win, i, 0);
244
                for (j = 0; j < width; j++)
245
                        waddch(win, ' ');
246
        }
247
        touchwin(win);
248
}
249
 
250
void dialog_clear(void)
251
{
252
        attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
253
        /* Display background title if it exists ... - SLH */
254
        if (dlg.backtitle != NULL) {
255
                int i;
256
 
257
                wattrset(stdscr, dlg.screen.atr);
258
                mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle);
259
                wmove(stdscr, 1, 1);
260
                for (i = 1; i < COLS - 1; i++)
261
                        waddch(stdscr, ACS_HLINE);
262
        }
263
        wnoutrefresh(stdscr);
264
}
265
 
266
/*
267
 * Do some initialization for dialog
268
 */
269
void init_dialog(const char *backtitle)
270
{
271
        dlg.backtitle = backtitle;
272
        color_setup(getenv("MENUCONFIG_COLOR"));
273
}
274
 
275
void set_dialog_backtitle(const char *backtitle)
276
{
277
        dlg.backtitle = backtitle;
278
}
279
 
280
void reset_dialog(void)
281
{
282
        initscr();              /* Init curses */
283
        keypad(stdscr, TRUE);
284
        cbreak();
285
        noecho();
286
        dialog_clear();
287
}
288
 
289
/*
290
 * End using dialog functions.
291
 */
292
void end_dialog(void)
293
{
294
        endwin();
295
}
296
 
297
/* Print the title of the dialog. Center the title and truncate
298
 * tile if wider than dialog (- 2 chars).
299
 **/
300
void print_title(WINDOW *dialog, const char *title, int width)
301
{
302
        if (title) {
303
                int tlen = MIN(width - 2, strlen(title));
304
                wattrset(dialog, dlg.title.atr);
305
                mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
306
                mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
307
                waddch(dialog, ' ');
308
        }
309
}
310
 
311
/*
312
 * Print a string of text in a window, automatically wrap around to the
313
 * next line if the string is too long to fit on one line. Newline
314
 * characters '\n' are replaced by spaces.  We start on a new line
315
 * if there is no room for at least 4 nonblanks following a double-space.
316
 */
317
void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
318
{
319
        int newl, cur_x, cur_y;
320
        int i, prompt_len, room, wlen;
321
        char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
322
 
323
        strcpy(tempstr, prompt);
324
 
325
        prompt_len = strlen(tempstr);
326
 
327
        /*
328
         * Remove newlines
329
         */
330
        for (i = 0; i < prompt_len; i++) {
331
                if (tempstr[i] == '\n')
332
                        tempstr[i] = ' ';
333
        }
334
 
335
        if (prompt_len <= width - x * 2) {      /* If prompt is short */
336
                wmove(win, y, (width - prompt_len) / 2);
337
                waddstr(win, tempstr);
338
        } else {
339
                cur_x = x;
340
                cur_y = y;
341
                newl = 1;
342
                word = tempstr;
343
                while (word && *word) {
344
                        sp = strchr(word, ' ');
345
                        if (sp)
346
                                *sp++ = 0;
347
 
348
                        /* Wrap to next line if either the word does not fit,
349
                           or it is the first word of a new sentence, and it is
350
                           short, and the next word does not fit. */
351
                        room = width - cur_x;
352
                        wlen = strlen(word);
353
                        if (wlen > room ||
354
                            (newl && wlen < 4 && sp
355
                             && wlen + 1 + strlen(sp) > room
356
                             && (!(sp2 = strchr(sp, ' '))
357
                                 || wlen + 1 + (sp2 - sp) > room))) {
358
                                cur_y++;
359
                                cur_x = x;
360
                        }
361
                        wmove(win, cur_y, cur_x);
362
                        waddstr(win, word);
363
                        getyx(win, cur_y, cur_x);
364
                        cur_x++;
365
                        if (sp && *sp == ' ') {
366
                                cur_x++;        /* double space */
367
                                while (*++sp == ' ') ;
368
                                newl = 1;
369
                        } else
370
                                newl = 0;
371
                        word = sp;
372
                }
373
        }
374
}
375
 
376
/*
377
 * Print a button
378
 */
379
void print_button(WINDOW * win, const char *label, int y, int x, int selected)
380
{
381
        int i, temp;
382
 
383
        wmove(win, y, x);
384
        wattrset(win, selected ? dlg.button_active.atr
385
                 : dlg.button_inactive.atr);
386
        waddstr(win, "<");
387
        temp = strspn(label, " ");
388
        label += temp;
389
        wattrset(win, selected ? dlg.button_label_active.atr
390
                 : dlg.button_label_inactive.atr);
391
        for (i = 0; i < temp; i++)
392
                waddch(win, ' ');
393
        wattrset(win, selected ? dlg.button_key_active.atr
394
                 : dlg.button_key_inactive.atr);
395
        waddch(win, label[0]);
396
        wattrset(win, selected ? dlg.button_label_active.atr
397
                 : dlg.button_label_inactive.atr);
398
        waddstr(win, (char *)label + 1);
399
        wattrset(win, selected ? dlg.button_active.atr
400
                 : dlg.button_inactive.atr);
401
        waddstr(win, ">");
402
        wmove(win, y, x + temp + 1);
403
}
404
 
405
/*
406
 * Draw a rectangular box with line drawing characters
407
 */
408
void
409
draw_box(WINDOW * win, int y, int x, int height, int width,
410
         chtype box, chtype border)
411
{
412
        int i, j;
413
 
414
        wattrset(win, 0);
415
        for (i = 0; i < height; i++) {
416
                wmove(win, y + i, x);
417
                for (j = 0; j < width; j++)
418
                        if (!i && !j)
419
                                waddch(win, border | ACS_ULCORNER);
420
                        else if (i == height - 1 && !j)
421
                                waddch(win, border | ACS_LLCORNER);
422
                        else if (!i && j == width - 1)
423
                                waddch(win, box | ACS_URCORNER);
424
                        else if (i == height - 1 && j == width - 1)
425
                                waddch(win, box | ACS_LRCORNER);
426
                        else if (!i)
427
                                waddch(win, border | ACS_HLINE);
428
                        else if (i == height - 1)
429
                                waddch(win, box | ACS_HLINE);
430
                        else if (!j)
431
                                waddch(win, border | ACS_VLINE);
432
                        else if (j == width - 1)
433
                                waddch(win, box | ACS_VLINE);
434
                        else
435
                                waddch(win, box | ' ');
436
        }
437
}
438
 
439
/*
440
 * Draw shadows along the right and bottom edge to give a more 3D look
441
 * to the boxes
442
 */
443
void draw_shadow(WINDOW * win, int y, int x, int height, int width)
444
{
445
        int i;
446
 
447
        if (has_colors()) {     /* Whether terminal supports color? */
448
                wattrset(win, dlg.shadow.atr);
449
                wmove(win, y + height, x + 2);
450
                for (i = 0; i < width; i++)
451
                        waddch(win, winch(win) & A_CHARTEXT);
452
                for (i = y + 1; i < y + height + 1; i++) {
453
                        wmove(win, i, x + width);
454
                        waddch(win, winch(win) & A_CHARTEXT);
455
                        waddch(win, winch(win) & A_CHARTEXT);
456
                }
457
                wnoutrefresh(win);
458
        }
459
}
460
 
461
/*
462
 *  Return the position of the first alphabetic character in a string.
463
 */
464
int first_alpha(const char *string, const char *exempt)
465
{
466
        int i, in_paren = 0, c;
467
 
468
        for (i = 0; i < strlen(string); i++) {
469
                c = tolower(string[i]);
470
 
471
                if (strchr("<[(", c))
472
                        ++in_paren;
473
                if (strchr(">])", c) && in_paren > 0)
474
                        --in_paren;
475
 
476
                if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0)
477
                        return i;
478
        }
479
 
480
        return 0;
481
}
482
 
483
/*
484
 * ncurses uses ESC to detect escaped char sequences. This resutl in
485
 * a small timeout before ESC is actually delivered to the application.
486
 * lxdialog suggest <ESC> <ESC> which is correctly translated to two
487
 * times esc. But then we need to ignore the second esc to avoid stepping
488
 * out one menu too much. Filter away all escaped key sequences since
489
 * keypad(FALSE) turn off ncurses support for escape sequences - and thats
490
 * needed to make notimeout() do as expected.
491
 */
492
int on_key_esc(WINDOW *win)
493
{
494
        int key;
495
        int key2;
496
        int key3;
497
 
498
        nodelay(win, TRUE);
499
        keypad(win, FALSE);
500
        key = wgetch(win);
501
        key2 = wgetch(win);
502
        do {
503
                key3 = wgetch(win);
504
        } while (key3 != ERR);
505
        nodelay(win, FALSE);
506
        keypad(win, TRUE);
507
        if (key == KEY_ESC && key2 == ERR)
508
                return KEY_ESC;
509
        else if (key != ERR && key != KEY_ESC && key2 == ERR)
510
                ungetch(key);
511
 
512
        return -1;
513
}
514
 
515
/* redraw screen in new size */
516
int on_key_resize(void)
517
{
518
        dialog_clear();
519
        return KEY_RESIZE;
520
}
521
 
522
struct dialog_list *item_cur;
523
struct dialog_list item_nil;
524
struct dialog_list *item_head;
525
 
526
void item_reset(void)
527
{
528
        struct dialog_list *p, *next;
529
 
530
        for (p = item_head; p; p = next) {
531
                next = p->next;
532
                free(p);
533
        }
534
        item_head = NULL;
535
        item_cur = &item_nil;
536
}
537
 
538
void item_make(const char *fmt, ...)
539
{
540
        va_list ap;
541
        struct dialog_list *p = malloc(sizeof(*p));
542
 
543
        if (item_head)
544
                item_cur->next = p;
545
        else
546
                item_head = p;
547
        item_cur = p;
548
        memset(p, 0, sizeof(*p));
549
 
550
        va_start(ap, fmt);
551
        vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap);
552
        va_end(ap);
553
}
554
 
555
void item_add_str(const char *fmt, ...)
556
{
557
        va_list ap;
558
        size_t avail;
559
 
560
        avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
561
 
562
        va_start(ap, fmt);
563
        vsnprintf(item_cur->node.str + strlen(item_cur->node.str),
564
                  avail, fmt, ap);
565
        item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0';
566
        va_end(ap);
567
}
568
 
569
void item_set_tag(char tag)
570
{
571
        item_cur->node.tag = tag;
572
}
573
void item_set_data(void *ptr)
574
{
575
        item_cur->node.data = ptr;
576
}
577
 
578
void item_set_selected(int val)
579
{
580
        item_cur->node.selected = val;
581
}
582
 
583
int item_activate_selected(void)
584
{
585
        item_foreach()
586
                if (item_is_selected())
587
                        return 1;
588
        return 0;
589
}
590
 
591
void *item_data(void)
592
{
593
        return item_cur->node.data;
594
}
595
 
596
char item_tag(void)
597
{
598
        return item_cur->node.tag;
599
}
600
 
601
int item_count(void)
602
{
603
        int n = 0;
604
        struct dialog_list *p;
605
 
606
        for (p = item_head; p; p = p->next)
607
                n++;
608
        return n;
609
}
610
 
611
void item_set(int n)
612
{
613
        int i = 0;
614
        item_foreach()
615
                if (i++ == n)
616
                        return;
617
}
618
 
619
int item_n(void)
620
{
621
        int n = 0;
622
        struct dialog_list *p;
623
 
624
        for (p = item_head; p; p = p->next) {
625
                if (p == item_cur)
626
                        return n;
627
                n++;
628
        }
629
        return 0;
630
}
631
 
632
const char *item_str(void)
633
{
634
        return item_cur->node.str;
635
}
636
 
637
int item_is_selected(void)
638
{
639
        return (item_cur->node.selected != 0);
640
}
641
 
642
int item_is_tag(char tag)
643
{
644
        return (item_cur->node.tag == tag);
645
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.