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