⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 this is the file used to browse web
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "links.h"/*static inline struct session *get_term_session(struct terminal *term){	if ((void *)term->windows.prev == &term->windows) {		internal("terminal has no windows");		return NULL;	}	return ((struct window *)term->windows.prev)->data;}*/void menu_about(struct terminal *term, void *d, struct session *ses){	msg_box(term, NULL, TEXT(T_ABOUT), AL_CENTER, TEXT(T_LINKS__LYNX_LIKE), NULL, 1, TEXT(T_OK), NULL, B_ENTER | B_ESC);}void menu_keys(struct terminal *term, void *d, struct session *ses){	msg_box(term, NULL, TEXT(T_KEYS), AL_LEFT, TEXT(T_KEYS_DESC), NULL, 1, TEXT(T_OK), NULL, B_ENTER | B_ESC);}void menu_copying(struct terminal *term, void *d, struct session *ses){	msg_box(term, NULL, TEXT(T_COPYING), AL_CENTER, TEXT(T_COPYING_DESC), NULL, 1, TEXT(T_OK), NULL, B_ENTER | B_ESC);}void menu_manual(struct terminal *term, void *d, struct session *ses){	goto_url(ses, LINKS_MANUAL_URL);}void menu_for_frame(struct terminal *term, void (*f)(struct session *, struct f_data_c *, int), struct session *ses){	do_for_frame(ses, f, 0);}void menu_goto_url(struct terminal *term, void *d, struct session *ses){	dialog_goto_url(ses, "");}void menu_save_url_as(struct terminal *term, void *d, struct session *ses){	dialog_save_url(ses);}void menu_go_back(struct terminal *term, void *d, struct session *ses){	go_back(ses);}void menu_reload(struct terminal *term, void *d, struct session *ses){	reload(ses, -1);}void really_exit_prog(struct session *ses){	register_bottom_half((void (*)(void *))destroy_terminal, ses->term);}void dont_exit_prog(struct session *ses){	ses->exit_query = 0;}void query_exit(struct session *ses){	ses->exit_query = 1;	msg_box(ses->term, NULL, TEXT(T_EXIT_LINKS), AL_CENTER, (ses->term->next == ses->term->prev && are_there_downloads()) ? TEXT(T_DO_YOU_REALLY_WANT_TO_EXIT_LINKS_AND_TERMINATE_ALL_DOWNLOADS) : TEXT(T_DO_YOU_REALLY_WANT_TO_EXIT_LINKS), ses, 2, TEXT(T_YES), (void (*)(void *))really_exit_prog, B_ENTER, TEXT(T_NO), dont_exit_prog, B_ESC);}void exit_prog(struct terminal *term, void *d, struct session *ses){	if (!ses) {		register_bottom_half((void (*)(void *))destroy_terminal, term);		return;	}	if (!ses->exit_query && (!d || (term->next == term->prev && are_there_downloads()))) {		query_exit(ses);		return;	}	really_exit_prog(ses);}struct refresh {	struct terminal *term;	struct window *win;	struct session *ses;	void (*fn)(struct terminal *term, void *d, struct session *ses);	void *data;	int timer;};void refresh(struct refresh *r){	struct refresh rr;	r->timer = -1;	memcpy(&rr, r, sizeof(struct refresh));	delete_window(r->win);	rr.fn(rr.term, rr.data, rr.ses);}void end_refresh(struct refresh *r){	if (r->timer != -1) kill_timer(r->timer);	mem_free(r);}void refresh_abort(struct dialog_data *dlg){	end_refresh(dlg->dlg->udata2);}void cache_inf(struct terminal *term, void *d, struct session *ses){	unsigned char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8, *a9, *a10, *a11, *a12, *a13, *a14, *a15, *a16;	int l = 0;	struct refresh *r;	r = mem_alloc(sizeof(struct refresh));	r->term = term;	r->win = NULL;	r->ses = ses;	r->fn = cache_inf;	r->data = d;	r->timer = -1;	l = 0;	l = 0, a1 = init_str(); add_to_str(&a1, &l, ": "); add_num_to_str(&a1, &l, select_info(CI_FILES));add_to_str(&a1, &l, " ");	l = 0, a2 = init_str(); add_to_str(&a2, &l, ", "); add_num_to_str(&a2, &l, select_info(CI_TIMERS));add_to_str(&a2, &l, " ");	l = 0, a3 = init_str(); add_to_str(&a3, &l, ".\n");	l = 0, a4 = init_str(); add_to_str(&a4, &l, ": "); add_num_to_str(&a4, &l, connect_info(CI_FILES));add_to_str(&a4, &l, " ");	l = 0, a5 = init_str(); add_to_str(&a5, &l, ", "); add_num_to_str(&a5, &l, connect_info(CI_CONNECTING));add_to_str(&a5, &l, " ");	l = 0, a6 = init_str(); add_to_str(&a6, &l, ", "); add_num_to_str(&a6, &l, connect_info(CI_TRANSFER));add_to_str(&a6, &l, " ");	l = 0, a7 = init_str(); add_to_str(&a7, &l, ", "); add_num_to_str(&a7, &l, connect_info(CI_KEEP));add_to_str(&a7, &l, " ");	l = 0, a8 = init_str(); add_to_str(&a8, &l, ".\n");	l = 0, a9 = init_str(); add_to_str(&a9, &l, ": "); add_num_to_str(&a9, &l, cache_info(CI_BYTES));add_to_str(&a9, &l, " ");	l = 0, a10 = init_str(); add_to_str(&a10, &l, ", "); add_num_to_str(&a10, &l, cache_info(CI_FILES));add_to_str(&a10, &l, " ");	l = 0, a11 = init_str(); add_to_str(&a11, &l, ", "); add_num_to_str(&a11, &l, cache_info(CI_LOCKED));add_to_str(&a11, &l, " ");	l = 0, a12 = init_str(); add_to_str(&a12, &l, ", "); add_num_to_str(&a12, &l, cache_info(CI_LOADING));add_to_str(&a12, &l, " ");	l = 0, a13 = init_str(); add_to_str(&a13, &l, ".\n");	l = 0, a14 = init_str(); add_to_str(&a14, &l, ": "); add_num_to_str(&a14, &l, formatted_info(CI_FILES));add_to_str(&a14, &l, " ");	l = 0, a15 = init_str(); add_to_str(&a15, &l, ", "); add_num_to_str(&a15, &l, formatted_info(CI_LOCKED));add_to_str(&a15, &l, " ");	l = 0, a16 = init_str(); add_to_str(&a16, &l, ".");	msg_box(term, getml(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, NULL), TEXT(T_RESOURCES), AL_LEFT | AL_EXTD_TEXT, TEXT(T_RESOURCES), a1, TEXT(T_HANDLES), a2, TEXT(T_TIMERS), a3, TEXT(T_CONNECTIONS), a4, TEXT(T_cONNECTIONS), a5, TEXT(T_CONNECTING), a6, TEXT(T_tRANSFERRING), a7, TEXT(T_KEEPALIVE), a8, TEXT(T_MEMORY_CACHE), a9, TEXT(T_BYTES), a10, TEXT(T_FILES), a11, TEXT(T_LOCKED), a12, TEXT(T_LOADING), a13, TEXT(T_FORMATTED_DOCUMENT_CACHE), a14, TEXT(T_DOCUMENTS), a15, TEXT(T_LOCKED), a16, NULL, r, 1, TEXT(T_OK), NULL, B_ENTER | B_ESC);	r->win = term->windows.next;	((struct dialog_data *)r->win->data)->dlg->abort = refresh_abort;	r->timer = install_timer(RESOURCE_INFO_REFRESH, (void (*)(void *))refresh, r);}#ifdef DEBUGvoid list_cache(struct terminal *term, void *d, struct session *ses){	unsigned char *a;	int l = 0;	struct refresh *r;	struct cache_entry *ce, *cache;	a = init_str();	r = mem_alloc(sizeof(struct refresh));	r->term = term;	r->win = NULL;	r->ses = ses;	r->fn = list_cache;	r->data = d;	r->timer = -1;	cache = (struct cache_entry *)cache_info(CI_LIST);	add_to_str(&a, &l, ":");	foreach(ce, *cache) {		add_to_str(&a, &l, "\n");		add_to_str(&a, &l, ce->url);	}	msg_box(term, getml(a, NULL), TEXT(T_CACHE_INFO), AL_LEFT | AL_EXTD_TEXT, TEXT(T_CACHE_CONTENT), a, NULL, r, 1, TEXT(T_OK), end_refresh, B_ENTER | B_ESC);	r->win = term->windows.next;	r->timer = install_timer(RESOURCE_INFO_REFRESH, (void (*)(void *))refresh, r);	/* !!! the refresh here is buggy */}#endif#ifdef LEAK_DEBUGvoid memory_cld(struct terminal *term, void *d){	last_mem_amount = mem_amount;}#define MSG_BUF	2000#define MSG_W	100void memory_info(struct terminal *term, void *d, struct session *ses){	char message[MSG_BUF];	char *p;	struct refresh *r;	r = mem_alloc(sizeof(struct refresh));	r->term = term;	r->win = NULL;	r->ses = ses;	r->fn = memory_info;	r->data = d;	r->timer = -1;	p = message;	sprintf(p, "%ld %s", mem_amount, _(TEXT(T_MEMORY_ALLOCATED), term)), p += strlen(p);	if (last_mem_amount != -1) sprintf(p, ", %s %ld, %s %ld", _(TEXT(T_LAST), term), last_mem_amount, _(TEXT(T_DIFFERENCE), term), mem_amount - last_mem_amount), p += strlen(p);	sprintf(p, "."), p += strlen(p);#if 0 && defined(MAX_LIST_SIZE)	if (last_mem_amount != -1) {		long i, j;		int l = 0;		for (i = 0; i < MAX_LIST_SIZE; i++) if (memory_list[i].p && memory_list[i].p != last_memory_list[i].p) {			for (j = 0; j < MAX_LIST_SIZE; j++) if (last_memory_list[j].p == memory_list[i].p) goto b;			if (!l) sprintf(p, "\n%s: ", _(TEXT(T_NEW_ADDRESSES), term)), p += strlen(p), l = 1;			else sprintf(p, ", "), p += strlen(p);			sprintf(p, "#%p of %d at %s:%d", memory_list[i].p, (int)memory_list[i].size, memory_list[i].file, memory_list[i].line), p += strlen(p);			if (p - message >= MSG_BUF - MSG_W) {				sprintf(p, ".."), p += strlen(p);				break;			}			b:;		}		if (!l) sprintf(p, "\n%s", _(TEXT(T_NO_NEW_ADDRESSES), term)), p += strlen(p);		sprintf(p, "."), p += strlen(p);	}#endif	p = stracpy(message);	msg_box(term, getml(p, NULL), TEXT(T_MEMORY_INFO), AL_CENTER, p, r, 1, TEXT(T_OK), NULL, B_ENTER | B_ESC);	r->win = term->windows.next;	((struct dialog_data *)r->win->data)->dlg->abort = refresh_abort;	r->timer = install_timer(RESOURCE_INFO_REFRESH, (void (*)(void *))refresh, r);}#endifvoid flush_caches(struct terminal *term, void *d, void *e){	shrink_memory(1);}void go_backwards(struct terminal *term, void *psteps, struct session *ses){	int steps = (int) psteps;	/*if (ses->tq_goto_position)		--steps;	if (ses->search_word)		mem_free(ses->search_word), ses->search_word = NULL;*/	abort_loading(ses);	while (steps > 1) {		struct location *loc = ses->history.next;		if ((void *) loc == &ses->history) return;		loc = loc->next;		if ((void *) loc == &ses->history) return;		destroy_location(loc);		--steps;	}	if (steps)		go_back(ses);}struct menu_item no_hist_menu[] = {	{ TEXT(T_NO_HISTORY), "", M_BAR, NULL, NULL, 0, 0 },	{ NULL, NULL, 0, NULL, NULL, 0, 0 },};void history_menu(struct terminal *term, void *ddd, struct session *ses){	struct location *l;	struct menu_item *mi = NULL;	int n = 0;	foreach(l, ses->history) {		if (n/* || ses->tq_goto_position*/) {			unsigned char *url;			if (!mi && !(mi = new_menu(3))) return;			url = stracpy(l->vs.url);			if (strchr(url, POST_CHAR)) *strchr(url, POST_CHAR) = 0;			add_to_menu(&mi, url, "", "", MENU_FUNC go_backwards, (void *) n, 0);		}		n++;	}	if (n <= 1) do_menu(term, no_hist_menu, ses);	else do_menu(term, mi, ses);}struct menu_item no_downloads_menu[] = {	{ TEXT(T_NO_DOWNLOADS), "", M_BAR, NULL, NULL, 0, 0 },	{ NULL, NULL, 0, NULL, NULL, 0, 0 },};void downloads_menu(struct terminal *term, void *ddd, struct session *ses){	struct download *d;	struct menu_item *mi = NULL;	int n = 0;	foreachback(d, downloads) {		unsigned char *u;		if (!mi) if (!(mi = new_menu(3))) return;		u = stracpy(d->url);		if (strchr(u, POST_CHAR)) *strchr(u, POST_CHAR) = 0;		add_to_menu(&mi, u, "", "", MENU_FUNC display_download, d, 0);		n++;	}	if (!n) do_menu(term, no_downloads_menu, ses);	else do_menu(term, mi, ses);}void menu_doc_info(struct terminal *term, void *ddd, struct session *ses){	state_msg(ses);}void menu_head_info(struct terminal *term, void *ddd, struct session *ses){	head_msg(ses);}void menu_toggle(struct terminal *term, void *ddd, struct session *ses){	toggle(ses, ses->screen, 0);}void display_codepage(struct terminal *term, void *pcp, struct session *ses){	int cp = (int)pcp;	struct term_spec *t = new_term_spec(term->term);	if (t) t->charset = cp;	cls_redraw_all_terminals();}void assumed_codepage(struct terminal *term, void *pcp, struct session *ses){	int cp = (int)pcp;	ses->ds.assume_cp = cp;	redraw_terminal_cls(term);}void charset_list(struct terminal *term, void *xxx, struct session *ses){	int i, sel;	unsigned char *n;	struct menu_item *mi;	if (!(mi = new_menu(1))) return;	for (i = 0; (n = get_cp_name(i)); i++) {		if (is_cp_special(i)) continue;		add_to_menu(&mi, get_cp_name(i), "", "", MENU_FUNC display_codepage, (void *)i, 0);	}	sel = ses->term->spec->charset;	if (sel < 0) sel = 0;	do_menu_selected(term, mi, ses, sel);}void set_val(struct terminal *term, void *ip, int *d){	*d = (int)ip;}void charset_sel_list(struct terminal *term, struct session *ses, int *ptr){	int i, sel;	unsigned char *n;	struct menu_item *mi;	if (!(mi = new_menu(1))) return;	for (i = 0; (n = get_cp_name(i)); i++) {		add_to_menu(&mi, get_cp_name(i), "", "", MENU_FUNC set_val, (void *)i, 0);	}	sel = *ptr;	if (sel < 0) sel = 0;	do_menu_selected(term, mi, ptr, sel);}void terminal_options_ok(void *p){	cls_redraw_all_terminals();}unsigned char *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), TEXT(T_USE_11M), TEXT(T_RESTRICT_FRAMES_IN_CP850_852), TEXT(T_BLOCK_CURSOR), TEXT(T_COLOR), NULL };void terminal_options(struct terminal *term, void *xxx, struct session *ses){	struct dialog *d;	struct term_spec *ts = new_term_spec(term->term);	if (!ts) return;	d = mem_alloc(sizeof(struct dialog) + 12 * sizeof(struct dialog_item));	memset(d, 0, sizeof(struct dialog) + 12 * sizeof(struct dialog_item));	d->title = TEXT(T_TERMINAL_OPTIONS);	d->fn = checkbox_list_fn;	d->udata = td_labels;	d->refresh = (void (*)(void *))terminal_options_ok;	d->items[0].type = D_CHECKBOX;	d->items[0].gid = 1;	d->items[0].gnum = TERM_DUMB;	d->items[0].dlen = sizeof(int);	d->items[0].data = (void *)&ts->mode;	d->items[1].type = D_CHECKBOX;	d->items[1].gid = 1;	d->items[1].gnum = TERM_VT100;	d->items[1].dlen = sizeof(int);	d->items[1].data = (void *)&ts->mode;	d->items[2].type = D_CHECKBOX;	d->items[2].gid = 1;	d->items[2].gnum = TERM_LINUX;	d->items[2].dlen = sizeof(int);	d->items[2].data = (void *)&ts->mode;	d->items[3].type = D_CHECKBOX;	d->items[3].gid = 1;	d->items[3].gnum = TERM_KOI8;	d->items[3].dlen = sizeof(int);	d->items[3].data = (void *)&ts->mode;	d->items[4].type = D_CHECKBOX;	d->items[4].gid = 1;	d->items[4].gnum = TERM_FREEBSD;	d->items[4].dlen = sizeof(int);	d->items[4].data = (void *)&ts->mode;	d->items[5].type = D_CHECKBOX;	d->items[5].gid = 0;	d->items[5].dlen = sizeof(int);	d->items[5].data = (void *)&ts->m11_hack;	d->items[6].type = D_CHECKBOX;	d->items[6].gid = 0;	d->items[6].dlen = sizeof(int);	d->items[6].data = (void *)&ts->restrict_852;	d->items[7].type = D_CHECKBOX;	d->items[7].gid = 0;	d->items[7].dlen = sizeof(int);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -