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