2021-08-28 15:37:32 +00:00
/* menu.c
* ( c ) 2002 Mikulas Patocka , Petr ' Brain ' Kulhavy
* This file is a part of the Links program , released under GPL .
*/
# include "links.h"
static struct history file_history = { 0 , { & file_history . items , & file_history . items } } ;
static void remove_zeroes ( unsigned char * string )
{
int l = ( int ) strlen ( cast_const_char string ) ;
while ( l & & string [ l - 1 ] = = ' 0 ' ) {
l - - ;
string [ l ] = 0 ;
}
}
static unsigned char * const version_texts [ ] = {
TEXT_ ( T_LINKS_VERSION ) ,
TEXT_ ( T_OPERATING_SYSTEM_TYPE ) ,
TEXT_ ( T_OPERATING_SYSTEM_VERSION ) ,
TEXT_ ( T_COMPILER ) ,
TEXT_ ( T_WORD_SIZE ) ,
TEXT_ ( T_DEBUGGING_LEVEL ) ,
TEXT_ ( T_EVENT_HANDLER ) ,
TEXT_ ( T_IPV6 ) ,
TEXT_ ( T_COMPRESSION_METHODS ) ,
TEXT_ ( T_ENCRYPTION ) ,
TEXT_ ( T_UTF8_TERMINAL ) ,
# if defined(__linux__) || defined(__LINUX__) || defined(__SPAD__) || defined(USE_GPM)
TEXT_ ( T_GPM_MOUSE_DRIVER ) ,
# endif
# ifdef OS2
TEXT_ ( T_XTERM_FOR_OS2 ) ,
# endif
# ifdef JS
TEXT_ ( T_JAVASCRIPT ) ,
# endif
TEXT_ ( T_GRAPHICS_MODE ) ,
# ifdef G
TEXT_ ( T_FONT_RENDERING ) ,
TEXT_ ( T_IMAGE_LIBRARIES ) ,
TEXT_ ( T_OPENMP ) ,
# endif
TEXT_ ( T_CONFIGURATION_DIRECTORY ) ,
NULL ,
} ;
static void add_and_pad ( unsigned char * * s , int * l , struct terminal * term , unsigned char * str , int maxlen )
{
unsigned char * x = get_text_translation ( str , term ) ;
int len = cp_len ( term_charset ( term ) , x ) ;
add_to_str ( s , l , x ) ;
add_to_str ( s , l , cast_uchar " : " ) ;
while ( len + + < maxlen ) add_chr_to_str ( s , l , ' ' ) ;
}
static void menu_version ( void * term_ )
{
struct terminal * term = ( struct terminal * ) term_ ;
int i ;
int maxlen = 0 ;
unsigned char * s ;
int l ;
unsigned char * const * decc_volatile text_ptr ;
for ( i = 0 ; version_texts [ i ] ; i + + ) {
unsigned char * t = get_text_translation ( version_texts [ i ] , term ) ;
int tl = cp_len ( term_charset ( term ) , t ) ;
if ( tl > maxlen )
maxlen = tl ;
}
s = init_str ( ) ;
l = 0 ;
text_ptr = version_texts ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_to_str ( & s , & l , cast_uchar VERSION_STRING ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_to_str ( & s , & l , cast_uchar SYSTEM_NAME ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_to_str ( & s , & l , system_name ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_to_str ( & s , & l , compiler_name ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_MEMORY ) , term ) ) ;
add_chr_to_str ( & s , & l , ' ' ) ;
add_num_to_str ( & s , & l , sizeof ( void * ) * 8 ) ;
add_to_str ( & s , & l , cast_uchar " -bit, " ) ;
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_FILE_SIZE ) , term ) ) ;
add_chr_to_str ( & s , & l , ' ' ) ;
add_num_to_str ( & s , & l , sizeof ( off_t ) * 8 /*- ((off_t)-1 < 0)*/ ) ;
add_to_str ( & s , & l , cast_uchar " -bit " ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_num_to_str ( & s , & l , DEBUGLEVEL ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_event_string ( & s , & l , term ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifdef SUPPORT_IPV6
if ( ! support_ipv6 ) add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NOT_ENABLED_IN_SYSTEM ) , term ) ) ;
else if ( ! ipv6_full_access ( ) ) add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_LOCAL_NETWORK_ONLY ) , term ) ) ;
else add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_YES ) , term ) ) ;
# else
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifdef HAVE_ANY_COMPRESSION
add_compress_methods ( & s , & l ) ;
# else
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifdef HAVE_SSL
# ifdef OPENSSL_VERSION
add_to_str ( & s , & l , ( unsigned char * ) OpenSSL_version ( OPENSSL_VERSION ) ) ;
# else
add_to_str ( & s , & l , ( unsigned char * ) SSLeay_version ( SSLEAY_VERSION ) ) ;
# endif
# ifndef HAVE_SSL_CERTIFICATES
add_to_str ( & s , & l , cast_uchar " ( " ) ;
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO_CERTIFICATE_VERIFICATION ) , term ) ) ;
add_chr_to_str ( & s , & l , ' ) ' ) ;
# endif
# else
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifdef ENABLE_UTF8
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_YES ) , term ) ) ;
# else
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
# if defined(__linux__) || defined(__LINUX__) || defined(__SPAD__) || defined(USE_GPM)
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifdef USE_GPM
add_gpm_version ( & s , & l ) ;
# else
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
# endif
# ifdef OS2
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifdef X2
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_YES ) , term ) ) ;
# else
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
# endif
# ifdef JS
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_YES ) , term ) ) ;
add_to_str ( & s , & l , cast_uchar " \n " ) ;
# endif
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifdef G
i = l ;
add_graphics_drivers ( & s , & l ) ;
for ( ; s [ i ] ; i + + ) if ( s [ i - 1 ] = = ' ' ) s [ i ] = upcase ( s [ i ] ) ;
# else
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
# ifdef G
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifndef HAVE_FREETYPE
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_INTERNAL ) , term ) ) ;
# else
add_freetype_version ( & s , & l ) ;
add_to_str ( & s , & l , cast_uchar " , " ) ;
add_fontconfig_version ( & s , & l ) ;
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
add_png_version ( & s , & l ) ;
# ifdef HAVE_JPEG
add_to_str ( & s , & l , cast_uchar " , " ) ;
add_jpeg_version ( & s , & l ) ;
# endif
# ifdef HAVE_TIFF
add_to_str ( & s , & l , cast_uchar " , " ) ;
add_tiff_version ( & s , & l ) ;
# endif
# ifdef HAVE_SVG
add_to_str ( & s , & l , cast_uchar " , " ) ;
add_svg_version ( & s , & l ) ;
2022-06-06 13:08:05 +00:00
# endif
# ifdef HAVE_WEBP
add_to_str ( & s , & l , cast_uchar " , " ) ;
add_webp_version ( & s , & l ) ;
2023-04-06 17:18:18 +00:00
# endif
# ifdef HAVE_AVIF
add_to_str ( & s , & l , cast_uchar " , " ) ;
add_avif_version ( & s , & l ) ;
2021-08-28 15:37:32 +00:00
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
# endif
# ifdef G
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
# ifndef HAVE_OPENMP
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NO ) , term ) ) ;
# else
if ( ! F ) {
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NOT_USED_IN_TEXT_MODE ) , term ) ) ;
} else if ( disable_openmp ) {
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_DISABLED ) , term ) ) ;
} else {
int thr = omp_start ( ) ;
omp_end ( ) ;
add_num_to_str ( & s , & l , thr ) ;
add_chr_to_str ( & s , & l , ' ' ) ;
if ( thr = = 1 ) add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_THREAD ) , term ) ) ;
else if ( thr > = 2 & & thr < = 4 ) add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_THREADS ) , term ) ) ;
else add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_THREADS5 ) , term ) ) ;
}
# endif
add_to_str ( & s , & l , cast_uchar " \n " ) ;
# endif
add_and_pad ( & s , & l , term , * text_ptr + + , maxlen ) ;
if ( links_home ) {
unsigned char * native_home = os_conv_to_external_path ( links_home , NULL ) ;
add_to_str ( & s , & l , native_home ) ;
mem_free ( native_home ) ;
} else {
add_to_str ( & s , & l , get_text_translation ( TEXT_ ( T_NONE ) , term ) ) ;
}
add_to_str ( & s , & l , cast_uchar " \n " ) ;
s [ l - 1 ] = 0 ;
if ( * text_ptr )
internal_error ( " menu_version: text mismatched " ) ;
msg_box ( term , getml ( s , NULL ) , TEXT_ ( T_VERSION_INFORMATION ) , AL_LEFT | AL_MONO , s , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
}
static void menu_about ( struct terminal * term , void * d , void * ses_ )
{
msg_box ( term , NULL , TEXT_ ( T_ABOUT ) , AL_CENTER , TEXT_ ( T_LINKS__LYNX_LIKE ) , MSG_BOX_END , ( void * ) term , 2 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC , TEXT_ ( T_VERSION ) , menu_version , 0 ) ;
}
static void menu_keys ( struct terminal * term , void * d , void * ses_ )
{
if ( ! term - > spec - > braille )
msg_box ( term , NULL , TEXT_ ( T_KEYS ) , AL_LEFT | AL_MONO , TEXT_ ( T_KEYS_DESC ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
else
msg_box ( term , NULL , TEXT_ ( T_KEYS ) , AL_LEFT | AL_MONO , TEXT_ ( T_KEYS_DESC ) , cast_uchar " \n " , TEXT_ ( T_KEYS_BRAILLE_DESC ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
}
void activate_keys ( struct session * ses )
{
menu_keys ( ses - > term , NULL , ses ) ;
}
static void menu_copying ( struct terminal * term , void * d , void * ses_ )
{
msg_box ( term , NULL , TEXT_ ( T_COPYING ) , AL_CENTER , TEXT_ ( T_COPYING_DESC ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
}
static void menu_url ( struct terminal * term , void * url_ , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
unsigned char * url = get_text_translation ( ( unsigned char * ) url_ , term ) ;
goto_url_utf8 ( ses , url ) ;
}
static void menu_for_frame ( struct terminal * term , void * f_ , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
void ( * f ) ( struct session * , struct f_data_c * , int ) = * ( void ( * const * ) ( struct session * , struct f_data_c * , int ) ) f_ ;
do_for_frame ( ses , f , 0 ) ;
}
static void menu_goto_url ( struct terminal * term , void * d , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
dialog_goto_url ( ses , cast_uchar " " ) ;
}
static void menu_save_url_as ( struct terminal * term , void * d , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
dialog_save_url ( ses ) ;
}
static void menu_go_back ( struct terminal * term , void * d , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
go_back ( ses , 1 ) ;
}
static void menu_go_forward ( struct terminal * term , void * d , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
go_back ( ses , - 1 ) ;
}
static void menu_reload ( struct terminal * term , void * d , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
reload ( ses , - 1 ) ;
}
void really_exit_prog ( void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
register_bottom_half ( destroy_terminal , ses - > term ) ;
}
static void dont_exit_prog ( void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
ses - > exit_query = 0 ;
}
void query_exit ( struct session * ses )
{
int only_one_term = ses - > term - > list_entry . next = = ses - > term - > list_entry . prev ;
ses - > exit_query = 1 ;
msg_box ( ses - > term , NULL , TEXT_ ( T_EXIT_LINKS ) , AL_CENTER ,
only_one_term & & are_there_downloads ( ) ? TEXT_ ( T_DO_YOU_REALLY_WANT_TO_EXIT_LINKS_AND_TERMINATE_ALL_DOWNLOADS ) :
! F | | only_one_term ? TEXT_ ( T_DO_YOU_REALLY_WANT_TO_EXIT_LINKS ) :
TEXT_ ( T_DO_YOU_REALLY_WANT_TO_CLOSE_WINDOW ) ,
MSG_BOX_END ,
( void * ) ses , 2 , TEXT_ ( T_YES ) , really_exit_prog , B_ENTER , TEXT_ ( T_NO ) , dont_exit_prog , B_ESC ) ;
}
void exit_prog ( struct terminal * term , void * d , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
int only_one_term ;
if ( ! ses ) {
register_bottom_half ( destroy_terminal , term ) ;
return ;
}
only_one_term = ses - > term - > list_entry . next = = ses - > term - > list_entry . prev ;
if ( ! ses - > exit_query & & ( ! d | | ( only_one_term & & are_there_downloads ( ) ) ) ) {
query_exit ( ses ) ;
return ;
}
really_exit_prog ( ses ) ;
}
struct refresh {
struct terminal * term ;
struct window * win ;
struct dialog * dlg ;
unsigned char * ( * txt ) ( struct terminal * term ) ;
struct timer * timer ;
} ;
static void refresh ( void * r_ )
{
struct refresh * r = ( struct refresh * ) r_ ;
unsigned char * * udata = r - > dlg - > udata ;
unsigned char * txt = r - > txt ( r - > win - > term ) ;
if ( strcmp ( cast_const_char udata [ 0 ] , cast_const_char txt ) ) {
mem_free ( udata [ 0 ] ) ;
udata [ 0 ] = txt ;
if ( ! F ) redraw_below_window ( r - > win ) ;
redraw_window ( r - > win ) ;
} else {
mem_free ( txt ) ;
}
r - > timer = install_timer ( RESOURCE_INFO_REFRESH , refresh , r ) ;
}
static void refresh_abort ( struct dialog_data * dlg )
{
struct refresh * r = dlg - > dlg - > udata2 ;
unsigned char * * udata = r - > dlg - > udata ;
if ( r - > timer ! = NULL ) kill_timer ( r - > timer ) ;
mem_free ( udata [ 0 ] ) ;
mem_free ( r ) ;
}
static void refresh_dialog_box ( struct terminal * term , unsigned char * ( * txt ) ( struct terminal * ) )
{
struct refresh * r = mem_alloc ( sizeof ( struct refresh ) ) ;
r - > term = term ;
r - > win = list_struct ( term - > windows . next , struct window ) ;
r - > txt = txt ;
r - > timer = install_timer ( RESOURCE_INFO_REFRESH , refresh , r ) ;
r - > dlg = ( ( struct dialog_data * ) r - > win - > data ) - > dlg ;
r - > dlg - > udata2 = r ;
r - > dlg - > abort = refresh_abort ;
}
static unsigned char * resource_info_msg ( struct terminal * term )
{
unsigned char * a = init_str ( ) ;
int l = 0 ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_RESOURCES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , select_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_HANDLES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , select_info ( CI_TIMERS ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_TIMERS ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " . \n " ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_CONNECTIONS ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , connect_info ( CI_FILES ) - connect_info ( CI_CONNECTING ) - connect_info ( CI_TRANSFER ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_WAITING ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , connect_info ( CI_CONNECTING ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_CONNECTING ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , connect_info ( CI_TRANSFER ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_tRANSFERRING ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , connect_info ( CI_KEEP ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_KEEPALIVE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " . \n " ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_MEMORY_CACHE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , cache_info ( CI_BYTES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_BYTES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , cache_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_FILES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , cache_info ( CI_LOCKED ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_LOCKED ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , cache_info ( CI_LOADING ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_LOADING ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " . \n " ) ;
# ifdef HAVE_ANY_COMPRESSION
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_DECOMPRESSED_CACHE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , decompress_info ( CI_BYTES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_BYTES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , decompress_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_FILES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , decompress_info ( CI_LOCKED ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_LOCKED ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " . \n " ) ;
# endif
# ifdef G
if ( F ) {
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_IMAGE_CACHE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , imgcache_info ( CI_BYTES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_BYTES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , imgcache_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_IMAGES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , imgcache_info ( CI_LOCKED ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_LOCKED ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " . \n " ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_FONT_CACHE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , fontcache_info ( CI_BYTES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_BYTES ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , fontcache_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_LETTERS ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " . \n " ) ;
}
# endif
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_FORMATTED_DOCUMENT_CACHE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , formatted_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_DOCUMENTS ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , formatted_info ( CI_LOCKED ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_LOCKED ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " . \n " ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_DNS_CACHE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , dns_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_SERVERS ) , term ) ) ;
# ifdef SSL_SESSION_RESUME
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_TLS_SESSION_CACHE ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " : " ) ;
add_unsigned_long_num_to_str ( & a , & l , session_info ( CI_FILES ) ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_SERVERS ) , term ) ) ;
# endif
add_chr_to_str ( & a , & l , ' . ' ) ;
/*{
int j = get_time ( ) / 100 % 170 ;
int i ;
add_chr_to_str ( & a , & l , ' \n ' ) ;
for ( i = 0 ; i < j ; i + + )
add_chr_to_str ( & a , & l , ' - ' ) ;
} */
return a ;
}
static void resource_info_menu ( struct terminal * term , void * d , void * ses_ )
{
unsigned char * a = resource_info_msg ( term ) ;
msg_box ( term , NULL , TEXT_ ( T_RESOURCES ) , AL_LEFT , a , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
refresh_dialog_box ( term , resource_info_msg ) ;
}
# ifdef LEAK_DEBUG
# if defined(LEAK_DEBUG_LIST)
static void top_blocks ( void * r_ , int mode , unsigned char * caption )
{
struct refresh * r = ( struct refresh * ) r_ ;
struct terminal * term = r - > term ;
unsigned char * tm ;
int n_entries ;
if ( ! F ) {
n_entries = term - > y - 7 ;
# ifdef G
} else {
n_entries = term - > y / G_BFU_FONT_SIZE - 7 ;
# endif
}
if ( n_entries < 3 )
n_entries = 3 ;
tm = get_top_memory ( mode , n_entries ) ;
msg_box ( term , getml ( tm , NULL ) , caption , AL_LEFT | AL_MONO , tm , MSG_BOX_END , ( void * ) r , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
}
static void most_allocated ( void * r_ )
{
struct refresh * r = ( struct refresh * ) r_ ;
top_blocks ( r , GTM_MOST_ALLOCATED , TEXT_ ( T_MOST_ALLOCATED ) ) ;
}
static void largest_blocks ( void * r_ )
{
struct refresh * r = ( struct refresh * ) r_ ;
top_blocks ( r , GTM_LARGEST_BLOCKS , TEXT_ ( T_LARGEST_BLOCKS ) ) ;
}
# endif
static unsigned char * memory_info_msg ( struct terminal * term )
{
unsigned char * a = init_str ( ) ;
int l = 0 ;
add_unsigned_long_num_to_str ( & a , & l , mem_amount ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_MEMORY_ALLOCATED ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , mem_blocks ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_BLOCKS_ALLOCATED ) , term ) ) ;
add_chr_to_str ( & a , & l , ' . ' ) ;
# ifdef MEMORY_BIGALLOC
add_to_str ( & a , & l , cast_uchar " \n " ) ;
add_unsigned_long_num_to_str ( & a , & l , mem_bigalloc ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_MEMORY_LARGE_BLOCKS ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , blocks_bigalloc ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_BLOCKS_LARGE_BLOCKS ) , term ) ) ;
add_chr_to_str ( & a , & l , ' . ' ) ;
# endif
# ifdef MEMORY_REQUESTED
if ( mem_requested & & blocks_requested ) {
add_to_str ( & a , & l , cast_uchar " \n " ) ;
add_unsigned_long_num_to_str ( & a , & l , mem_requested ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_MEMORY_REQUESTED ) , term ) ) ;
add_to_str ( & a , & l , cast_uchar " , " ) ;
add_unsigned_long_num_to_str ( & a , & l , blocks_requested ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_BLOCKS_REQUESTED ) , term ) ) ;
add_chr_to_str ( & a , & l , ' . ' ) ;
}
# endif
# ifdef JS
add_to_str ( & a , & l , cast_uchar " \n " ) ;
add_unsigned_long_num_to_str ( & a , & l , js_zaflaknuto_pameti ) ;
add_chr_to_str ( & a , & l , ' ' ) ;
add_to_str ( & a , & l , get_text_translation ( TEXT_ ( T_JS_MEMORY_ALLOCATED ) , term ) ) ;
add_chr_to_str ( & a , & l , ' . ' ) ;
# endif
return a ;
}
static void memory_info_menu ( struct terminal * term , void * d , void * ses_ )
{
unsigned char * a = memory_info_msg ( term ) ;
# if defined(LEAK_DEBUG_LIST)
msg_box ( term , NULL , TEXT_ ( T_MEMORY_INFO ) , AL_CENTER , a , MSG_BOX_END , NULL , 3 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC , TEXT_ ( T_MOST_ALLOCATED ) , most_allocated , 0 , TEXT_ ( T_LARGEST_BLOCKS ) , largest_blocks , 0 ) ;
# else
msg_box ( term , NULL , TEXT_ ( T_MEMORY_INFO ) , AL_CENTER , a , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
# endif
refresh_dialog_box ( term , memory_info_msg ) ;
}
# endif
static void flush_caches ( struct terminal * term , void * d , void * e )
{
abort_background_connections ( ) ;
shrink_memory ( SH_FREE_ALL , 0 ) ;
}
/* jde v historii na polozku id_ptr */
void go_backwards ( struct terminal * term , void * id_ptr , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
unsigned want_id = ( unsigned ) ( my_intptr_t ) id_ptr ;
struct location * l ;
struct list_head * ll ;
int n = 0 ;
foreach ( struct location , l , ll , ses - > history ) {
if ( l - > location_id = = want_id ) {
goto have_it ;
}
n + + ;
}
n = - 1 ;
foreach ( struct location , l , ll , ses - > forward_history ) {
if ( l - > location_id = = want_id ) {
goto have_it ;
}
n - - ;
}
return ;
have_it :
go_back ( ses , n ) ;
}
static_const struct menu_item no_hist_menu [ ] = {
{ TEXT_ ( T_NO_HISTORY ) , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static void add_history_menu_entry ( struct terminal * term , struct menu_item * * mi , int * n , struct location * l )
{
unsigned char * url ;
if ( ! * mi ) * mi = new_menu ( MENU_FREE_ITEMS | MENU_FREE_TEXT ) ;
url = display_url ( term , l - > url , 1 ) ;
add_to_menu ( mi , url , cast_uchar " " , cast_uchar " " , go_backwards , ( void * ) ( my_intptr_t ) l - > location_id , 0 , * n ) ;
( * n ) + + ;
if ( * n = = MAXINT ) overalloc ( ) ;
}
static void history_menu ( struct terminal * term , void * ddd , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
struct location * l ;
struct list_head * ll ;
struct menu_item * mi = NULL ;
int n = 0 ;
int selected = 0 ;
foreachback ( struct location , l , ll , ses - > forward_history ) {
add_history_menu_entry ( term , & mi , & n , l ) ;
}
selected = n ;
foreach ( struct location , l , ll , ses - > history ) {
add_history_menu_entry ( term , & mi , & n , l ) ;
}
if ( ! mi ) do_menu ( term , ( struct menu_item * ) no_hist_menu , ses ) ;
else do_menu_selected ( term , mi , ses , selected , NULL , NULL ) ;
}
static_const struct menu_item no_downloads_menu [ ] = {
{ TEXT_ ( T_NO_DOWNLOADS ) , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static void downloads_menu ( struct terminal * term , void * ddd , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
struct download * d ;
struct list_head * ld ;
struct menu_item * mi = NULL ;
int n = 0 ;
foreachback ( struct download , d , ld , downloads ) {
unsigned char * f , * ff ;
if ( ! mi ) mi = new_menu ( MENU_FREE_ITEMS | MENU_FREE_TEXT | MENU_FREE_RTEXT ) ;
f = ! d - > prog ? d - > orig_file : d - > url ;
for ( ff = f ; * ff ; ff + + )
if ( ( dir_sep ( ff [ 0 ] )
# if defined(DOS_FS) || defined(SPAD)
| | ( ! d - > prog & & ff [ 0 ] = = ' : ' )
# endif
) & & ff [ 1 ] )
f = ff + 1 ;
if ( ! d - > prog )
f = stracpy ( f ) ;
else
f = display_url ( term , f , 1 ) ;
add_to_menu ( & mi , f , download_percentage ( d , 0 ) , cast_uchar " " , display_download , d , 0 , n ) ;
n + + ;
}
if ( ! n ) do_menu ( term , ( struct menu_item * ) no_downloads_menu , ses ) ;
else do_menu ( term , mi , ses ) ;
}
# ifndef GRDRV_VIRTUAL_DEVICES
# define have_windows_menu 0
# else
# define have_windows_menu (F && drv->init_device == init_virtual_device)
static void window_switch ( struct terminal * term , void * nump , void * ses )
{
int n = ( int ) ( my_intptr_t ) nump ;
switch_virtual_device ( n ) ;
}
static void windows_menu ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
struct menu_item * mi = new_menu ( MENU_FREE_ITEMS | MENU_FREE_TEXT | MENU_FREE_RTEXT | MENU_FREE_HOTKEY ) ;
int i ;
int selected = 0 ;
int pos = 0 ;
int have_free_slot = 0 ;
int o ;
for ( i = 0 ; i < n_virtual_devices ; i + + ) {
if ( virtual_devices [ i ] ) {
struct session * xs ;
struct list_head * ls ;
unsigned char * l = init_str ( ) , * r = init_str ( ) , * h = init_str ( ) ;
int ll = 0 , rr = 0 , hh = 0 ;
add_num_to_str ( & l , & ll , i + 1 ) ;
add_chr_to_str ( & l , & ll , ' . ' ) ;
foreach ( struct session , xs , ls , sessions ) if ( ( void * ) xs - > term = = virtual_devices [ i ] - > user_data ) {
if ( xs - > screen & & xs - > screen - > f_data & & xs - > screen - > f_data - > title ) {
add_chr_to_str ( & l , & ll , ' ' ) ;
if ( xs - > screen - > f_data - > title [ 0 ] ) {
add_to_str ( & l , & ll , xs - > screen - > f_data - > title ) ;
} else if ( xs - > screen - > rq & & xs - > screen - > rq - > url ) {
unsigned char * url = display_url ( term , xs - > screen - > rq - > url , 1 ) ;
add_to_str ( & l , & ll , url ) ;
mem_free ( url ) ;
}
}
break ;
}
if ( n_virtual_devices > 10 ) {
add_to_str ( & r , & rr , cast_uchar " Alt-F " ) ;
add_num_to_str ( & r , & rr , i + 1 ) ;
} else {
add_to_str ( & r , & rr , cast_uchar " Alt- " ) ;
add_chr_to_str ( & r , & rr , ( i + 1 ) % 10 + ' 0 ' ) ;
}
if ( i < 10 ) {
add_chr_to_str ( & h , & hh , ( i + 1 ) % 10 + ' 0 ' ) ;
}
if ( current_virtual_device = = virtual_devices [ i ] )
selected = pos ;
add_to_menu ( & mi , l , r , h , window_switch , ( void * ) ( my_intptr_t ) i , 0 , pos + + ) ;
} else {
have_free_slot = 1 ;
}
}
if ( ( o = can_open_in_new ( term ) ) & & have_free_slot ) {
add_to_menu ( & mi , cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , pos + + ) ;
mi [ pos - 1 ] . free_i = MENU_FREE_ITEMS ;
add_to_menu ( & mi , TEXT_ ( T_NEW_WINDOW ) , cast_uchar " " , TEXT_ ( T_HK_NEW_WINDOW ) , open_in_new_window , ( void * ) & send_open_new_xterm_ptr , o - 1 , pos + + ) ;
mi [ pos - 1 ] . free_i = MENU_FREE_ITEMS ;
}
do_menu_selected ( term , mi , ses , selected , NULL , NULL ) ;
}
# endif
static void menu_doc_info ( struct terminal * term , void * ddd , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
state_msg ( ses ) ;
}
static void menu_head_info ( struct terminal * term , void * ddd , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
head_msg ( ses ) ;
}
static unsigned char * get_clipboard_test_empty ( struct terminal * term )
{
unsigned char * clip = get_clipboard_text ( term ) ;
if ( clip & & ! * clip ) {
mem_free ( clip ) ;
clip = NULL ;
}
if ( ! clip ) {
msg_box (
term ,
NULL ,
TEXT_ ( T_SAVE_CLIPBOARD_TO_A_FILE ) ,
AL_CENTER ,
TEXT_ ( T_THE_CLIPBOARD_IS_EMPTY ) , MSG_BOX_END ,
NULL ,
1 ,
TEXT_ ( T_CANCEL ) , msg_box_null , B_ENTER | B_ESC
) ;
return NULL ;
}
return clip ;
}
static void save_clipboard ( struct session * ses , unsigned char * file , int mode )
{
unsigned char * clip ;
int h , rs , l ;
int download_mode = mode = = DOWNLOAD_DEFAULT ? CDF_EXCL : 0 ;
clip = get_clipboard_test_empty ( ses - > term ) ;
if ( ! clip )
return ;
if ( ( h = create_download_file ( ses , ses - > term - > cwd , file , download_mode , 0 ) ) < 0 ) goto ret ;
l = ( int ) strlen ( cast_const_char clip ) ;
if ( hard_write ( h , clip , l ) ! = l ) {
msg_box ( ses - > term , NULL , TEXT_ ( T_SAVE_ERROR ) , AL_CENTER , TEXT_ ( T_ERROR_WRITING_TO_FILE ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_CANCEL ) , msg_box_null , B_ENTER | B_ESC ) ;
}
EINTRLOOP ( rs , close ( h ) ) ;
ret :
mem_free ( clip ) ;
}
static void menu_save_clipboard ( struct terminal * term , void * ddd , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
unsigned char * clip ;
clip = get_clipboard_test_empty ( term ) ;
if ( ! clip )
return ;
mem_free ( clip ) ;
query_file ( ses , cast_uchar " " , NULL , save_clipboard , NULL , DOWNLOAD_OVERWRITE ) ;
}
static void load_clipboard ( void * ses_ , unsigned char * file )
{
struct session * ses = ( struct session * ) ses_ ;
unsigned char * wd , * f , * c ;
if ( ! * file )
return ;
wd = get_cwd ( ) ;
set_cwd ( ses - > term - > cwd ) ;
f = translate_download_file ( file ) ;
c = read_config_file ( f ) ;
if ( ! c ) {
unsigned char * emsg = strerror_alloc ( errno , ses - > term ) ;
if ( wd ) set_cwd ( wd ) , mem_free ( wd ) ;
msg_box (
ses - > term ,
getml ( emsg , f , NULL ) ,
TEXT_ ( T_LOAD_CLIPBOARD_FROM_A_FILE ) ,
AL_CENTER ,
TEXT_ ( T_ERROR_READING_THE_FILE ) , cast_uchar " " , f , cast_uchar " : " , emsg , MSG_BOX_END ,
NULL ,
1 ,
TEXT_ ( T_CANCEL ) , msg_box_null , B_ENTER | B_ESC
) ;
return ;
}
if ( wd ) set_cwd ( wd ) , mem_free ( wd ) ;
set_clipboard_text ( ses - > term , c ) ;
mem_free ( f ) ;
mem_free ( c ) ;
}
static void menu_load_clipboard ( struct terminal * term , void * ddd , void * ses_ )
{
input_field ( term , NULL , TEXT_ ( T_LOAD_CLIPBOARD_FROM_A_FILE ) , TEXT_ ( T_FILE ) , ses_ , & file_history , MAX_INPUT_URL_LEN , cast_uchar " " , 0 , 0 , NULL , 2 , TEXT_ ( T_OK ) , load_clipboard , TEXT_ ( T_CANCEL ) , input_field_null ) ;
}
static void menu_toggle ( struct terminal * term , void * ddd , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
toggle ( ses , ses - > screen , 0 ) ;
}
static void set_display_codepage ( struct terminal * term , void * pcp , void * ptr )
{
int cp = ( int ) ( my_intptr_t ) pcp ;
struct term_spec * t = new_term_spec ( term - > term ) ;
t - > character_set = cp ;
cls_redraw_all_terminals ( ) ;
}
static void set_val ( struct terminal * term , void * ip , void * d )
{
* ( int * ) d = ( int ) ( my_intptr_t ) ip ;
}
static void charset_sel_list ( struct terminal * term , int ini , void ( * set ) ( struct terminal * term , void * ip , void * ptr ) , void * ptr , int utf , int def )
{
int i ;
unsigned char * n ;
struct menu_item * mi ;
# ifdef OS_NO_SYSTEM_CHARSET
def = 0 ;
# endif
mi = new_menu ( MENU_FREE_ITEMS | MENU_FREE_RTEXT ) ;
for ( i = - def ; ( n = get_cp_name ( i ) ) ; i + + ) {
unsigned char * n , * r , * p ;
if ( ! utf & & i = = utf8_table ) continue ;
if ( i = = - 1 ) {
n = TEXT_ ( T_DEFAULT_CHARSET ) ;
r = stracpy ( get_cp_name ( term - > default_character_set ) ) ;
p = cast_uchar strstr ( cast_const_char r , " ( " ) ;
if ( p ) * p = 0 ;
} else {
n = get_cp_name ( i ) ;
r = stracpy ( cast_uchar " " ) ;
}
add_to_menu ( & mi , n , r , cast_uchar " " , set , ( void * ) ( my_intptr_t ) i , 0 , i + def ) ;
}
ini + = def ;
if ( ini < 0 )
ini = term - > default_character_set ;
do_menu_selected ( term , mi , ptr , ini , NULL , NULL ) ;
}
static void charset_list ( struct terminal * term , void * xxx , void * ses_ )
{
charset_sel_list ( term , term - > spec - > character_set , set_display_codepage , NULL ,
# ifdef ENABLE_UTF8
1
# else
0
# endif
, 1 ) ;
}
static void terminal_options_ok ( void * p )
{
cls_redraw_all_terminals ( ) ;
}
static unsigned char * const td_labels [ ] = {
TEXT_ ( T_NO_FRAMES ) ,
TEXT_ ( T_VT_100_FRAMES ) ,
TEXT_ ( T_LINUX_OR_OS2_FRAMES ) ,
TEXT_ ( T_KOI8R_FRAMES ) ,
TEXT_ ( T_FREEBSD_FRAMES ) ,
# ifdef ENABLE_UTF8
TEXT_ ( T_UTF8_FRAMES ) ,
# endif
TEXT_ ( T_USE_11M ) ,
TEXT_ ( T_RESTRICT_FRAMES_IN_CP850_852 ) ,
TEXT_ ( T_BLOCK_CURSOR ) ,
TEXT_ ( T_COLOR ) ,
TEXT_ ( T_BRAILLE_TERMINAL ) ,
NULL
} ;
static void terminal_options ( struct terminal * term , void * xxx , void * ses_ )
{
int a ;
struct dialog * d ;
struct term_spec * ts = new_term_spec ( term - > term ) ;
d = mem_calloc ( sizeof ( struct dialog ) + 13 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_TERMINAL_OPTIONS ) ;
d - > fn = checkbox_list_fn ;
d - > udata = ( void * ) td_labels ;
d - > refresh = terminal_options_ok ;
a = 0 ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = TERM_DUMB ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > mode ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = TERM_VT100 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > mode ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = TERM_LINUX ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > mode ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = TERM_KOI8 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > mode ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = TERM_FREEBSD ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > mode ;
# ifdef ENABLE_UTF8
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = TERM_UTF8 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > mode ;
# endif
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > m11_hack ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > restrict_852 ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > block_cursor ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > col ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & ts - > braille ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_OK ) ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
static unsigned char left_margin_str [ 5 ] ;
static unsigned char right_margin_str [ 5 ] ;
static unsigned char top_margin_str [ 5 ] ;
static unsigned char bottom_margin_str [ 5 ] ;
static void margins_ok ( void * xxx )
{
struct terminal * term = xxx ;
int left , right , top , bottom ;
left = atoi ( cast_const_char left_margin_str ) ;
right = atoi ( cast_const_char right_margin_str ) ;
top = atoi ( cast_const_char top_margin_str ) ;
bottom = atoi ( cast_const_char bottom_margin_str ) ;
if ( ! F ) {
struct term_spec * ts = new_term_spec ( term - > term ) ;
if ( left + right > = term - > real_x | |
top + bottom > = term - > real_y ) {
goto error ;
}
ts - > left_margin = left ;
ts - > right_margin = right ;
ts - > top_margin = top ;
ts - > bottom_margin = bottom ;
cls_redraw_all_terminals ( ) ;
# ifdef G
} else {
if ( drv - > set_margin ( left , right , top , bottom ) )
goto error ;
# endif
}
return ;
error :
msg_box (
term ,
NULL ,
TEXT_ ( T_MARGINS_TOO_LARGE ) ,
AL_CENTER ,
TEXT_ ( T_THE_ENTERED_VALUES_ARE_TOO_LARGE_FOR_THE_CURRENT_SCREEN ) , MSG_BOX_END ,
NULL ,
1 ,
TEXT_ ( T_CANCEL ) , msg_box_null , B_ENTER | B_ESC
) ;
}
static unsigned char * const margins_labels [ ] = {
TEXT_ ( T_LEFT_MARGIN ) ,
TEXT_ ( T_RIGHT_MARGIN ) ,
TEXT_ ( T_TOP_MARGIN ) ,
TEXT_ ( T_BOTTOM_MARGIN ) ,
} ;
static void screen_margins ( struct terminal * term , void * xxx , void * ses_ )
{
struct dialog * d ;
struct term_spec * ts = term - > spec ;
int string_len = ! F ? 4 : 5 ;
int max_value = ! F ? 999 : 9999 ;
int l , r , t , b ;
if ( ! F ) {
l = ts - > left_margin ;
r = ts - > right_margin ;
t = ts - > top_margin ;
b = ts - > bottom_margin ;
# ifdef G
} else {
drv - > get_margin ( & l , & r , & t , & b ) ;
# endif
}
snprint ( left_margin_str , string_len , l ) ;
snprint ( right_margin_str , string_len , r ) ;
snprint ( top_margin_str , string_len , t ) ;
snprint ( bottom_margin_str , string_len , b ) ;
d = mem_calloc ( sizeof ( struct dialog ) + 6 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_SCREEN_MARGINS ) ;
d - > fn = group_fn ;
d - > udata = ( void * ) margins_labels ;
d - > refresh = margins_ok ;
d - > refresh_data = term ;
d - > items [ 0 ] . type = D_FIELD ;
d - > items [ 0 ] . dlen = string_len ;
d - > items [ 0 ] . data = left_margin_str ;
d - > items [ 0 ] . fn = check_number ;
d - > items [ 0 ] . gid = 0 ;
d - > items [ 0 ] . gnum = max_value ;
d - > items [ 1 ] . type = D_FIELD ;
d - > items [ 1 ] . dlen = string_len ;
d - > items [ 1 ] . data = right_margin_str ;
d - > items [ 1 ] . fn = check_number ;
d - > items [ 1 ] . gid = 0 ;
d - > items [ 1 ] . gnum = max_value ;
d - > items [ 2 ] . type = D_FIELD ;
d - > items [ 2 ] . dlen = string_len ;
d - > items [ 2 ] . data = top_margin_str ;
d - > items [ 2 ] . fn = check_number ;
d - > items [ 2 ] . gid = 0 ;
d - > items [ 2 ] . gnum = max_value ;
d - > items [ 3 ] . type = D_FIELD ;
d - > items [ 3 ] . dlen = string_len ;
d - > items [ 3 ] . data = bottom_margin_str ;
d - > items [ 3 ] . fn = check_number ;
d - > items [ 3 ] . gid = 0 ;
d - > items [ 3 ] . gnum = max_value ;
d - > items [ 4 ] . type = D_BUTTON ;
d - > items [ 4 ] . gid = B_ENTER ;
d - > items [ 4 ] . fn = ok_dialog ;
d - > items [ 4 ] . text = TEXT_ ( T_OK ) ;
d - > items [ 5 ] . type = D_BUTTON ;
d - > items [ 5 ] . gid = B_ESC ;
d - > items [ 5 ] . fn = cancel_dialog ;
d - > items [ 5 ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ 6 ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# ifdef JS
static unsigned char * const jsopt_labels [ ] = { TEXT_ ( T_KILL_ALL_SCRIPTS ) , TEXT_ ( T_ENABLE_JAVASCRIPT ) , TEXT_ ( T_VERBOSE_JS_ERRORS ) , TEXT_ ( T_VERBOSE_JS_WARNINGS ) , TEXT_ ( T_ENABLE_ALL_CONVERSIONS ) , TEXT_ ( T_ENABLE_GLOBAL_NAME_RESOLUTION ) , TEXT_ ( T_MANUAL_JS_CONTROL ) , TEXT_ ( T_JS_RECURSION_DEPTH ) , TEXT_ ( T_JS_MEMORY_LIMIT_KB ) , NULL } ;
static int kill_script_opt ;
static unsigned char js_fun_depth_str [ 7 ] ;
static unsigned char js_memory_limit_str [ 7 ] ;
static inline void kill_js_recursively ( struct f_data_c * fd )
{
struct f_data_c * f ;
struct list_head * lf ;
if ( fd - > js ) js_downcall_game_over ( fd - > js - > ctx ) ;
foreach ( struct f_data_c , f , lf , fd - > subframes ) kill_js_recursively ( f ) ;
}
static inline void quiet_kill_js_recursively ( struct f_data_c * fd )
{
struct f_data_c * f ;
struct list_head * lf ;
if ( fd - > js ) js_downcall_game_over ( fd - > js - > ctx ) ;
foreach ( struct f_data_c , f , lf , fd - > subframes ) quiet_kill_js_recursively ( f ) ;
}
static void refresh_javascript ( void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
if ( ses - > screen - > f_data ) jsint_scan_script_tags ( ses - > screen ) ;
if ( kill_script_opt )
kill_js_recursively ( ses - > screen ) ;
if ( ! js_enable ) /* vypnuli jsme skribt */
{
if ( ses - > default_status ) mem_free ( ses - > default_status ) , ses - > default_status = NULL ;
quiet_kill_js_recursively ( ses - > screen ) ;
}
js_fun_depth = strtol ( cast_const_char js_fun_depth_str , 0 , 10 ) ;
js_memory_limit = strtol ( cast_const_char js_memory_limit_str , 0 , 10 ) ;
/* reparse document (muze se zmenit hodne veci) */
html_interpret_recursive ( ses - > screen ) ;
draw_formatted ( ses ) ;
}
static void javascript_options ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
struct dialog * d ;
kill_script_opt = 0 ;
snprintf ( cast_char js_fun_depth_str , 7 , " %d " , js_fun_depth ) ;
snprintf ( cast_char js_memory_limit_str , 7 , " %d " , js_memory_limit ) ;
d = mem_calloc ( sizeof ( struct dialog ) + 11 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_JAVASCRIPT_OPTIONS ) ;
d - > fn = group_fn ;
d - > refresh = refresh_javascript ;
d - > refresh_data = ses ;
d - > udata = ( void * ) jsopt_labels ;
d - > items [ 0 ] . type = D_CHECKBOX ;
d - > items [ 0 ] . gid = 0 ;
d - > items [ 0 ] . dlen = sizeof ( int ) ;
d - > items [ 0 ] . data = ( void * ) & kill_script_opt ;
d - > items [ 1 ] . type = D_CHECKBOX ;
d - > items [ 1 ] . gid = 0 ;
d - > items [ 1 ] . dlen = sizeof ( int ) ;
d - > items [ 1 ] . data = ( void * ) & js_enable ;
d - > items [ 2 ] . type = D_CHECKBOX ;
d - > items [ 2 ] . gid = 0 ;
d - > items [ 2 ] . dlen = sizeof ( int ) ;
d - > items [ 2 ] . data = ( void * ) & js_verbose_errors ;
d - > items [ 3 ] . type = D_CHECKBOX ;
d - > items [ 3 ] . gid = 0 ;
d - > items [ 3 ] . dlen = sizeof ( int ) ;
d - > items [ 3 ] . data = ( void * ) & js_verbose_warnings ;
d - > items [ 4 ] . type = D_CHECKBOX ;
d - > items [ 4 ] . gid = 0 ;
d - > items [ 4 ] . dlen = sizeof ( int ) ;
d - > items [ 4 ] . data = ( void * ) & js_all_conversions ;
d - > items [ 5 ] . type = D_CHECKBOX ;
d - > items [ 5 ] . gid = 0 ;
d - > items [ 5 ] . dlen = sizeof ( int ) ;
d - > items [ 5 ] . data = ( void * ) & js_global_resolve ;
d - > items [ 6 ] . type = D_CHECKBOX ;
d - > items [ 6 ] . gid = 0 ;
d - > items [ 6 ] . dlen = sizeof ( int ) ;
d - > items [ 6 ] . data = ( void * ) & js_manual_confirmation ;
d - > items [ 7 ] . type = D_FIELD ;
d - > items [ 7 ] . dlen = 7 ;
d - > items [ 7 ] . data = js_fun_depth_str ;
d - > items [ 7 ] . fn = check_number ;
d - > items [ 7 ] . gid = 1 ;
d - > items [ 7 ] . gnum = 999999 ;
d - > items [ 8 ] . type = D_FIELD ;
d - > items [ 8 ] . dlen = 7 ;
d - > items [ 8 ] . data = js_memory_limit_str ;
d - > items [ 8 ] . fn = check_number ;
d - > items [ 8 ] . gid = 1024 ;
d - > items [ 8 ] . gnum = 30 * 1024 ;
d - > items [ 9 ] . type = D_BUTTON ;
d - > items [ 9 ] . gid = B_ENTER ;
d - > items [ 9 ] . fn = ok_dialog ;
d - > items [ 9 ] . text = TEXT_ ( T_OK ) ;
d - > items [ 10 ] . type = D_BUTTON ;
d - > items [ 10 ] . gid = B_ESC ;
d - > items [ 10 ] . fn = cancel_dialog ;
d - > items [ 10 ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ 11 ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# endif
# ifndef G
static inline void reinit_video ( void ) { }
# else
# define VO_GAMMA_LEN 9
static unsigned char disp_red_g [ VO_GAMMA_LEN ] ;
static unsigned char disp_green_g [ VO_GAMMA_LEN ] ;
static unsigned char disp_blue_g [ VO_GAMMA_LEN ] ;
static unsigned char user_g [ VO_GAMMA_LEN ] ;
static unsigned char aspect_str [ VO_GAMMA_LEN ] ;
static void reinit_video ( void ) ;
static void refresh_video ( void * xxx )
{
display_red_gamma = atof ( cast_const_char disp_red_g ) ;
display_green_gamma = atof ( cast_const_char disp_green_g ) ;
display_blue_gamma = atof ( cast_const_char disp_blue_g ) ;
user_gamma = atof ( cast_const_char user_g ) ;
bfu_aspect = atof ( cast_const_char aspect_str ) ;
if ( F & & drv - > flags & ( GD_SELECT_PALETTE | GD_SWITCH_PALETTE ) & & drv - > set_palette )
drv - > set_palette ( ) ;
reinit_video ( ) ;
}
static void reinit_video ( void )
{
if ( ! F )
return ;
/* Flush font cache */
update_aspect ( ) ;
/* Recompute dithering tables for the new gamma */
init_dither ( drv - > depth ) ;
shutdown_bfu ( ) ;
freetype_reload ( ) ;
init_bfu ( ) ;
init_grview ( ) ;
/* Redraw all terminals */
cls_redraw_all_terminals ( ) ;
shrink_format_cache ( SH_FREE_ALL ) ;
}
# define video_msg_0 TEXT_(T_VIDEO_OPTIONS_TEXT)
static unsigned char * const video_msg_1 [ ] = {
TEXT_ ( T_RED_DISPLAY_GAMMA ) ,
TEXT_ ( T_GREEN_DISPLAY_GAMMA ) ,
TEXT_ ( T_BLUE_DISPLAY_GAMMA ) ,
TEXT_ ( T_USER_GAMMA ) ,
TEXT_ ( T_ASPECT_RATIO ) ,
} ;
static unsigned char * const video_msg_2 [ ] = {
TEXT_ ( T_DISPLAY_OPTIMIZATION_CRT ) ,
TEXT_ ( T_DISPLAY_OPTIMIZATION_LCD_RGB ) ,
TEXT_ ( T_DISPLAY_OPTIMIZATION_LCD_BGR ) ,
TEXT_ ( T_DITHER_LETTERS ) ,
TEXT_ ( T_DITHER_IMAGES ) ,
TEXT_ ( T_8_BIT_GAMMA_CORRECTION ) ,
TEXT_ ( T_16_BIT_GAMMA_CORRECTION ) ,
TEXT_ ( T_AUTO_GAMMA_CORRECTION ) ,
} ;
# define video_option_select_palette (drv->flags & GD_SELECT_PALETTE)
# define video_option_switch_palette (drv->flags & GD_SWITCH_PALETTE)
# define video_option_scrolling (drv->flags & GD_DONT_USE_SCROLL)
static unsigned char * const video_msg_select_palette [ ] = {
TEXT_ ( T_RGB_PALETTE_6x6x6 ) ,
TEXT_ ( T_RGB_PALETTE_8x8x4 ) ,
} ;
static unsigned char * const video_msg_switch_palette [ ] = {
TEXT_ ( T_SWITCH_PALETTE ) ,
} ;
static unsigned char * const video_msg_scrolling [ ] = {
TEXT_ ( T_OVERWRITE_SCREEN_INSTEAD_OF_SCROLLING_IT ) ,
} ;
static void videoopt_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
struct dialog_item_data * did ;
int max = 0 , min = 0 ;
int w , rw ;
int y = gf_val ( - 1 , - G_BFU_FONT_SIZE ) ;
max_text_width ( term , video_msg_0 , & max , AL_LEFT ) ;
min_text_width ( term , video_msg_0 , & min , AL_LEFT ) ;
max_group_width ( term , video_msg_1 , dlg - > items , array_elements ( video_msg_1 ) , & max ) ;
min_group_width ( term , video_msg_1 , dlg - > items , array_elements ( video_msg_1 ) , & min ) ;
checkboxes_width ( term , video_msg_2 , array_elements ( video_msg_2 ) , & max , max_text_width ) ;
checkboxes_width ( term , video_msg_2 , array_elements ( video_msg_2 ) , & min , min_text_width ) ;
if ( video_option_select_palette ) {
checkboxes_width ( term , video_msg_select_palette , array_elements ( video_msg_select_palette ) , & max , max_text_width ) ;
checkboxes_width ( term , video_msg_select_palette , array_elements ( video_msg_select_palette ) , & min , min_text_width ) ;
}
if ( video_option_switch_palette ) {
checkboxes_width ( term , video_msg_switch_palette , array_elements ( video_msg_switch_palette ) , & max , max_text_width ) ;
checkboxes_width ( term , video_msg_switch_palette , array_elements ( video_msg_switch_palette ) , & min , min_text_width ) ;
}
if ( video_option_scrolling ) {
checkboxes_width ( term , video_msg_scrolling , array_elements ( video_msg_scrolling ) , & max , max_text_width ) ;
checkboxes_width ( term , video_msg_scrolling , array_elements ( video_msg_scrolling ) , & min , min_text_width ) ;
}
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = dlg - > win - > term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > dlg - > win - > term - > x - 2 * DIALOG_LB ) w = dlg - > win - > term - > x - 2 * DIALOG_LB ;
if ( w < 1 ) w = 1 ;
rw = 0 ;
dlg_format_text ( dlg , NULL , video_msg_0 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
did = dlg - > items ;
dlg_format_group ( dlg , NULL , video_msg_1 , did , array_elements ( video_msg_1 ) , 0 , & y , w , & rw ) ;
did + = array_elements ( video_msg_1 ) ;
y + = LL ;
dlg_format_checkboxes ( dlg , NULL , did , array_elements ( video_msg_2 ) , dlg - > x + DIALOG_LB , & y , w , & rw , video_msg_2 ) ;
did + = array_elements ( video_msg_2 ) ;
if ( video_option_select_palette ) {
dlg_format_checkboxes ( dlg , NULL , did , array_elements ( video_msg_select_palette ) , dlg - > x + DIALOG_LB , & y , w , & rw , video_msg_select_palette ) ;
did + = array_elements ( video_msg_select_palette ) ;
}
if ( video_option_switch_palette ) {
dlg_format_checkboxes ( dlg , NULL , did , array_elements ( video_msg_switch_palette ) , dlg - > x + DIALOG_LB , & y , w , & rw , video_msg_switch_palette ) ;
did + = array_elements ( video_msg_switch_palette ) ;
}
if ( video_option_scrolling ) {
dlg_format_checkboxes ( dlg , NULL , did , array_elements ( video_msg_scrolling ) , dlg - > x + DIALOG_LB , & y , w , & rw , video_msg_scrolling ) ;
did + = array_elements ( video_msg_scrolling ) ;
}
y + = LL ;
dlg_format_buttons ( dlg , NULL , did , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = w + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB ;
dlg_format_text ( dlg , term , video_msg_0 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
did = dlg - > items ;
dlg_format_group ( dlg , term , video_msg_1 , did , array_elements ( video_msg_1 ) , dlg - > x + DIALOG_LB , & y , w , NULL ) ;
did + = array_elements ( video_msg_1 ) ;
y + = LL ;
dlg_format_checkboxes ( dlg , term , did , array_elements ( video_msg_2 ) , dlg - > x + DIALOG_LB , & y , w , NULL , video_msg_2 ) ;
did + = array_elements ( video_msg_2 ) ;
if ( video_option_select_palette ) {
dlg_format_checkboxes ( dlg , term , did , array_elements ( video_msg_select_palette ) , dlg - > x + DIALOG_LB , & y , w , NULL , video_msg_select_palette ) ;
did + = array_elements ( video_msg_select_palette ) ;
}
if ( video_option_switch_palette ) {
dlg_format_checkboxes ( dlg , term , did , array_elements ( video_msg_switch_palette ) , dlg - > x + DIALOG_LB , & y , w , NULL , video_msg_switch_palette ) ;
did + = array_elements ( video_msg_switch_palette ) ;
}
if ( video_option_scrolling ) {
dlg_format_checkboxes ( dlg , term , did , array_elements ( video_msg_scrolling ) , dlg - > x + DIALOG_LB , & y , w , NULL , video_msg_scrolling ) ;
did + = array_elements ( video_msg_scrolling ) ;
}
y + = LL ;
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 2 , 2 , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
}
static void video_options ( struct terminal * term , void * xxx , void * ses_ )
{
struct dialog * d ;
int a ;
snprintf ( cast_char disp_red_g , VO_GAMMA_LEN , " %f " , display_red_gamma ) ;
remove_zeroes ( disp_red_g ) ;
snprintf ( cast_char disp_green_g , VO_GAMMA_LEN , " %f " , display_green_gamma ) ;
remove_zeroes ( disp_green_g ) ;
snprintf ( cast_char disp_blue_g , VO_GAMMA_LEN , " %f " , display_blue_gamma ) ;
remove_zeroes ( disp_blue_g ) ;
snprintf ( cast_char user_g , VO_GAMMA_LEN , " %f " , user_gamma ) ;
remove_zeroes ( user_g ) ;
snprintf ( cast_char aspect_str , VO_GAMMA_LEN , " %f " , bfu_aspect ) ;
remove_zeroes ( aspect_str ) ;
d = mem_calloc ( sizeof ( struct dialog ) + 18 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_VIDEO_OPTIONS ) ;
d - > fn = videoopt_fn ;
d - > refresh = refresh_video ;
a = 0 ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = VO_GAMMA_LEN ;
d - > items [ a ] . data = disp_red_g ;
d - > items [ a ] . fn = check_float ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 10000 ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = VO_GAMMA_LEN ;
d - > items [ a ] . data = disp_green_g ;
d - > items [ a ] . fn = check_float ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 10000 ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = VO_GAMMA_LEN ;
d - > items [ a ] . data = disp_blue_g ;
d - > items [ a ] . fn = check_float ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 10000 ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = VO_GAMMA_LEN ;
d - > items [ a ] . data = user_g ;
d - > items [ a ] . fn = check_float ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 10000 ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = VO_GAMMA_LEN ;
d - > items [ a ] . data = aspect_str ;
d - > items [ a ] . fn = check_float ;
d - > items [ a ] . gid = 25 ;
d - > items [ a + + ] . gnum = 400 ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = 0 ; /* CRT */
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & display_optimize ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = 1 ; /* LCD RGB */
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & display_optimize ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = 2 ; /* LCD BGR*/
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & display_optimize ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & dither_letters ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & dither_images ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 2 ;
d - > items [ a ] . gnum = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & gamma_bits ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 2 ;
d - > items [ a ] . gnum = 1 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & gamma_bits ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 2 ;
d - > items [ a ] . gnum = 2 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & gamma_bits ;
if ( video_option_select_palette ) {
int * palette_mode_p = & drv - > param - > palette_mode ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 3 ;
d - > items [ a ] . gnum = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) palette_mode_p ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 3 ;
d - > items [ a ] . gnum = 1 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) palette_mode_p ;
}
if ( video_option_switch_palette ) {
int * palette_mode_p = & drv - > param - > palette_mode ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) palette_mode_p ;
}
if ( video_option_scrolling ) {
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a + + ] . data = ( void * ) & overwrite_instead_of_scroll ;
}
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_OK ) ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# endif
static void refresh_network ( void * xxx )
{
abort_background_connections ( ) ;
register_bottom_half ( check_queue , NULL ) ;
}
static unsigned char max_c_str [ 3 ] ;
static unsigned char max_cth_str [ 3 ] ;
static unsigned char max_t_str [ 3 ] ;
static unsigned char time_str [ 5 ] ;
static unsigned char unrtime_str [ 5 ] ;
static unsigned char addrtime_str [ 4 ] ;
static void refresh_connections ( void * xxx )
{
netcfg_stamp + + ;
max_connections = atoi ( cast_const_char max_c_str ) ;
max_connections_to_host = atoi ( cast_const_char max_cth_str ) ;
max_tries = atoi ( cast_const_char max_t_str ) ;
receive_timeout = atoi ( cast_const_char time_str ) ;
unrestartable_receive_timeout = atoi ( cast_const_char unrtime_str ) ;
timeout_multiple_addresses = atoi ( cast_const_char addrtime_str ) ;
refresh_network ( xxx ) ;
}
static unsigned char * net_msg [ 10 ] ;
static void dlg_net_options ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
int a ;
snprint ( max_c_str , 3 , max_connections ) ;
snprint ( max_cth_str , 3 , max_connections_to_host ) ;
snprint ( max_t_str , 3 , max_tries ) ;
snprint ( time_str , 5 , receive_timeout ) ;
snprint ( unrtime_str , 5 , unrestartable_receive_timeout ) ;
snprint ( addrtime_str , 4 , timeout_multiple_addresses ) ;
2022-06-06 13:08:05 +00:00
d = mem_calloc ( sizeof ( struct dialog ) + 11 * sizeof ( struct dialog_item ) ) ;
2021-08-28 15:37:32 +00:00
d - > title = TEXT_ ( T_NETWORK_OPTIONS ) ;
d - > fn = group_fn ;
d - > udata = ( void * ) net_msg ;
d - > refresh = refresh_connections ;
a = 0 ;
net_msg [ a ] = TEXT_ ( T_MAX_CONNECTIONS ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = max_c_str ;
d - > items [ a ] . dlen = 3 ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 99 ;
net_msg [ a ] = TEXT_ ( T_MAX_CONNECTIONS_TO_ONE_HOST ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = max_cth_str ;
d - > items [ a ] . dlen = 3 ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 99 ;
net_msg [ a ] = TEXT_ ( T_RETRIES ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = max_t_str ;
d - > items [ a ] . dlen = 3 ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a + + ] . gnum = 16 ;
net_msg [ a ] = TEXT_ ( T_RECEIVE_TIMEOUT_SEC ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = time_str ;
d - > items [ a ] . dlen = 5 ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 9999 ;
net_msg [ a ] = TEXT_ ( T_TIMEOUT_WHEN_UNRESTARTABLE ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = unrtime_str ;
d - > items [ a ] . dlen = 5 ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 9999 ;
# ifdef USE_GETADDRINFO
net_msg [ a ] = TEXT_ ( T_TIMEOUT_WHEN_TRYING_MULTIPLE_ADDRESSES ) ;
# else
net_msg [ a ] = TEXT_ ( T_TIMEOUT_WHEN_TRYING_KEEPALIVE_CONNECTION ) ;
# endif
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = addrtime_str ;
d - > items [ a ] . dlen = 4 ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a + + ] . gnum = 999 ;
net_msg [ a ] = TEXT_ ( T_BIND_TO_LOCAL_IP_ADDRESS ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = bind_ip_address ;
d - > items [ a ] . dlen = sizeof ( bind_ip_address ) ;
d - > items [ a + + ] . fn = check_local_ip_address ;
# ifdef SUPPORT_IPV6
if ( support_ipv6 ) {
net_msg [ a ] = TEXT_ ( T_BIND_TO_LOCAL_IPV6_ADDRESS ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . data = bind_ipv6_address ;
d - > items [ a ] . dlen = sizeof ( bind_ipv6_address ) ;
d - > items [ a + + ] . fn = check_local_ipv6_address ;
}
# endif
net_msg [ a ] = TEXT_ ( T_SET_TIME_OF_DOWNLOADED_FILES ) ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & download_utime ;
d - > items [ a + + ] . dlen = sizeof ( int ) ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_OK ) ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# ifdef SUPPORT_IPV6
static unsigned char * const ipv6_labels [ ] = { TEXT_ ( T_IPV6_DEFAULT ) , TEXT_ ( T_IPV6_PREFER_IPV4 ) , TEXT_ ( T_IPV6_PREFER_IPV6 ) , TEXT_ ( T_IPV6_USE_ONLY_IPV4 ) , TEXT_ ( T_IPV6_USE_ONLY_IPV6 ) , NULL } ;
static void dlg_ipv6_options ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
d = mem_calloc ( sizeof ( struct dialog ) + 7 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_IPV6_OPTIONS ) ;
d - > fn = checkbox_list_fn ;
d - > udata = ( void * ) ipv6_labels ;
d - > refresh = refresh_network ;
d - > items [ 0 ] . type = D_CHECKBOX ;
d - > items [ 0 ] . gid = 1 ;
d - > items [ 0 ] . gnum = ADDR_PREFERENCE_DEFAULT ;
d - > items [ 0 ] . dlen = sizeof ( int ) ;
d - > items [ 0 ] . data = ( void * ) & ipv6_options . addr_preference ;
d - > items [ 1 ] . type = D_CHECKBOX ;
d - > items [ 1 ] . gid = 1 ;
d - > items [ 1 ] . gnum = ADDR_PREFERENCE_IPV4 ;
d - > items [ 1 ] . dlen = sizeof ( int ) ;
d - > items [ 1 ] . data = ( void * ) & ipv6_options . addr_preference ;
d - > items [ 2 ] . type = D_CHECKBOX ;
d - > items [ 2 ] . gid = 1 ;
d - > items [ 2 ] . gnum = ADDR_PREFERENCE_IPV6 ;
d - > items [ 2 ] . dlen = sizeof ( int ) ;
d - > items [ 2 ] . data = ( void * ) & ipv6_options . addr_preference ;
d - > items [ 3 ] . type = D_CHECKBOX ;
d - > items [ 3 ] . gid = 1 ;
d - > items [ 3 ] . gnum = ADDR_PREFERENCE_IPV4_ONLY ;
d - > items [ 3 ] . dlen = sizeof ( int ) ;
d - > items [ 3 ] . data = ( void * ) & ipv6_options . addr_preference ;
d - > items [ 4 ] . type = D_CHECKBOX ;
d - > items [ 4 ] . gid = 1 ;
d - > items [ 4 ] . gnum = ADDR_PREFERENCE_IPV6_ONLY ;
d - > items [ 4 ] . dlen = sizeof ( int ) ;
d - > items [ 4 ] . data = ( void * ) & ipv6_options . addr_preference ;
d - > items [ 5 ] . type = D_BUTTON ;
d - > items [ 5 ] . gid = B_ENTER ;
d - > items [ 5 ] . fn = ok_dialog ;
d - > items [ 5 ] . text = TEXT_ ( T_OK ) ;
d - > items [ 6 ] . type = D_BUTTON ;
d - > items [ 6 ] . gid = B_ESC ;
d - > items [ 6 ] . fn = cancel_dialog ;
d - > items [ 6 ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ 7 ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# endif
# ifdef HAVE_SSL
# define N_N 6
# else
# define N_N 5
# endif
static unsigned char * const proxy_msg [ ] = {
TEXT_ ( T_HTTP_PROXY__HOST_PORT ) ,
TEXT_ ( T_FTP_PROXY__HOST_PORT ) ,
# ifdef HAVE_SSL
TEXT_ ( T_HTTPS_PROXY__HOST_PORT ) ,
# endif
TEXT_ ( T_SOCKS_4A_PROXY__USER_HOST_PORT ) ,
TEXT_ ( T_APPEND_TEXT_TO_SOCKS_LOOKUPS ) ,
TEXT_ ( T_NOPROXY_LIST ) ,
TEXT_ ( T_ONLY_PROXIES ) ,
} ;
static void proxy_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int max = 0 , min = 0 ;
int w , rw ;
int i ;
int y = gf_val ( - 1 , - G_BFU_FONT_SIZE ) ;
if ( dlg - > win - > term - > spec - > braille ) y + = LL ;
for ( i = 0 ; i < N_N ; i + + ) {
max_text_width ( term , proxy_msg [ i ] , & max , AL_LEFT ) ;
min_text_width ( term , proxy_msg [ i ] , & min , AL_LEFT ) ;
}
max_group_width ( term , proxy_msg + N_N , dlg - > items + N_N , dlg - > n - 2 - N_N , & max ) ;
min_group_width ( term , proxy_msg + N_N , dlg - > items + N_N , dlg - > n - 2 - N_N , & min ) ;
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = dlg - > win - > term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > dlg - > win - > term - > x - 2 * DIALOG_LB ) w = dlg - > win - > term - > x - 2 * DIALOG_LB ;
if ( w < 1 ) w = 1 ;
rw = 0 ;
for ( i = 0 ; i < N_N ; i + + ) {
dlg_format_text_and_field ( dlg , NULL , proxy_msg [ i ] , & dlg - > items [ i ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
}
dlg_format_group ( dlg , NULL , proxy_msg + N_N , dlg - > items + N_N , dlg - > n - 2 - N_N , 0 , & y , w , & rw ) ;
y + = LL ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 2 , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = w + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB ;
if ( dlg - > win - > term - > spec - > braille ) y + = LL ;
for ( i = 0 ; i < N_N ; i + + ) {
dlg_format_text_and_field ( dlg , term , proxy_msg [ i ] , & dlg - > items [ i ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
}
dlg_format_group ( dlg , term , proxy_msg + N_N , & dlg - > items [ N_N ] , dlg - > n - 2 - N_N , dlg - > x + DIALOG_LB , & y , w , NULL ) ;
y + = LL ;
dlg_format_buttons ( dlg , term , & dlg - > items [ dlg - > n - 2 ] , 2 , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
}
void reset_settings_for_tor ( void )
{
# ifdef DOS
max_connections = 3 ;
max_connections_to_host = 2 ;
# else
max_connections = 10 ;
max_connections_to_host = 8 ;
# endif
max_tries = 3 ;
receive_timeout = 120 ;
unrestartable_receive_timeout = 600 ;
max_cookie_age = 0 ;
max_format_cache_entries = 5 ;
memory_cache_size = 4194304 ;
image_cache_size = 1048576 ;
font_cache_size = 2097152 ;
aggressive_cache = 1 ;
http_options . http10 = 0 ;
http_options . allow_blacklist = 1 ;
http_options . no_accept_charset = 0 ;
http_options . no_compression = 0 ;
http_options . retry_internal_errors = 0 ;
http_options . header . do_not_track = 0 ;
http_options . header . referer = proxies . only_proxies ? REFERER_NONE : REFERER_REAL_SAME_SERVER ;
http_options . header . extra_header [ 0 ] = 0 ;
ftp_options . eprt_epsv = 0 ;
dither_letters = 1 ;
dither_images = 1 ;
dds . tables = 1 ;
dds . frames = 1 ;
dds . auto_refresh = 0 ;
dds . display_images = 1 ;
}
static void data_cleanup ( void )
{
struct session * ses ;
struct list_head * lses ;
reset_settings_for_tor ( ) ;
foreach ( struct session , ses , lses , sessions ) {
ses - > ds . tables = dds . tables ;
ses - > ds . frames = dds . frames ;
ses - > ds . auto_refresh = dds . auto_refresh ;
ses - > ds . display_images = dds . display_images ;
cleanup_session ( ses ) ;
draw_formatted ( ses ) ;
}
reinit_video ( ) ;
free_blacklist ( ) ;
free_cookies ( ) ;
free_auth ( ) ;
abort_all_connections ( ) ;
shrink_memory ( SH_FREE_ALL , 0 ) ;
}
static unsigned char http_proxy [ MAX_STR_LEN ] ;
static unsigned char ftp_proxy [ MAX_STR_LEN ] ;
static unsigned char https_proxy [ MAX_STR_LEN ] ;
static unsigned char socks_proxy [ MAX_STR_LEN ] ;
static unsigned char no_proxy [ MAX_STR_LEN ] ;
static void display_proxy ( struct terminal * term , unsigned char * result , unsigned char * proxy )
{
unsigned char * url , * res ;
int sl ;
if ( ! proxy [ 0 ] ) {
result [ 0 ] = 0 ;
return ;
}
url = stracpy ( cast_uchar " proxy:// " ) ;
add_to_strn ( & url , proxy ) ;
add_to_strn ( & url , cast_uchar " / " ) ;
res = display_url ( term , url , 0 ) ;
sl = ( int ) strlen ( cast_const_char res ) ;
if ( sl < 9 | | strncmp ( cast_const_char res , " proxy:// " , 8 ) | | res [ sl - 1 ] ! = ' / ' ) {
result [ 0 ] = 0 ;
} else {
res [ sl - 1 ] = 0 ;
safe_strncpy ( result , res + 8 , MAX_STR_LEN ) ;
}
mem_free ( url ) ;
mem_free ( res ) ;
}
static void display_noproxy_list ( struct terminal * term , unsigned char * result , unsigned char * noproxy_list )
{
unsigned char * res ;
res = display_host_list ( term , noproxy_list ) ;
if ( ! res ) {
result [ 0 ] = 0 ;
} else {
safe_strncpy ( result , res , MAX_STR_LEN ) ;
}
mem_free ( res ) ;
}
int save_proxy ( int charset , unsigned char * result , unsigned char * proxy )
{
unsigned char * url , * res ;
int sl ;
int retval ;
if ( ! proxy [ 0 ] ) {
result [ 0 ] = 0 ;
return 0 ;
}
proxy = convert ( charset , utf8_table , proxy , NULL ) ;
url = stracpy ( cast_uchar " proxy:// " ) ;
add_to_strn ( & url , proxy ) ;
add_to_strn ( & url , cast_uchar " / " ) ;
mem_free ( proxy ) ;
if ( parse_url ( url , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL ) ) {
mem_free ( url ) ;
result [ 0 ] = 0 ;
return - 1 ;
}
res = idn_encode_url ( url , 0 ) ;
mem_free ( url ) ;
if ( ! res ) {
result [ 0 ] = 0 ;
return - 1 ;
}
sl = ( int ) strlen ( cast_const_char res ) ;
if ( sl < 9 | | strncmp ( cast_const_char res , " proxy:// " , 8 ) | | res [ sl - 1 ] ! = ' / ' ) {
result [ 0 ] = 0 ;
retval = - 1 ;
} else {
res [ sl - 1 ] = 0 ;
safe_strncpy ( result , res + 8 , MAX_STR_LEN ) ;
retval = strlen ( cast_const_char ( res + 8 ) ) > = MAX_STR_LEN ? - 1 : 0 ;
}
mem_free ( res ) ;
return retval ;
}
int save_noproxy_list ( int charset , unsigned char * result , unsigned char * noproxy_list )
{
unsigned char * res ;
noproxy_list = convert ( charset , utf8_table , noproxy_list , NULL ) ;
res = idn_encode_host ( noproxy_list , ( int ) strlen ( cast_const_char noproxy_list ) , cast_uchar " ., " , 0 ) ;
mem_free ( noproxy_list ) ;
if ( ! res ) {
result [ 0 ] = 0 ;
return - 1 ;
} else {
safe_strncpy ( result , res , MAX_STR_LEN ) ;
retval = strlen ( cast_const_char res ) > = MAX_STR_LEN ? - 1 : 0 ;
}
mem_free ( res ) ;
return retval ;
}
static int check_proxy_noproxy ( struct dialog_data * dlg , struct dialog_item_data * di , int ( * save ) ( int , unsigned char * , unsigned char * ) )
{
unsigned char * result = mem_alloc ( MAX_STR_LEN ) ;
if ( save ( term_charset ( dlg - > win - > term ) , result , di - > cdata ) ) {
mem_free ( result ) ;
msg_box ( dlg - > win - > term , NULL , TEXT_ ( T_BAD_STRING ) , AL_CENTER , TEXT_ ( T_BAD_PROXY_SYNTAX ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_CANCEL ) , msg_box_null , B_ENTER | B_ESC ) ;
return 1 ;
}
mem_free ( result ) ;
return 0 ;
}
static int check_proxy ( struct dialog_data * dlg , struct dialog_item_data * di )
{
return check_proxy_noproxy ( dlg , di , save_proxy ) ;
}
static int check_noproxy_list ( struct dialog_data * dlg , struct dialog_item_data * di )
{
return check_proxy_noproxy ( dlg , di , save_noproxy_list ) ;
}
static int proxy_ok_dialog ( struct dialog_data * dlg , struct dialog_item_data * di )
{
struct terminal * term = dlg - > win - > term ;
int charset = term_charset ( term ) ;
int op = proxies . only_proxies ;
int r = ok_dialog ( dlg , di ) ;
if ( r ) return r ;
save_proxy ( charset , proxies . http_proxy , http_proxy ) ;
save_proxy ( charset , proxies . ftp_proxy , ftp_proxy ) ;
save_proxy ( charset , proxies . https_proxy , https_proxy ) ;
save_proxy ( charset , proxies . socks_proxy , socks_proxy ) ;
save_noproxy_list ( charset , proxies . no_proxy , no_proxy ) ;
if ( ! proxies . only_proxies ) {
/* parsing duplicated in make_connection */
long lp ;
char * end ;
unsigned char * p = cast_uchar strchr ( cast_const_char proxies . socks_proxy , ' @ ' ) ;
if ( ! p ) p = proxies . socks_proxy ;
else p + + ;
p = cast_uchar strchr ( cast_const_char p , ' : ' ) ;
if ( p ) {
p + + ;
lp = strtol ( cast_const_char p , & end , 10 ) ;
if ( ! * end & & lp = = 9050 ) {
proxies . only_proxies = 1 ;
msg_box ( term , NULL , TEXT_ ( T_PROXIES ) , AL_LEFT , TEXT_ ( T_TOR_MODE_ENABLED ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
}
}
}
if ( op ! = proxies . only_proxies ) {
data_cleanup ( ) ;
}
refresh_network ( NULL ) ;
return 0 ;
}
static void dlg_proxy_options ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
int a = 0 ;
display_proxy ( term , http_proxy , proxies . http_proxy ) ;
display_proxy ( term , ftp_proxy , proxies . ftp_proxy ) ;
display_proxy ( term , https_proxy , proxies . https_proxy ) ;
display_proxy ( term , socks_proxy , proxies . socks_proxy ) ;
display_noproxy_list ( term , no_proxy , proxies . no_proxy ) ;
d = mem_calloc ( sizeof ( struct dialog ) + ( N_N + 3 ) * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_PROXIES ) ;
d - > fn = proxy_fn ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = http_proxy ;
d - > items [ a ] . fn = check_proxy ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = ftp_proxy ;
d - > items [ a ] . fn = check_proxy ;
a + + ;
# ifdef HAVE_SSL
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = https_proxy ;
d - > items [ a ] . fn = check_proxy ;
a + + ;
# endif
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = socks_proxy ;
d - > items [ a ] . fn = check_proxy ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = proxies . dns_append ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = no_proxy ;
d - > items [ a ] . fn = check_noproxy_list ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & proxies . only_proxies ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = proxy_ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# undef N_N
# ifdef HAVE_SSL_CERTIFICATES
static int check_file ( struct dialog_data * dlg , struct dialog_item_data * di , int type )
{
unsigned char * p = di - > cdata ;
int r ;
struct stat st ;
links_ssl * ssl ;
if ( ! p [ 0 ] ) return 0 ;
EINTRLOOP ( r , stat ( cast_const_char p , & st ) ) ;
if ( r | | ! S_ISREG ( st . st_mode ) ) {
msg_box ( dlg - > win - > term , NULL , TEXT_ ( T_BAD_FILE ) , AL_CENTER , TEXT_ ( T_THE_FILE_DOES_NOT_EXIST ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_CANCEL ) , msg_box_null , B_ENTER | B_ESC ) ;
return 1 ;
}
ssl = getSSL ( ) ;
if ( ! ssl )
return 0 ;
# if !defined(OPENSSL_NO_STDIO)
if ( ! type ) {
ssl_asked_for_password = 0 ;
r = SSL_use_PrivateKey_file ( ssl - > ssl , cast_const_char p , SSL_FILETYPE_PEM ) ;
if ( ! r & & ssl_asked_for_password ) r = 1 ;
r = r ! = 1 ;
} else {
r = SSL_use_certificate_file ( ssl - > ssl , cast_const_char p , SSL_FILETYPE_PEM ) ;
r = r ! = 1 ;
}
# else
r = 0 ;
# endif
if ( r )
msg_box ( dlg - > win - > term , NULL , TEXT_ ( T_BAD_FILE ) , AL_CENTER , TEXT_ ( T_THE_FILE_HAS_INVALID_FORMAT ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_CANCEL ) , msg_box_null , B_ENTER | B_ESC ) ;
freeSSL ( ssl ) ;
return r ;
}
static int check_file_key ( struct dialog_data * dlg , struct dialog_item_data * di )
{
return check_file ( dlg , di , 0 ) ;
}
static int check_file_crt ( struct dialog_data * dlg , struct dialog_item_data * di )
{
return check_file ( dlg , di , 1 ) ;
}
static unsigned char * const ssl_labels [ ] = {
TEXT_ ( T_ACCEPT_INVALID_CERTIFICATES ) ,
TEXT_ ( T_WARN_ON_INVALID_CERTIFICATES ) ,
TEXT_ ( T_REJECT_INVALID_CERTIFICATES ) ,
# ifdef HAVE_BUILTIN_SSL_CERTIFICATES
TEXT_ ( T_USE_BUILT_IN_CERTIFICATES ) ,
# endif
TEXT_ ( T_CLIENT_CERTIFICATE_KEY_FILE ) ,
TEXT_ ( T_CLIENT_CERTIFICATE_FILE ) ,
TEXT_ ( T_CLIENT_CERTIFICATE_KEY_PASSWORD ) ,
NULL
} ;
static void ssl_options_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int max = 0 , min = 0 ;
int w , rw ;
int y = 0 ;
checkboxes_width ( term , dlg - > dlg - > udata , dlg - > n - 4 , & max , max_text_width ) ;
checkboxes_width ( term , dlg - > dlg - > udata , dlg - > n - 4 , & min , min_text_width ) ;
max_text_width ( term , ssl_labels [ dlg - > n - 4 ] , & max , AL_LEFT ) ;
min_text_width ( term , ssl_labels [ dlg - > n - 4 ] , & min , AL_LEFT ) ;
max_text_width ( term , ssl_labels [ dlg - > n - 3 ] , & max , AL_LEFT ) ;
min_text_width ( term , ssl_labels [ dlg - > n - 3 ] , & min , AL_LEFT ) ;
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > term - > x - 2 * DIALOG_LB ) w = term - > x - 2 * DIALOG_LB ;
if ( w < 5 ) w = 5 ;
rw = 0 ;
dlg_format_checkboxes ( dlg , NULL , dlg - > items , dlg - > n - 5 , 0 , & y , w , & rw , dlg - > dlg - > udata ) ;
y + = LL ;
dlg_format_text_and_field ( dlg , NULL , ssl_labels [ dlg - > n - 5 ] , dlg - > items + dlg - > n - 5 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , ssl_labels [ dlg - > n - 4 ] , dlg - > items + dlg - > n - 4 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , ssl_labels [ dlg - > n - 3 ] , dlg - > items + dlg - > n - 3 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 2 , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = rw + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB + LL ;
dlg_format_checkboxes ( dlg , term , dlg - > items , dlg - > n - 5 , dlg - > x + DIALOG_LB , & y , w , NULL , dlg - > dlg - > udata ) ;
y + = LL ;
dlg_format_text_and_field ( dlg , term , ssl_labels [ dlg - > n - 5 ] , dlg - > items + dlg - > n - 5 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , ssl_labels [ dlg - > n - 4 ] , dlg - > items + dlg - > n - 4 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , ssl_labels [ dlg - > n - 3 ] , dlg - > items + dlg - > n - 3 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 2 , 2 , dlg - > x + DIALOG_LB , & y , w , & rw , AL_CENTER ) ;
}
static void dlg_ssl_options ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
int a = 0 ;
const int items = 8
# ifdef HAVE_BUILTIN_SSL_CERTIFICATES
+ 1
# endif
;
d = mem_calloc ( sizeof ( struct dialog ) + items * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_SSL_OPTIONS ) ;
d - > fn = ssl_options_fn ;
d - > udata = ( void * ) ssl_labels ;
d - > refresh = refresh_network ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = SSL_ACCEPT_INVALID_CERTIFICATE ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & ssl_options . certificates ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = SSL_WARN_ON_INVALID_CERTIFICATE ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & ssl_options . certificates ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = SSL_REJECT_INVALID_CERTIFICATE ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & ssl_options . certificates ;
a + + ;
# ifdef HAVE_BUILTIN_SSL_CERTIFICATES
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & ssl_options . built_in_certificates ;
a + + ;
# endif
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = ssl_options . client_cert_key ;
d - > items [ a ] . fn = check_file_key ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = ssl_options . client_cert_crt ;
d - > items [ a ] . fn = check_file_crt ;
a + + ;
d - > items [ a ] . type = D_FIELD_PASS ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = ssl_options . client_cert_password ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# endif
2022-06-06 13:08:05 +00:00
static unsigned char * const dns_msg [ ] = {
# ifndef NO_ASYNC_LOOKUP
TEXT_ ( T_ASYNC_DNS_LOOKUP ) ,
# endif
TEXT_ ( T_DNS_OVER_HTTPS_URL ) ,
} ;
static void dns_options_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int max = 0 , min = 0 ;
int w , rw ;
int i ;
int y = 0 ;
i = 0 ;
# ifndef NO_ASYNC_LOOKUP
max_group_width ( term , dns_msg + i , dlg - > items , 1 , & max ) ;
min_group_width ( term , dns_msg + i , dlg - > items , 1 , & min ) ;
i + + ;
# endif
for ( ; i < dlg - > n - 2 ; i + + ) {
max_text_width ( term , dns_msg [ i ] , & max , AL_LEFT ) ;
min_text_width ( term , dns_msg [ i ] , & min , AL_LEFT ) ;
}
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = dlg - > win - > term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > dlg - > win - > term - > x - 2 * DIALOG_LB ) w = dlg - > win - > term - > x - 2 * DIALOG_LB ;
if ( w < 1 ) w = 1 ;
rw = 0 ;
i = 0 ;
# ifndef NO_ASYNC_LOOKUP
dlg_format_group ( dlg , NULL , dns_msg , dlg - > items , 1 , 0 , & y , w , & rw ) ;
y + = LL ;
i + + ;
# else
if ( ! dlg - > win - > term - > spec - > braille ) y - = LL ;
# endif
for ( ; i < dlg - > n - 2 ; i + + ) {
dlg_format_text_and_field ( dlg , NULL , dns_msg [ i ] , & dlg - > items [ i ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
}
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 2 , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = w + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB ;
y + = LL ;
i = 0 ;
# ifndef NO_ASYNC_LOOKUP
dlg_format_group ( dlg , term , dns_msg , dlg - > items , 1 , dlg - > x + DIALOG_LB , & y , w , & rw ) ;
y + = LL ;
i + + ;
# else
if ( ! dlg - > win - > term - > spec - > braille ) y - = LL ;
# endif
for ( ; i < dlg - > n - 2 ; i + + ) {
dlg_format_text_and_field ( dlg , term , dns_msg [ i ] , & dlg - > items [ i ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
}
dlg_format_buttons ( dlg , term , & dlg - > items [ dlg - > n - 2 ] , 2 , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
}
static void dlg_dns_options ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
int a = 0 ;
d = mem_calloc ( sizeof ( struct dialog ) + 5 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_DNS_OPTIONS ) ;
d - > fn = dns_options_fn ;
d - > refresh = refresh_network ;
# ifndef NO_ASYNC_LOOKUP
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( unsigned char * ) & async_lookup ;
a + + ;
# endif
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = dns_over_https ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
2021-08-28 15:37:32 +00:00
static unsigned char * const http_labels [ ] = { TEXT_ ( T_USE_HTTP_10 ) , TEXT_ ( T_ALLOW_SERVER_BLACKLIST ) , TEXT_ ( T_DO_NOT_SEND_ACCEPT_CHARSET ) ,
# ifdef HAVE_ANY_COMPRESSION
TEXT_ ( T_DO_NOT_ADVERTISE_COMPRESSION_SUPPORT ) ,
# endif
TEXT_ ( T_RETRY_ON_INTERNAL_ERRORS ) , NULL } ;
static unsigned char * const http_header_labels [ ] = { TEXT_ ( T_FAKE_FIREFOX ) , TEXT_ ( T_DO_NOT_TRACK ) , TEXT_ ( T_REFERER_NONE ) , TEXT_ ( T_REFERER_SAME_URL ) , TEXT_ ( T_REFERER_FAKE ) , TEXT_ ( T_REFERER_REAL_SAME_SERVER ) , TEXT_ ( T_REFERER_REAL ) , TEXT_ ( T_FAKE_REFERER ) , TEXT_ ( T_FAKE_USERAGENT ) , TEXT_ ( T_EXTRA_HEADER ) , NULL } ;
static void httpheadopt_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int max = 0 , min = 0 ;
int w , rw ;
int y = 0 ;
checkboxes_width ( term , dlg - > dlg - > udata , dlg - > n - 5 , & max , max_text_width ) ;
checkboxes_width ( term , dlg - > dlg - > udata , dlg - > n - 5 , & min , min_text_width ) ;
max_text_width ( term , http_header_labels [ dlg - > n - 5 ] , & max , AL_LEFT ) ;
min_text_width ( term , http_header_labels [ dlg - > n - 5 ] , & min , AL_LEFT ) ;
max_text_width ( term , http_header_labels [ dlg - > n - 4 ] , & max , AL_LEFT ) ;
min_text_width ( term , http_header_labels [ dlg - > n - 4 ] , & min , AL_LEFT ) ;
max_text_width ( term , http_header_labels [ dlg - > n - 3 ] , & max , AL_LEFT ) ;
min_text_width ( term , http_header_labels [ dlg - > n - 3 ] , & min , AL_LEFT ) ;
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > term - > x - 2 * DIALOG_LB ) w = term - > x - 2 * DIALOG_LB ;
if ( w < 5 ) w = 5 ;
rw = 0 ;
dlg_format_checkboxes ( dlg , NULL , dlg - > items , dlg - > n - 5 , 0 , & y , w , & rw , dlg - > dlg - > udata ) ;
y + = LL ;
dlg_format_text_and_field ( dlg , NULL , http_header_labels [ dlg - > n - 5 ] , dlg - > items + dlg - > n - 5 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , http_header_labels [ dlg - > n - 4 ] , dlg - > items + dlg - > n - 4 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , http_header_labels [ dlg - > n - 3 ] , dlg - > items + dlg - > n - 3 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 2 , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = rw + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB + LL ;
dlg_format_checkboxes ( dlg , term , dlg - > items , dlg - > n - 5 , dlg - > x + DIALOG_LB , & y , w , NULL , dlg - > dlg - > udata ) ;
y + = LL ;
dlg_format_text_and_field ( dlg , term , http_header_labels [ dlg - > n - 5 ] , dlg - > items + dlg - > n - 5 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , http_header_labels [ dlg - > n - 4 ] , dlg - > items + dlg - > n - 4 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
if ( ! dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , http_header_labels [ dlg - > n - 3 ] , dlg - > items + dlg - > n - 3 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 2 , 2 , dlg - > x + DIALOG_LB , & y , w , & rw , AL_CENTER ) ;
}
static int dlg_http_header_options ( struct dialog_data * dlg , struct dialog_item_data * di )
{
struct http_header_options * header = ( struct http_header_options * ) di - > cdata ;
struct dialog * d ;
d = mem_calloc ( sizeof ( struct dialog ) + 12 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_HTTP_HEADER_OPTIONS ) ;
d - > fn = httpheadopt_fn ;
d - > udata = ( void * ) http_header_labels ;
d - > items [ 0 ] . type = D_CHECKBOX ;
d - > items [ 0 ] . gid = 0 ;
d - > items [ 0 ] . dlen = sizeof ( int ) ;
d - > items [ 0 ] . data = ( void * ) & header - > fake_firefox ;
d - > items [ 1 ] . type = D_CHECKBOX ;
d - > items [ 1 ] . gid = 0 ;
d - > items [ 1 ] . dlen = sizeof ( int ) ;
d - > items [ 1 ] . data = ( void * ) & header - > do_not_track ;
d - > items [ 2 ] . type = D_CHECKBOX ;
d - > items [ 2 ] . gid = 1 ;
d - > items [ 2 ] . gnum = REFERER_NONE ;
d - > items [ 2 ] . dlen = sizeof ( int ) ;
d - > items [ 2 ] . data = ( void * ) & header - > referer ;
d - > items [ 3 ] . type = D_CHECKBOX ;
d - > items [ 3 ] . gid = 1 ;
d - > items [ 3 ] . gnum = REFERER_SAME_URL ;
d - > items [ 3 ] . dlen = sizeof ( int ) ;
d - > items [ 3 ] . data = ( void * ) & header - > referer ;
d - > items [ 4 ] . type = D_CHECKBOX ;
d - > items [ 4 ] . gid = 1 ;
d - > items [ 4 ] . gnum = REFERER_FAKE ;
d - > items [ 4 ] . dlen = sizeof ( int ) ;
d - > items [ 4 ] . data = ( void * ) & header - > referer ;
d - > items [ 5 ] . type = D_CHECKBOX ;
d - > items [ 5 ] . gid = 1 ;
d - > items [ 5 ] . gnum = REFERER_REAL_SAME_SERVER ;
d - > items [ 5 ] . dlen = sizeof ( int ) ;
d - > items [ 5 ] . data = ( void * ) & header - > referer ;
d - > items [ 6 ] . type = D_CHECKBOX ;
d - > items [ 6 ] . gid = 1 ;
d - > items [ 6 ] . gnum = REFERER_REAL ;
d - > items [ 6 ] . dlen = sizeof ( int ) ;
d - > items [ 6 ] . data = ( void * ) & header - > referer ;
d - > items [ 7 ] . type = D_FIELD ;
d - > items [ 7 ] . dlen = MAX_STR_LEN ;
d - > items [ 7 ] . data = header - > fake_referer ;
d - > items [ 8 ] . type = D_FIELD ;
d - > items [ 8 ] . dlen = MAX_STR_LEN ;
d - > items [ 8 ] . data = header - > fake_useragent ;
d - > items [ 9 ] . type = D_FIELD ;
d - > items [ 9 ] . dlen = MAX_STR_LEN ;
d - > items [ 9 ] . data = header - > extra_header ;
d - > items [ 10 ] . type = D_BUTTON ;
d - > items [ 10 ] . gid = B_ENTER ;
d - > items [ 10 ] . fn = ok_dialog ;
d - > items [ 10 ] . text = TEXT_ ( T_OK ) ;
d - > items [ 11 ] . type = D_BUTTON ;
d - > items [ 11 ] . gid = B_ESC ;
d - > items [ 11 ] . fn = cancel_dialog ;
d - > items [ 11 ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ 12 ] . type = D_END ;
do_dialog ( dlg - > win - > term , d , getml ( d , NULL ) ) ;
return 0 ;
}
static void dlg_http_options ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
int a = 0 ;
d = mem_calloc ( sizeof ( struct dialog ) + 8 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_HTTP_BUG_WORKAROUNDS ) ;
d - > fn = checkbox_list_fn ;
d - > udata = ( void * ) http_labels ;
d - > refresh = refresh_network ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & http_options . http10 ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & http_options . allow_blacklist ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & http_options . no_accept_charset ;
a + + ;
# ifdef HAVE_ANY_COMPRESSION
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & http_options . no_compression ;
a + + ;
# endif
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & http_options . retry_internal_errors ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . fn = dlg_http_header_options ;
d - > items [ a ] . text = TEXT_ ( T_HEADER_OPTIONS ) ;
d - > items [ a ] . data = ( void * ) & http_options . header ;
d - > items [ a ] . dlen = sizeof ( struct http_header_options ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
a + + ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
static unsigned char * const ftp_texts [ ] = { TEXT_ ( T_PASSWORD_FOR_ANONYMOUS_LOGIN ) , TEXT_ ( T_USE_PASSIVE_FTP ) , TEXT_ ( T_USE_EPRT_EPSV ) , TEXT_ ( T_SET_TYPE_OF_SERVICE ) , NULL } ;
static void ftpopt_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int max = 0 , min = 0 ;
int w , rw ;
int y = 0 ;
if ( dlg - > win - > term - > spec - > braille ) y + = LL ;
max_text_width ( term , ftp_texts [ 0 ] , & max , AL_LEFT ) ;
min_text_width ( term , ftp_texts [ 0 ] , & min , AL_LEFT ) ;
checkboxes_width ( term , ftp_texts + 1 , dlg - > n - 3 , & max , max_text_width ) ;
checkboxes_width ( term , ftp_texts + 1 , dlg - > n - 3 , & min , min_text_width ) ;
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > term - > x - 2 * DIALOG_LB ) w = term - > x - 2 * DIALOG_LB ;
if ( w < 5 ) w = 5 ;
rw = 0 ;
dlg_format_text_and_field ( dlg , NULL , ftp_texts [ 0 ] , dlg - > items , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
dlg_format_checkboxes ( dlg , NULL , dlg - > items + 1 , dlg - > n - 3 , 0 , & y , w , & rw , ftp_texts + 1 ) ;
y + = LL ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 2 , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = rw + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB ;
if ( dlg - > win - > term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , ftp_texts [ 0 ] , dlg - > items , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_checkboxes ( dlg , term , dlg - > items + 1 , dlg - > n - 3 , dlg - > x + DIALOG_LB , & y , w , NULL , ftp_texts + 1 ) ;
y + = LL ;
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 2 , 2 , dlg - > x + DIALOG_LB , & y , w , & rw , AL_CENTER ) ;
}
static void dlg_ftp_options ( struct terminal * term , void * xxx , void * yyy )
{
int a ;
struct dialog * d ;
d = mem_calloc ( sizeof ( struct dialog ) + 6 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_FTP_OPTIONS ) ;
d - > fn = ftpopt_fn ;
d - > refresh = refresh_network ;
a = 0 ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = ftp_options . anon_pass ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & ftp_options . passive_ftp ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & ftp_options . eprt_epsv ;
a + + ;
# ifdef HAVE_IPTOS
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & ftp_options . set_tos ;
a + + ;
# endif
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# ifndef DISABLE_SMB
static unsigned char * const smb_labels [ ] = { TEXT_ ( T_ALLOW_HYPERLINKS_TO_SMB ) , NULL } ;
static void dlg_smb_options ( struct terminal * term , void * xxx , void * yyy )
{
int a ;
struct dialog * d ;
d = mem_calloc ( sizeof ( struct dialog ) + 3 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_SMB_OPTIONS ) ;
d - > fn = checkbox_list_fn ;
d - > udata = ( void * ) smb_labels ;
a = 0 ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & smb_options . allow_hyperlinks_to_smb ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# endif
static unsigned char * const prg_msg [ ] = {
TEXT_ ( T_MAILTO_PROG ) ,
TEXT_ ( T_TELNET_PROG ) ,
TEXT_ ( T_TN3270_PROG ) ,
TEXT_ ( T_MMS_PROG ) ,
TEXT_ ( T_MAGNET_PROG ) ,
2022-06-06 13:08:05 +00:00
TEXT_ ( T_GOPHER_PROG ) ,
2021-08-28 15:37:32 +00:00
TEXT_ ( T_SHELL_PROG ) ,
cast_uchar " "
} ;
static void netprog_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int max = 0 , min = 0 ;
int w , rw ;
int y = gf_val ( - 1 , - G_BFU_FONT_SIZE ) ;
int a ;
a = 0 ;
max_text_width ( term , prg_msg [ a ] , & max , AL_LEFT ) ;
min_text_width ( term , prg_msg [ a + + ] , & min , AL_LEFT ) ;
max_text_width ( term , prg_msg [ a ] , & max , AL_LEFT ) ;
min_text_width ( term , prg_msg [ a + + ] , & min , AL_LEFT ) ;
max_text_width ( term , prg_msg [ a ] , & max , AL_LEFT ) ;
min_text_width ( term , prg_msg [ a + + ] , & min , AL_LEFT ) ;
max_text_width ( term , prg_msg [ a ] , & max , AL_LEFT ) ;
min_text_width ( term , prg_msg [ a + + ] , & min , AL_LEFT ) ;
max_text_width ( term , prg_msg [ a ] , & max , AL_LEFT ) ;
min_text_width ( term , prg_msg [ a + + ] , & min , AL_LEFT ) ;
2022-06-06 13:08:05 +00:00
max_text_width ( term , prg_msg [ a ] , & max , AL_LEFT ) ;
min_text_width ( term , prg_msg [ a + + ] , & min , AL_LEFT ) ;
2021-08-28 15:37:32 +00:00
# ifdef G
if ( have_extra_exec ( ) ) {
max_text_width ( term , prg_msg [ a ] , & max , AL_LEFT ) ;
min_text_width ( term , prg_msg [ a + + ] , & min , AL_LEFT ) ;
}
# endif
max_buttons_width ( term , dlg - > items + a , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + a , 2 , & min ) ;
w = dlg - > win - > term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > dlg - > win - > term - > x - 2 * DIALOG_LB ) w = dlg - > win - > term - > x - 2 * DIALOG_LB ;
if ( w < 1 ) w = 1 ;
rw = 0 ;
a = 0 ;
if ( term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , prg_msg [ a ] , & dlg - > items [ a ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , prg_msg [ a ] , & dlg - > items [ a ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , prg_msg [ a ] , & dlg - > items [ a ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , prg_msg [ a ] , & dlg - > items [ a ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , NULL , prg_msg [ a ] , & dlg - > items [ a ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
2022-06-06 13:08:05 +00:00
dlg_format_text_and_field ( dlg , NULL , prg_msg [ a ] , & dlg - > items [ a ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
2021-08-28 15:37:32 +00:00
# ifdef G
if ( have_extra_exec ( ) ) {
dlg_format_text_and_field ( dlg , NULL , prg_msg [ a ] , & dlg - > items [ a ] , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
}
# endif
if ( term - > spec - > braille ) y + = LL ;
dlg_format_buttons ( dlg , NULL , dlg - > items + a , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = w + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB ;
if ( term - > spec - > braille ) y + = LL ;
a = 0 ;
dlg_format_text_and_field ( dlg , term , prg_msg [ a ] , & dlg - > items [ a ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , prg_msg [ a ] , & dlg - > items [ a ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , prg_msg [ a ] , & dlg - > items [ a ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , prg_msg [ a ] , & dlg - > items [ a ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
dlg_format_text_and_field ( dlg , term , prg_msg [ a ] , & dlg - > items [ a ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
2022-06-06 13:08:05 +00:00
dlg_format_text_and_field ( dlg , term , prg_msg [ a ] , & dlg - > items [ a ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
2021-08-28 15:37:32 +00:00
# ifdef G
if ( have_extra_exec ( ) ) {
dlg_format_text_and_field ( dlg , term , prg_msg [ a ] , & dlg - > items [ a ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
a + + ;
if ( ! term - > spec - > braille ) y + = LL ;
}
# endif
if ( term - > spec - > braille ) y + = LL ;
dlg_format_buttons ( dlg , term , & dlg - > items [ a ] , 2 , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
}
static void net_programs ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
int a ;
2022-06-06 13:08:05 +00:00
d = mem_calloc ( sizeof ( struct dialog ) + 9 * sizeof ( struct dialog_item ) ) ;
2021-08-28 15:37:32 +00:00
# ifdef G
if ( have_extra_exec ( ) ) d - > title = TEXT_ ( T_MAIL_TELNET_AND_SHELL_PROGRAMS ) ;
else
# endif
d - > title = TEXT_ ( T_MAIL_AND_TELNET_PROGRAMS ) ;
d - > fn = netprog_fn ;
a = 0 ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a + + ] . data = get_prog ( & mailto_prog ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a + + ] . data = get_prog ( & telnet_prog ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a + + ] . data = get_prog ( & tn3270_prog ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a + + ] . data = get_prog ( & mms_prog ) ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a + + ] . data = get_prog ( & magnet_prog ) ;
2022-06-06 13:08:05 +00:00
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a + + ] . data = get_prog ( & gopher_prog ) ;
2021-08-28 15:37:32 +00:00
# ifdef G
if ( have_extra_exec ( ) ) {
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a + + ] . data = drv - > param - > shell_term ;
}
# endif
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_OK ) ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
static unsigned char mc_str [ 8 ] ;
# ifdef G
static unsigned char ic_str [ 8 ] ;
static unsigned char fc_str [ 8 ] ;
# endif
static unsigned char doc_str [ 4 ] ;
static void cache_refresh ( void * xxx )
{
memory_cache_size = atoi ( cast_const_char mc_str ) * 1024 ;
# ifdef G
if ( F ) {
image_cache_size = atoi ( cast_const_char ic_str ) * 1024 ;
font_cache_size = atoi ( cast_const_char fc_str ) * 1024 ;
}
# endif
max_format_cache_entries = atoi ( cast_const_char doc_str ) ;
shrink_memory ( SH_CHECK_QUOTA , 0 ) ;
}
static unsigned char * const cache_texts [ ] = { TEXT_ ( T_MEMORY_CACHE_SIZE__KB ) , TEXT_ ( T_NUMBER_OF_FORMATTED_DOCUMENTS ) , TEXT_ ( T_AGGRESSIVE_CACHE ) } ;
# ifdef G
static unsigned char * const g_cache_texts [ ] = { TEXT_ ( T_MEMORY_CACHE_SIZE__KB ) , TEXT_ ( T_IMAGE_CACHE_SIZE__KB ) , TEXT_ ( T_FONT_CACHE_SIZE__KB ) , TEXT_ ( T_NUMBER_OF_FORMATTED_DOCUMENTS ) , TEXT_ ( T_AGGRESSIVE_CACHE ) } ;
# endif
static void cache_opt ( struct terminal * term , void * xxx , void * yyy )
{
struct dialog * d ;
int a ;
snprint ( mc_str , 8 , memory_cache_size / 1024 ) ;
# ifdef G
if ( F ) {
snprint ( ic_str , 8 , image_cache_size / 1024 ) ;
snprint ( fc_str , 8 , font_cache_size / 1024 ) ;
}
# endif
snprint ( doc_str , 4 , max_format_cache_entries ) ;
# ifdef G
if ( F ) {
d = mem_calloc ( sizeof ( struct dialog ) + 7 * sizeof ( struct dialog_item ) ) ;
} else
# endif
{
d = mem_calloc ( sizeof ( struct dialog ) + 5 * sizeof ( struct dialog_item ) ) ;
}
a = 0 ;
d - > title = TEXT_ ( T_CACHE_OPTIONS ) ;
d - > fn = group_fn ;
# ifdef G
if ( F ) d - > udata = ( void * ) g_cache_texts ;
else
# endif
d - > udata = ( void * ) cache_texts ;
d - > refresh = cache_refresh ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 8 ;
d - > items [ a ] . data = mc_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = MAXINT / 1024 ;
a + + ;
# ifdef G
if ( F )
{
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 8 ;
d - > items [ a ] . data = ic_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = MAXINT / 1024 ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 8 ;
d - > items [ a ] . data = fc_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = MAXINT / 1024 ;
a + + ;
}
# endif
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 4 ;
d - > items [ a ] . data = doc_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 999 ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & aggressive_cache ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
static void menu_shell ( struct terminal * term , void * xxx , void * yyy )
{
unsigned char * sh ;
if ( ! ( sh = cast_uchar GETSHELL ) ) sh = cast_uchar DEFAULT_SHELL ;
exec_on_terminal ( term , sh , cast_uchar " " , 1 ) ;
}
static void menu_kill_background_connections ( struct terminal * term , void * xxx , void * yyy )
{
abort_background_connections ( ) ;
}
static void menu_kill_all_connections ( struct terminal * term , void * xxx , void * yyy )
{
abort_all_connections ( ) ;
}
static void menu_save_html_options ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
memcpy ( & dds , & ses - > ds , sizeof ( struct document_setup ) ) ;
write_html_config ( term ) ;
}
static unsigned char marg_str [ 2 ] ;
# ifdef G
static unsigned char html_font_str [ 4 ] ;
static unsigned char image_scale_str [ 6 ] ;
# endif
static void session_refresh ( struct session * ses )
{
html_interpret_recursive ( ses - > screen ) ;
draw_formatted ( ses ) ;
}
static void html_refresh ( void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
ses - > ds . margin = atoi ( cast_const_char marg_str ) ;
# ifdef G
if ( F ) {
ses - > ds . font_size = atoi ( cast_const_char html_font_str ) ;
ses - > ds . image_scale = atoi ( cast_const_char image_scale_str ) ;
}
# endif
session_refresh ( ses ) ;
}
# ifdef G
static unsigned char * const html_texts_g [ ] = {
TEXT_ ( T_DISPLAY_TABLES ) ,
TEXT_ ( T_DISPLAY_FRAMES ) ,
TEXT_ ( T_BREAK_LONG_LINES ) ,
TEXT_ ( T_DISPLAY_LINKS_TO_IMAGES ) ,
TEXT_ ( T_DISPLAY_IMAGE_FILENAMES ) ,
TEXT_ ( T_DISPLAY_IMAGES ) ,
TEXT_ ( T_AUTO_REFRESH ) ,
TEXT_ ( T_TARGET_IN_NEW_WINDOW ) ,
TEXT_ ( T_TEXT_MARGIN ) ,
cast_uchar " " ,
TEXT_ ( T_IGNORE_CHARSET_INFO_SENT_BY_SERVER ) ,
TEXT_ ( T_USER_FONT_SIZE ) ,
TEXT_ ( T_SCALE_ALL_IMAGES_BY ) ,
TEXT_ ( T_PORN_ENABLE )
} ;
# endif
static unsigned char * const html_texts [ ] = {
TEXT_ ( T_DISPLAY_TABLES ) ,
TEXT_ ( T_DISPLAY_FRAMES ) ,
TEXT_ ( T_BREAK_LONG_LINES ) ,
TEXT_ ( T_DISPLAY_LINKS_TO_IMAGES ) ,
TEXT_ ( T_DISPLAY_IMAGE_FILENAMES ) ,
TEXT_ ( T_LINK_ORDER_BY_COLUMNS ) ,
TEXT_ ( T_NUMBERED_LINKS ) ,
TEXT_ ( T_AUTO_REFRESH ) ,
TEXT_ ( T_TARGET_IN_NEW_WINDOW ) ,
TEXT_ ( T_TEXT_MARGIN ) ,
cast_uchar " " ,
TEXT_ ( T_IGNORE_CHARSET_INFO_SENT_BY_SERVER )
} ;
static int dlg_assume_cp ( struct dialog_data * dlg , struct dialog_item_data * di )
{
charset_sel_list ( dlg - > win - > term , * ( int * ) di - > cdata , set_val , ( void * ) di - > cdata , 1 , 0 ) ;
return 0 ;
}
# ifdef G
static int dlg_kb_cp ( struct dialog_data * dlg , struct dialog_item_data * di )
{
charset_sel_list ( dlg - > win - > term , * ( int * ) di - > cdata , set_val , ( void * ) di - > cdata ,
# ifdef DOS
0
# else
1
# endif
, 1 ) ;
return 0 ;
}
# endif
void dialog_html_options ( struct session * ses )
{
struct dialog * d ;
int a ;
snprint ( marg_str , 2 , ses - > ds . margin ) ;
if ( ! F ) {
d = mem_calloc ( sizeof ( struct dialog ) + 14 * sizeof ( struct dialog_item ) ) ;
# ifdef G
} else {
d = mem_calloc ( sizeof ( struct dialog ) + 16 * sizeof ( struct dialog_item ) ) ;
snprintf ( cast_char html_font_str , 4 , " %d " , ses - > ds . font_size ) ;
snprintf ( cast_char image_scale_str , 6 , " %d " , ses - > ds . image_scale ) ;
# endif
}
d - > title = TEXT_ ( T_HTML_OPTIONS ) ;
d - > fn = group_fn ;
d - > udata = ( void * ) gf_val ( html_texts , html_texts_g ) ;
d - > udata2 = ses ;
d - > refresh = html_refresh ;
d - > refresh_data = ses ;
a = 0 ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . tables ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . frames ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . break_long_lines ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . images ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . image_names ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
# ifdef G
if ( F ) {
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . display_images ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
}
# endif
if ( ! F ) {
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . table_order ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . num_links ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
}
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . auto_refresh ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . target_in_new_window ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 2 ;
d - > items [ a ] . data = marg_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 9 ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . fn = dlg_assume_cp ;
d - > items [ a ] . text = TEXT_ ( T_DEFAULT_CODEPAGE ) ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . assume_cp ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . hard_assume ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
# ifdef G
if ( F ) {
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 4 ;
d - > items [ a ] . data = html_font_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = MAX_FONT_SIZE ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 4 ;
d - > items [ a ] . data = image_scale_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = 999 ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . data = ( unsigned char * ) & ses - > ds . porn_enable ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
}
# endif
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( ses - > term , d , getml ( d , NULL ) ) ;
}
static void menu_html_options ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
dialog_html_options ( ses ) ;
}
static unsigned char * const color_texts [ ] = { cast_uchar " " , cast_uchar " " , cast_uchar " " , TEXT_ ( T_IGNORE_DOCUMENT_COLOR ) } ;
# ifdef G
static unsigned char * const color_texts_g [ ] = { TEXT_ ( T_TEXT_COLOR ) , TEXT_ ( T_LINK_COLOR ) , TEXT_ ( T_BACKGROUND_COLOR ) , TEXT_ ( T_IGNORE_DOCUMENT_COLOR ) } ;
static unsigned char g_text_color_str [ 7 ] ;
static unsigned char g_link_color_str [ 7 ] ;
static unsigned char g_background_color_str [ 7 ] ;
# endif
static void html_color_refresh ( void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
# ifdef G
if ( F ) {
ses - > ds . g_text_color = ( int ) strtol ( cast_const_char g_text_color_str , NULL , 16 ) ;
ses - > ds . g_link_color = ( int ) strtol ( cast_const_char g_link_color_str , NULL , 16 ) ;
ses - > ds . g_background_color = ( int ) strtol ( cast_const_char g_background_color_str , NULL , 16 ) ;
}
# endif
html_interpret_recursive ( ses - > screen ) ;
draw_formatted ( ses ) ;
}
static void select_color ( struct terminal * term , int n , int * ptr )
{
int i ;
struct menu_item * mi ;
mi = new_menu ( MENU_FREE_ITEMS ) ;
for ( i = 0 ; i < n ; i + + ) {
add_to_menu ( & mi , TEXT_ ( T_COLOR_0 + i ) , cast_uchar " " , cast_uchar " " , set_val , ( void * ) ( unsigned long ) i , 0 , i ) ;
}
do_menu_selected ( term , mi , ptr , * ptr , NULL , NULL ) ;
}
static int select_color_8 ( struct dialog_data * dlg , struct dialog_item_data * di )
{
select_color ( dlg - > win - > term , 8 , ( int * ) di - > cdata ) ;
return 0 ;
}
static int select_color_16 ( struct dialog_data * dlg , struct dialog_item_data * di )
{
select_color ( dlg - > win - > term , 16 , ( int * ) di - > cdata ) ;
return 0 ;
}
static void menu_color ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
struct dialog * d ;
# ifdef G
if ( F ) {
snprintf ( cast_char g_text_color_str , 7 , " %06x " , ( unsigned ) ses - > ds . g_text_color ) ;
snprintf ( cast_char g_link_color_str , 7 , " %06x " , ( unsigned ) ses - > ds . g_link_color ) ;
snprintf ( cast_char g_background_color_str , 7 , " %06x " , ( unsigned ) ses - > ds . g_background_color ) ;
}
# endif
d = mem_calloc ( sizeof ( struct dialog ) + 6 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_COLOR ) ;
d - > fn = group_fn ;
d - > udata = ( void * ) gf_val ( color_texts , color_texts_g ) ;
d - > udata2 = ses ;
d - > refresh = html_color_refresh ;
d - > refresh_data = ses ;
if ( ! F ) {
d - > items [ 0 ] . type = D_BUTTON ;
d - > items [ 0 ] . gid = 0 ;
d - > items [ 0 ] . text = TEXT_ ( T_TEXT_COLOR ) ;
d - > items [ 0 ] . fn = select_color_16 ;
d - > items [ 0 ] . data = ( unsigned char * ) & ses - > ds . t_text_color ;
d - > items [ 0 ] . dlen = sizeof ( int ) ;
d - > items [ 1 ] . type = D_BUTTON ;
d - > items [ 1 ] . gid = 0 ;
d - > items [ 1 ] . text = TEXT_ ( T_LINK_COLOR ) ;
d - > items [ 1 ] . fn = select_color_16 ;
d - > items [ 1 ] . data = ( unsigned char * ) & ses - > ds . t_link_color ;
d - > items [ 1 ] . dlen = sizeof ( int ) ;
d - > items [ 2 ] . type = D_BUTTON ;
d - > items [ 2 ] . gid = 0 ;
d - > items [ 2 ] . text = TEXT_ ( T_BACKGROUND_COLOR ) ;
d - > items [ 2 ] . fn = select_color_8 ;
d - > items [ 2 ] . data = ( unsigned char * ) & ses - > ds . t_background_color ;
d - > items [ 2 ] . dlen = sizeof ( int ) ;
}
# ifdef G
else {
d - > items [ 0 ] . type = D_FIELD ;
d - > items [ 0 ] . dlen = 7 ;
d - > items [ 0 ] . data = g_text_color_str ;
d - > items [ 0 ] . fn = check_hex_number ;
d - > items [ 0 ] . gid = 0 ;
d - > items [ 0 ] . gnum = 0xffffff ;
d - > items [ 1 ] . type = D_FIELD ;
d - > items [ 1 ] . dlen = 7 ;
d - > items [ 1 ] . data = g_link_color_str ;
d - > items [ 1 ] . fn = check_hex_number ;
d - > items [ 1 ] . gid = 0 ;
d - > items [ 1 ] . gnum = 0xffffff ;
d - > items [ 2 ] . type = D_FIELD ;
d - > items [ 2 ] . dlen = 7 ;
d - > items [ 2 ] . data = g_background_color_str ;
d - > items [ 2 ] . fn = check_hex_number ;
d - > items [ 2 ] . gid = 0 ;
d - > items [ 2 ] . gnum = 0xffffff ;
}
# endif
d - > items [ 3 ] . type = D_CHECKBOX ;
d - > items [ 3 ] . data = ( unsigned char * ) gf_val ( & ses - > ds . t_ignore_document_color , & ses - > ds . g_ignore_document_color ) ;
d - > items [ 3 ] . dlen = sizeof ( int ) ;
d - > items [ 4 ] . type = D_BUTTON ;
d - > items [ 4 ] . gid = B_ENTER ;
d - > items [ 4 ] . fn = ok_dialog ;
d - > items [ 4 ] . text = TEXT_ ( T_OK ) ;
d - > items [ 5 ] . type = D_BUTTON ;
d - > items [ 5 ] . gid = B_ESC ;
d - > items [ 5 ] . fn = cancel_dialog ;
d - > items [ 5 ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ 6 ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
static unsigned char new_bookmarks_file [ MAX_STR_LEN ] ;
static int new_bookmarks_codepage ;
# ifdef G
static unsigned char menu_font_str [ 4 ] ;
static unsigned char bg_color_str [ 7 ] ;
static unsigned char fg_color_str [ 7 ] ;
static unsigned char scroll_area_color_str [ 7 ] ;
static unsigned char scroll_bar_color_str [ 7 ] ;
static unsigned char scroll_frame_color_str [ 7 ] ;
# endif
static void refresh_misc ( void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
# ifdef G
if ( F ) {
menu_font_size = ( int ) strtol ( cast_const_char menu_font_str , NULL , 10 ) ;
G_BFU_FG_COLOR = ( int ) strtol ( cast_const_char fg_color_str , NULL , 16 ) ;
G_BFU_BG_COLOR = ( int ) strtol ( cast_const_char bg_color_str , NULL , 16 ) ;
G_SCROLL_BAR_AREA_COLOR = ( int ) strtol ( cast_const_char scroll_area_color_str , NULL , 16 ) ;
G_SCROLL_BAR_BAR_COLOR = ( int ) strtol ( cast_const_char scroll_bar_color_str , NULL , 16 ) ;
G_SCROLL_BAR_FRAME_COLOR = ( int ) strtol ( cast_const_char scroll_frame_color_str , NULL , 16 ) ;
shutdown_bfu ( ) ;
init_bfu ( ) ;
init_grview ( ) ;
cls_redraw_all_terminals ( ) ;
}
# endif
if ( strcmp ( cast_const_char new_bookmarks_file , cast_const_char bookmarks_file ) | | new_bookmarks_codepage ! = bookmarks_codepage ) {
reinit_bookmarks ( ses , new_bookmarks_file , new_bookmarks_codepage ) ;
}
}
# ifdef G
static unsigned char * const miscopt_labels_g [ ] = { TEXT_ ( T_MENU_FONT_SIZE ) , TEXT_ ( T_ENTER_COLORS_AS_RGB_TRIPLETS ) , TEXT_ ( T_MENU_FOREGROUND_COLOR ) , TEXT_ ( T_MENU_BACKGROUND_COLOR ) , TEXT_ ( T_SCROLL_BAR_AREA_COLOR ) , TEXT_ ( T_SCROLL_BAR_BAR_COLOR ) , TEXT_ ( T_SCROLL_BAR_FRAME_COLOR ) , TEXT_ ( T_BOOKMARKS_FILE ) , NULL } ;
# endif
static unsigned char * const miscopt_labels [ ] = { TEXT_ ( T_BOOKMARKS_FILE ) , NULL } ;
static unsigned char * const miscopt_checkbox_labels [ ] = { TEXT_ ( T_SAVE_URL_HISTORY_ON_EXIT ) , NULL } ;
static void miscopt_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
unsigned char * * labels = dlg - > dlg - > udata ;
int max = 0 , min = 0 ;
int w , rw ;
int y = 0 ;
int a = 0 ;
int bmk = ! anonymous ;
# ifdef G
if ( F & & ( ( drv - > flags ) & GD_NEED_CODEPAGE ) ) a = 1 ;
# endif
max_text_width ( term , labels [ F ? 7 : 0 ] , & max , AL_LEFT ) ;
min_text_width ( term , labels [ F ? 7 : 0 ] , & min , AL_LEFT ) ;
# ifdef G
if ( F )
{
max_text_width ( term , labels [ 1 ] , & max , AL_LEFT ) ;
min_text_width ( term , labels [ 1 ] , & min , AL_LEFT ) ;
max_group_width ( term , labels , dlg - > items , 1 , & max ) ;
min_group_width ( term , labels , dlg - > items , 1 , & min ) ;
max_group_width ( term , labels + 2 , dlg - > items + 1 , 5 , & max ) ;
min_group_width ( term , labels + 2 , dlg - > items + 1 , 5 , & min ) ;
}
# endif
if ( bmk )
{
max_buttons_width ( term , dlg - > items + dlg - > n - 3 - a - bmk , 1 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 3 - a - bmk , 1 , & min ) ;
}
if ( a )
{
max_buttons_width ( term , dlg - > items + dlg - > n - 3 - bmk , 1 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 3 - bmk , 1 , & min ) ;
}
if ( bmk ) {
checkboxes_width ( term , miscopt_checkbox_labels , 1 , & max , max_text_width ) ;
checkboxes_width ( term , miscopt_checkbox_labels , 1 , & min , min_text_width ) ;
}
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > term - > x - 2 * DIALOG_LB ) w = term - > x - 2 * DIALOG_LB ;
if ( w < 5 ) w = 5 ;
rw = 0 ;
# ifdef G
if ( F )
{
dlg_format_group ( dlg , NULL , labels , dlg - > items , 1 , dlg - > x + DIALOG_LB , & y , w , & rw ) ;
y + = LL ;
dlg_format_text ( dlg , NULL , labels [ 1 ] , dlg - > x + DIALOG_LB , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_group ( dlg , NULL , labels + 2 , dlg - > items + 1 , 5 , dlg - > x + DIALOG_LB , & y , w , & rw ) ;
y + = LL ;
}
# endif
if ( bmk )
{
dlg_format_text_and_field ( dlg , NULL , labels [ F ? 7 : 0 ] , dlg - > items + dlg - > n - 4 - a - bmk , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
}
if ( bmk ) {
y + = LL ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 3 - a - bmk , 1 , 0 , & y , w , & rw , AL_LEFT ) ;
}
if ( a ) dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 3 - bmk , 1 , 0 , & y , w , & rw , AL_LEFT ) ;
if ( bmk ) dlg_format_checkboxes ( dlg , NULL , dlg - > items + dlg - > n - 3 , 1 , 0 , & y , w , & rw , miscopt_checkbox_labels ) ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 2 , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = w + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB ;
# ifdef G
if ( F )
{
y + = LL ;
dlg_format_group ( dlg , term , labels , dlg - > items , 1 , dlg - > x + DIALOG_LB , & y , w , NULL ) ;
y + = LL ;
dlg_format_text ( dlg , term , labels [ 1 ] , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_group ( dlg , term , labels + 2 , dlg - > items + 1 , 5 , dlg - > x + DIALOG_LB , & y , w , NULL ) ;
y + = LL ;
} else
# endif
{
y + = LL ;
}
if ( bmk )
{
dlg_format_text_and_field ( dlg , term , labels [ F ? 7 : 0 ] , dlg - > items + dlg - > n - 4 - a - bmk , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 3 - a - bmk , 1 , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
}
if ( a ) dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 3 - bmk , 1 , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
if ( bmk ) {
dlg_format_checkboxes ( dlg , term , dlg - > items + dlg - > n - 3 , 1 , dlg - > x + DIALOG_LB , & y , w , NULL , miscopt_checkbox_labels ) ;
y + = LL ;
}
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 2 , 2 , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
}
static void miscelaneous_options ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
struct dialog * d ;
int a = 0 ;
if ( anonymous & & ! F ) return ; /* if you add something into text mode (or both text and graphics), remove this (and enable also miscelaneous_options in do_setup_menu) */
safe_strncpy ( new_bookmarks_file , bookmarks_file , MAX_STR_LEN ) ;
new_bookmarks_codepage = bookmarks_codepage ;
if ( ! F ) {
d = mem_calloc ( sizeof ( struct dialog ) + 5 * sizeof ( struct dialog_item ) ) ;
}
# ifdef G
else {
d = mem_calloc ( sizeof ( struct dialog ) + 12 * sizeof ( struct dialog_item ) ) ;
snprintf ( cast_char menu_font_str , 4 , " %d " , menu_font_size ) ;
snprintf ( cast_char fg_color_str , 7 , " %06x " , ( unsigned ) G_BFU_FG_COLOR ) ;
snprintf ( cast_char bg_color_str , 7 , " %06x " , ( unsigned ) G_BFU_BG_COLOR ) ;
snprintf ( cast_char scroll_bar_color_str , 7 , " %06x " , ( unsigned ) G_SCROLL_BAR_BAR_COLOR ) ;
snprintf ( cast_char scroll_area_color_str , 7 , " %06x " , ( unsigned ) G_SCROLL_BAR_AREA_COLOR ) ;
snprintf ( cast_char scroll_frame_color_str , 7 , " %06x " , ( unsigned ) G_SCROLL_BAR_FRAME_COLOR ) ;
}
# endif
d - > title = TEXT_ ( T_MISCELANEOUS_OPTIONS ) ;
d - > refresh = refresh_misc ;
d - > refresh_data = ses ;
d - > fn = miscopt_fn ;
if ( ! F )
d - > udata = ( void * ) miscopt_labels ;
# ifdef G
else
d - > udata = ( void * ) miscopt_labels_g ;
# endif
d - > udata2 = ses ;
# ifdef G
if ( F ) {
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 4 ;
d - > items [ a ] . data = menu_font_str ;
d - > items [ a ] . fn = check_number ;
d - > items [ a ] . gid = 1 ;
d - > items [ a ] . gnum = MAX_FONT_SIZE ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 7 ;
d - > items [ a ] . data = fg_color_str ;
d - > items [ a ] . fn = check_hex_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 0xffffff ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 7 ;
d - > items [ a ] . data = bg_color_str ;
d - > items [ a ] . fn = check_hex_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 0xffffff ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 7 ;
d - > items [ a ] . data = scroll_area_color_str ;
d - > items [ a ] . fn = check_hex_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 0xffffff ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 7 ;
d - > items [ a ] . data = scroll_bar_color_str ;
d - > items [ a ] . fn = check_hex_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 0xffffff ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = 7 ;
d - > items [ a ] . data = scroll_frame_color_str ;
d - > items [ a ] . fn = check_hex_number ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 0xffffff ;
a + + ;
}
# endif
if ( ! anonymous ) {
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . data = new_bookmarks_file ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . fn = dlg_assume_cp ;
d - > items [ a ] . text = TEXT_ ( T_BOOKMARKS_ENCODING ) ;
d - > items [ a ] . data = ( unsigned char * ) & new_bookmarks_codepage ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
}
# ifdef G
if ( F & & ( drv - > flags & GD_NEED_CODEPAGE ) ) {
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . fn = dlg_kb_cp ;
d - > items [ a ] . text = TEXT_ ( T_KEYBOARD_CODEPAGE ) ;
d - > items [ a ] . data = ( unsigned char * ) & drv - > param - > kbd_codepage ;
d - > items [ a ] . dlen = sizeof ( int ) ;
a + + ;
}
# endif
if ( ! anonymous ) {
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & save_history ;
a + + ;
}
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# define C_LEN 9
static unsigned char max_cookie_age_str [ C_LEN ] ;
static void refresh_cookies ( void * xxx )
{
max_cookie_age = atof ( cast_const_char max_cookie_age_str ) ;
}
static int clear_cookies ( struct dialog_data * dlg , struct dialog_item_data * di )
{
unsigned char * s = init_str ( ) ;
int l = 0 ;
unsigned long cnt = free_cookies ( ) ;
clear_cookies_file ( ) ;
add_num_to_str ( & s , & l , cnt ) ;
msg_box (
dlg - > win - > term ,
getml ( s , NULL ) ,
TEXT_ ( T_CLEAR_COOKIES ) ,
AL_CENTER ,
s , cast_uchar " " , TEXT_ ( T_COOKIES_WERE_CLEARED ) , MSG_BOX_END ,
( void * ) NULL ,
1 ,
TEXT_ ( T_OK ) , msg_box_null , B_ENTER
) ;
return 0 ;
}
static unsigned char * const cookies_texts [ ] = { TEXT_ ( T_ENABLE_COOKIES ) , TEXT_ ( T_SAVE_COOKIES ) , TEXT_ ( T_MAX_COOKIE_AGE ) , NULL } ;
static void cookiesopt_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int max = 0 , min = 0 ;
int w , rw ;
int y = 0 ;
if ( dlg - > win - > term - > spec - > braille ) y + = LL ;
checkboxes_width ( term , cookies_texts , 2 , & max , max_text_width ) ;
checkboxes_width ( term , cookies_texts , 2 , & min , min_text_width ) ;
max_text_width ( term , cookies_texts [ 2 ] , & max , AL_LEFT ) ;
min_text_width ( term , cookies_texts [ 2 ] , & min , AL_LEFT ) ;
max_buttons_width ( term , dlg - > items + dlg - > n - 3 , 3 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 3 , 3 , & min ) ;
w = term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > term - > x - 2 * DIALOG_LB ) w = term - > x - 2 * DIALOG_LB ;
if ( w < 5 ) w = 5 ;
rw = 0 ;
y + = LL ;
dlg_format_checkboxes ( dlg , NULL , dlg - > items , 2 , 0 , & y , w , & rw , cookies_texts ) ;
dlg_format_text_and_field ( dlg , NULL , cookies_texts [ 2 ] , dlg - > items + 2 , 0 , & y , w , & rw , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 3 , 3 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = rw + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB ;
y + = LL ;
dlg_format_checkboxes ( dlg , term , dlg - > items , 2 , dlg - > x + DIALOG_LB , & y , w , NULL , cookies_texts ) ;
y + = LL ;
dlg_format_text_and_field ( dlg , term , cookies_texts [ 2 ] , dlg - > items + 2 , dlg - > x + DIALOG_LB , & y , w , NULL , COLOR_DIALOG_TEXT , AL_LEFT ) ;
y + = LL ;
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 3 , 3 , dlg - > x + DIALOG_LB , & y , w , & rw , AL_CENTER ) ;
}
static void cookies_options ( struct terminal * term , void * xxx , void * yyy )
{
int a ;
struct dialog * d ;
snprintf ( cast_char max_cookie_age_str , C_LEN , " %f " , max_cookie_age ) ;
remove_zeroes ( max_cookie_age_str ) ;
d = mem_calloc ( sizeof ( struct dialog ) + 6 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_COOKIES ) ;
d - > fn = cookiesopt_fn ;
d - > refresh = refresh_cookies ;
a = 0 ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & enable_cookies ;
a + + ;
d - > items [ a ] . type = D_CHECKBOX ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . dlen = sizeof ( int ) ;
d - > items [ a ] . data = ( void * ) & save_cookies ;
a + + ;
d - > items [ a ] . type = D_FIELD ;
d - > items [ a ] . dlen = C_LEN ;
d - > items [ a ] . data = max_cookie_age_str ;
d - > items [ a ] . fn = check_float ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . gnum = 999999900 ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . fn = clear_cookies ;
d - > items [ a ] . text = TEXT_ ( T_CLEAR_COOKIES ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a ] . text = TEXT_ ( T_OK ) ;
a + + ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a ] . text = TEXT_ ( T_CANCEL ) ;
a + + ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# ifdef HAVE_FREETYPE
static void refresh_fonts ( void * x )
{
reinit_video ( ) ;
}
static void font_selected ( struct terminal * term , void * ip , void * d )
{
safe_strncpy ( d , ip , MAX_STR_LEN ) ;
}
static void free_fonts ( void * fonts_ )
{
fontconfig_free_fonts ( ( struct list_of_fonts * ) fonts_ ) ;
}
static int select_font ( struct dialog_data * dlg , struct dialog_item_data * di )
{
2022-06-06 13:08:05 +00:00
unsigned char * decc_volatile empty = cast_uchar " " ;
2021-08-28 15:37:32 +00:00
struct list_of_fonts * fonts ;
int n_fonts ;
int i ;
struct menu_item * mi ;
int monospaced = di - > item - > data = = font_file_m | | di - > item - > data = = font_file_m_b
# ifdef USE_ITALIC
| | di - > item - > data = = font_file_i_m | | di - > item - > data = = font_file_i_m_b
# endif
;
int bold = di - > item - > data = = font_file_b | | di - > item - > data = = font_file_m_b
# ifdef USE_ITALIC
| | di - > item - > data = = font_file_i_b | | di - > item - > data = = font_file_i_m_b
# endif
;
int current_font = 0 ;
/*debug("select font: %s", di->cdata);*/
fontconfig_list_fonts ( & fonts , & n_fonts , monospaced ) ;
mi = new_menu ( MENU_FREE_ITEMS | MENU_FONT_LIST | ( bold * MENU_FONT_LIST_BOLD ) | ( monospaced * MENU_FONT_LIST_MONO ) ) ;
2022-06-06 13:08:05 +00:00
add_to_menu ( & mi , TEXT_ ( T_BUILT_IN_FONT ) , empty , empty , font_selected , empty , 0 , 0 ) ;
2021-08-28 15:37:32 +00:00
for ( i = 0 ; i < n_fonts ; i + + ) {
if ( ! strcmp ( cast_const_char fonts [ i ] . file , cast_const_char di - > cdata ) )
current_font = i + 1 ;
2022-06-06 13:08:05 +00:00
add_to_menu ( & mi , fonts [ i ] . name , empty , empty , font_selected , fonts [ i ] . file , 0 , i + 1 ) ;
2021-08-28 15:37:32 +00:00
}
do_menu_selected ( dlg - > win - > term , mi , di - > cdata , current_font , free_fonts , fonts ) ;
return 0 ;
}
static unsigned char * const font_labels [ ] = { cast_uchar " " , cast_uchar " " , cast_uchar " " , cast_uchar " " , cast_uchar " " , cast_uchar " " , cast_uchar " " , cast_uchar " " } ;
static void fonts_fn ( struct dialog_data * dlg )
{
struct terminal * term = dlg - > win - > term ;
int step = ( dlg - > n - 2 ) / 2 ;
int max = 0 , min = 0 ;
int w , rw ;
int y = 0 ;
max_buttons_width ( term , dlg - > items , step , & max ) ;
min_buttons_width ( term , dlg - > items , step , & min ) ;
max_buttons_width ( term , dlg - > items + step , step , & max ) ;
min_buttons_width ( term , dlg - > items + step , step , & min ) ;
max_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & max ) ;
min_buttons_width ( term , dlg - > items + dlg - > n - 2 , 2 , & min ) ;
w = term - > x * 9 / 10 - 2 * DIALOG_LB ;
if ( w > max ) w = max ;
if ( w < min ) w = min ;
if ( w > term - > x - 2 * DIALOG_LB ) w = term - > x - 2 * DIALOG_LB ;
if ( w < 1 ) w = 1 ;
rw = 0 ;
dlg_format_buttons ( dlg , NULL , dlg - > items , step , 0 , & y , w , & rw , AL_CENTER ) ;
dlg_format_buttons ( dlg , NULL , dlg - > items + step , step , 0 , & y , w , & rw , AL_CENTER ) ;
dlg_format_buttons ( dlg , NULL , dlg - > items + dlg - > n - 2 , 2 , 0 , & y , w , & rw , AL_CENTER ) ;
w = rw ;
dlg - > xw = rw + 2 * DIALOG_LB ;
dlg - > yw = y + 2 * DIALOG_TB ;
center_dlg ( dlg ) ;
draw_dlg ( dlg ) ;
y = dlg - > y + DIALOG_TB + LL ;
dlg_format_buttons ( dlg , term , dlg - > items , step , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
dlg_format_buttons ( dlg , term , dlg - > items + step , step , dlg - > x + DIALOG_LB , & y , w , NULL , AL_CENTER ) ;
dlg_format_buttons ( dlg , term , dlg - > items + dlg - > n - 2 , 2 , dlg - > x + DIALOG_LB , & y , w , & rw , AL_CENTER ) ;
}
static void font_options ( struct terminal * term , void * xxx , void * ses_ )
{
struct dialog * d ;
int a ;
d = mem_calloc ( sizeof ( struct dialog ) + ( 2 + FF_SHAPES ) * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_FONTS ) ;
d - > fn = fonts_fn ;
d - > udata = ( void * ) font_labels ;
d - > refresh = refresh_fonts ;
a = 0 ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_REGULAR_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_BOLD_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file_b ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_MONOSPACED_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file_m ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_MONOSPACED_BOLD_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file_m_b ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
# ifdef USE_ITALIC
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_ITALIC_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file_i ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_ITALIC_BOLD_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file_i_b ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_MONOSPACED_ITALIC_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file_i_m ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = 0 ;
d - > items [ a ] . text = TEXT_ ( T_MONOSPACED_ITALIC_BOLD_FONT ) ;
d - > items [ a ] . fn = select_font ;
d - > items [ a ] . data = font_file_i_m_b ;
d - > items [ a + + ] . dlen = MAX_STR_LEN ;
# endif
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ENTER ;
d - > items [ a ] . fn = ok_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_OK ) ;
d - > items [ a ] . type = D_BUTTON ;
d - > items [ a ] . gid = B_ESC ;
d - > items [ a ] . fn = cancel_dialog ;
d - > items [ a + + ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ a ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
# endif
static void menu_set_language ( struct terminal * term , void * pcp , void * ptr )
{
set_language ( ( int ) ( my_intptr_t ) pcp ) ;
cls_redraw_all_terminals ( ) ;
}
static void menu_language_list ( struct terminal * term , void * xxx , void * ses_ )
{
# ifdef OS_NO_SYSTEM_LANGUAGE
const int def = 0 ;
# else
const int def = 1 ;
# endif
int i , sel ;
struct menu_item * mi ;
mi = new_menu ( MENU_FREE_ITEMS ) ;
for ( i = - def ; i < n_languages ( ) ; i + + ) {
unsigned char * n , * r ;
if ( i = = - 1 ) {
n = TEXT_ ( T_DEFAULT_LANG ) ;
r = language_name ( get_default_language ( ) ) ;
} else {
n = language_name ( i ) ;
r = cast_uchar " " ;
}
add_to_menu ( & mi , n , r , cast_uchar " " , menu_set_language , ( void * ) ( my_intptr_t ) i , 0 , i + def ) ;
}
sel = current_language + def ;
if ( sel < 0 )
sel = get_default_language ( ) ;
do_menu_selected ( term , mi , NULL , sel , NULL , NULL ) ;
}
static unsigned char * const resize_texts [ ] = { TEXT_ ( T_COLUMNS ) , TEXT_ ( T_ROWS ) } ;
static unsigned char x_str [ 4 ] ;
static unsigned char y_str [ 4 ] ;
static void do_resize_terminal ( void * term_ )
{
struct terminal * term = ( struct terminal * ) term_ ;
unsigned char str [ 8 ] ;
strcpy ( cast_char str , cast_const_char x_str ) ;
strcat ( cast_char str , " , " ) ;
strcat ( cast_char str , cast_const_char y_str ) ;
do_terminal_function ( term , TERM_FN_RESIZE , str ) ;
}
static void dlg_resize_terminal ( struct terminal * term , void * xxx , void * ses_ )
{
struct dialog * d ;
unsigned x = ( unsigned ) term - > x > 999 ? 999 : term - > x ;
unsigned y = ( unsigned ) term - > y > 999 ? 999 : term - > y ;
sprintf ( cast_char x_str , " %u " , x ) ;
sprintf ( cast_char y_str , " %u " , y ) ;
d = mem_calloc ( sizeof ( struct dialog ) + 4 * sizeof ( struct dialog_item ) ) ;
d - > title = TEXT_ ( T_RESIZE_TERMINAL ) ;
d - > fn = group_fn ;
d - > udata = ( void * ) resize_texts ;
d - > refresh = do_resize_terminal ;
d - > refresh_data = term ;
d - > items [ 0 ] . type = D_FIELD ;
d - > items [ 0 ] . dlen = 4 ;
d - > items [ 0 ] . data = x_str ;
d - > items [ 0 ] . fn = check_number ;
d - > items [ 0 ] . gid = 1 ;
d - > items [ 0 ] . gnum = 999 ;
d - > items [ 1 ] . type = D_FIELD ;
d - > items [ 1 ] . dlen = 4 ;
d - > items [ 1 ] . data = y_str ;
d - > items [ 1 ] . fn = check_number ;
d - > items [ 1 ] . gid = 1 ;
d - > items [ 1 ] . gnum = 999 ;
d - > items [ 2 ] . type = D_BUTTON ;
d - > items [ 2 ] . gid = B_ENTER ;
d - > items [ 2 ] . fn = ok_dialog ;
d - > items [ 2 ] . text = TEXT_ ( T_OK ) ;
d - > items [ 3 ] . type = D_BUTTON ;
d - > items [ 3 ] . gid = B_ESC ;
d - > items [ 3 ] . fn = cancel_dialog ;
d - > items [ 3 ] . text = TEXT_ ( T_CANCEL ) ;
d - > items [ 4 ] . type = D_END ;
do_dialog ( term , d , getml ( d , NULL ) ) ;
}
static_const struct menu_item file_menu11 [ ] = {
{ TEXT_ ( T_GOTO_URL ) , cast_uchar " g " , TEXT_ ( T_HK_GOTO_URL ) , menu_goto_url , NULL , 0 , 1 } ,
{ TEXT_ ( T_GO_BACK ) , cast_uchar " z " , TEXT_ ( T_HK_GO_BACK ) , menu_go_back , NULL , 0 , 1 } ,
{ TEXT_ ( T_GO_FORWARD ) , cast_uchar " x " , TEXT_ ( T_HK_GO_FORWARD ) , menu_go_forward , NULL , 0 , 1 } ,
{ TEXT_ ( T_HISTORY ) , cast_uchar " > " , TEXT_ ( T_HK_HISTORY ) , history_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_RELOAD ) , cast_uchar " Ctrl-R " , TEXT_ ( T_HK_RELOAD ) , menu_reload , NULL , 0 , 1 } ,
} ;
# ifdef G
static_const struct menu_item file_menu111 [ ] = {
{ TEXT_ ( T_GOTO_URL ) , cast_uchar " g " , TEXT_ ( T_HK_GOTO_URL ) , menu_goto_url , NULL , 0 , 1 } ,
{ TEXT_ ( T_GO_BACK ) , cast_uchar " z " , TEXT_ ( T_HK_GO_BACK ) , menu_go_back , NULL , 0 , 1 } ,
{ TEXT_ ( T_GO_FORWARD ) , cast_uchar " x " , TEXT_ ( T_HK_GO_FORWARD ) , menu_go_forward , NULL , 0 , 1 } ,
{ TEXT_ ( T_HISTORY ) , cast_uchar " > " , TEXT_ ( T_HK_HISTORY ) , history_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_RELOAD ) , cast_uchar " Ctrl-R " , TEXT_ ( T_HK_RELOAD ) , menu_reload , NULL , 0 , 1 } ,
} ;
# endif
static_const struct menu_item file_menu12 [ ] = {
{ TEXT_ ( T_BOOKMARKS ) , cast_uchar " s " , TEXT_ ( T_HK_BOOKMARKS ) , menu_bookmark_manager , NULL , 0 , 1 } ,
} ;
static_const struct menu_item file_menu21 [ ] = {
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_AS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_AS ) , save_as , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_URL_AS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_URL_AS ) , menu_save_url_as , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_FORMATTED_DOCUMENT ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_FORMATTED_DOCUMENT ) , menu_save_formatted , NULL , 0 , 1 } ,
} ;
# ifdef G
static_const struct menu_item file_menu211 [ ] = {
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_AS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_AS ) , save_as , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_URL_AS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_URL_AS ) , menu_save_url_as , NULL , 0 , 1 } ,
} ;
# endif
# ifdef G
static_const struct menu_item file_menu211_clipb [ ] = {
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_AS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_AS ) , save_as , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_URL_AS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_URL_AS ) , menu_save_url_as , NULL , 0 , 1 } ,
{ TEXT_ ( T_COPY_URL_LOCATION ) , cast_uchar " " , TEXT_ ( T_HK_COPY_URL_LOCATION ) , copy_url_location , NULL , 0 , 1 } ,
} ;
# endif
static_const struct menu_item file_menu22 [ ] = {
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 1 } ,
{ TEXT_ ( T_KILL_BACKGROUND_CONNECTIONS ) , cast_uchar " " , TEXT_ ( T_HK_KILL_BACKGROUND_CONNECTIONS ) , menu_kill_background_connections , NULL , 0 , 1 } ,
{ TEXT_ ( T_KILL_ALL_CONNECTIONS ) , cast_uchar " " , TEXT_ ( T_HK_KILL_ALL_CONNECTIONS ) , menu_kill_all_connections , NULL , 0 , 1 } ,
{ TEXT_ ( T_FLUSH_ALL_CACHES ) , cast_uchar " " , TEXT_ ( T_HK_FLUSH_ALL_CACHES ) , flush_caches , NULL , 0 , 1 } ,
{ TEXT_ ( T_RESOURCE_INFO ) , cast_uchar " " , TEXT_ ( T_HK_RESOURCE_INFO ) , resource_info_menu , NULL , 0 , 1 } ,
# ifdef LEAK_DEBUG
{ TEXT_ ( T_MEMORY_INFO ) , cast_uchar " " , TEXT_ ( T_HK_MEMORY_INFO ) , memory_info_menu , NULL , 0 , 1 } ,
# endif
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 1 } ,
} ;
static_const struct menu_item file_menu3 [ ] = {
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 1 } ,
{ TEXT_ ( T_EXIT ) , cast_uchar " q " , TEXT_ ( T_HK_EXIT ) , exit_prog , NULL , 0 , 1 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static void do_file_menu ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
int x ;
int o ;
struct menu_item * file_menu , * e ;
file_menu = mem_alloc ( sizeof ( file_menu11 ) + sizeof ( file_menu12 ) + sizeof ( file_menu21 ) + sizeof ( file_menu22 ) + sizeof ( file_menu3 ) + 3 * sizeof ( struct menu_item ) ) ;
e = file_menu ;
if ( ! F ) {
memcpy ( e , file_menu11 , sizeof ( file_menu11 ) ) ;
e + = sizeof ( file_menu11 ) / sizeof ( struct menu_item ) ;
# ifdef G
} else {
memcpy ( e , file_menu111 , sizeof ( file_menu111 ) ) ;
e + = sizeof ( file_menu111 ) / sizeof ( struct menu_item ) ;
# endif
}
if ( ! anonymous ) {
memcpy ( e , file_menu12 , sizeof ( file_menu12 ) ) ;
e + = sizeof ( file_menu12 ) / sizeof ( struct menu_item ) ;
}
if ( ! have_windows_menu & & ( o = can_open_in_new ( term ) ) ) {
e - > text = TEXT_ ( T_NEW_WINDOW ) ;
e - > rtext = o - 1 ? cast_uchar " > " : cast_uchar " " ;
e - > hotkey = TEXT_ ( T_HK_NEW_WINDOW ) ;
e - > func = open_in_new_window ;
e - > data = ( void * ) & send_open_new_xterm_ptr ;
e - > in_m = o - 1 ;
e - > free_i = 0 ;
e + + ;
}
if ( ! anonymous ) {
if ( ! F ) {
memcpy ( e , file_menu21 , sizeof ( file_menu21 ) ) ;
e + = sizeof ( file_menu21 ) / sizeof ( struct menu_item ) ;
# ifdef G
} else {
if ( clipboard_support ( term ) )
{
memcpy ( e , file_menu211_clipb , sizeof ( file_menu211_clipb ) ) ;
e + = sizeof ( file_menu211_clipb ) / sizeof ( struct menu_item ) ;
}
else
{
memcpy ( e , file_menu211 , sizeof ( file_menu211 ) ) ;
e + = sizeof ( file_menu211 ) / sizeof ( struct menu_item ) ;
}
# endif
}
}
memcpy ( e , file_menu22 , sizeof ( file_menu22 ) ) ;
e + = sizeof ( file_menu22 ) / sizeof ( struct menu_item ) ;
/*cast_uchar "", cast_uchar "", M_BAR, NULL, NULL, 0, 0,
TEXT_ ( T_OS_SHELL ) , cast_uchar " " , TEXT_ ( T_HK_OS_SHELL ) , menu_shell , NULL , 0 , 0 , */
x = 1 ;
if ( ! anonymous & & can_open_os_shell ( term - > environment ) ) {
e - > text = TEXT_ ( T_OS_SHELL ) ;
e - > rtext = cast_uchar " " ;
e - > hotkey = TEXT_ ( T_HK_OS_SHELL ) ;
e - > func = menu_shell ;
e - > data = NULL ;
e - > in_m = 0 ;
e - > free_i = 0 ;
e + + ;
x = 0 ;
}
if ( can_resize_window ( term ) ) {
e - > text = TEXT_ ( T_RESIZE_TERMINAL ) ;
e - > rtext = cast_uchar " " ;
e - > hotkey = TEXT_ ( T_HK_RESIZE_TERMINAL ) ;
e - > func = dlg_resize_terminal ;
e - > data = NULL ;
e - > in_m = 0 ;
e - > free_i = 0 ;
e + + ;
x = 0 ;
}
memcpy ( e , file_menu3 + x , sizeof ( file_menu3 ) - x * sizeof ( struct menu_item ) ) ;
e + = sizeof ( file_menu3 ) / sizeof ( struct menu_item ) ;
do_menu ( term , file_menu , ses ) ;
}
static void ( * const search_dlg_ptr ) ( struct session * ses , struct f_data_c * f , int a ) = search_dlg ;
static void ( * const search_back_dlg_ptr ) ( struct session * ses , struct f_data_c * f , int a ) = search_back_dlg ;
static void ( * const find_next_ptr ) ( struct session * ses , struct f_data_c * f , int a ) = find_next ;
static void ( * const find_next_back_ptr ) ( struct session * ses , struct f_data_c * f , int a ) = find_next_back ;
static void ( * const set_frame_ptr ) ( struct session * ses , struct f_data_c * f , int a ) = set_frame ;
static_const struct menu_item view_menu [ ] = {
{ TEXT_ ( T_SEARCH ) , cast_uchar " / " , TEXT_ ( T_HK_SEARCH ) , menu_for_frame , ( void * ) & search_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_SEARCH_BACK ) , cast_uchar " ? " , TEXT_ ( T_HK_SEARCH_BACK ) , menu_for_frame , ( void * ) & search_back_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_NEXT ) , cast_uchar " n " , TEXT_ ( T_HK_FIND_NEXT ) , menu_for_frame , ( void * ) & find_next_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_PREVIOUS ) , cast_uchar " N " , TEXT_ ( T_HK_FIND_PREVIOUS ) , menu_for_frame , ( void * ) & find_next_back_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_TOGGLE_HTML_PLAIN ) , cast_uchar " \\ " , TEXT_ ( T_HK_TOGGLE_HTML_PLAIN ) , menu_toggle , NULL , 0 , 0 } ,
{ TEXT_ ( T_DOCUMENT_INFO ) , cast_uchar " = " , TEXT_ ( T_HK_DOCUMENT_INFO ) , menu_doc_info , NULL , 0 , 0 } ,
{ TEXT_ ( T_HEADER_INFO ) , cast_uchar " | " , TEXT_ ( T_HK_HEADER_INFO ) , menu_head_info , NULL , 0 , 0 } ,
{ TEXT_ ( T_FRAME_AT_FULL_SCREEN ) , cast_uchar " f " , TEXT_ ( T_HK_FRAME_AT_FULL_SCREEN ) , menu_for_frame , ( void * ) & set_frame_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_SAVE_CLIPBOARD_TO_A_FILE ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_CLIPBOARD_TO_A_FILE ) , menu_save_clipboard , NULL , 0 , 0 } ,
{ TEXT_ ( T_LOAD_CLIPBOARD_FROM_A_FILE ) , cast_uchar " " , TEXT_ ( T_HK_LOAD_CLIPBOARD_FROM_A_FILE ) , menu_load_clipboard , NULL , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_HTML_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_HTML_OPTIONS ) , menu_html_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_SAVE_HTML_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_HTML_OPTIONS ) , menu_save_html_options , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static_const struct menu_item view_menu_anon [ ] = {
{ TEXT_ ( T_SEARCH ) , cast_uchar " / " , TEXT_ ( T_HK_SEARCH ) , menu_for_frame , ( void * ) & search_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_SEARCH_BACK ) , cast_uchar " ? " , TEXT_ ( T_HK_SEARCH_BACK ) , menu_for_frame , ( void * ) & search_back_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_NEXT ) , cast_uchar " n " , TEXT_ ( T_HK_FIND_NEXT ) , menu_for_frame , ( void * ) & find_next_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_PREVIOUS ) , cast_uchar " N " , TEXT_ ( T_HK_FIND_PREVIOUS ) , menu_for_frame , ( void * ) & find_next_back_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_TOGGLE_HTML_PLAIN ) , cast_uchar " \\ " , TEXT_ ( T_HK_TOGGLE_HTML_PLAIN ) , menu_toggle , NULL , 0 , 0 } ,
{ TEXT_ ( T_DOCUMENT_INFO ) , cast_uchar " = " , TEXT_ ( T_HK_DOCUMENT_INFO ) , menu_doc_info , NULL , 0 , 0 } ,
{ TEXT_ ( T_FRAME_AT_FULL_SCREEN ) , cast_uchar " f " , TEXT_ ( T_HK_FRAME_AT_FULL_SCREEN ) , menu_for_frame , ( void * ) & set_frame_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_HTML_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_HTML_OPTIONS ) , menu_html_options , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static_const struct menu_item view_menu_color [ ] = {
{ TEXT_ ( T_SEARCH ) , cast_uchar " / " , TEXT_ ( T_HK_SEARCH ) , menu_for_frame , ( void * ) & search_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_SEARCH_BACK ) , cast_uchar " ? " , TEXT_ ( T_HK_SEARCH_BACK ) , menu_for_frame , ( void * ) & search_back_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_NEXT ) , cast_uchar " n " , TEXT_ ( T_HK_FIND_NEXT ) , menu_for_frame , ( void * ) & find_next_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_PREVIOUS ) , cast_uchar " N " , TEXT_ ( T_HK_FIND_PREVIOUS ) , menu_for_frame , ( void * ) & find_next_back_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_TOGGLE_HTML_PLAIN ) , cast_uchar " \\ " , TEXT_ ( T_HK_TOGGLE_HTML_PLAIN ) , menu_toggle , NULL , 0 , 0 } ,
{ TEXT_ ( T_DOCUMENT_INFO ) , cast_uchar " = " , TEXT_ ( T_HK_DOCUMENT_INFO ) , menu_doc_info , NULL , 0 , 0 } ,
{ TEXT_ ( T_HEADER_INFO ) , cast_uchar " | " , TEXT_ ( T_HK_HEADER_INFO ) , menu_head_info , NULL , 0 , 0 } ,
{ TEXT_ ( T_FRAME_AT_FULL_SCREEN ) , cast_uchar " f " , TEXT_ ( T_HK_FRAME_AT_FULL_SCREEN ) , menu_for_frame , ( void * ) & set_frame_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_SAVE_CLIPBOARD_TO_A_FILE ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_CLIPBOARD_TO_A_FILE ) , menu_save_clipboard , NULL , 0 , 0 } ,
{ TEXT_ ( T_LOAD_CLIPBOARD_FROM_A_FILE ) , cast_uchar " " , TEXT_ ( T_HK_LOAD_CLIPBOARD_FROM_A_FILE ) , menu_load_clipboard , NULL , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_HTML_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_HTML_OPTIONS ) , menu_html_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_COLOR ) , cast_uchar " " , TEXT_ ( T_HK_COLOR ) , menu_color , NULL , 0 , 0 } ,
{ TEXT_ ( T_SAVE_HTML_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_HTML_OPTIONS ) , menu_save_html_options , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static_const struct menu_item view_menu_anon_color [ ] = {
{ TEXT_ ( T_SEARCH ) , cast_uchar " / " , TEXT_ ( T_HK_SEARCH ) , menu_for_frame , ( void * ) & search_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_SEARCH_BACK ) , cast_uchar " ? " , TEXT_ ( T_HK_SEARCH_BACK ) , menu_for_frame , ( void * ) & search_back_dlg_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_NEXT ) , cast_uchar " n " , TEXT_ ( T_HK_FIND_NEXT ) , menu_for_frame , ( void * ) & find_next_ptr , 0 , 0 } ,
{ TEXT_ ( T_FIND_PREVIOUS ) , cast_uchar " N " , TEXT_ ( T_HK_FIND_PREVIOUS ) , menu_for_frame , ( void * ) & find_next_back_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_TOGGLE_HTML_PLAIN ) , cast_uchar " \\ " , TEXT_ ( T_HK_TOGGLE_HTML_PLAIN ) , menu_toggle , NULL , 0 , 0 } ,
{ TEXT_ ( T_DOCUMENT_INFO ) , cast_uchar " = " , TEXT_ ( T_HK_DOCUMENT_INFO ) , menu_doc_info , NULL , 0 , 0 } ,
{ TEXT_ ( T_FRAME_AT_FULL_SCREEN ) , cast_uchar " f " , TEXT_ ( T_HK_FRAME_AT_FULL_SCREEN ) , menu_for_frame , ( void * ) & set_frame_ptr , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 0 } ,
{ TEXT_ ( T_HTML_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_HTML_OPTIONS ) , menu_html_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_COLOR ) , cast_uchar " " , TEXT_ ( T_HK_COLOR ) , menu_color , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static void do_view_menu ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
if ( F | | term - > spec - > col ) {
if ( ! anonymous ) do_menu ( term , ( struct menu_item * ) view_menu_color , ses ) ;
else do_menu ( term , ( struct menu_item * ) view_menu_anon_color , ses ) ;
} else {
if ( ! anonymous ) do_menu ( term , ( struct menu_item * ) view_menu , ses ) ;
else do_menu ( term , ( struct menu_item * ) view_menu_anon , ses ) ;
}
}
static_const struct menu_item help_menu [ ] = {
{ TEXT_ ( T_ABOUT ) , cast_uchar " " , TEXT_ ( T_HK_ABOUT ) , menu_about , NULL , 0 , 0 } ,
{ TEXT_ ( T_KEYS ) , cast_uchar " F1 " , TEXT_ ( T_HK_KEYS ) , menu_keys , NULL , 0 , 0 } ,
{ TEXT_ ( T_MANUAL ) , cast_uchar " " , TEXT_ ( T_HK_MANUAL ) , menu_url , TEXT_ ( T_URL_MANUAL ) , 0 , 0 } ,
{ TEXT_ ( T_HOMEPAGE ) , cast_uchar " " , TEXT_ ( T_HK_HOMEPAGE ) , menu_url , TEXT_ ( T_URL_HOMEPAGE ) , 0 , 0 } ,
{ TEXT_ ( T_COPYING ) , cast_uchar " " , TEXT_ ( T_HK_COPYING ) , menu_copying , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
# ifdef G
static_const struct menu_item help_menu_g [ ] = {
{ TEXT_ ( T_ABOUT ) , cast_uchar " " , TEXT_ ( T_HK_ABOUT ) , menu_about , NULL , 0 , 0 } ,
{ TEXT_ ( T_KEYS ) , cast_uchar " F1 " , TEXT_ ( T_HK_KEYS ) , menu_keys , NULL , 0 , 0 } ,
{ TEXT_ ( T_MANUAL ) , cast_uchar " " , TEXT_ ( T_HK_MANUAL ) , menu_url , TEXT_ ( T_URL_MANUAL ) , 0 , 0 } ,
{ TEXT_ ( T_HOMEPAGE ) , cast_uchar " " , TEXT_ ( T_HK_HOMEPAGE ) , menu_url , TEXT_ ( T_URL_HOMEPAGE ) , 0 , 0 } ,
{ TEXT_ ( T_CALIBRATION ) , cast_uchar " " , TEXT_ ( T_HK_CALIBRATION ) , menu_url , TEXT_ ( T_URL_CALIBRATION ) , 0 , 0 } ,
{ TEXT_ ( T_COPYING ) , cast_uchar " " , TEXT_ ( T_HK_COPYING ) , menu_copying , NULL , 0 , 0 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
# endif
static_const struct menu_item net_options_menu [ ] = {
{ TEXT_ ( T_CONNECTIONS ) , cast_uchar " " , TEXT_ ( T_HK_CONNECTIONS ) , dlg_net_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_PROXIES ) , cast_uchar " " , TEXT_ ( T_HK_PROXIES ) , dlg_proxy_options , NULL , 0 , 0 } ,
# ifdef HAVE_SSL_CERTIFICATES
{ TEXT_ ( T_SSL_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_SSL_OPTIONS ) , dlg_ssl_options , NULL , 0 , 0 } ,
# endif
2022-06-06 13:08:05 +00:00
{ TEXT_ ( T_DNS_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_DNS_OPTIONS ) , dlg_dns_options , NULL , 0 , 0 } ,
2021-08-28 15:37:32 +00:00
{ TEXT_ ( T_HTTP_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_HTTP_OPTIONS ) , dlg_http_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_FTP_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_FTP_OPTIONS ) , dlg_ftp_options , NULL , 0 , 0 } ,
# ifndef DISABLE_SMB
{ TEXT_ ( T_SMB_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_SMB_OPTIONS ) , dlg_smb_options , NULL , 0 , 0 } ,
# endif
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
# ifdef SUPPORT_IPV6
static_const struct menu_item net_options_ipv6_menu [ ] = {
{ TEXT_ ( T_CONNECTIONS ) , cast_uchar " " , TEXT_ ( T_HK_CONNECTIONS ) , dlg_net_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_IPV6_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_IPV6_OPTIONS ) , dlg_ipv6_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_PROXIES ) , cast_uchar " " , TEXT_ ( T_HK_PROXIES ) , dlg_proxy_options , NULL , 0 , 0 } ,
# ifdef HAVE_SSL_CERTIFICATES
{ TEXT_ ( T_SSL_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_SSL_OPTIONS ) , dlg_ssl_options , NULL , 0 , 0 } ,
# endif
2022-06-06 13:08:05 +00:00
{ TEXT_ ( T_DNS_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_DNS_OPTIONS ) , dlg_dns_options , NULL , 0 , 0 } ,
2021-08-28 15:37:32 +00:00
{ TEXT_ ( T_HTTP_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_HTTP_OPTIONS ) , dlg_http_options , NULL , 0 , 0 } ,
{ TEXT_ ( T_FTP_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_FTP_OPTIONS ) , dlg_ftp_options , NULL , 0 , 0 } ,
# ifndef DISABLE_SMB
{ TEXT_ ( T_SMB_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_SMB_OPTIONS ) , dlg_smb_options , NULL , 0 , 0 } ,
# endif
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
# endif
static void network_menu ( struct terminal * term , void * xxx , void * yyy )
{
# ifdef SUPPORT_IPV6
if ( support_ipv6 )
do_menu ( term , ( struct menu_item * ) net_options_ipv6_menu , NULL ) ;
else
# endif
do_menu ( term , ( struct menu_item * ) net_options_menu , NULL ) ;
}
static void menu_write_config ( struct terminal * term , void * xxx , void * yyy )
{
write_config ( term ) ;
}
static_const struct menu_item setup_menu_1 [ ] = {
{ TEXT_ ( T_LANGUAGE ) , cast_uchar " > " , TEXT_ ( T_HK_LANGUAGE ) , menu_language_list , NULL , 1 , 1 } ,
} ;
static_const struct menu_item setup_menu_2 [ ] = {
{ TEXT_ ( T_CHARACTER_SET ) , cast_uchar " > " , TEXT_ ( T_HK_CHARACTER_SET ) , charset_list , NULL , 1 , 1 } ,
{ TEXT_ ( T_TERMINAL_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_TERMINAL_OPTIONS ) , terminal_options , NULL , 0 , 1 } ,
} ;
# ifdef G
static_const struct menu_item setup_menu_3 [ ] = {
{ TEXT_ ( T_VIDEO_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_VIDEO_OPTIONS ) , video_options , NULL , 0 , 1 } ,
} ;
# endif
static_const struct menu_item setup_menu_4 [ ] = {
{ TEXT_ ( T_SCREEN_MARGINS ) , cast_uchar " " , TEXT_ ( T_HK_SCREEN_MARGINS ) , screen_margins , NULL , 0 , 1 } ,
} ;
static_const struct menu_item setup_menu_5 [ ] = {
{ TEXT_ ( T_NETWORK_OPTIONS ) , cast_uchar " > " , TEXT_ ( T_HK_NETWORK_OPTIONS ) , network_menu , NULL , 1 , 1 } ,
} ;
static_const struct menu_item setup_menu_6 [ ] = {
{ TEXT_ ( T_COOKIES ) , cast_uchar " " , TEXT_ ( T_HK_COOKIES ) , cookies_options , NULL , 0 , 1 } ,
{ TEXT_ ( T_MISCELANEOUS_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_MISCELANEOUS_OPTIONS ) , miscelaneous_options , NULL , 0 , 1 } ,
} ;
# ifdef HAVE_FREETYPE
static_const struct menu_item setup_menu_7 [ ] = {
{ TEXT_ ( T_FONTS ) , cast_uchar " " , TEXT_ ( T_HK_FONTS ) , font_options , NULL , 0 , 1 } ,
} ;
# endif
static_const struct menu_item setup_menu_8 [ ] = {
# ifdef JS
{ TEXT_ ( T_JAVASCRIPT_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_JAVASCRIPT_OPTIONS ) , javascript_options , NULL , 0 , 1 } ,
# endif
{ TEXT_ ( T_CACHE ) , cast_uchar " " , TEXT_ ( T_HK_CACHE ) , cache_opt , NULL , 0 , 1 } ,
{ TEXT_ ( T_MAIL_AND_TELNEL ) , cast_uchar " " , TEXT_ ( T_HK_MAIL_AND_TELNEL ) , net_programs , NULL , 0 , 1 } ,
{ TEXT_ ( T_ASSOCIATIONS ) , cast_uchar " " , TEXT_ ( T_HK_ASSOCIATIONS ) , menu_assoc_manager , NULL , 0 , 1 } ,
{ TEXT_ ( T_FILE_EXTENSIONS ) , cast_uchar " " , TEXT_ ( T_HK_FILE_EXTENSIONS ) , menu_ext_manager , NULL , 0 , 1 } ,
{ TEXT_ ( T_BLOCK_LIST ) , cast_uchar " " , TEXT_ ( T_HK_BLOCK_LIST ) , block_manager , NULL , 0 , 0 } ,
{ cast_uchar " " , cast_uchar " " , M_BAR , NULL , NULL , 0 , 1 } ,
{ TEXT_ ( T_SAVE_OPTIONS ) , cast_uchar " " , TEXT_ ( T_HK_SAVE_OPTIONS ) , menu_write_config , NULL , 0 , 1 } ,
} ;
static_const struct menu_item setup_menu_9 [ ] = {
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
static void do_setup_menu ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
struct menu_item * setup_menu , * e ;
int size =
sizeof ( setup_menu_1 ) +
sizeof ( setup_menu_2 ) +
# ifdef G
sizeof ( setup_menu_3 ) +
# endif
sizeof ( setup_menu_4 ) +
sizeof ( setup_menu_5 ) +
sizeof ( setup_menu_6 ) +
# ifdef HAVE_FREETYPE
sizeof ( setup_menu_7 ) +
# endif
sizeof ( setup_menu_8 ) +
sizeof ( setup_menu_9 ) ;
setup_menu = mem_alloc ( size ) ;
e = setup_menu ;
memcpy ( e , setup_menu_1 , sizeof ( setup_menu_1 ) ) ;
e + = sizeof ( setup_menu_1 ) / sizeof ( struct menu_item ) ;
if ( ! F ) {
memcpy ( e , setup_menu_2 , sizeof ( setup_menu_2 ) ) ;
e + = sizeof ( setup_menu_2 ) / sizeof ( struct menu_item ) ;
# ifdef G
} else {
memcpy ( e , setup_menu_3 , sizeof ( setup_menu_3 ) ) ;
e + = sizeof ( setup_menu_3 ) / sizeof ( struct menu_item ) ;
# endif
}
if ( ! F
# ifdef G
| | ( drv - > get_margin & & drv - > set_margin )
# endif
) {
memcpy ( e , setup_menu_4 , sizeof ( setup_menu_4 ) ) ;
e + = sizeof ( setup_menu_4 ) / sizeof ( struct menu_item ) ;
}
if ( ! anonymous ) {
memcpy ( e , setup_menu_5 , sizeof ( setup_menu_5 ) ) ;
e + = sizeof ( setup_menu_5 ) / sizeof ( struct menu_item ) ;
}
if ( ! anonymous | | F ) {
memcpy ( e , setup_menu_6 , sizeof ( setup_menu_6 ) ) ;
e + = sizeof ( setup_menu_6 ) / sizeof ( struct menu_item ) ;
}
# ifdef HAVE_FREETYPE
if ( F ) {
memcpy ( e , setup_menu_7 , sizeof ( setup_menu_7 ) ) ;
e + = sizeof ( setup_menu_7 ) / sizeof ( struct menu_item ) ;
}
# endif
if ( ! anonymous ) {
memcpy ( e , setup_menu_8 , sizeof ( setup_menu_8 ) ) ;
e + = sizeof ( setup_menu_8 ) / sizeof ( struct menu_item ) ;
}
memcpy ( e , setup_menu_9 , sizeof ( setup_menu_9 ) ) ;
e + = sizeof ( setup_menu_9 ) / sizeof ( struct menu_item ) ;
do_menu ( term , setup_menu , ses ) ;
}
static void do_help_menu ( struct terminal * term , void * xxx , void * ses_ )
{
struct session * ses = ( struct session * ) ses_ ;
do_menu ( term , ( struct menu_item * ) gf_val ( help_menu , help_menu_g ) , ses ) ;
}
static_const struct menu_item main_menu [ ] = {
{ TEXT_ ( T_FILE ) , cast_uchar " " , TEXT_ ( T_HK_FILE ) , do_file_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_VIEW ) , cast_uchar " " , TEXT_ ( T_HK_VIEW ) , do_view_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_LINK ) , cast_uchar " " , TEXT_ ( T_HK_LINK ) , link_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_DOWNLOADS ) , cast_uchar " " , TEXT_ ( T_HK_DOWNLOADS ) , downloads_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_SETUP ) , cast_uchar " " , TEXT_ ( T_HK_SETUP ) , do_setup_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_HELP ) , cast_uchar " " , TEXT_ ( T_HK_HELP ) , do_help_menu , NULL , 1 , 1 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
# ifdef G
# ifdef GRDRV_VIRTUAL_DEVICES
static_const struct menu_item main_menu_g_windows [ ] = {
{ TEXT_ ( T_FILE ) , cast_uchar " " , TEXT_ ( T_HK_FILE ) , do_file_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_VIEW ) , cast_uchar " " , TEXT_ ( T_HK_VIEW ) , do_view_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_LINK ) , cast_uchar " " , TEXT_ ( T_HK_LINK ) , link_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_DOWNLOADS ) , cast_uchar " " , TEXT_ ( T_HK_DOWNLOADS ) , downloads_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_WINDOWS ) , cast_uchar " " , TEXT_ ( T_HK_WINDOWS ) , windows_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_SETUP ) , cast_uchar " " , TEXT_ ( T_HK_SETUP ) , do_setup_menu , NULL , 1 , 1 } ,
{ TEXT_ ( T_HELP ) , cast_uchar " " , TEXT_ ( T_HK_HELP ) , do_help_menu , NULL , 1 , 1 } ,
{ NULL , NULL , 0 , NULL , NULL , 0 , 0 }
} ;
# endif
# endif
/* lame technology rulez ! */
void activate_bfu_technology ( struct session * ses , int item )
{
struct terminal * term = ses - > term ;
/* decc_volatile to avoid compiler bug */
struct menu_item * decc_volatile m = ( struct menu_item * ) main_menu ;
# ifdef G
struct menu_item * decc_volatile mg = m ;
# ifdef GRDRV_VIRTUAL_DEVICES
if ( have_windows_menu )
mg = ( struct menu_item * ) main_menu_g_windows ;
# endif
# endif
do_mainmenu ( term , gf_val ( m , mg ) , ses , item ) ;
}
struct history goto_url_history = { 0 , { & goto_url_history . items , & goto_url_history . items } } ;
void dialog_goto_url ( struct session * ses , unsigned char * url )
{
input_field ( ses - > term , NULL , TEXT_ ( T_GOTO_URL ) , TEXT_ ( T_ENTER_URL ) , ses , & goto_url_history , MAX_INPUT_URL_LEN , url , 0 , 0 , NULL , 2 , TEXT_ ( T_OK ) , goto_url , TEXT_ ( T_CANCEL ) , input_field_null ) ;
}
void dialog_save_url ( struct session * ses )
{
input_field ( ses - > term , NULL , TEXT_ ( T_SAVE_URL ) , TEXT_ ( T_ENTER_URL ) , ses , & goto_url_history , MAX_INPUT_URL_LEN , cast_uchar " " , 0 , 0 , NULL , 2 , TEXT_ ( T_OK ) , save_url , TEXT_ ( T_CANCEL ) , input_field_null ) ;
}
struct does_file_exist_s {
void ( * fn ) ( struct session * , unsigned char * , int ) ;
void ( * cancel ) ( void * ) ;
int flags ;
struct session * ses ;
unsigned char * file ;
unsigned char * url ;
unsigned char * head ;
} ;
static void does_file_exist_ok ( struct does_file_exist_s * h , int mode )
{
if ( h - > fn ) {
unsigned char * d = h - > file ;
unsigned char * dd ;
for ( dd = h - > file ; * dd ; dd + + ) if ( dir_sep ( * dd ) ) d = dd + 1 ;
if ( d - h - > file < MAX_STR_LEN ) {
memcpy ( download_dir , h - > file , d - h - > file ) ;
download_dir [ d - h - > file ] = 0 ;
}
h - > fn ( h - > ses , h - > file , mode ) ;
}
}
static void does_file_exist_continue ( void * data )
{
does_file_exist_ok ( data , DOWNLOAD_CONTINUE ) ;
}
static void does_file_exist_overwrite ( void * data )
{
does_file_exist_ok ( data , DOWNLOAD_OVERWRITE ) ;
}
static void does_file_exist_cancel ( void * data )
{
struct does_file_exist_s * h = ( struct does_file_exist_s * ) data ;
if ( h - > cancel ) h - > cancel ( h - > ses ) ;
}
static void does_file_exist_rename ( void * data )
{
struct does_file_exist_s * h = ( struct does_file_exist_s * ) data ;
query_file ( h - > ses , h - > url , h - > head , h - > fn , h - > cancel , h - > flags ) ;
}
static void does_file_exist ( void * d_ , unsigned char * file )
{
struct does_file_exist_s * d = ( struct does_file_exist_s * ) d_ ;
unsigned char * f ;
unsigned char * wd ;
struct session * ses = d - > ses ;
struct stat st ;
int r ;
struct does_file_exist_s * h ;
unsigned char * msg ;
int file_type = 0 ;
h = mem_alloc ( sizeof ( struct does_file_exist_s ) ) ;
h - > fn = d - > fn ;
h - > cancel = d - > cancel ;
h - > flags = d - > flags ;
h - > ses = ses ;
h - > file = stracpy ( file ) ;
h - > url = stracpy ( d - > url ) ;
h - > head = stracpy ( d - > head ) ;
if ( ! * file ) {
does_file_exist_rename ( h ) ;
goto free_h_ret ;
}
if ( test_abort_downloads_to_file ( file , ses - > term - > cwd , 0 ) ) {
msg = TEXT_ ( T_ALREADY_EXISTS_AS_DOWNLOAD ) ;
goto display_msgbox ;
}
wd = get_cwd ( ) ;
set_cwd ( ses - > term - > cwd ) ;
f = translate_download_file ( file ) ;
EINTRLOOP ( r , stat ( cast_const_char f , & st ) ) ;
mem_free ( f ) ;
if ( wd ) set_cwd ( wd ) , mem_free ( wd ) ;
if ( r ) {
does_file_exist_ok ( h , DOWNLOAD_DEFAULT ) ;
free_h_ret :
if ( h - > head ) mem_free ( h - > head ) ;
mem_free ( h - > file ) ;
mem_free ( h - > url ) ;
mem_free ( h ) ;
return ;
}
if ( ! S_ISREG ( st . st_mode ) ) {
if ( S_ISDIR ( st . st_mode ) )
file_type = 2 ;
else
file_type = 1 ;
}
msg = TEXT_ ( T_ALREADY_EXISTS ) ;
display_msgbox :
if ( file_type = = 2 ) {
msg_box (
ses - > term ,
getml ( h , h - > file , h - > url , h - > head , NULL ) ,
TEXT_ ( T_FILE_ALREADY_EXISTS ) ,
AL_CENTER ,
TEXT_ ( T_DIRECTORY ) , cast_uchar " " , h - > file , cast_uchar " " , TEXT_ ( T_ALREADY_EXISTS ) , MSG_BOX_END ,
( void * ) h ,
2 ,
TEXT_ ( T_RENAME ) , does_file_exist_rename , B_ENTER ,
TEXT_ ( T_CANCEL ) , does_file_exist_cancel , B_ESC
) ;
} else if ( file_type | | h - > flags ! = DOWNLOAD_CONTINUE ) {
msg_box (
ses - > term ,
getml ( h , h - > file , h - > url , h - > head , NULL ) ,
TEXT_ ( T_FILE_ALREADY_EXISTS ) ,
AL_CENTER ,
TEXT_ ( T_FILE ) , cast_uchar " " , h - > file , cast_uchar " " , msg , cast_uchar " " , TEXT_ ( T_DO_YOU_WISH_TO_OVERWRITE ) , MSG_BOX_END ,
( void * ) h ,
3 ,
TEXT_ ( T_OVERWRITE ) , does_file_exist_overwrite , B_ENTER ,
TEXT_ ( T_RENAME ) , does_file_exist_rename , 0 ,
TEXT_ ( T_CANCEL ) , does_file_exist_cancel , B_ESC
) ;
} else {
msg_box (
ses - > term ,
getml ( h , h - > file , h - > url , h - > head , NULL ) ,
TEXT_ ( T_FILE_ALREADY_EXISTS ) ,
AL_CENTER ,
TEXT_ ( T_FILE ) , cast_uchar " " , h - > file , cast_uchar " " , msg , cast_uchar " " , TEXT_ ( T_DO_YOU_WISH_TO_CONTINUE ) , MSG_BOX_END ,
( void * ) h ,
4 ,
TEXT_ ( T_CONTINUE ) , does_file_exist_continue , B_ENTER ,
TEXT_ ( T_OVERWRITE ) , does_file_exist_overwrite , 0 ,
TEXT_ ( T_RENAME ) , does_file_exist_rename , 0 ,
TEXT_ ( T_CANCEL ) , does_file_exist_cancel , B_ESC
) ;
}
}
static void query_file_cancel ( void * d_ , unsigned char * s_ )
{
struct does_file_exist_s * d = ( struct does_file_exist_s * ) d_ ;
if ( d - > cancel ) d - > cancel ( d - > ses ) ;
}
void query_file ( struct session * ses , unsigned char * url , unsigned char * head , void ( * fn ) ( struct session * , unsigned char * , int ) , void ( * cancel ) ( void * ) , int flags )
{
unsigned char * fc , * file , * def ;
int dfl = 0 ;
struct does_file_exist_s * h ;
h = mem_alloc ( sizeof ( struct does_file_exist_s ) ) ;
fc = get_filename_from_url ( url , head , 0 ) ;
file = convert ( utf8_table , 0 , fc , NULL ) ;
mem_free ( fc ) ;
check_filename ( & file ) ;
def = init_str ( ) ;
add_to_str ( & def , & dfl , download_dir ) ;
if ( * def & & ! dir_sep ( def [ strlen ( cast_const_char def ) - 1 ] ) ) add_chr_to_str ( & def , & dfl , ' / ' ) ;
add_to_str ( & def , & dfl , file ) ;
mem_free ( file ) ;
h - > fn = fn ;
h - > cancel = cancel ;
h - > flags = flags ;
h - > ses = ses ;
h - > file = NULL ;
h - > url = stracpy ( url ) ;
h - > head = stracpy ( head ) ;
input_field ( ses - > term , getml ( h , h - > url , h - > head , NULL ) , TEXT_ ( T_DOWNLOAD ) , TEXT_ ( T_SAVE_TO_FILE ) , h , & file_history , MAX_INPUT_URL_LEN , def , 0 , 0 , NULL , 2 , TEXT_ ( T_OK ) , does_file_exist , TEXT_ ( T_CANCEL ) , query_file_cancel ) ;
mem_free ( def ) ;
}
static struct history search_history = { 0 , { & search_history . items , & search_history . items } } ;
void search_back_dlg ( struct session * ses , struct f_data_c * f , int a )
{
if ( list_empty ( ses - > history ) | | ! f - > f_data | | ! f - > vs ) {
msg_box ( ses - > term , NULL , TEXT_ ( T_SEARCH ) , AL_LEFT , TEXT_ ( T_YOU_ARE_NOWHERE ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
return ;
}
input_field ( ses - > term , NULL , TEXT_ ( T_SEARCH_BACK ) , TEXT_ ( T_SEARCH_FOR_TEXT ) , ses , & search_history , MAX_INPUT_URL_LEN , cast_uchar " " , 0 , 0 , NULL , 2 , TEXT_ ( T_OK ) , search_for_back , TEXT_ ( T_CANCEL ) , input_field_null ) ;
}
void search_dlg ( struct session * ses , struct f_data_c * f , int a )
{
if ( list_empty ( ses - > history ) | | ! f - > f_data | | ! f - > vs ) {
msg_box ( ses - > term , NULL , TEXT_ ( T_SEARCH_FOR_TEXT ) , AL_LEFT , TEXT_ ( T_YOU_ARE_NOWHERE ) , MSG_BOX_END , NULL , 1 , TEXT_ ( T_OK ) , msg_box_null , B_ENTER | B_ESC ) ;
return ;
}
input_field ( ses - > term , NULL , TEXT_ ( T_SEARCH ) , TEXT_ ( T_SEARCH_FOR_TEXT ) , ses , & search_history , MAX_INPUT_URL_LEN , cast_uchar " " , 0 , 0 , NULL , 2 , TEXT_ ( T_OK ) , search_for , TEXT_ ( T_CANCEL ) , input_field_null ) ;
}
void free_history_lists ( void )
{
free_history ( goto_url_history ) ;
free_history ( file_history ) ;
free_history ( search_history ) ;
# ifdef JS
free_history ( js_get_string_history ) ; /* is in jsint.c */
# endif
}