4716 lines
		
	
	
	
		
			149 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			4716 lines
		
	
	
	
		
			149 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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);
 | |
| #endif
 | |
| #ifdef HAVE_WEBP
 | |
| 	add_to_str(&s, &l, cast_uchar ", ");
 | |
| 	add_webp_version(&s, &l);
 | |
| #endif
 | |
| #ifdef HAVE_AVIF
 | |
| 	add_to_str(&s, &l, cast_uchar ", ");
 | |
| 	add_avif_version(&s, &l);
 | |
| #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);
 | |
| 	d = mem_calloc(sizeof(struct dialog) + 11 * sizeof(struct dialog_item));
 | |
| 	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
 | |
| 
 | |
| 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));
 | |
| }
 | |
| 
 | |
| 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),
 | |
| 	TEXT_(T_GOPHER_PROG),
 | |
| 	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);
 | |
| 	max_text_width(term, prg_msg[a], &max, AL_LEFT);
 | |
| 	min_text_width(term, prg_msg[a++], &min, AL_LEFT);
 | |
| #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;
 | |
| 	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;
 | |
| #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;
 | |
| 	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;
 | |
| #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;
 | |
| 	d = mem_calloc(sizeof(struct dialog) + 9 * sizeof(struct dialog_item));
 | |
| #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);
 | |
| 	d->items[a].type = D_FIELD;
 | |
| 	d->items[a].dlen = MAX_STR_LEN;
 | |
| 	d->items[a++].data = get_prog(&gopher_prog);
 | |
| #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)
 | |
| {
 | |
| 	unsigned char * decc_volatile empty = cast_uchar "";
 | |
| 	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));
 | |
| 
 | |
| 	add_to_menu(&mi, TEXT_(T_BUILT_IN_FONT), empty, empty, font_selected, empty, 0, 0);
 | |
| 	for (i = 0; i < n_fonts; i++) {
 | |
| 		if (!strcmp(cast_const_char fonts[i].file, cast_const_char di->cdata))
 | |
| 			current_font = i + 1;
 | |
| 		add_to_menu(&mi, fonts[i].name, empty, empty, font_selected, fonts[i].file, 0, i + 1);
 | |
| 	}
 | |
| 
 | |
| 	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
 | |
| 	{ TEXT_(T_DNS_OPTIONS), cast_uchar "", TEXT_(T_HK_DNS_OPTIONS), dlg_dns_options, NULL, 0, 0 },
 | |
| 	{ 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
 | |
| 	{ TEXT_(T_DNS_OPTIONS), cast_uchar "", TEXT_(T_HK_DNS_OPTIONS), dlg_dns_options, NULL, 0, 0 },
 | |
| 	{ 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
 | |
| }
 |