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