2018-12-18 21:13:35 +09:00
// SPDX-License-Identifier: GPL-2.0+
2005-04-16 15:20:36 -07:00
/*
* inputbox . c - - implements the input box
*
* ORIGINAL AUTHOR : Savio Lam ( lam836 @ cs . cuhk . hk )
* MODIFIED FOR LINUX KERNEL CONFIG BY : William Roadcap ( roadcap @ cfw . com )
*/
# include "dialog.h"
2005-07-27 14:14:00 -04:00
char dialog_input_result [ MAX_LEN + 1 ] ;
2005-04-16 15:20:36 -07:00
/*
* Print the termination buttons
*/
2005-11-19 19:13:34 +01:00
static void print_buttons ( WINDOW * dialog , int height , int width , int selected )
2005-04-16 15:20:36 -07:00
{
2005-11-19 19:13:34 +01:00
int x = width / 2 - 11 ;
int y = height - 2 ;
2005-04-16 15:20:36 -07:00
2018-05-22 21:36:12 +02:00
print_button ( dialog , " Ok " , y , x , selected = = 0 ) ;
print_button ( dialog , " Help " , y , x + 14 , selected = = 1 ) ;
2005-04-16 15:20:36 -07:00
2005-11-19 19:13:34 +01:00
wmove ( dialog , y , x + 1 + 14 * selected ) ;
wrefresh ( dialog ) ;
2005-04-16 15:20:36 -07:00
}
/*
* Display a dialog box for inputing a string
*/
2005-11-19 21:56:20 +01:00
int dialog_inputbox ( const char * title , const char * prompt , int height , int width ,
2014-06-10 19:08:13 +09:00
const char * init )
2005-04-16 15:20:36 -07:00
{
2005-11-19 19:13:34 +01:00
int i , x , y , box_y , box_x , box_width ;
2012-12-17 22:38:02 +08:00
int input_x = 0 , key = 0 , button = - 1 ;
int show_x , len , pos ;
2005-11-19 19:13:34 +01:00
char * instr = dialog_input_result ;
WINDOW * dialog ;
2006-07-29 22:48:57 +02:00
if ( ! init )
instr [ 0 ] = ' \0 ' ;
else
strcpy ( instr , init ) ;
do_resize :
2013-06-15 11:07:35 +02:00
if ( getmaxy ( stdscr ) < = ( height - INPUTBOX_HEIGTH_MIN ) )
2006-07-29 22:48:57 +02:00
return - ERRDISPLAYTOOSMALL ;
2013-06-15 11:07:35 +02:00
if ( getmaxx ( stdscr ) < = ( width - INPUTBOX_WIDTH_MIN ) )
2006-07-29 22:48:57 +02:00
return - ERRDISPLAYTOOSMALL ;
2005-11-19 19:13:34 +01:00
/* center dialog box on screen */
2013-05-12 12:30:49 +02:00
x = ( getmaxx ( stdscr ) - width ) / 2 ;
y = ( getmaxy ( stdscr ) - height ) / 2 ;
2005-11-19 19:13:34 +01:00
draw_shadow ( stdscr , y , x , height , width ) ;
dialog = newwin ( height , width , y , x ) ;
keypad ( dialog , TRUE ) ;
2006-07-24 21:40:46 +02:00
draw_box ( dialog , 0 , 0 , height , width ,
dlg . dialog . atr , dlg . border . atr ) ;
wattrset ( dialog , dlg . border . atr ) ;
2005-11-19 19:13:34 +01:00
mvwaddch ( dialog , height - 3 , 0 , ACS_LTEE ) ;
for ( i = 0 ; i < width - 2 ; i + + )
waddch ( dialog , ACS_HLINE ) ;
2006-07-24 21:40:46 +02:00
wattrset ( dialog , dlg . dialog . atr ) ;
2005-11-19 19:13:34 +01:00
waddch ( dialog , ACS_RTEE ) ;
2005-11-19 23:38:06 +01:00
print_title ( dialog , title , width ) ;
2005-11-19 19:13:34 +01:00
2006-07-24 21:40:46 +02:00
wattrset ( dialog , dlg . dialog . atr ) ;
2005-11-19 19:13:34 +01:00
print_autowrap ( dialog , prompt , width - 2 , 1 , 3 ) ;
/* Draw the input field box */
box_width = width - 6 ;
getyx ( dialog , y , x ) ;
box_y = y + 2 ;
box_x = ( width - box_width ) / 2 ;
2006-07-24 21:40:46 +02:00
draw_box ( dialog , y + 1 , box_x - 1 , 3 , box_width + 2 ,
2008-03-20 21:30:32 +01:00
dlg . dialog . atr , dlg . border . atr ) ;
2005-11-19 19:13:34 +01:00
print_buttons ( dialog , height , width , 0 ) ;
/* Set up the initial value */
wmove ( dialog , box_y , box_x ) ;
2006-07-24 21:40:46 +02:00
wattrset ( dialog , dlg . inputbox . atr ) ;
2005-11-19 19:13:34 +01:00
2012-12-17 22:38:02 +08:00
len = strlen ( instr ) ;
pos = len ;
2005-11-19 19:13:34 +01:00
2012-12-17 22:38:02 +08:00
if ( len > = box_width ) {
show_x = len - box_width + 1 ;
2005-11-19 19:13:34 +01:00
input_x = box_width - 1 ;
for ( i = 0 ; i < box_width - 1 ; i + + )
2012-12-17 22:38:02 +08:00
waddch ( dialog , instr [ show_x + i ] ) ;
2005-11-19 21:56:20 +01:00
} else {
2012-12-17 22:38:02 +08:00
show_x = 0 ;
input_x = len ;
2005-11-19 19:13:34 +01:00
waddstr ( dialog , instr ) ;
2005-11-19 21:56:20 +01:00
}
2005-11-19 19:13:34 +01:00
wmove ( dialog , box_y , box_x + input_x ) ;
wrefresh ( dialog ) ;
2006-07-28 23:57:48 +02:00
while ( key ! = KEY_ESC ) {
2005-11-19 19:13:34 +01:00
key = wgetch ( dialog ) ;
if ( button = = - 1 ) { /* Input box selected */
switch ( key ) {
case TAB :
case KEY_UP :
case KEY_DOWN :
break ;
case KEY_BACKSPACE :
2019-03-25 15:16:47 +00:00
case 8 : /* ^H */
case 127 : /* ^? */
2012-12-17 22:38:02 +08:00
if ( pos ) {
2006-07-24 21:40:46 +02:00
wattrset ( dialog , dlg . inputbox . atr ) ;
2012-12-17 22:38:02 +08:00
if ( input_x = = 0 ) {
show_x - - ;
2005-11-19 19:13:34 +01:00
} else
input_x - - ;
2012-12-17 22:38:02 +08:00
if ( pos < len ) {
for ( i = pos - 1 ; i < len ; i + + ) {
instr [ i ] = instr [ i + 1 ] ;
}
}
pos - - ;
len - - ;
instr [ len ] = ' \0 ' ;
wmove ( dialog , box_y , box_x ) ;
for ( i = 0 ; i < box_width ; i + + ) {
if ( ! instr [ show_x + i ] ) {
waddch ( dialog , ' ' ) ;
break ;
}
waddch ( dialog , instr [ show_x + i ] ) ;
}
2005-11-19 19:13:34 +01:00
wmove ( dialog , box_y , input_x + box_x ) ;
wrefresh ( dialog ) ;
}
continue ;
2012-12-17 22:38:02 +08:00
case KEY_LEFT :
if ( pos > 0 ) {
if ( input_x > 0 ) {
wmove ( dialog , box_y , - - input_x + box_x ) ;
} else if ( input_x = = 0 ) {
show_x - - ;
wmove ( dialog , box_y , box_x ) ;
for ( i = 0 ; i < box_width ; i + + ) {
if ( ! instr [ show_x + i ] ) {
waddch ( dialog , ' ' ) ;
break ;
}
waddch ( dialog , instr [ show_x + i ] ) ;
}
wmove ( dialog , box_y , box_x ) ;
}
pos - - ;
}
continue ;
case KEY_RIGHT :
if ( pos < len ) {
if ( input_x < box_width - 1 ) {
wmove ( dialog , box_y , + + input_x + box_x ) ;
} else if ( input_x = = box_width - 1 ) {
show_x + + ;
wmove ( dialog , box_y , box_x ) ;
for ( i = 0 ; i < box_width ; i + + ) {
if ( ! instr [ show_x + i ] ) {
waddch ( dialog , ' ' ) ;
break ;
}
waddch ( dialog , instr [ show_x + i ] ) ;
}
wmove ( dialog , box_y , input_x + box_x ) ;
}
pos + + ;
}
continue ;
2005-11-19 19:13:34 +01:00
default :
if ( key < 0x100 & & isprint ( key ) ) {
2012-12-17 22:38:02 +08:00
if ( len < MAX_LEN ) {
2006-07-24 21:40:46 +02:00
wattrset ( dialog , dlg . inputbox . atr ) ;
2012-12-17 22:38:02 +08:00
if ( pos < len ) {
for ( i = len ; i > pos ; i - - )
instr [ i ] = instr [ i - 1 ] ;
instr [ pos ] = key ;
} else {
instr [ len ] = key ;
}
pos + + ;
len + + ;
instr [ len ] = ' \0 ' ;
2005-11-19 19:13:34 +01:00
if ( input_x = = box_width - 1 ) {
2012-12-17 22:38:02 +08:00
show_x + + ;
2005-11-19 19:13:34 +01:00
} else {
2012-12-17 22:38:02 +08:00
input_x + + ;
}
wmove ( dialog , box_y , box_x ) ;
for ( i = 0 ; i < box_width ; i + + ) {
if ( ! instr [ show_x + i ] ) {
waddch ( dialog , ' ' ) ;
break ;
}
waddch ( dialog , instr [ show_x + i ] ) ;
2005-11-19 19:13:34 +01:00
}
2012-12-17 22:38:02 +08:00
wmove ( dialog , box_y , input_x + box_x ) ;
2005-11-19 19:13:34 +01:00
wrefresh ( dialog ) ;
} else
flash ( ) ; /* Alarm user about overflow */
continue ;
}
}
2005-04-16 15:20:36 -07:00
}
2005-11-19 19:13:34 +01:00
switch ( key ) {
case ' O ' :
case ' o ' :
delwin ( dialog ) ;
return 0 ;
case ' H ' :
case ' h ' :
delwin ( dialog ) ;
return 1 ;
case KEY_UP :
case KEY_LEFT :
switch ( button ) {
case - 1 :
2010-04-14 11:44:05 +08:00
button = 1 ; /* Indicates "Help" button is selected */
2005-11-19 19:13:34 +01:00
print_buttons ( dialog , height , width , 1 ) ;
break ;
case 0 :
button = - 1 ; /* Indicates input box is selected */
print_buttons ( dialog , height , width , 0 ) ;
wmove ( dialog , box_y , box_x + input_x ) ;
wrefresh ( dialog ) ;
break ;
case 1 :
button = 0 ; /* Indicates "OK" button is selected */
print_buttons ( dialog , height , width , 0 ) ;
break ;
2005-04-16 15:20:36 -07:00
}
2005-11-19 19:13:34 +01:00
break ;
case TAB :
case KEY_DOWN :
case KEY_RIGHT :
switch ( button ) {
case - 1 :
button = 0 ; /* Indicates "OK" button is selected */
print_buttons ( dialog , height , width , 0 ) ;
break ;
case 0 :
2010-04-14 11:44:05 +08:00
button = 1 ; /* Indicates "Help" button is selected */
2005-11-19 19:13:34 +01:00
print_buttons ( dialog , height , width , 1 ) ;
break ;
case 1 :
button = - 1 ; /* Indicates input box is selected */
print_buttons ( dialog , height , width , 0 ) ;
wmove ( dialog , box_y , box_x + input_x ) ;
wrefresh ( dialog ) ;
break ;
}
break ;
case ' ' :
case ' \n ' :
delwin ( dialog ) ;
return ( button = = - 1 ? 0 : button ) ;
case ' X ' :
case ' x ' :
2006-07-28 23:57:48 +02:00
key = KEY_ESC ;
break ;
case KEY_ESC :
key = on_key_esc ( dialog ) ;
2005-11-19 19:13:34 +01:00
break ;
2006-07-29 22:48:57 +02:00
case KEY_RESIZE :
delwin ( dialog ) ;
on_key_resize ( ) ;
goto do_resize ;
2005-04-16 15:20:36 -07:00
}
}
2005-11-19 19:13:34 +01:00
delwin ( dialog ) ;
2006-07-28 23:57:48 +02:00
return KEY_ESC ; /* ESC pressed */
2005-04-16 15:20:36 -07:00
}