162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * dialog.h -- common declarations for all dialog modules 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <sys/types.h> 962306a36Sopenharmony_ci#include <fcntl.h> 1062306a36Sopenharmony_ci#include <unistd.h> 1162306a36Sopenharmony_ci#include <ctype.h> 1262306a36Sopenharmony_ci#include <stdlib.h> 1362306a36Sopenharmony_ci#include <string.h> 1462306a36Sopenharmony_ci#include <stdbool.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#ifdef __sun__ 1762306a36Sopenharmony_ci#define CURS_MACROS 1862306a36Sopenharmony_ci#endif 1962306a36Sopenharmony_ci#include <ncurses.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define TR(params) _tracef params 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define KEY_ESC 27 2462306a36Sopenharmony_ci#define TAB 9 2562306a36Sopenharmony_ci#define MAX_LEN 2048 2662306a36Sopenharmony_ci#define BUF_SIZE (10*1024) 2762306a36Sopenharmony_ci#define MIN(x,y) (x < y ? x : y) 2862306a36Sopenharmony_ci#define MAX(x,y) (x > y ? x : y) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#ifndef ACS_ULCORNER 3162306a36Sopenharmony_ci#define ACS_ULCORNER '+' 3262306a36Sopenharmony_ci#endif 3362306a36Sopenharmony_ci#ifndef ACS_LLCORNER 3462306a36Sopenharmony_ci#define ACS_LLCORNER '+' 3562306a36Sopenharmony_ci#endif 3662306a36Sopenharmony_ci#ifndef ACS_URCORNER 3762306a36Sopenharmony_ci#define ACS_URCORNER '+' 3862306a36Sopenharmony_ci#endif 3962306a36Sopenharmony_ci#ifndef ACS_LRCORNER 4062306a36Sopenharmony_ci#define ACS_LRCORNER '+' 4162306a36Sopenharmony_ci#endif 4262306a36Sopenharmony_ci#ifndef ACS_HLINE 4362306a36Sopenharmony_ci#define ACS_HLINE '-' 4462306a36Sopenharmony_ci#endif 4562306a36Sopenharmony_ci#ifndef ACS_VLINE 4662306a36Sopenharmony_ci#define ACS_VLINE '|' 4762306a36Sopenharmony_ci#endif 4862306a36Sopenharmony_ci#ifndef ACS_LTEE 4962306a36Sopenharmony_ci#define ACS_LTEE '+' 5062306a36Sopenharmony_ci#endif 5162306a36Sopenharmony_ci#ifndef ACS_RTEE 5262306a36Sopenharmony_ci#define ACS_RTEE '+' 5362306a36Sopenharmony_ci#endif 5462306a36Sopenharmony_ci#ifndef ACS_UARROW 5562306a36Sopenharmony_ci#define ACS_UARROW '^' 5662306a36Sopenharmony_ci#endif 5762306a36Sopenharmony_ci#ifndef ACS_DARROW 5862306a36Sopenharmony_ci#define ACS_DARROW 'v' 5962306a36Sopenharmony_ci#endif 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* error return codes */ 6262306a36Sopenharmony_ci#define ERRDISPLAYTOOSMALL (KEY_MAX + 1) 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* 6562306a36Sopenharmony_ci * Color definitions 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_cistruct dialog_color { 6862306a36Sopenharmony_ci chtype atr; /* Color attribute */ 6962306a36Sopenharmony_ci int fg; /* foreground */ 7062306a36Sopenharmony_ci int bg; /* background */ 7162306a36Sopenharmony_ci int hl; /* highlight this item */ 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistruct subtitle_list { 7562306a36Sopenharmony_ci struct subtitle_list *next; 7662306a36Sopenharmony_ci const char *text; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistruct dialog_info { 8062306a36Sopenharmony_ci const char *backtitle; 8162306a36Sopenharmony_ci struct subtitle_list *subtitles; 8262306a36Sopenharmony_ci struct dialog_color screen; 8362306a36Sopenharmony_ci struct dialog_color shadow; 8462306a36Sopenharmony_ci struct dialog_color dialog; 8562306a36Sopenharmony_ci struct dialog_color title; 8662306a36Sopenharmony_ci struct dialog_color border; 8762306a36Sopenharmony_ci struct dialog_color button_active; 8862306a36Sopenharmony_ci struct dialog_color button_inactive; 8962306a36Sopenharmony_ci struct dialog_color button_key_active; 9062306a36Sopenharmony_ci struct dialog_color button_key_inactive; 9162306a36Sopenharmony_ci struct dialog_color button_label_active; 9262306a36Sopenharmony_ci struct dialog_color button_label_inactive; 9362306a36Sopenharmony_ci struct dialog_color inputbox; 9462306a36Sopenharmony_ci struct dialog_color inputbox_border; 9562306a36Sopenharmony_ci struct dialog_color searchbox; 9662306a36Sopenharmony_ci struct dialog_color searchbox_title; 9762306a36Sopenharmony_ci struct dialog_color searchbox_border; 9862306a36Sopenharmony_ci struct dialog_color position_indicator; 9962306a36Sopenharmony_ci struct dialog_color menubox; 10062306a36Sopenharmony_ci struct dialog_color menubox_border; 10162306a36Sopenharmony_ci struct dialog_color item; 10262306a36Sopenharmony_ci struct dialog_color item_selected; 10362306a36Sopenharmony_ci struct dialog_color tag; 10462306a36Sopenharmony_ci struct dialog_color tag_selected; 10562306a36Sopenharmony_ci struct dialog_color tag_key; 10662306a36Sopenharmony_ci struct dialog_color tag_key_selected; 10762306a36Sopenharmony_ci struct dialog_color check; 10862306a36Sopenharmony_ci struct dialog_color check_selected; 10962306a36Sopenharmony_ci struct dialog_color uarrow; 11062306a36Sopenharmony_ci struct dialog_color darrow; 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* 11462306a36Sopenharmony_ci * Global variables 11562306a36Sopenharmony_ci */ 11662306a36Sopenharmony_ciextern struct dialog_info dlg; 11762306a36Sopenharmony_ciextern char dialog_input_result[]; 11862306a36Sopenharmony_ciextern int saved_x, saved_y; /* Needed in signal handler in mconf.c */ 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci/* 12162306a36Sopenharmony_ci * Function prototypes 12262306a36Sopenharmony_ci */ 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/* item list as used by checklist and menubox */ 12562306a36Sopenharmony_civoid item_reset(void); 12662306a36Sopenharmony_civoid item_make(const char *fmt, ...); 12762306a36Sopenharmony_civoid item_add_str(const char *fmt, ...); 12862306a36Sopenharmony_civoid item_set_tag(char tag); 12962306a36Sopenharmony_civoid item_set_data(void *p); 13062306a36Sopenharmony_civoid item_set_selected(int val); 13162306a36Sopenharmony_ciint item_activate_selected(void); 13262306a36Sopenharmony_civoid *item_data(void); 13362306a36Sopenharmony_cichar item_tag(void); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci/* item list manipulation for lxdialog use */ 13662306a36Sopenharmony_ci#define MAXITEMSTR 200 13762306a36Sopenharmony_cistruct dialog_item { 13862306a36Sopenharmony_ci char str[MAXITEMSTR]; /* prompt displayed */ 13962306a36Sopenharmony_ci char tag; 14062306a36Sopenharmony_ci void *data; /* pointer to menu item - used by menubox+checklist */ 14162306a36Sopenharmony_ci int selected; /* Set to 1 by dialog_*() function if selected. */ 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci/* list of lialog_items */ 14562306a36Sopenharmony_cistruct dialog_list { 14662306a36Sopenharmony_ci struct dialog_item node; 14762306a36Sopenharmony_ci struct dialog_list *next; 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ciextern struct dialog_list *item_cur; 15162306a36Sopenharmony_ciextern struct dialog_list item_nil; 15262306a36Sopenharmony_ciextern struct dialog_list *item_head; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ciint item_count(void); 15562306a36Sopenharmony_civoid item_set(int n); 15662306a36Sopenharmony_ciint item_n(void); 15762306a36Sopenharmony_ciconst char *item_str(void); 15862306a36Sopenharmony_ciint item_is_selected(void); 15962306a36Sopenharmony_ciint item_is_tag(char tag); 16062306a36Sopenharmony_ci#define item_foreach() \ 16162306a36Sopenharmony_ci for (item_cur = item_head ? item_head: item_cur; \ 16262306a36Sopenharmony_ci item_cur && (item_cur != &item_nil); item_cur = item_cur->next) 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci/* generic key handlers */ 16562306a36Sopenharmony_ciint on_key_esc(WINDOW *win); 16662306a36Sopenharmony_ciint on_key_resize(void); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci/* minimum (re)size values */ 16962306a36Sopenharmony_ci#define CHECKLIST_HEIGTH_MIN 6 /* For dialog_checklist() */ 17062306a36Sopenharmony_ci#define CHECKLIST_WIDTH_MIN 6 17162306a36Sopenharmony_ci#define INPUTBOX_HEIGTH_MIN 2 /* For dialog_inputbox() */ 17262306a36Sopenharmony_ci#define INPUTBOX_WIDTH_MIN 2 17362306a36Sopenharmony_ci#define MENUBOX_HEIGTH_MIN 15 /* For dialog_menu() */ 17462306a36Sopenharmony_ci#define MENUBOX_WIDTH_MIN 65 17562306a36Sopenharmony_ci#define TEXTBOX_HEIGTH_MIN 8 /* For dialog_textbox() */ 17662306a36Sopenharmony_ci#define TEXTBOX_WIDTH_MIN 8 17762306a36Sopenharmony_ci#define YESNO_HEIGTH_MIN 4 /* For dialog_yesno() */ 17862306a36Sopenharmony_ci#define YESNO_WIDTH_MIN 4 17962306a36Sopenharmony_ci#define WINDOW_HEIGTH_MIN 19 /* For init_dialog() */ 18062306a36Sopenharmony_ci#define WINDOW_WIDTH_MIN 80 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ciint init_dialog(const char *backtitle); 18362306a36Sopenharmony_civoid set_dialog_backtitle(const char *backtitle); 18462306a36Sopenharmony_civoid set_dialog_subtitles(struct subtitle_list *subtitles); 18562306a36Sopenharmony_civoid end_dialog(int x, int y); 18662306a36Sopenharmony_civoid attr_clear(WINDOW * win, int height, int width, chtype attr); 18762306a36Sopenharmony_civoid dialog_clear(void); 18862306a36Sopenharmony_civoid print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); 18962306a36Sopenharmony_civoid print_button(WINDOW * win, const char *label, int y, int x, int selected); 19062306a36Sopenharmony_civoid print_title(WINDOW *dialog, const char *title, int width); 19162306a36Sopenharmony_civoid draw_box(WINDOW * win, int y, int x, int height, int width, chtype box, 19262306a36Sopenharmony_ci chtype border); 19362306a36Sopenharmony_civoid draw_shadow(WINDOW * win, int y, int x, int height, int width); 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ciint first_alpha(const char *string, const char *exempt); 19662306a36Sopenharmony_ciint dialog_yesno(const char *title, const char *prompt, int height, int width); 19762306a36Sopenharmony_ciint dialog_msgbox(const char *title, const char *prompt, int height, 19862306a36Sopenharmony_ci int width, int pause); 19962306a36Sopenharmony_ciint dialog_textbox(const char *title, const char *tbuf, int initial_height, 20062306a36Sopenharmony_ci int initial_width, int *_vscroll, int *_hscroll, 20162306a36Sopenharmony_ci int (*extra_key_cb)(int, size_t, size_t, void *), void *data); 20262306a36Sopenharmony_ciint dialog_menu(const char *title, const char *prompt, 20362306a36Sopenharmony_ci const void *selected, int *s_scroll); 20462306a36Sopenharmony_ciint dialog_checklist(const char *title, const char *prompt, int height, 20562306a36Sopenharmony_ci int width, int list_height); 20662306a36Sopenharmony_ciint dialog_inputbox(const char *title, const char *prompt, int height, 20762306a36Sopenharmony_ci int width, const char *init); 208