10a9064fbSMasahiro Yamada /* 20a9064fbSMasahiro Yamada * dialog.h -- common declarations for all dialog modules 30a9064fbSMasahiro Yamada * 40a9064fbSMasahiro Yamada * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) 50a9064fbSMasahiro Yamada * 6*5b8031ccSTom Rini * SPDX-License-Identifier: GPL-2.0+ 70a9064fbSMasahiro Yamada */ 80a9064fbSMasahiro Yamada 90a9064fbSMasahiro Yamada #include <sys/types.h> 100a9064fbSMasahiro Yamada #include <fcntl.h> 110a9064fbSMasahiro Yamada #include <unistd.h> 120a9064fbSMasahiro Yamada #include <ctype.h> 130a9064fbSMasahiro Yamada #include <stdlib.h> 140a9064fbSMasahiro Yamada #include <string.h> 150a9064fbSMasahiro Yamada #include <stdbool.h> 160a9064fbSMasahiro Yamada 170a9064fbSMasahiro Yamada #ifndef KBUILD_NO_NLS 180a9064fbSMasahiro Yamada # include <libintl.h> 190a9064fbSMasahiro Yamada #else 200a9064fbSMasahiro Yamada # define gettext(Msgid) ((const char *) (Msgid)) 210a9064fbSMasahiro Yamada #endif 220a9064fbSMasahiro Yamada 230a9064fbSMasahiro Yamada #ifdef __sun__ 240a9064fbSMasahiro Yamada #define CURS_MACROS 250a9064fbSMasahiro Yamada #endif 260a9064fbSMasahiro Yamada #include CURSES_LOC 270a9064fbSMasahiro Yamada 280a9064fbSMasahiro Yamada /* 290a9064fbSMasahiro Yamada * Colors in ncurses 1.9.9e do not work properly since foreground and 300a9064fbSMasahiro Yamada * background colors are OR'd rather than separately masked. This version 310a9064fbSMasahiro Yamada * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible 320a9064fbSMasahiro Yamada * with standard curses. The simplest fix (to make this work with standard 330a9064fbSMasahiro Yamada * curses) uses the wbkgdset() function, not used in the original hack. 340a9064fbSMasahiro Yamada * Turn it off if we're building with 1.9.9e, since it just confuses things. 350a9064fbSMasahiro Yamada */ 360a9064fbSMasahiro Yamada #if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) 370a9064fbSMasahiro Yamada #define OLD_NCURSES 1 380a9064fbSMasahiro Yamada #undef wbkgdset 390a9064fbSMasahiro Yamada #define wbkgdset(w,p) /*nothing */ 400a9064fbSMasahiro Yamada #else 410a9064fbSMasahiro Yamada #define OLD_NCURSES 0 420a9064fbSMasahiro Yamada #endif 430a9064fbSMasahiro Yamada 440a9064fbSMasahiro Yamada #define TR(params) _tracef params 450a9064fbSMasahiro Yamada 460a9064fbSMasahiro Yamada #define KEY_ESC 27 470a9064fbSMasahiro Yamada #define TAB 9 480a9064fbSMasahiro Yamada #define MAX_LEN 2048 490a9064fbSMasahiro Yamada #define BUF_SIZE (10*1024) 500a9064fbSMasahiro Yamada #define MIN(x,y) (x < y ? x : y) 510a9064fbSMasahiro Yamada #define MAX(x,y) (x > y ? x : y) 520a9064fbSMasahiro Yamada 530a9064fbSMasahiro Yamada #ifndef ACS_ULCORNER 540a9064fbSMasahiro Yamada #define ACS_ULCORNER '+' 550a9064fbSMasahiro Yamada #endif 560a9064fbSMasahiro Yamada #ifndef ACS_LLCORNER 570a9064fbSMasahiro Yamada #define ACS_LLCORNER '+' 580a9064fbSMasahiro Yamada #endif 590a9064fbSMasahiro Yamada #ifndef ACS_URCORNER 600a9064fbSMasahiro Yamada #define ACS_URCORNER '+' 610a9064fbSMasahiro Yamada #endif 620a9064fbSMasahiro Yamada #ifndef ACS_LRCORNER 630a9064fbSMasahiro Yamada #define ACS_LRCORNER '+' 640a9064fbSMasahiro Yamada #endif 650a9064fbSMasahiro Yamada #ifndef ACS_HLINE 660a9064fbSMasahiro Yamada #define ACS_HLINE '-' 670a9064fbSMasahiro Yamada #endif 680a9064fbSMasahiro Yamada #ifndef ACS_VLINE 690a9064fbSMasahiro Yamada #define ACS_VLINE '|' 700a9064fbSMasahiro Yamada #endif 710a9064fbSMasahiro Yamada #ifndef ACS_LTEE 720a9064fbSMasahiro Yamada #define ACS_LTEE '+' 730a9064fbSMasahiro Yamada #endif 740a9064fbSMasahiro Yamada #ifndef ACS_RTEE 750a9064fbSMasahiro Yamada #define ACS_RTEE '+' 760a9064fbSMasahiro Yamada #endif 770a9064fbSMasahiro Yamada #ifndef ACS_UARROW 780a9064fbSMasahiro Yamada #define ACS_UARROW '^' 790a9064fbSMasahiro Yamada #endif 800a9064fbSMasahiro Yamada #ifndef ACS_DARROW 810a9064fbSMasahiro Yamada #define ACS_DARROW 'v' 820a9064fbSMasahiro Yamada #endif 830a9064fbSMasahiro Yamada 840a9064fbSMasahiro Yamada /* error return codes */ 850a9064fbSMasahiro Yamada #define ERRDISPLAYTOOSMALL (KEY_MAX + 1) 860a9064fbSMasahiro Yamada 870a9064fbSMasahiro Yamada /* 880a9064fbSMasahiro Yamada * Color definitions 890a9064fbSMasahiro Yamada */ 900a9064fbSMasahiro Yamada struct dialog_color { 910a9064fbSMasahiro Yamada chtype atr; /* Color attribute */ 920a9064fbSMasahiro Yamada int fg; /* foreground */ 930a9064fbSMasahiro Yamada int bg; /* background */ 940a9064fbSMasahiro Yamada int hl; /* highlight this item */ 950a9064fbSMasahiro Yamada }; 960a9064fbSMasahiro Yamada 970a9064fbSMasahiro Yamada struct subtitle_list { 980a9064fbSMasahiro Yamada struct subtitle_list *next; 990a9064fbSMasahiro Yamada const char *text; 1000a9064fbSMasahiro Yamada }; 1010a9064fbSMasahiro Yamada 1020a9064fbSMasahiro Yamada struct dialog_info { 1030a9064fbSMasahiro Yamada const char *backtitle; 1040a9064fbSMasahiro Yamada struct subtitle_list *subtitles; 1050a9064fbSMasahiro Yamada struct dialog_color screen; 1060a9064fbSMasahiro Yamada struct dialog_color shadow; 1070a9064fbSMasahiro Yamada struct dialog_color dialog; 1080a9064fbSMasahiro Yamada struct dialog_color title; 1090a9064fbSMasahiro Yamada struct dialog_color border; 1100a9064fbSMasahiro Yamada struct dialog_color button_active; 1110a9064fbSMasahiro Yamada struct dialog_color button_inactive; 1120a9064fbSMasahiro Yamada struct dialog_color button_key_active; 1130a9064fbSMasahiro Yamada struct dialog_color button_key_inactive; 1140a9064fbSMasahiro Yamada struct dialog_color button_label_active; 1150a9064fbSMasahiro Yamada struct dialog_color button_label_inactive; 1160a9064fbSMasahiro Yamada struct dialog_color inputbox; 1170a9064fbSMasahiro Yamada struct dialog_color inputbox_border; 1180a9064fbSMasahiro Yamada struct dialog_color searchbox; 1190a9064fbSMasahiro Yamada struct dialog_color searchbox_title; 1200a9064fbSMasahiro Yamada struct dialog_color searchbox_border; 1210a9064fbSMasahiro Yamada struct dialog_color position_indicator; 1220a9064fbSMasahiro Yamada struct dialog_color menubox; 1230a9064fbSMasahiro Yamada struct dialog_color menubox_border; 1240a9064fbSMasahiro Yamada struct dialog_color item; 1250a9064fbSMasahiro Yamada struct dialog_color item_selected; 1260a9064fbSMasahiro Yamada struct dialog_color tag; 1270a9064fbSMasahiro Yamada struct dialog_color tag_selected; 1280a9064fbSMasahiro Yamada struct dialog_color tag_key; 1290a9064fbSMasahiro Yamada struct dialog_color tag_key_selected; 1300a9064fbSMasahiro Yamada struct dialog_color check; 1310a9064fbSMasahiro Yamada struct dialog_color check_selected; 1320a9064fbSMasahiro Yamada struct dialog_color uarrow; 1330a9064fbSMasahiro Yamada struct dialog_color darrow; 1340a9064fbSMasahiro Yamada }; 1350a9064fbSMasahiro Yamada 1360a9064fbSMasahiro Yamada /* 1370a9064fbSMasahiro Yamada * Global variables 1380a9064fbSMasahiro Yamada */ 1390a9064fbSMasahiro Yamada extern struct dialog_info dlg; 1400a9064fbSMasahiro Yamada extern char dialog_input_result[]; 1410a9064fbSMasahiro Yamada extern int saved_x, saved_y; /* Needed in signal handler in mconf.c */ 1420a9064fbSMasahiro Yamada 1430a9064fbSMasahiro Yamada /* 1440a9064fbSMasahiro Yamada * Function prototypes 1450a9064fbSMasahiro Yamada */ 1460a9064fbSMasahiro Yamada 1470a9064fbSMasahiro Yamada /* item list as used by checklist and menubox */ 1480a9064fbSMasahiro Yamada void item_reset(void); 1490a9064fbSMasahiro Yamada void item_make(const char *fmt, ...); 1500a9064fbSMasahiro Yamada void item_add_str(const char *fmt, ...); 1510a9064fbSMasahiro Yamada void item_set_tag(char tag); 1520a9064fbSMasahiro Yamada void item_set_data(void *p); 1530a9064fbSMasahiro Yamada void item_set_selected(int val); 1540a9064fbSMasahiro Yamada int item_activate_selected(void); 1550a9064fbSMasahiro Yamada void *item_data(void); 1560a9064fbSMasahiro Yamada char item_tag(void); 1570a9064fbSMasahiro Yamada 1580a9064fbSMasahiro Yamada /* item list manipulation for lxdialog use */ 1590a9064fbSMasahiro Yamada #define MAXITEMSTR 200 1600a9064fbSMasahiro Yamada struct dialog_item { 161ad618992SMasahiro Yamada char str[MAXITEMSTR]; /* prompt displayed */ 1620a9064fbSMasahiro Yamada char tag; 1630a9064fbSMasahiro Yamada void *data; /* pointer to menu item - used by menubox+checklist */ 1640a9064fbSMasahiro Yamada int selected; /* Set to 1 by dialog_*() function if selected. */ 1650a9064fbSMasahiro Yamada }; 1660a9064fbSMasahiro Yamada 1670a9064fbSMasahiro Yamada /* list of lialog_items */ 1680a9064fbSMasahiro Yamada struct dialog_list { 1690a9064fbSMasahiro Yamada struct dialog_item node; 1700a9064fbSMasahiro Yamada struct dialog_list *next; 1710a9064fbSMasahiro Yamada }; 1720a9064fbSMasahiro Yamada 1730a9064fbSMasahiro Yamada extern struct dialog_list *item_cur; 1740a9064fbSMasahiro Yamada extern struct dialog_list item_nil; 1750a9064fbSMasahiro Yamada extern struct dialog_list *item_head; 1760a9064fbSMasahiro Yamada 1770a9064fbSMasahiro Yamada int item_count(void); 1780a9064fbSMasahiro Yamada void item_set(int n); 1790a9064fbSMasahiro Yamada int item_n(void); 1800a9064fbSMasahiro Yamada const char *item_str(void); 1810a9064fbSMasahiro Yamada int item_is_selected(void); 1820a9064fbSMasahiro Yamada int item_is_tag(char tag); 1830a9064fbSMasahiro Yamada #define item_foreach() \ 1840a9064fbSMasahiro Yamada for (item_cur = item_head ? item_head: item_cur; \ 1850a9064fbSMasahiro Yamada item_cur && (item_cur != &item_nil); item_cur = item_cur->next) 1860a9064fbSMasahiro Yamada 1870a9064fbSMasahiro Yamada /* generic key handlers */ 1880a9064fbSMasahiro Yamada int on_key_esc(WINDOW *win); 1890a9064fbSMasahiro Yamada int on_key_resize(void); 1900a9064fbSMasahiro Yamada 1910a9064fbSMasahiro Yamada /* minimum (re)size values */ 1920a9064fbSMasahiro Yamada #define CHECKLIST_HEIGTH_MIN 6 /* For dialog_checklist() */ 1930a9064fbSMasahiro Yamada #define CHECKLIST_WIDTH_MIN 6 1940a9064fbSMasahiro Yamada #define INPUTBOX_HEIGTH_MIN 2 /* For dialog_inputbox() */ 1950a9064fbSMasahiro Yamada #define INPUTBOX_WIDTH_MIN 2 1960a9064fbSMasahiro Yamada #define MENUBOX_HEIGTH_MIN 15 /* For dialog_menu() */ 1970a9064fbSMasahiro Yamada #define MENUBOX_WIDTH_MIN 65 1980a9064fbSMasahiro Yamada #define TEXTBOX_HEIGTH_MIN 8 /* For dialog_textbox() */ 1990a9064fbSMasahiro Yamada #define TEXTBOX_WIDTH_MIN 8 2000a9064fbSMasahiro Yamada #define YESNO_HEIGTH_MIN 4 /* For dialog_yesno() */ 2010a9064fbSMasahiro Yamada #define YESNO_WIDTH_MIN 4 2020a9064fbSMasahiro Yamada #define WINDOW_HEIGTH_MIN 19 /* For init_dialog() */ 2030a9064fbSMasahiro Yamada #define WINDOW_WIDTH_MIN 80 2040a9064fbSMasahiro Yamada 2050a9064fbSMasahiro Yamada int init_dialog(const char *backtitle); 2060a9064fbSMasahiro Yamada void set_dialog_backtitle(const char *backtitle); 2070a9064fbSMasahiro Yamada void set_dialog_subtitles(struct subtitle_list *subtitles); 2080a9064fbSMasahiro Yamada void end_dialog(int x, int y); 2090a9064fbSMasahiro Yamada void attr_clear(WINDOW * win, int height, int width, chtype attr); 2100a9064fbSMasahiro Yamada void dialog_clear(void); 2110a9064fbSMasahiro Yamada void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); 2120a9064fbSMasahiro Yamada void print_button(WINDOW * win, const char *label, int y, int x, int selected); 2130a9064fbSMasahiro Yamada void print_title(WINDOW *dialog, const char *title, int width); 2140a9064fbSMasahiro Yamada void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box, 2150a9064fbSMasahiro Yamada chtype border); 2160a9064fbSMasahiro Yamada void draw_shadow(WINDOW * win, int y, int x, int height, int width); 2170a9064fbSMasahiro Yamada 2180a9064fbSMasahiro Yamada int first_alpha(const char *string, const char *exempt); 2190a9064fbSMasahiro Yamada int dialog_yesno(const char *title, const char *prompt, int height, int width); 2200a9064fbSMasahiro Yamada int dialog_msgbox(const char *title, const char *prompt, int height, 2210a9064fbSMasahiro Yamada int width, int pause); 2220a9064fbSMasahiro Yamada 2230a9064fbSMasahiro Yamada 2240a9064fbSMasahiro Yamada typedef void (*update_text_fn)(char *buf, size_t start, size_t end, void 2250a9064fbSMasahiro Yamada *_data); 2260a9064fbSMasahiro Yamada int dialog_textbox(const char *title, char *tbuf, int initial_height, 2270a9064fbSMasahiro Yamada int initial_width, int *keys, int *_vscroll, int *_hscroll, 2280a9064fbSMasahiro Yamada update_text_fn update_text, void *data); 2290a9064fbSMasahiro Yamada int dialog_menu(const char *title, const char *prompt, 2300a9064fbSMasahiro Yamada const void *selected, int *s_scroll); 2310a9064fbSMasahiro Yamada int dialog_checklist(const char *title, const char *prompt, int height, 2320a9064fbSMasahiro Yamada int width, int list_height); 2330a9064fbSMasahiro Yamada int dialog_inputbox(const char *title, const char *prompt, int height, 2340a9064fbSMasahiro Yamada int width, const char *init); 2350a9064fbSMasahiro Yamada 2360a9064fbSMasahiro Yamada /* 2370a9064fbSMasahiro Yamada * This is the base for fictitious keys, which activate 2380a9064fbSMasahiro Yamada * the buttons. 2390a9064fbSMasahiro Yamada * 2400a9064fbSMasahiro Yamada * Mouse-generated keys are the following: 2410a9064fbSMasahiro Yamada * -- the first 32 are used as numbers, in addition to '0'-'9' 2420a9064fbSMasahiro Yamada * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') 2430a9064fbSMasahiro Yamada * -- uppercase chars are used to invoke the button (M_EVENT + 'O') 2440a9064fbSMasahiro Yamada */ 2450a9064fbSMasahiro Yamada #define M_EVENT (KEY_MAX+1) 246