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