📄 menu.c
字号:
#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 + -