yesno.c revision 114603
1/* 2 * yesno.c -- implements the yes/no box 3 * 4 * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 2 9 * of the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 */ 20 21#include <sys/cdefs.h> 22__FBSDID("$FreeBSD: head/gnu/lib/libdialog/yesno.c 114603 2003-05-03 21:31:08Z obrien $"); 23 24#include <dialog.h> 25#include "dialog.priv.h" 26 27/* Actual work function */ 28static int dialog_yesno_proc(unsigned char *title, unsigned char *prompt, 29 int height, int width, int yesdefault); 30 31/* 32 * Display a dialog box with two buttons - Yes and No 33 */ 34int 35dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width) 36{ 37 return dialog_yesno_proc(title, prompt, height, width, TRUE); 38} 39 40/* 41 * Display a dialog box with two buttons - No and Yes 42 */ 43int 44dialog_noyes(unsigned char *title, unsigned char *prompt, int height, int width) 45{ 46 return dialog_yesno_proc(title, prompt, height, width, FALSE); 47} 48 49static int 50dialog_yesno_proc(unsigned char *title, unsigned char *prompt, int height, int width, int yesdefault) 51{ 52 int i, j, x, y, key, button; 53 WINDOW *dialog; 54 char *tmphlp; 55 56 /* disable helpline */ 57 tmphlp = get_helpline(); 58 use_helpline(NULL); 59 60 if (height < 0) 61 height = strheight(prompt)+4; 62 if (width < 0) { 63 i = strwidth(prompt); 64 j = ((title != NULL) ? strwidth(title) : 0); 65 width = MAX(i,j)+4; 66 } 67 width = MAX(width,23); 68 69 if (width > COLS) 70 width = COLS; 71 if (height > LINES) 72 height = LINES; 73 /* center dialog box on screen */ 74 x = DialogX ? DialogX : (COLS - width)/2; 75 y = DialogY ? DialogY : (LINES - height)/2; 76 77#ifdef HAVE_NCURSES 78 if (use_shadow) 79 draw_shadow(stdscr, y, x, height, width); 80#endif 81 dialog = newwin(height, width, y, x); 82 if (dialog == NULL) { 83 endwin(); 84 fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x); 85 exit(1); 86 } 87 keypad(dialog, TRUE); 88 89 draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 90 wattrset(dialog, border_attr); 91 wmove(dialog, height-3, 0); 92 waddch(dialog, ACS_LTEE); 93 for (i = 0; i < width-2; i++) 94 waddch(dialog, ACS_HLINE); 95 wattrset(dialog, dialog_attr); 96 waddch(dialog, ACS_RTEE); 97 wmove(dialog, height-2, 1); 98 for (i = 0; i < width-2; i++) 99 waddch(dialog, ' '); 100 101 if (title != NULL) { 102 wattrset(dialog, title_attr); 103 wmove(dialog, 0, (width - strlen(title))/2 - 1); 104 waddch(dialog, ' '); 105 waddstr(dialog, title); 106 waddch(dialog, ' '); 107 } 108 wattrset(dialog, dialog_attr); 109 wmove(dialog, 1, 2); 110 print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE); 111 112 display_helpline(dialog, height-1, width); 113 114 x = width/2-10; 115 y = height-2; 116 117 /* preset button 0 or 1 for YES or NO as the default */ 118 key = 0; 119 button = !yesdefault; 120 while (key != ESC) { 121 print_button(dialog, " No ", y, x+13, button); 122 print_button(dialog, " Yes " , y, x, !button); 123 if (button) 124 wmove(dialog, y, x+16); 125 else 126 wmove(dialog, y, x+2); 127 wrefresh(dialog); 128 129 key = wgetch(dialog); 130 switch (key) { 131 case 'Y': 132 case 'y': 133 delwin(dialog); 134 restore_helpline(tmphlp); 135 return 0; 136 case 'N': 137 case 'n': 138 delwin(dialog); 139 restore_helpline(tmphlp); 140 return 1; 141 case KEY_BTAB: 142 case TAB: 143 case KEY_UP: 144 case KEY_DOWN: 145 case KEY_LEFT: 146 case KEY_RIGHT: 147 button = !button; 148 /* redrawn at the loop's entry */ 149 break; 150 case ' ': 151 case '\r': 152 case '\n': 153 delwin(dialog); 154 restore_helpline(tmphlp); 155 return button; 156 case ESC: 157 break; 158 case KEY_F(1): 159 case '?': 160 display_helpfile(); 161 break; 162 } 163 } 164 165 delwin(dialog); 166 restore_helpline(tmphlp); 167 return -1; /* ESC pressed */ 168} 169/* End of dialog_yesno() */ 170