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