📄 menu.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"/* prototypes */void menu_about(struct terminal *, void *, struct session *);void menu_keys(struct terminal *, void *, struct session *);void menu_copying(struct terminal *, void *, struct session *);void menu_manual(struct terminal *, void *, struct session *);void menu_homepage(struct terminal *, void *, struct session *);void menu_calibration(struct terminal *, void *, struct session *);void menu_for_frame(struct terminal *, void (*)(struct session *, struct f_data_c *, int), struct session *);void menu_goto_url(struct terminal *, void *, struct session *);void menu_save_url_as(struct terminal *, void *, struct session *);void menu_save_bookmarks(struct terminal *, void *, struct session *);void menu_go_back(struct terminal *, void *, struct session *);void menu_reload(struct terminal *, void *, struct session *);void dont_exit_prog(struct session *);void refresh_abort(struct dialog_data *);void cache_inf(struct terminal *, void *, struct session *);void list_cache(struct terminal *, void *, struct session *);void memory_cld(struct terminal *, void *);void memory_info(struct terminal *, void *, struct session *);void flush_caches(struct terminal *, void *, void *);void history_menu(struct terminal *, void *, struct session *);void downloads_menu(struct terminal *, void *, struct session *);void menu_doc_info(struct terminal *, void *, struct session *);void menu_head_info(struct terminal *, void *, struct session *);void menu_toggle(struct terminal *, void *, struct session *);void display_codepage(struct terminal *, void *, struct session *);void assumed_codepage(struct terminal *, void *, struct session *);void charset_list(struct terminal *, void *, struct session *);void set_val(struct terminal *, void *, int *);void charset_sel_list(struct terminal *, struct session *, int *, int);void terminal_options_ok(void *);void terminal_options(struct terminal *, void *, struct session *);void refresh_javascript(struct session *);void javascript_options(struct terminal *, void *, struct session *);void httpopt_fn(struct dialog_data *);int dlg_http_options(struct dialog_data *, struct dialog_item_data *);void ftpopt_fn(struct dialog_data *);int dlg_ftp_options(struct dialog_data *, struct dialog_item_data *);int dlg_proxy_options(struct dialog_data *, struct dialog_item_data *);void refresh_video(struct session *);void videoopt_fn(struct dialog_data *);void remove_zeroes(unsigned char *);void video_options(struct terminal *, void *, struct session *);void refresh_net(void *);void proxy_fn(struct dialog_data *);void net_options(struct terminal *, void *, void *);void netprog_fn(struct dialog_data *);void net_programs(struct terminal *, void *, void *);void cache_refresh(void *);void cache_opt(struct terminal *, void *, void *);void menu_shell(struct terminal *, void *, void *);void menu_kill_background_connections(struct terminal *, void *, void *);void menu_kill_all_connections(struct terminal *, void *, void *);void menu_save_html_options(struct terminal *, void *, struct session *);void html_refresh(struct session *);int dlg_assume_cp(struct dialog_data *, struct dialog_item_data *);int dlg_kb_cp(struct dialog_data *, struct dialog_item_data *);void menu_html_options(struct terminal *, void *, struct session *);void refresh_misc(void *);void miscopt_fn(struct dialog_data *);void miscelaneous_options(struct terminal *, void *, struct session *);void menu_set_language(struct terminal *, void *, struct session *);void menu_language_list(struct terminal *, void *, struct session *);void do_resize_terminal(struct terminal *);void dlg_resize_terminal(struct terminal *, void *, struct session *);void do_file_menu(struct terminal *, void *, struct session *);void do_view_menu(struct terminal *, void *, struct session *);void do_setup_menu(struct terminal *, void *, struct session *);/*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 | AL_MONO, 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_homepage(struct terminal *term, void *d, struct session *ses){ goto_url(ses, LINKS_HOMEPAGE_URL);}void menu_calibration(struct terminal *term, void *d, struct session *ses){ goto_url(ses, LINKS_CALIBRATION_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_save_bookmarks(struct terminal *term, void *d, struct session *ses){ save_bookmarks();}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) : (!F || ses->term->next == ses->term->prev) ? TEXT(T_DO_YOU_REALLY_WANT_TO_EXIT_LINKS) : TEXT(T_DO_YOU_REALLY_WANT_TO_CLOSE_WINDOW), 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;};/* prototypes */void refresh(struct refresh *);void end_refresh(struct refresh *);void refresh(struct refresh *r){ struct refresh rr; r->timer = -1; memcpy(&rr, r, sizeof(struct refresh)); rr.fn(rr.term, rr.data, rr.ses); delete_window(r->win);}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;#ifdef G unsigned char *b14, *b15, *b16, *b17; unsigned char *c14, *c15, *c16, *c17;#endif 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");#ifdef G if (F) { l = 0, b14 = init_str(); add_to_str(&b14, &l, ", "); add_num_to_str(&b14, &l, imgcache_info(CI_BYTES)); add_to_str(&b14, &l, " "); l = 0, b15 = init_str(); add_to_str(&b15, &l, ", "); add_num_to_str(&b15, &l, imgcache_info(CI_FILES)); add_to_str(&b15, &l, " "); l = 0, b16 = init_str(); add_to_str(&b16, &l, ", "); add_num_to_str(&b16, &l, imgcache_info(CI_LOCKED)); add_to_str(&b16, &l, " "); l = 0, b17 = init_str(); add_to_str(&b17, &l, ".\n"); l = 0, c14 = init_str(); add_to_str(&c14, &l, ", "); add_num_to_str(&c14, &l, font_cache.bytes); add_to_str(&c14, &l, " "); l = 0, c15 = init_str(); add_to_str(&c15, &l, ", "); add_num_to_str(&c15, &l, font_cache.max_bytes); add_to_str(&c15, &l, " "); l = 0, c16 = init_str(); add_to_str(&c16, &l, ", "); add_num_to_str(&c16, &l, font_cache.items); add_to_str(&c16, &l, " "); l = 0, c17 = init_str(); add_to_str(&c17, &l, ".\n"); }#endif 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, "."); if (!F) 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);#ifdef G else msg_box(term, getml(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, b14, b15, b16, b17, a14, a15, a16, c14, c15, c16, c17, 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_IMAGE_CACHE), b14, TEXT(T_BYTES), b15, TEXT(T_IMAGES), b16, TEXT(T_LOCKED), b17, TEXT(T_FONT_CACHE), c14, TEXT(T_BYTES), c15, TEXT(T_BYTES_MAX), c16, TEXT(T_LETTERS), c17, 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);#endif 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);#ifdef JS sprintf(p, "\n%ld %s.", js_zaflaknuto_pameti, _(TEXT(T_JS_MEMORY_ALLOCATED), term)), p += strlen(p);#endif#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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -