1*0a9064fbSMasahiro Yamada /* 2*0a9064fbSMasahiro Yamada * dialog.h -- common declarations for all dialog modules 3*0a9064fbSMasahiro Yamada * 4*0a9064fbSMasahiro Yamada * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) 5*0a9064fbSMasahiro Yamada * 6*0a9064fbSMasahiro Yamada * This program is free software; you can redistribute it and/or 7*0a9064fbSMasahiro Yamada * modify it under the terms of the GNU General Public License 8*0a9064fbSMasahiro Yamada * as published by the Free Software Foundation; either version 2 9*0a9064fbSMasahiro Yamada * of the License, or (at your option) any later version. 10*0a9064fbSMasahiro Yamada * 11*0a9064fbSMasahiro Yamada * This program is distributed in the hope that it will be useful, 12*0a9064fbSMasahiro Yamada * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*0a9064fbSMasahiro Yamada * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*0a9064fbSMasahiro Yamada * GNU General Public License for more details. 15*0a9064fbSMasahiro Yamada * 16*0a9064fbSMasahiro Yamada * You should have received a copy of the GNU General Public License 17*0a9064fbSMasahiro Yamada * along with this program; if not, write to the Free Software 18*0a9064fbSMasahiro Yamada * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19*0a9064fbSMasahiro Yamada */ 20*0a9064fbSMasahiro Yamada 21*0a9064fbSMasahiro Yamada #include <sys/types.h> 22*0a9064fbSMasahiro Yamada #include <fcntl.h> 23*0a9064fbSMasahiro Yamada #include <unistd.h> 24*0a9064fbSMasahiro Yamada #include <ctype.h> 25*0a9064fbSMasahiro Yamada #include <stdlib.h> 26*0a9064fbSMasahiro Yamada #include <string.h> 27*0a9064fbSMasahiro Yamada #include <stdbool.h> 28*0a9064fbSMasahiro Yamada 29*0a9064fbSMasahiro Yamada #ifndef KBUILD_NO_NLS 30*0a9064fbSMasahiro Yamada # include <libintl.h> 31*0a9064fbSMasahiro Yamada #else 32*0a9064fbSMasahiro Yamada # define gettext(Msgid) ((const char *) (Msgid)) 33*0a9064fbSMasahiro Yamada #endif 34*0a9064fbSMasahiro Yamada 35*0a9064fbSMasahiro Yamada #ifdef __sun__ 36*0a9064fbSMasahiro Yamada #define CURS_MACROS 37*0a9064fbSMasahiro Yamada #endif 38*0a9064fbSMasahiro Yamada #include CURSES_LOC 39*0a9064fbSMasahiro Yamada 40*0a9064fbSMasahiro Yamada /* 41*0a9064fbSMasahiro Yamada * Colors in ncurses 1.9.9e do not work properly since foreground and 42*0a9064fbSMasahiro Yamada * background colors are OR'd rather than separately masked. This version 43*0a9064fbSMasahiro Yamada * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible 44*0a9064fbSMasahiro Yamada * with standard curses. The simplest fix (to make this work with standard 45*0a9064fbSMasahiro Yamada * curses) uses the wbkgdset() function, not used in the original hack. 46*0a9064fbSMasahiro Yamada * Turn it off if we're building with 1.9.9e, since it just confuses things. 47*0a9064fbSMasahiro Yamada */ 48*0a9064fbSMasahiro Yamada #if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) 49*0a9064fbSMasahiro Yamada #define OLD_NCURSES 1 50*0a9064fbSMasahiro Yamada #undef wbkgdset 51*0a9064fbSMasahiro Yamada #define wbkgdset(w,p) /*nothing */ 52*0a9064fbSMasahiro Yamada #else 53*0a9064fbSMasahiro Yamada #define OLD_NCURSES 0 54*0a9064fbSMasahiro Yamada #endif 55*0a9064fbSMasahiro Yamada 56*0a9064fbSMasahiro Yamada #define TR(params) _tracef params 57*0a9064fbSMasahiro Yamada 58*0a9064fbSMasahiro Yamada #define KEY_ESC 27 59*0a9064fbSMasahiro Yamada #define TAB 9 60*0a9064fbSMasahiro Yamada #define MAX_LEN 2048 61*0a9064fbSMasahiro Yamada #define BUF_SIZE (10*1024) 62*0a9064fbSMasahiro Yamada #define MIN(x,y) (x < y ? x : y) 63*0a9064fbSMasahiro Yamada #define MAX(x,y) (x > y ? x : y) 64*0a9064fbSMasahiro Yamada 65*0a9064fbSMasahiro Yamada #ifndef ACS_ULCORNER 66*0a9064fbSMasahiro Yamada #define ACS_ULCORNER '+' 67*0a9064fbSMasahiro Yamada #endif 68*0a9064fbSMasahiro Yamada #ifndef ACS_LLCORNER 69*0a9064fbSMasahiro Yamada #define ACS_LLCORNER '+' 70*0a9064fbSMasahiro Yamada #endif 71*0a9064fbSMasahiro Yamada #ifndef ACS_URCORNER 72*0a9064fbSMasahiro Yamada #define ACS_URCORNER '+' 73*0a9064fbSMasahiro Yamada #endif 74*0a9064fbSMasahiro Yamada #ifndef ACS_LRCORNER 75*0a9064fbSMasahiro Yamada #define ACS_LRCORNER '+' 76*0a9064fbSMasahiro Yamada #endif 77*0a9064fbSMasahiro Yamada #ifndef ACS_HLINE 78*0a9064fbSMasahiro Yamada #define ACS_HLINE '-' 79*0a9064fbSMasahiro Yamada #endif 80*0a9064fbSMasahiro Yamada #ifndef ACS_VLINE 81*0a9064fbSMasahiro Yamada #define ACS_VLINE '|' 82*0a9064fbSMasahiro Yamada #endif 83*0a9064fbSMasahiro Yamada #ifndef ACS_LTEE 84*0a9064fbSMasahiro Yamada #define ACS_LTEE '+' 85*0a9064fbSMasahiro Yamada #endif 86*0a9064fbSMasahiro Yamada #ifndef ACS_RTEE 87*0a9064fbSMasahiro Yamada #define ACS_RTEE '+' 88*0a9064fbSMasahiro Yamada #endif 89*0a9064fbSMasahiro Yamada #ifndef ACS_UARROW 90*0a9064fbSMasahiro Yamada #define ACS_UARROW '^' 91*0a9064fbSMasahiro Yamada #endif 92*0a9064fbSMasahiro Yamada #ifndef ACS_DARROW 93*0a9064fbSMasahiro Yamada #define ACS_DARROW 'v' 94*0a9064fbSMasahiro Yamada #endif 95*0a9064fbSMasahiro Yamada 96*0a9064fbSMasahiro Yamada /* error return codes */ 97*0a9064fbSMasahiro Yamada #define ERRDISPLAYTOOSMALL (KEY_MAX + 1) 98*0a9064fbSMasahiro Yamada 99*0a9064fbSMasahiro Yamada /* 100*0a9064fbSMasahiro Yamada * Color definitions 101*0a9064fbSMasahiro Yamada */ 102*0a9064fbSMasahiro Yamada struct dialog_color { 103*0a9064fbSMasahiro Yamada chtype atr; /* Color attribute */ 104*0a9064fbSMasahiro Yamada int fg; /* foreground */ 105*0a9064fbSMasahiro Yamada int bg; /* background */ 106*0a9064fbSMasahiro Yamada int hl; /* highlight this item */ 107*0a9064fbSMasahiro Yamada }; 108*0a9064fbSMasahiro Yamada 109*0a9064fbSMasahiro Yamada struct subtitle_list { 110*0a9064fbSMasahiro Yamada struct subtitle_list *next; 111*0a9064fbSMasahiro Yamada const char *text; 112*0a9064fbSMasahiro Yamada }; 113*0a9064fbSMasahiro Yamada 114*0a9064fbSMasahiro Yamada struct dialog_info { 115*0a9064fbSMasahiro Yamada const char *backtitle; 116*0a9064fbSMasahiro Yamada struct subtitle_list *subtitles; 117*0a9064fbSMasahiro Yamada struct dialog_color screen; 118*0a9064fbSMasahiro Yamada struct dialog_color shadow; 119*0a9064fbSMasahiro Yamada struct dialog_color dialog; 120*0a9064fbSMasahiro Yamada struct dialog_color title; 121*0a9064fbSMasahiro Yamada struct dialog_color border; 122*0a9064fbSMasahiro Yamada struct dialog_color button_active; 123*0a9064fbSMasahiro Yamada struct dialog_color button_inactive; 124*0a9064fbSMasahiro Yamada struct dialog_color button_key_active; 125*0a9064fbSMasahiro Yamada struct dialog_color button_key_inactive; 126*0a9064fbSMasahiro Yamada struct dialog_color button_label_active; 127*0a9064fbSMasahiro Yamada struct dialog_color button_label_inactive; 128*0a9064fbSMasahiro Yamada struct dialog_color inputbox; 129*0a9064fbSMasahiro Yamada struct dialog_color inputbox_border; 130*0a9064fbSMasahiro Yamada struct dialog_color searchbox; 131*0a9064fbSMasahiro Yamada struct dialog_color searchbox_title; 132*0a9064fbSMasahiro Yamada struct dialog_color searchbox_border; 133*0a9064fbSMasahiro Yamada struct dialog_color position_indicator; 134*0a9064fbSMasahiro Yamada struct dialog_color menubox; 135*0a9064fbSMasahiro Yamada struct dialog_color menubox_border; 136*0a9064fbSMasahiro Yamada struct dialog_color item; 137*0a9064fbSMasahiro Yamada struct dialog_color item_selected; 138*0a9064fbSMasahiro Yamada struct dialog_color tag; 139*0a9064fbSMasahiro Yamada struct dialog_color tag_selected; 140*0a9064fbSMasahiro Yamada struct dialog_color tag_key; 141*0a9064fbSMasahiro Yamada struct dialog_color tag_key_selected; 142*0a9064fbSMasahiro Yamada struct dialog_color check; 143*0a9064fbSMasahiro Yamada struct dialog_color check_selected; 144*0a9064fbSMasahiro Yamada struct dialog_color uarrow; 145*0a9064fbSMasahiro Yamada struct dialog_color darrow; 146*0a9064fbSMasahiro Yamada }; 147*0a9064fbSMasahiro Yamada 148*0a9064fbSMasahiro Yamada /* 149*0a9064fbSMasahiro Yamada * Global variables 150*0a9064fbSMasahiro Yamada */ 151*0a9064fbSMasahiro Yamada extern struct dialog_info dlg; 152*0a9064fbSMasahiro Yamada extern char dialog_input_result[]; 153*0a9064fbSMasahiro Yamada extern int saved_x, saved_y; /* Needed in signal handler in mconf.c */ 154*0a9064fbSMasahiro Yamada 155*0a9064fbSMasahiro Yamada /* 156*0a9064fbSMasahiro Yamada * Function prototypes 157*0a9064fbSMasahiro Yamada */ 158*0a9064fbSMasahiro Yamada 159*0a9064fbSMasahiro Yamada /* item list as used by checklist and menubox */ 160*0a9064fbSMasahiro Yamada void item_reset(void); 161*0a9064fbSMasahiro Yamada void item_make(const char *fmt, ...); 162*0a9064fbSMasahiro Yamada void item_add_str(const char *fmt, ...); 163*0a9064fbSMasahiro Yamada void item_set_tag(char tag); 164*0a9064fbSMasahiro Yamada void item_set_data(void *p); 165*0a9064fbSMasahiro Yamada void item_set_selected(int val); 166*0a9064fbSMasahiro Yamada int item_activate_selected(void); 167*0a9064fbSMasahiro Yamada void *item_data(void); 168*0a9064fbSMasahiro Yamada char item_tag(void); 169*0a9064fbSMasahiro Yamada 170*0a9064fbSMasahiro Yamada /* item list manipulation for lxdialog use */ 171*0a9064fbSMasahiro Yamada #define MAXITEMSTR 200 172*0a9064fbSMasahiro Yamada struct dialog_item { 173*0a9064fbSMasahiro Yamada char str[MAXITEMSTR]; /* promtp displayed */ 174*0a9064fbSMasahiro Yamada char tag; 175*0a9064fbSMasahiro Yamada void *data; /* pointer to menu item - used by menubox+checklist */ 176*0a9064fbSMasahiro Yamada int selected; /* Set to 1 by dialog_*() function if selected. */ 177*0a9064fbSMasahiro Yamada }; 178*0a9064fbSMasahiro Yamada 179*0a9064fbSMasahiro Yamada /* list of lialog_items */ 180*0a9064fbSMasahiro Yamada struct dialog_list { 181*0a9064fbSMasahiro Yamada struct dialog_item node; 182*0a9064fbSMasahiro Yamada struct dialog_list *next; 183*0a9064fbSMasahiro Yamada }; 184*0a9064fbSMasahiro Yamada 185*0a9064fbSMasahiro Yamada extern struct dialog_list *item_cur; 186*0a9064fbSMasahiro Yamada extern struct dialog_list item_nil; 187*0a9064fbSMasahiro Yamada extern struct dialog_list *item_head; 188*0a9064fbSMasahiro Yamada 189*0a9064fbSMasahiro Yamada int item_count(void); 190*0a9064fbSMasahiro Yamada void item_set(int n); 191*0a9064fbSMasahiro Yamada int item_n(void); 192*0a9064fbSMasahiro Yamada const char *item_str(void); 193*0a9064fbSMasahiro Yamada int item_is_selected(void); 194*0a9064fbSMasahiro Yamada int item_is_tag(char tag); 195*0a9064fbSMasahiro Yamada #define item_foreach() \ 196*0a9064fbSMasahiro Yamada for (item_cur = item_head ? item_head: item_cur; \ 197*0a9064fbSMasahiro Yamada item_cur && (item_cur != &item_nil); item_cur = item_cur->next) 198*0a9064fbSMasahiro Yamada 199*0a9064fbSMasahiro Yamada /* generic key handlers */ 200*0a9064fbSMasahiro Yamada int on_key_esc(WINDOW *win); 201*0a9064fbSMasahiro Yamada int on_key_resize(void); 202*0a9064fbSMasahiro Yamada 203*0a9064fbSMasahiro Yamada /* minimum (re)size values */ 204*0a9064fbSMasahiro Yamada #define CHECKLIST_HEIGTH_MIN 6 /* For dialog_checklist() */ 205*0a9064fbSMasahiro Yamada #define CHECKLIST_WIDTH_MIN 6 206*0a9064fbSMasahiro Yamada #define INPUTBOX_HEIGTH_MIN 2 /* For dialog_inputbox() */ 207*0a9064fbSMasahiro Yamada #define INPUTBOX_WIDTH_MIN 2 208*0a9064fbSMasahiro Yamada #define MENUBOX_HEIGTH_MIN 15 /* For dialog_menu() */ 209*0a9064fbSMasahiro Yamada #define MENUBOX_WIDTH_MIN 65 210*0a9064fbSMasahiro Yamada #define TEXTBOX_HEIGTH_MIN 8 /* For dialog_textbox() */ 211*0a9064fbSMasahiro Yamada #define TEXTBOX_WIDTH_MIN 8 212*0a9064fbSMasahiro Yamada #define YESNO_HEIGTH_MIN 4 /* For dialog_yesno() */ 213*0a9064fbSMasahiro Yamada #define YESNO_WIDTH_MIN 4 214*0a9064fbSMasahiro Yamada #define WINDOW_HEIGTH_MIN 19 /* For init_dialog() */ 215*0a9064fbSMasahiro Yamada #define WINDOW_WIDTH_MIN 80 216*0a9064fbSMasahiro Yamada 217*0a9064fbSMasahiro Yamada int init_dialog(const char *backtitle); 218*0a9064fbSMasahiro Yamada void set_dialog_backtitle(const char *backtitle); 219*0a9064fbSMasahiro Yamada void set_dialog_subtitles(struct subtitle_list *subtitles); 220*0a9064fbSMasahiro Yamada void end_dialog(int x, int y); 221*0a9064fbSMasahiro Yamada void attr_clear(WINDOW * win, int height, int width, chtype attr); 222*0a9064fbSMasahiro Yamada void dialog_clear(void); 223*0a9064fbSMasahiro Yamada void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); 224*0a9064fbSMasahiro Yamada void print_button(WINDOW * win, const char *label, int y, int x, int selected); 225*0a9064fbSMasahiro Yamada void print_title(WINDOW *dialog, const char *title, int width); 226*0a9064fbSMasahiro Yamada void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box, 227*0a9064fbSMasahiro Yamada chtype border); 228*0a9064fbSMasahiro Yamada void draw_shadow(WINDOW * win, int y, int x, int height, int width); 229*0a9064fbSMasahiro Yamada 230*0a9064fbSMasahiro Yamada int first_alpha(const char *string, const char *exempt); 231*0a9064fbSMasahiro Yamada int dialog_yesno(const char *title, const char *prompt, int height, int width); 232*0a9064fbSMasahiro Yamada int dialog_msgbox(const char *title, const char *prompt, int height, 233*0a9064fbSMasahiro Yamada int width, int pause); 234*0a9064fbSMasahiro Yamada 235*0a9064fbSMasahiro Yamada 236*0a9064fbSMasahiro Yamada typedef void (*update_text_fn)(char *buf, size_t start, size_t end, void 237*0a9064fbSMasahiro Yamada *_data); 238*0a9064fbSMasahiro Yamada int dialog_textbox(const char *title, char *tbuf, int initial_height, 239*0a9064fbSMasahiro Yamada int initial_width, int *keys, int *_vscroll, int *_hscroll, 240*0a9064fbSMasahiro Yamada update_text_fn update_text, void *data); 241*0a9064fbSMasahiro Yamada int dialog_menu(const char *title, const char *prompt, 242*0a9064fbSMasahiro Yamada const void *selected, int *s_scroll); 243*0a9064fbSMasahiro Yamada int dialog_checklist(const char *title, const char *prompt, int height, 244*0a9064fbSMasahiro Yamada int width, int list_height); 245*0a9064fbSMasahiro Yamada int dialog_inputbox(const char *title, const char *prompt, int height, 246*0a9064fbSMasahiro Yamada int width, const char *init); 247*0a9064fbSMasahiro Yamada 248*0a9064fbSMasahiro Yamada /* 249*0a9064fbSMasahiro Yamada * This is the base for fictitious keys, which activate 250*0a9064fbSMasahiro Yamada * the buttons. 251*0a9064fbSMasahiro Yamada * 252*0a9064fbSMasahiro Yamada * Mouse-generated keys are the following: 253*0a9064fbSMasahiro Yamada * -- the first 32 are used as numbers, in addition to '0'-'9' 254*0a9064fbSMasahiro Yamada * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') 255*0a9064fbSMasahiro Yamada * -- uppercase chars are used to invoke the button (M_EVENT + 'O') 256*0a9064fbSMasahiro Yamada */ 257*0a9064fbSMasahiro Yamada #define M_EVENT (KEY_MAX+1) 258