18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * util.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) 68c2ecf20Sopenharmony_ci * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <stdarg.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "dialog.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* Needed in signal handler in mconf.c */ 148c2ecf20Sopenharmony_ciint saved_x, saved_y; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistruct dialog_info dlg; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistatic void set_mono_theme(void) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci dlg.screen.atr = A_NORMAL; 218c2ecf20Sopenharmony_ci dlg.shadow.atr = A_NORMAL; 228c2ecf20Sopenharmony_ci dlg.dialog.atr = A_NORMAL; 238c2ecf20Sopenharmony_ci dlg.title.atr = A_BOLD; 248c2ecf20Sopenharmony_ci dlg.border.atr = A_NORMAL; 258c2ecf20Sopenharmony_ci dlg.button_active.atr = A_REVERSE; 268c2ecf20Sopenharmony_ci dlg.button_inactive.atr = A_DIM; 278c2ecf20Sopenharmony_ci dlg.button_key_active.atr = A_REVERSE; 288c2ecf20Sopenharmony_ci dlg.button_key_inactive.atr = A_BOLD; 298c2ecf20Sopenharmony_ci dlg.button_label_active.atr = A_REVERSE; 308c2ecf20Sopenharmony_ci dlg.button_label_inactive.atr = A_NORMAL; 318c2ecf20Sopenharmony_ci dlg.inputbox.atr = A_NORMAL; 328c2ecf20Sopenharmony_ci dlg.inputbox_border.atr = A_NORMAL; 338c2ecf20Sopenharmony_ci dlg.searchbox.atr = A_NORMAL; 348c2ecf20Sopenharmony_ci dlg.searchbox_title.atr = A_BOLD; 358c2ecf20Sopenharmony_ci dlg.searchbox_border.atr = A_NORMAL; 368c2ecf20Sopenharmony_ci dlg.position_indicator.atr = A_BOLD; 378c2ecf20Sopenharmony_ci dlg.menubox.atr = A_NORMAL; 388c2ecf20Sopenharmony_ci dlg.menubox_border.atr = A_NORMAL; 398c2ecf20Sopenharmony_ci dlg.item.atr = A_NORMAL; 408c2ecf20Sopenharmony_ci dlg.item_selected.atr = A_REVERSE; 418c2ecf20Sopenharmony_ci dlg.tag.atr = A_BOLD; 428c2ecf20Sopenharmony_ci dlg.tag_selected.atr = A_REVERSE; 438c2ecf20Sopenharmony_ci dlg.tag_key.atr = A_BOLD; 448c2ecf20Sopenharmony_ci dlg.tag_key_selected.atr = A_REVERSE; 458c2ecf20Sopenharmony_ci dlg.check.atr = A_BOLD; 468c2ecf20Sopenharmony_ci dlg.check_selected.atr = A_REVERSE; 478c2ecf20Sopenharmony_ci dlg.uarrow.atr = A_BOLD; 488c2ecf20Sopenharmony_ci dlg.darrow.atr = A_BOLD; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#define DLG_COLOR(dialog, f, b, h) \ 528c2ecf20Sopenharmony_cido { \ 538c2ecf20Sopenharmony_ci dlg.dialog.fg = (f); \ 548c2ecf20Sopenharmony_ci dlg.dialog.bg = (b); \ 558c2ecf20Sopenharmony_ci dlg.dialog.hl = (h); \ 568c2ecf20Sopenharmony_ci} while (0) 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistatic void set_classic_theme(void) 598c2ecf20Sopenharmony_ci{ 608c2ecf20Sopenharmony_ci DLG_COLOR(screen, COLOR_CYAN, COLOR_BLUE, true); 618c2ecf20Sopenharmony_ci DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, true); 628c2ecf20Sopenharmony_ci DLG_COLOR(dialog, COLOR_BLACK, COLOR_WHITE, false); 638c2ecf20Sopenharmony_ci DLG_COLOR(title, COLOR_YELLOW, COLOR_WHITE, true); 648c2ecf20Sopenharmony_ci DLG_COLOR(border, COLOR_WHITE, COLOR_WHITE, true); 658c2ecf20Sopenharmony_ci DLG_COLOR(button_active, COLOR_WHITE, COLOR_BLUE, true); 668c2ecf20Sopenharmony_ci DLG_COLOR(button_inactive, COLOR_BLACK, COLOR_WHITE, false); 678c2ecf20Sopenharmony_ci DLG_COLOR(button_key_active, COLOR_WHITE, COLOR_BLUE, true); 688c2ecf20Sopenharmony_ci DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_WHITE, false); 698c2ecf20Sopenharmony_ci DLG_COLOR(button_label_active, COLOR_YELLOW, COLOR_BLUE, true); 708c2ecf20Sopenharmony_ci DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true); 718c2ecf20Sopenharmony_ci DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false); 728c2ecf20Sopenharmony_ci DLG_COLOR(inputbox_border, COLOR_BLACK, COLOR_WHITE, false); 738c2ecf20Sopenharmony_ci DLG_COLOR(searchbox, COLOR_BLACK, COLOR_WHITE, false); 748c2ecf20Sopenharmony_ci DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_WHITE, true); 758c2ecf20Sopenharmony_ci DLG_COLOR(searchbox_border, COLOR_WHITE, COLOR_WHITE, true); 768c2ecf20Sopenharmony_ci DLG_COLOR(position_indicator, COLOR_YELLOW, COLOR_WHITE, true); 778c2ecf20Sopenharmony_ci DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false); 788c2ecf20Sopenharmony_ci DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true); 798c2ecf20Sopenharmony_ci DLG_COLOR(item, COLOR_BLACK, COLOR_WHITE, false); 808c2ecf20Sopenharmony_ci DLG_COLOR(item_selected, COLOR_WHITE, COLOR_BLUE, true); 818c2ecf20Sopenharmony_ci DLG_COLOR(tag, COLOR_YELLOW, COLOR_WHITE, true); 828c2ecf20Sopenharmony_ci DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_BLUE, true); 838c2ecf20Sopenharmony_ci DLG_COLOR(tag_key, COLOR_YELLOW, COLOR_WHITE, true); 848c2ecf20Sopenharmony_ci DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_BLUE, true); 858c2ecf20Sopenharmony_ci DLG_COLOR(check, COLOR_BLACK, COLOR_WHITE, false); 868c2ecf20Sopenharmony_ci DLG_COLOR(check_selected, COLOR_WHITE, COLOR_BLUE, true); 878c2ecf20Sopenharmony_ci DLG_COLOR(uarrow, COLOR_GREEN, COLOR_WHITE, true); 888c2ecf20Sopenharmony_ci DLG_COLOR(darrow, COLOR_GREEN, COLOR_WHITE, true); 898c2ecf20Sopenharmony_ci} 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistatic void set_blackbg_theme(void) 928c2ecf20Sopenharmony_ci{ 938c2ecf20Sopenharmony_ci DLG_COLOR(screen, COLOR_RED, COLOR_BLACK, true); 948c2ecf20Sopenharmony_ci DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false); 958c2ecf20Sopenharmony_ci DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false); 968c2ecf20Sopenharmony_ci DLG_COLOR(title, COLOR_RED, COLOR_BLACK, false); 978c2ecf20Sopenharmony_ci DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci DLG_COLOR(button_active, COLOR_YELLOW, COLOR_RED, false); 1008c2ecf20Sopenharmony_ci DLG_COLOR(button_inactive, COLOR_YELLOW, COLOR_BLACK, false); 1018c2ecf20Sopenharmony_ci DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_RED, true); 1028c2ecf20Sopenharmony_ci DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false); 1038c2ecf20Sopenharmony_ci DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_RED, false); 1048c2ecf20Sopenharmony_ci DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_BLACK, true); 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci DLG_COLOR(inputbox, COLOR_YELLOW, COLOR_BLACK, false); 1078c2ecf20Sopenharmony_ci DLG_COLOR(inputbox_border, COLOR_YELLOW, COLOR_BLACK, false); 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci DLG_COLOR(searchbox, COLOR_YELLOW, COLOR_BLACK, false); 1108c2ecf20Sopenharmony_ci DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_BLACK, true); 1118c2ecf20Sopenharmony_ci DLG_COLOR(searchbox_border, COLOR_BLACK, COLOR_BLACK, true); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK, false); 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci DLG_COLOR(menubox, COLOR_YELLOW, COLOR_BLACK, false); 1168c2ecf20Sopenharmony_ci DLG_COLOR(menubox_border, COLOR_BLACK, COLOR_BLACK, true); 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci DLG_COLOR(item, COLOR_WHITE, COLOR_BLACK, false); 1198c2ecf20Sopenharmony_ci DLG_COLOR(item_selected, COLOR_WHITE, COLOR_RED, false); 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci DLG_COLOR(tag, COLOR_RED, COLOR_BLACK, false); 1228c2ecf20Sopenharmony_ci DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_RED, true); 1238c2ecf20Sopenharmony_ci DLG_COLOR(tag_key, COLOR_RED, COLOR_BLACK, false); 1248c2ecf20Sopenharmony_ci DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED, true); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci DLG_COLOR(check, COLOR_YELLOW, COLOR_BLACK, false); 1278c2ecf20Sopenharmony_ci DLG_COLOR(check_selected, COLOR_YELLOW, COLOR_RED, true); 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false); 1308c2ecf20Sopenharmony_ci DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false); 1318c2ecf20Sopenharmony_ci} 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic void set_bluetitle_theme(void) 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci set_classic_theme(); 1368c2ecf20Sopenharmony_ci DLG_COLOR(title, COLOR_BLUE, COLOR_WHITE, true); 1378c2ecf20Sopenharmony_ci DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true); 1388c2ecf20Sopenharmony_ci DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_BLUE, true); 1398c2ecf20Sopenharmony_ci DLG_COLOR(searchbox_title, COLOR_BLUE, COLOR_WHITE, true); 1408c2ecf20Sopenharmony_ci DLG_COLOR(position_indicator, COLOR_BLUE, COLOR_WHITE, true); 1418c2ecf20Sopenharmony_ci DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true); 1428c2ecf20Sopenharmony_ci DLG_COLOR(tag_key, COLOR_BLUE, COLOR_WHITE, true); 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci/* 1478c2ecf20Sopenharmony_ci * Select color theme 1488c2ecf20Sopenharmony_ci */ 1498c2ecf20Sopenharmony_cistatic int set_theme(const char *theme) 1508c2ecf20Sopenharmony_ci{ 1518c2ecf20Sopenharmony_ci int use_color = 1; 1528c2ecf20Sopenharmony_ci if (!theme) 1538c2ecf20Sopenharmony_ci set_bluetitle_theme(); 1548c2ecf20Sopenharmony_ci else if (strcmp(theme, "classic") == 0) 1558c2ecf20Sopenharmony_ci set_classic_theme(); 1568c2ecf20Sopenharmony_ci else if (strcmp(theme, "bluetitle") == 0) 1578c2ecf20Sopenharmony_ci set_bluetitle_theme(); 1588c2ecf20Sopenharmony_ci else if (strcmp(theme, "blackbg") == 0) 1598c2ecf20Sopenharmony_ci set_blackbg_theme(); 1608c2ecf20Sopenharmony_ci else if (strcmp(theme, "mono") == 0) 1618c2ecf20Sopenharmony_ci use_color = 0; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci return use_color; 1648c2ecf20Sopenharmony_ci} 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_cistatic void init_one_color(struct dialog_color *color) 1678c2ecf20Sopenharmony_ci{ 1688c2ecf20Sopenharmony_ci static int pair = 0; 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci pair++; 1718c2ecf20Sopenharmony_ci init_pair(pair, color->fg, color->bg); 1728c2ecf20Sopenharmony_ci if (color->hl) 1738c2ecf20Sopenharmony_ci color->atr = A_BOLD | COLOR_PAIR(pair); 1748c2ecf20Sopenharmony_ci else 1758c2ecf20Sopenharmony_ci color->atr = COLOR_PAIR(pair); 1768c2ecf20Sopenharmony_ci} 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_cistatic void init_dialog_colors(void) 1798c2ecf20Sopenharmony_ci{ 1808c2ecf20Sopenharmony_ci init_one_color(&dlg.screen); 1818c2ecf20Sopenharmony_ci init_one_color(&dlg.shadow); 1828c2ecf20Sopenharmony_ci init_one_color(&dlg.dialog); 1838c2ecf20Sopenharmony_ci init_one_color(&dlg.title); 1848c2ecf20Sopenharmony_ci init_one_color(&dlg.border); 1858c2ecf20Sopenharmony_ci init_one_color(&dlg.button_active); 1868c2ecf20Sopenharmony_ci init_one_color(&dlg.button_inactive); 1878c2ecf20Sopenharmony_ci init_one_color(&dlg.button_key_active); 1888c2ecf20Sopenharmony_ci init_one_color(&dlg.button_key_inactive); 1898c2ecf20Sopenharmony_ci init_one_color(&dlg.button_label_active); 1908c2ecf20Sopenharmony_ci init_one_color(&dlg.button_label_inactive); 1918c2ecf20Sopenharmony_ci init_one_color(&dlg.inputbox); 1928c2ecf20Sopenharmony_ci init_one_color(&dlg.inputbox_border); 1938c2ecf20Sopenharmony_ci init_one_color(&dlg.searchbox); 1948c2ecf20Sopenharmony_ci init_one_color(&dlg.searchbox_title); 1958c2ecf20Sopenharmony_ci init_one_color(&dlg.searchbox_border); 1968c2ecf20Sopenharmony_ci init_one_color(&dlg.position_indicator); 1978c2ecf20Sopenharmony_ci init_one_color(&dlg.menubox); 1988c2ecf20Sopenharmony_ci init_one_color(&dlg.menubox_border); 1998c2ecf20Sopenharmony_ci init_one_color(&dlg.item); 2008c2ecf20Sopenharmony_ci init_one_color(&dlg.item_selected); 2018c2ecf20Sopenharmony_ci init_one_color(&dlg.tag); 2028c2ecf20Sopenharmony_ci init_one_color(&dlg.tag_selected); 2038c2ecf20Sopenharmony_ci init_one_color(&dlg.tag_key); 2048c2ecf20Sopenharmony_ci init_one_color(&dlg.tag_key_selected); 2058c2ecf20Sopenharmony_ci init_one_color(&dlg.check); 2068c2ecf20Sopenharmony_ci init_one_color(&dlg.check_selected); 2078c2ecf20Sopenharmony_ci init_one_color(&dlg.uarrow); 2088c2ecf20Sopenharmony_ci init_one_color(&dlg.darrow); 2098c2ecf20Sopenharmony_ci} 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci/* 2128c2ecf20Sopenharmony_ci * Setup for color display 2138c2ecf20Sopenharmony_ci */ 2148c2ecf20Sopenharmony_cistatic void color_setup(const char *theme) 2158c2ecf20Sopenharmony_ci{ 2168c2ecf20Sopenharmony_ci int use_color; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci use_color = set_theme(theme); 2198c2ecf20Sopenharmony_ci if (use_color && has_colors()) { 2208c2ecf20Sopenharmony_ci start_color(); 2218c2ecf20Sopenharmony_ci init_dialog_colors(); 2228c2ecf20Sopenharmony_ci } else 2238c2ecf20Sopenharmony_ci set_mono_theme(); 2248c2ecf20Sopenharmony_ci} 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci/* 2278c2ecf20Sopenharmony_ci * Set window to attribute 'attr' 2288c2ecf20Sopenharmony_ci */ 2298c2ecf20Sopenharmony_civoid attr_clear(WINDOW * win, int height, int width, chtype attr) 2308c2ecf20Sopenharmony_ci{ 2318c2ecf20Sopenharmony_ci int i, j; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci wattrset(win, attr); 2348c2ecf20Sopenharmony_ci for (i = 0; i < height; i++) { 2358c2ecf20Sopenharmony_ci wmove(win, i, 0); 2368c2ecf20Sopenharmony_ci for (j = 0; j < width; j++) 2378c2ecf20Sopenharmony_ci waddch(win, ' '); 2388c2ecf20Sopenharmony_ci } 2398c2ecf20Sopenharmony_ci touchwin(win); 2408c2ecf20Sopenharmony_ci} 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_civoid dialog_clear(void) 2438c2ecf20Sopenharmony_ci{ 2448c2ecf20Sopenharmony_ci int lines, columns; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci lines = getmaxy(stdscr); 2478c2ecf20Sopenharmony_ci columns = getmaxx(stdscr); 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci attr_clear(stdscr, lines, columns, dlg.screen.atr); 2508c2ecf20Sopenharmony_ci /* Display background title if it exists ... - SLH */ 2518c2ecf20Sopenharmony_ci if (dlg.backtitle != NULL) { 2528c2ecf20Sopenharmony_ci int i, len = 0, skip = 0; 2538c2ecf20Sopenharmony_ci struct subtitle_list *pos; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci wattrset(stdscr, dlg.screen.atr); 2568c2ecf20Sopenharmony_ci mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle); 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { 2598c2ecf20Sopenharmony_ci /* 3 is for the arrow and spaces */ 2608c2ecf20Sopenharmony_ci len += strlen(pos->text) + 3; 2618c2ecf20Sopenharmony_ci } 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci wmove(stdscr, 1, 1); 2648c2ecf20Sopenharmony_ci if (len > columns - 2) { 2658c2ecf20Sopenharmony_ci const char *ellipsis = "[...] "; 2668c2ecf20Sopenharmony_ci waddstr(stdscr, ellipsis); 2678c2ecf20Sopenharmony_ci skip = len - (columns - 2 - strlen(ellipsis)); 2688c2ecf20Sopenharmony_ci } 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { 2718c2ecf20Sopenharmony_ci if (skip == 0) 2728c2ecf20Sopenharmony_ci waddch(stdscr, ACS_RARROW); 2738c2ecf20Sopenharmony_ci else 2748c2ecf20Sopenharmony_ci skip--; 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci if (skip == 0) 2778c2ecf20Sopenharmony_ci waddch(stdscr, ' '); 2788c2ecf20Sopenharmony_ci else 2798c2ecf20Sopenharmony_ci skip--; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci if (skip < strlen(pos->text)) { 2828c2ecf20Sopenharmony_ci waddstr(stdscr, pos->text + skip); 2838c2ecf20Sopenharmony_ci skip = 0; 2848c2ecf20Sopenharmony_ci } else 2858c2ecf20Sopenharmony_ci skip -= strlen(pos->text); 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci if (skip == 0) 2888c2ecf20Sopenharmony_ci waddch(stdscr, ' '); 2898c2ecf20Sopenharmony_ci else 2908c2ecf20Sopenharmony_ci skip--; 2918c2ecf20Sopenharmony_ci } 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci for (i = len + 1; i < columns - 1; i++) 2948c2ecf20Sopenharmony_ci waddch(stdscr, ACS_HLINE); 2958c2ecf20Sopenharmony_ci } 2968c2ecf20Sopenharmony_ci wnoutrefresh(stdscr); 2978c2ecf20Sopenharmony_ci} 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci/* 3008c2ecf20Sopenharmony_ci * Do some initialization for dialog 3018c2ecf20Sopenharmony_ci */ 3028c2ecf20Sopenharmony_ciint init_dialog(const char *backtitle) 3038c2ecf20Sopenharmony_ci{ 3048c2ecf20Sopenharmony_ci int height, width; 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci initscr(); /* Init curses */ 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci /* Get current cursor position for signal handler in mconf.c */ 3098c2ecf20Sopenharmony_ci getyx(stdscr, saved_y, saved_x); 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci getmaxyx(stdscr, height, width); 3128c2ecf20Sopenharmony_ci if (height < WINDOW_HEIGTH_MIN || width < WINDOW_WIDTH_MIN) { 3138c2ecf20Sopenharmony_ci endwin(); 3148c2ecf20Sopenharmony_ci return -ERRDISPLAYTOOSMALL; 3158c2ecf20Sopenharmony_ci } 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci dlg.backtitle = backtitle; 3188c2ecf20Sopenharmony_ci color_setup(getenv("MENUCONFIG_COLOR")); 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci keypad(stdscr, TRUE); 3218c2ecf20Sopenharmony_ci cbreak(); 3228c2ecf20Sopenharmony_ci noecho(); 3238c2ecf20Sopenharmony_ci dialog_clear(); 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci return 0; 3268c2ecf20Sopenharmony_ci} 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_civoid set_dialog_backtitle(const char *backtitle) 3298c2ecf20Sopenharmony_ci{ 3308c2ecf20Sopenharmony_ci dlg.backtitle = backtitle; 3318c2ecf20Sopenharmony_ci} 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_civoid set_dialog_subtitles(struct subtitle_list *subtitles) 3348c2ecf20Sopenharmony_ci{ 3358c2ecf20Sopenharmony_ci dlg.subtitles = subtitles; 3368c2ecf20Sopenharmony_ci} 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci/* 3398c2ecf20Sopenharmony_ci * End using dialog functions. 3408c2ecf20Sopenharmony_ci */ 3418c2ecf20Sopenharmony_civoid end_dialog(int x, int y) 3428c2ecf20Sopenharmony_ci{ 3438c2ecf20Sopenharmony_ci /* move cursor back to original position */ 3448c2ecf20Sopenharmony_ci move(y, x); 3458c2ecf20Sopenharmony_ci refresh(); 3468c2ecf20Sopenharmony_ci endwin(); 3478c2ecf20Sopenharmony_ci} 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci/* Print the title of the dialog. Center the title and truncate 3508c2ecf20Sopenharmony_ci * tile if wider than dialog (- 2 chars). 3518c2ecf20Sopenharmony_ci **/ 3528c2ecf20Sopenharmony_civoid print_title(WINDOW *dialog, const char *title, int width) 3538c2ecf20Sopenharmony_ci{ 3548c2ecf20Sopenharmony_ci if (title) { 3558c2ecf20Sopenharmony_ci int tlen = MIN(width - 2, strlen(title)); 3568c2ecf20Sopenharmony_ci wattrset(dialog, dlg.title.atr); 3578c2ecf20Sopenharmony_ci mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' '); 3588c2ecf20Sopenharmony_ci mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen); 3598c2ecf20Sopenharmony_ci waddch(dialog, ' '); 3608c2ecf20Sopenharmony_ci } 3618c2ecf20Sopenharmony_ci} 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci/* 3648c2ecf20Sopenharmony_ci * Print a string of text in a window, automatically wrap around to the 3658c2ecf20Sopenharmony_ci * next line if the string is too long to fit on one line. Newline 3668c2ecf20Sopenharmony_ci * characters '\n' are propperly processed. We start on a new line 3678c2ecf20Sopenharmony_ci * if there is no room for at least 4 nonblanks following a double-space. 3688c2ecf20Sopenharmony_ci */ 3698c2ecf20Sopenharmony_civoid print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x) 3708c2ecf20Sopenharmony_ci{ 3718c2ecf20Sopenharmony_ci int newl, cur_x, cur_y; 3728c2ecf20Sopenharmony_ci int prompt_len, room, wlen; 3738c2ecf20Sopenharmony_ci char tempstr[MAX_LEN + 1], *word, *sp, *sp2, *newline_separator = 0; 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci strcpy(tempstr, prompt); 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci prompt_len = strlen(tempstr); 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci if (prompt_len <= width - x * 2) { /* If prompt is short */ 3808c2ecf20Sopenharmony_ci wmove(win, y, (width - prompt_len) / 2); 3818c2ecf20Sopenharmony_ci waddstr(win, tempstr); 3828c2ecf20Sopenharmony_ci } else { 3838c2ecf20Sopenharmony_ci cur_x = x; 3848c2ecf20Sopenharmony_ci cur_y = y; 3858c2ecf20Sopenharmony_ci newl = 1; 3868c2ecf20Sopenharmony_ci word = tempstr; 3878c2ecf20Sopenharmony_ci while (word && *word) { 3888c2ecf20Sopenharmony_ci sp = strpbrk(word, "\n "); 3898c2ecf20Sopenharmony_ci if (sp && *sp == '\n') 3908c2ecf20Sopenharmony_ci newline_separator = sp; 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci if (sp) 3938c2ecf20Sopenharmony_ci *sp++ = 0; 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ci /* Wrap to next line if either the word does not fit, 3968c2ecf20Sopenharmony_ci or it is the first word of a new sentence, and it is 3978c2ecf20Sopenharmony_ci short, and the next word does not fit. */ 3988c2ecf20Sopenharmony_ci room = width - cur_x; 3998c2ecf20Sopenharmony_ci wlen = strlen(word); 4008c2ecf20Sopenharmony_ci if (wlen > room || 4018c2ecf20Sopenharmony_ci (newl && wlen < 4 && sp 4028c2ecf20Sopenharmony_ci && wlen + 1 + strlen(sp) > room 4038c2ecf20Sopenharmony_ci && (!(sp2 = strpbrk(sp, "\n ")) 4048c2ecf20Sopenharmony_ci || wlen + 1 + (sp2 - sp) > room))) { 4058c2ecf20Sopenharmony_ci cur_y++; 4068c2ecf20Sopenharmony_ci cur_x = x; 4078c2ecf20Sopenharmony_ci } 4088c2ecf20Sopenharmony_ci wmove(win, cur_y, cur_x); 4098c2ecf20Sopenharmony_ci waddstr(win, word); 4108c2ecf20Sopenharmony_ci getyx(win, cur_y, cur_x); 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ci /* Move to the next line if the word separator was a newline */ 4138c2ecf20Sopenharmony_ci if (newline_separator) { 4148c2ecf20Sopenharmony_ci cur_y++; 4158c2ecf20Sopenharmony_ci cur_x = x; 4168c2ecf20Sopenharmony_ci newline_separator = 0; 4178c2ecf20Sopenharmony_ci } else 4188c2ecf20Sopenharmony_ci cur_x++; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_ci if (sp && *sp == ' ') { 4218c2ecf20Sopenharmony_ci cur_x++; /* double space */ 4228c2ecf20Sopenharmony_ci while (*++sp == ' ') ; 4238c2ecf20Sopenharmony_ci newl = 1; 4248c2ecf20Sopenharmony_ci } else 4258c2ecf20Sopenharmony_ci newl = 0; 4268c2ecf20Sopenharmony_ci word = sp; 4278c2ecf20Sopenharmony_ci } 4288c2ecf20Sopenharmony_ci } 4298c2ecf20Sopenharmony_ci} 4308c2ecf20Sopenharmony_ci 4318c2ecf20Sopenharmony_ci/* 4328c2ecf20Sopenharmony_ci * Print a button 4338c2ecf20Sopenharmony_ci */ 4348c2ecf20Sopenharmony_civoid print_button(WINDOW * win, const char *label, int y, int x, int selected) 4358c2ecf20Sopenharmony_ci{ 4368c2ecf20Sopenharmony_ci int i, temp; 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci wmove(win, y, x); 4398c2ecf20Sopenharmony_ci wattrset(win, selected ? dlg.button_active.atr 4408c2ecf20Sopenharmony_ci : dlg.button_inactive.atr); 4418c2ecf20Sopenharmony_ci waddstr(win, "<"); 4428c2ecf20Sopenharmony_ci temp = strspn(label, " "); 4438c2ecf20Sopenharmony_ci label += temp; 4448c2ecf20Sopenharmony_ci wattrset(win, selected ? dlg.button_label_active.atr 4458c2ecf20Sopenharmony_ci : dlg.button_label_inactive.atr); 4468c2ecf20Sopenharmony_ci for (i = 0; i < temp; i++) 4478c2ecf20Sopenharmony_ci waddch(win, ' '); 4488c2ecf20Sopenharmony_ci wattrset(win, selected ? dlg.button_key_active.atr 4498c2ecf20Sopenharmony_ci : dlg.button_key_inactive.atr); 4508c2ecf20Sopenharmony_ci waddch(win, label[0]); 4518c2ecf20Sopenharmony_ci wattrset(win, selected ? dlg.button_label_active.atr 4528c2ecf20Sopenharmony_ci : dlg.button_label_inactive.atr); 4538c2ecf20Sopenharmony_ci waddstr(win, (char *)label + 1); 4548c2ecf20Sopenharmony_ci wattrset(win, selected ? dlg.button_active.atr 4558c2ecf20Sopenharmony_ci : dlg.button_inactive.atr); 4568c2ecf20Sopenharmony_ci waddstr(win, ">"); 4578c2ecf20Sopenharmony_ci wmove(win, y, x + temp + 1); 4588c2ecf20Sopenharmony_ci} 4598c2ecf20Sopenharmony_ci 4608c2ecf20Sopenharmony_ci/* 4618c2ecf20Sopenharmony_ci * Draw a rectangular box with line drawing characters 4628c2ecf20Sopenharmony_ci */ 4638c2ecf20Sopenharmony_civoid 4648c2ecf20Sopenharmony_cidraw_box(WINDOW * win, int y, int x, int height, int width, 4658c2ecf20Sopenharmony_ci chtype box, chtype border) 4668c2ecf20Sopenharmony_ci{ 4678c2ecf20Sopenharmony_ci int i, j; 4688c2ecf20Sopenharmony_ci 4698c2ecf20Sopenharmony_ci wattrset(win, 0); 4708c2ecf20Sopenharmony_ci for (i = 0; i < height; i++) { 4718c2ecf20Sopenharmony_ci wmove(win, y + i, x); 4728c2ecf20Sopenharmony_ci for (j = 0; j < width; j++) 4738c2ecf20Sopenharmony_ci if (!i && !j) 4748c2ecf20Sopenharmony_ci waddch(win, border | ACS_ULCORNER); 4758c2ecf20Sopenharmony_ci else if (i == height - 1 && !j) 4768c2ecf20Sopenharmony_ci waddch(win, border | ACS_LLCORNER); 4778c2ecf20Sopenharmony_ci else if (!i && j == width - 1) 4788c2ecf20Sopenharmony_ci waddch(win, box | ACS_URCORNER); 4798c2ecf20Sopenharmony_ci else if (i == height - 1 && j == width - 1) 4808c2ecf20Sopenharmony_ci waddch(win, box | ACS_LRCORNER); 4818c2ecf20Sopenharmony_ci else if (!i) 4828c2ecf20Sopenharmony_ci waddch(win, border | ACS_HLINE); 4838c2ecf20Sopenharmony_ci else if (i == height - 1) 4848c2ecf20Sopenharmony_ci waddch(win, box | ACS_HLINE); 4858c2ecf20Sopenharmony_ci else if (!j) 4868c2ecf20Sopenharmony_ci waddch(win, border | ACS_VLINE); 4878c2ecf20Sopenharmony_ci else if (j == width - 1) 4888c2ecf20Sopenharmony_ci waddch(win, box | ACS_VLINE); 4898c2ecf20Sopenharmony_ci else 4908c2ecf20Sopenharmony_ci waddch(win, box | ' '); 4918c2ecf20Sopenharmony_ci } 4928c2ecf20Sopenharmony_ci} 4938c2ecf20Sopenharmony_ci 4948c2ecf20Sopenharmony_ci/* 4958c2ecf20Sopenharmony_ci * Draw shadows along the right and bottom edge to give a more 3D look 4968c2ecf20Sopenharmony_ci * to the boxes 4978c2ecf20Sopenharmony_ci */ 4988c2ecf20Sopenharmony_civoid draw_shadow(WINDOW * win, int y, int x, int height, int width) 4998c2ecf20Sopenharmony_ci{ 5008c2ecf20Sopenharmony_ci int i; 5018c2ecf20Sopenharmony_ci 5028c2ecf20Sopenharmony_ci if (has_colors()) { /* Whether terminal supports color? */ 5038c2ecf20Sopenharmony_ci wattrset(win, dlg.shadow.atr); 5048c2ecf20Sopenharmony_ci wmove(win, y + height, x + 2); 5058c2ecf20Sopenharmony_ci for (i = 0; i < width; i++) 5068c2ecf20Sopenharmony_ci waddch(win, winch(win) & A_CHARTEXT); 5078c2ecf20Sopenharmony_ci for (i = y + 1; i < y + height + 1; i++) { 5088c2ecf20Sopenharmony_ci wmove(win, i, x + width); 5098c2ecf20Sopenharmony_ci waddch(win, winch(win) & A_CHARTEXT); 5108c2ecf20Sopenharmony_ci waddch(win, winch(win) & A_CHARTEXT); 5118c2ecf20Sopenharmony_ci } 5128c2ecf20Sopenharmony_ci wnoutrefresh(win); 5138c2ecf20Sopenharmony_ci } 5148c2ecf20Sopenharmony_ci} 5158c2ecf20Sopenharmony_ci 5168c2ecf20Sopenharmony_ci/* 5178c2ecf20Sopenharmony_ci * Return the position of the first alphabetic character in a string. 5188c2ecf20Sopenharmony_ci */ 5198c2ecf20Sopenharmony_ciint first_alpha(const char *string, const char *exempt) 5208c2ecf20Sopenharmony_ci{ 5218c2ecf20Sopenharmony_ci int i, in_paren = 0, c; 5228c2ecf20Sopenharmony_ci 5238c2ecf20Sopenharmony_ci for (i = 0; i < strlen(string); i++) { 5248c2ecf20Sopenharmony_ci c = tolower(string[i]); 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_ci if (strchr("<[(", c)) 5278c2ecf20Sopenharmony_ci ++in_paren; 5288c2ecf20Sopenharmony_ci if (strchr(">])", c) && in_paren > 0) 5298c2ecf20Sopenharmony_ci --in_paren; 5308c2ecf20Sopenharmony_ci 5318c2ecf20Sopenharmony_ci if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0) 5328c2ecf20Sopenharmony_ci return i; 5338c2ecf20Sopenharmony_ci } 5348c2ecf20Sopenharmony_ci 5358c2ecf20Sopenharmony_ci return 0; 5368c2ecf20Sopenharmony_ci} 5378c2ecf20Sopenharmony_ci 5388c2ecf20Sopenharmony_ci/* 5398c2ecf20Sopenharmony_ci * ncurses uses ESC to detect escaped char sequences. This resutl in 5408c2ecf20Sopenharmony_ci * a small timeout before ESC is actually delivered to the application. 5418c2ecf20Sopenharmony_ci * lxdialog suggest <ESC> <ESC> which is correctly translated to two 5428c2ecf20Sopenharmony_ci * times esc. But then we need to ignore the second esc to avoid stepping 5438c2ecf20Sopenharmony_ci * out one menu too much. Filter away all escaped key sequences since 5448c2ecf20Sopenharmony_ci * keypad(FALSE) turn off ncurses support for escape sequences - and thats 5458c2ecf20Sopenharmony_ci * needed to make notimeout() do as expected. 5468c2ecf20Sopenharmony_ci */ 5478c2ecf20Sopenharmony_ciint on_key_esc(WINDOW *win) 5488c2ecf20Sopenharmony_ci{ 5498c2ecf20Sopenharmony_ci int key; 5508c2ecf20Sopenharmony_ci int key2; 5518c2ecf20Sopenharmony_ci int key3; 5528c2ecf20Sopenharmony_ci 5538c2ecf20Sopenharmony_ci nodelay(win, TRUE); 5548c2ecf20Sopenharmony_ci keypad(win, FALSE); 5558c2ecf20Sopenharmony_ci key = wgetch(win); 5568c2ecf20Sopenharmony_ci key2 = wgetch(win); 5578c2ecf20Sopenharmony_ci do { 5588c2ecf20Sopenharmony_ci key3 = wgetch(win); 5598c2ecf20Sopenharmony_ci } while (key3 != ERR); 5608c2ecf20Sopenharmony_ci nodelay(win, FALSE); 5618c2ecf20Sopenharmony_ci keypad(win, TRUE); 5628c2ecf20Sopenharmony_ci if (key == KEY_ESC && key2 == ERR) 5638c2ecf20Sopenharmony_ci return KEY_ESC; 5648c2ecf20Sopenharmony_ci else if (key != ERR && key != KEY_ESC && key2 == ERR) 5658c2ecf20Sopenharmony_ci ungetch(key); 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci return -1; 5688c2ecf20Sopenharmony_ci} 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci/* redraw screen in new size */ 5718c2ecf20Sopenharmony_ciint on_key_resize(void) 5728c2ecf20Sopenharmony_ci{ 5738c2ecf20Sopenharmony_ci dialog_clear(); 5748c2ecf20Sopenharmony_ci return KEY_RESIZE; 5758c2ecf20Sopenharmony_ci} 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_cistruct dialog_list *item_cur; 5788c2ecf20Sopenharmony_cistruct dialog_list item_nil; 5798c2ecf20Sopenharmony_cistruct dialog_list *item_head; 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_civoid item_reset(void) 5828c2ecf20Sopenharmony_ci{ 5838c2ecf20Sopenharmony_ci struct dialog_list *p, *next; 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_ci for (p = item_head; p; p = next) { 5868c2ecf20Sopenharmony_ci next = p->next; 5878c2ecf20Sopenharmony_ci free(p); 5888c2ecf20Sopenharmony_ci } 5898c2ecf20Sopenharmony_ci item_head = NULL; 5908c2ecf20Sopenharmony_ci item_cur = &item_nil; 5918c2ecf20Sopenharmony_ci} 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_civoid item_make(const char *fmt, ...) 5948c2ecf20Sopenharmony_ci{ 5958c2ecf20Sopenharmony_ci va_list ap; 5968c2ecf20Sopenharmony_ci struct dialog_list *p = malloc(sizeof(*p)); 5978c2ecf20Sopenharmony_ci 5988c2ecf20Sopenharmony_ci if (item_head) 5998c2ecf20Sopenharmony_ci item_cur->next = p; 6008c2ecf20Sopenharmony_ci else 6018c2ecf20Sopenharmony_ci item_head = p; 6028c2ecf20Sopenharmony_ci item_cur = p; 6038c2ecf20Sopenharmony_ci memset(p, 0, sizeof(*p)); 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_ci va_start(ap, fmt); 6068c2ecf20Sopenharmony_ci vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap); 6078c2ecf20Sopenharmony_ci va_end(ap); 6088c2ecf20Sopenharmony_ci} 6098c2ecf20Sopenharmony_ci 6108c2ecf20Sopenharmony_civoid item_add_str(const char *fmt, ...) 6118c2ecf20Sopenharmony_ci{ 6128c2ecf20Sopenharmony_ci va_list ap; 6138c2ecf20Sopenharmony_ci size_t avail; 6148c2ecf20Sopenharmony_ci 6158c2ecf20Sopenharmony_ci avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str); 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_ci va_start(ap, fmt); 6188c2ecf20Sopenharmony_ci vsnprintf(item_cur->node.str + strlen(item_cur->node.str), 6198c2ecf20Sopenharmony_ci avail, fmt, ap); 6208c2ecf20Sopenharmony_ci item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0'; 6218c2ecf20Sopenharmony_ci va_end(ap); 6228c2ecf20Sopenharmony_ci} 6238c2ecf20Sopenharmony_ci 6248c2ecf20Sopenharmony_civoid item_set_tag(char tag) 6258c2ecf20Sopenharmony_ci{ 6268c2ecf20Sopenharmony_ci item_cur->node.tag = tag; 6278c2ecf20Sopenharmony_ci} 6288c2ecf20Sopenharmony_civoid item_set_data(void *ptr) 6298c2ecf20Sopenharmony_ci{ 6308c2ecf20Sopenharmony_ci item_cur->node.data = ptr; 6318c2ecf20Sopenharmony_ci} 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_civoid item_set_selected(int val) 6348c2ecf20Sopenharmony_ci{ 6358c2ecf20Sopenharmony_ci item_cur->node.selected = val; 6368c2ecf20Sopenharmony_ci} 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ciint item_activate_selected(void) 6398c2ecf20Sopenharmony_ci{ 6408c2ecf20Sopenharmony_ci item_foreach() 6418c2ecf20Sopenharmony_ci if (item_is_selected()) 6428c2ecf20Sopenharmony_ci return 1; 6438c2ecf20Sopenharmony_ci return 0; 6448c2ecf20Sopenharmony_ci} 6458c2ecf20Sopenharmony_ci 6468c2ecf20Sopenharmony_civoid *item_data(void) 6478c2ecf20Sopenharmony_ci{ 6488c2ecf20Sopenharmony_ci return item_cur->node.data; 6498c2ecf20Sopenharmony_ci} 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_cichar item_tag(void) 6528c2ecf20Sopenharmony_ci{ 6538c2ecf20Sopenharmony_ci return item_cur->node.tag; 6548c2ecf20Sopenharmony_ci} 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ciint item_count(void) 6578c2ecf20Sopenharmony_ci{ 6588c2ecf20Sopenharmony_ci int n = 0; 6598c2ecf20Sopenharmony_ci struct dialog_list *p; 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_ci for (p = item_head; p; p = p->next) 6628c2ecf20Sopenharmony_ci n++; 6638c2ecf20Sopenharmony_ci return n; 6648c2ecf20Sopenharmony_ci} 6658c2ecf20Sopenharmony_ci 6668c2ecf20Sopenharmony_civoid item_set(int n) 6678c2ecf20Sopenharmony_ci{ 6688c2ecf20Sopenharmony_ci int i = 0; 6698c2ecf20Sopenharmony_ci item_foreach() 6708c2ecf20Sopenharmony_ci if (i++ == n) 6718c2ecf20Sopenharmony_ci return; 6728c2ecf20Sopenharmony_ci} 6738c2ecf20Sopenharmony_ci 6748c2ecf20Sopenharmony_ciint item_n(void) 6758c2ecf20Sopenharmony_ci{ 6768c2ecf20Sopenharmony_ci int n = 0; 6778c2ecf20Sopenharmony_ci struct dialog_list *p; 6788c2ecf20Sopenharmony_ci 6798c2ecf20Sopenharmony_ci for (p = item_head; p; p = p->next) { 6808c2ecf20Sopenharmony_ci if (p == item_cur) 6818c2ecf20Sopenharmony_ci return n; 6828c2ecf20Sopenharmony_ci n++; 6838c2ecf20Sopenharmony_ci } 6848c2ecf20Sopenharmony_ci return 0; 6858c2ecf20Sopenharmony_ci} 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_ciconst char *item_str(void) 6888c2ecf20Sopenharmony_ci{ 6898c2ecf20Sopenharmony_ci return item_cur->node.str; 6908c2ecf20Sopenharmony_ci} 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ciint item_is_selected(void) 6938c2ecf20Sopenharmony_ci{ 6948c2ecf20Sopenharmony_ci return (item_cur->node.selected != 0); 6958c2ecf20Sopenharmony_ci} 6968c2ecf20Sopenharmony_ci 6978c2ecf20Sopenharmony_ciint item_is_tag(char tag) 6988c2ecf20Sopenharmony_ci{ 6998c2ecf20Sopenharmony_ci return (item_cur->node.tag == tag); 7008c2ecf20Sopenharmony_ci} 701