1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* |
3 | * yesno.c -- implements the yes/no box |
4 | * |
5 | * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) |
6 | * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) |
7 | */ |
8 | |
9 | #include "dialog.h" |
10 | |
11 | /* |
12 | * Display termination buttons |
13 | */ |
14 | static void print_buttons(WINDOW * dialog, int height, int width, int selected) |
15 | { |
16 | int x = width / 2 - 10; |
17 | int y = height - 2; |
18 | |
19 | print_button(win: dialog, label: " Yes " , y, x, selected: selected == 0); |
20 | print_button(win: dialog, label: " No " , y, x: x + 13, selected: selected == 1); |
21 | |
22 | wmove(dialog, y, x + 1 + 13 * selected); |
23 | wrefresh(dialog); |
24 | } |
25 | |
26 | /* |
27 | * Display a dialog box with two buttons - Yes and No |
28 | */ |
29 | int dialog_yesno(const char *title, const char *prompt, int height, int width) |
30 | { |
31 | int i, x, y, key = 0, button = 0; |
32 | WINDOW *dialog; |
33 | |
34 | do_resize: |
35 | if (getmaxy(stdscr) < (height + YESNO_HEIGHT_MIN)) |
36 | return -ERRDISPLAYTOOSMALL; |
37 | if (getmaxx(stdscr) < (width + YESNO_WIDTH_MIN)) |
38 | return -ERRDISPLAYTOOSMALL; |
39 | |
40 | /* center dialog box on screen */ |
41 | x = (getmaxx(stdscr) - width) / 2; |
42 | y = (getmaxy(stdscr) - height) / 2; |
43 | |
44 | draw_shadow(win: stdscr, y, x, height, width); |
45 | |
46 | dialog = newwin(height, width, y, x); |
47 | keypad(dialog, TRUE); |
48 | |
49 | draw_box(win: dialog, y: 0, x: 0, height, width, |
50 | box: dlg.dialog.atr, border: dlg.border.atr); |
51 | wattrset(dialog, dlg.border.atr); |
52 | mvwaddch(dialog, height - 3, 0, ACS_LTEE); |
53 | for (i = 0; i < width - 2; i++) |
54 | waddch(dialog, ACS_HLINE); |
55 | wattrset(dialog, dlg.dialog.atr); |
56 | waddch(dialog, ACS_RTEE); |
57 | |
58 | print_title(dialog, title, width); |
59 | |
60 | wattrset(dialog, dlg.dialog.atr); |
61 | print_autowrap(win: dialog, prompt, width: width - 2, y: 1, x: 3); |
62 | |
63 | print_buttons(dialog, height, width, selected: 0); |
64 | |
65 | while (key != KEY_ESC) { |
66 | key = wgetch(dialog); |
67 | switch (key) { |
68 | case 'Y': |
69 | case 'y': |
70 | delwin(dialog); |
71 | return 0; |
72 | case 'N': |
73 | case 'n': |
74 | delwin(dialog); |
75 | return 1; |
76 | |
77 | case TAB: |
78 | case KEY_LEFT: |
79 | case KEY_RIGHT: |
80 | button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button); |
81 | |
82 | print_buttons(dialog, height, width, selected: button); |
83 | wrefresh(dialog); |
84 | break; |
85 | case ' ': |
86 | case '\n': |
87 | delwin(dialog); |
88 | return button; |
89 | case KEY_ESC: |
90 | key = on_key_esc(win: dialog); |
91 | break; |
92 | case KEY_RESIZE: |
93 | delwin(dialog); |
94 | on_key_resize(); |
95 | goto do_resize; |
96 | } |
97 | } |
98 | |
99 | delwin(dialog); |
100 | return key; /* ESC pressed */ |
101 | } |
102 | |