📄 menu.c
字号:
d->items[1].fn = check_number; d->items[1].gid = 0; d->items[1].gnum = 256; 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));}void menu_shell(struct terminal *term, void *xxx, void *yyy){ unsigned char *sh; if (!(sh = GETSHELL)) sh = DEFAULT_SHELL; exec_on_terminal(term, sh, "", 1);}void menu_kill_background_connections(struct terminal *term, void *xxx, void *yyy){ abort_background_connections();}void menu_save_html_options(struct terminal *term, void *xxx, struct session *ses){ memcpy(&dds, &ses->ds, sizeof(struct document_setup)); write_html_config(term);}unsigned char marg_str[2];void html_refresh(struct session *ses){ ses->ds.margin = atoi(marg_str); html_interpret(ses); draw_formatted(ses); load_frames(ses, ses->screen); process_file_requests(ses); print_screen_status(ses);}unsigned char *html_texts[] = { TEXT(T_DISPLAY_TABLES), TEXT(T_DISPLAY_FRAMES), TEXT(T_DISPLAY_LINKS_TO_IMAGES), TEXT(T_LINK_ORDER_BY_COLUMNS), TEXT(T_NUMBERED_LINKS), TEXT(T_TEXT_MARGIN), "", TEXT(T_IGNORE_CHARSET_INFO_SENT_BY_SERVER) };int dlg_assume_cp(struct dialog_data *dlg, struct dialog_item_data *di){ charset_sel_list(dlg->win->term, dlg->dlg->udata2, (int *)di->cdata); return 0;}void menu_html_options(struct terminal *term, void *xxx, struct session *ses){ struct dialog *d; snprint(marg_str, 2, ses->ds.margin); d = mem_alloc(sizeof(struct dialog) + 11 * sizeof(struct dialog_item)); memset(d, 0, sizeof(struct dialog) + 11 * sizeof(struct dialog_item)); d->title = TEXT(T_HTML_OPTIONS); d->fn = group_fn; d->udata = html_texts; d->udata2 = ses; d->refresh = (void (*)(void *))html_refresh; d->refresh_data = ses; d->items[0].type = D_CHECKBOX; d->items[0].data = (unsigned char *) &ses->ds.tables; d->items[0].dlen = sizeof(int); d->items[1].type = D_CHECKBOX; d->items[1].data = (unsigned char *) &ses->ds.frames; d->items[1].dlen = sizeof(int); d->items[2].type = D_CHECKBOX; d->items[2].data = (unsigned char *) &ses->ds.images; d->items[2].dlen = sizeof(int); d->items[3].type = D_CHECKBOX; d->items[3].data = (unsigned char *) &ses->ds.table_order; d->items[3].dlen = sizeof(int); d->items[4].type = D_CHECKBOX; d->items[4].data = (unsigned char *) &ses->ds.num_links; d->items[4].dlen = sizeof(int); d->items[5].type = D_FIELD; d->items[5].dlen = 2; d->items[5].data = marg_str; d->items[5].fn = check_number; d->items[5].gid = 0; d->items[5].gnum = 9; d->items[6].type = D_BUTTON; d->items[6].gid = 0; d->items[6].fn = dlg_assume_cp; d->items[6].text = TEXT(T_DEFAULT_CODEPAGE); d->items[6].data = (unsigned char *) &ses->ds.assume_cp; d->items[6].dlen = sizeof(int); d->items[7].type = D_CHECKBOX; d->items[7].data = (unsigned char *) &ses->ds.hard_assume; d->items[7].dlen = sizeof(int); d->items[8].type = D_BUTTON; d->items[8].gid = B_ENTER; d->items[8].fn = ok_dialog; d->items[8].text = TEXT(T_OK); d->items[9].type = D_BUTTON; d->items[9].gid = B_ESC; d->items[9].fn = cancel_dialog; d->items[9].text = TEXT(T_CANCEL); d->items[10].type = D_END; do_dialog(term, d, getml(d, NULL));}void menu_set_language(struct terminal *term, void *pcp, struct session *ses){ set_language((int)pcp); cls_redraw_all_terminals();}void menu_language_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; i < n_languages(); i++) { n = language_name(i); add_to_menu(&mi, n, "", "", MENU_FUNC menu_set_language, (void *)i, 0); } sel = current_language; do_menu_selected(term, mi, ses, sel);}unsigned char *resize_texts[] = { TEXT(T_COLUMNS), TEXT(T_ROWS) };unsigned char x_str[4];unsigned char y_str[4];void do_resize_terminal(struct terminal *term){ unsigned char str[8]; strcpy(str, x_str); strcat(str, ","); strcat(str, y_str); do_terminal_function(term, TERM_FN_RESIZE, str);}void dlg_resize_terminal(struct terminal *term, void *xxx, struct session *ses){ struct dialog *d; int x = term->x > 999 ? 999 : term->x; int y = term->y > 999 ? 999 : term->y; sprintf(x_str, "%d", x); sprintf(y_str, "%d", y); d = mem_alloc(sizeof(struct dialog) + 5 * sizeof(struct dialog_item)); memset(d, 0, sizeof(struct dialog) + 5 * sizeof(struct dialog_item)); d->title = TEXT(T_RESIZE_TERMINAL); d->fn = group_fn; d->udata = resize_texts; d->refresh = (void (*)(void *))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));}struct menu_item file_menu11[] = { { TEXT(T_GOTO_URL), "g", TEXT(T_HK_GOTO_URL), MENU_FUNC menu_goto_url, (void *)0, 0, 0 }, { TEXT(T_GO_BACK), "<-", TEXT(T_HK_GO_BACK), MENU_FUNC menu_go_back, (void *)0, 0, 0 }, { TEXT(T_HISTORY), ">", TEXT(T_HK_HISTORY), MENU_FUNC history_menu, (void *)0, 1, 0 }, { TEXT(T_RELOAD), "Ctrl-R", TEXT(T_HK_RELOAD), MENU_FUNC menu_reload, (void *)0, 0, 0 },};struct menu_item file_menu12[] = { { TEXT(T_BOOKMARKS), "s", TEXT(T_HK_BOOKMARKS), MENU_FUNC menu_bookmark_manager, (void *)0, 0, 0 }, { TEXT(T_ADD_BOOKMARK), "a", TEXT(T_HK_ADD_BOOKMARK), MENU_FUNC launch_bm_add_doc_dialog, (void *)0, 0, 0 },};struct menu_item file_menu21[] = { { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_SAVE_AS), "", TEXT(T_HK_SAVE_AS), MENU_FUNC save_as, (void *)0, 0, 0 }, { TEXT(T_SAVE_URL_AS), "", TEXT(T_HK_SAVE_URL_AS), MENU_FUNC menu_save_url_as, (void *)0, 0, 0 }, { TEXT(T_SAVE_FORMATTED_DOCUMENT), "", TEXT(T_HK_SAVE_FORMATTED_DOCUMENT), MENU_FUNC menu_save_formatted, (void *)0, 0, 0 },};struct menu_item file_menu22[] = { { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_KILL_BACKGROUND_CONNECTIONS), "", TEXT(T_HK_KILL_BACKGROUND_CONNECTIONS), MENU_FUNC menu_kill_background_connections, (void *)0, 0, 0 }, { TEXT(T_FLUSH_ALL_CACHES), "", TEXT(T_HK_FLUSH_ALL_CACHES), MENU_FUNC flush_caches, (void *)0, 0, 0 }, { TEXT(T_RESOURCE_INFO), "", TEXT(T_HK_RESOURCE_INFO), MENU_FUNC cache_inf, (void *)0, 0, 0 },#if 0 { TEXT(T_CACHE_INFO), "", TEXT(T_HK_CACHE_INFO), MENU_FUNC list_cache, (void *)0, 0, 0 },#endif#ifdef LEAK_DEBUG { TEXT(T_MEMORY_INFO), "", TEXT(T_HK_MEMORY_INFO), MENU_FUNC memory_info, (void *)0, 0, 0 },#endif { "", "", M_BAR, NULL, NULL, 0, 0 },};struct menu_item file_menu3[] = { { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_EXIT), "q", TEXT(T_HK_EXIT), MENU_FUNC exit_prog, (void *)0, 0, 0 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};void do_file_menu(struct terminal *term, void *xxx, struct session *ses){ int x; int o; struct menu_item *file_menu, *e, *f; 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; memcpy(e, file_menu11, sizeof(file_menu11)); e += sizeof(file_menu11) / sizeof(struct menu_item); if (!anonymous) { memcpy(e, file_menu12, sizeof(file_menu12)); e += sizeof(file_menu12) / sizeof(struct menu_item); } if ((o = can_open_in_new(term))) { e->text = TEXT(T_NEW_WINDOW); e->rtext = o - 1 ? ">" : ""; e->hotkey = TEXT(T_HK_NEW_WINDOW); e->func = MENU_FUNC open_in_new_window; e->data = send_open_new_xterm; e->in_m = o - 1; e->free_i = 0; e++; } if (!anonymous) { memcpy(e, file_menu21, sizeof(file_menu21)); e += sizeof(file_menu21) / sizeof(struct menu_item); } memcpy(e, file_menu22, sizeof(file_menu22)); e += sizeof(file_menu22) / sizeof(struct menu_item); /*"", "", M_BAR, NULL, NULL, 0, 0, TEXT(T_OS_SHELL), "", TEXT(T_HK_OS_SHELL), MENU_FUNC menu_shell, NULL, 0, 0,*/ x = 1; if (!anonymous && can_open_os_shell(term->environment)) { e->text = TEXT(T_OS_SHELL); e->rtext = ""; e->hotkey = TEXT(T_HK_OS_SHELL); e->func = MENU_FUNC menu_shell; e->data = NULL; e->in_m = 0; e->free_i = 0; e++; x = 0; } if (can_resize_window(term->environment)) { e->text = TEXT(T_RESIZE_TERMINAL); e->rtext = ""; e->hotkey = TEXT(T_HK_RESIZE_TERMINAL); e->func = MENU_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); for (f = file_menu; f < e; f++) f->free_i = 1; do_menu(term, file_menu, ses);}struct menu_item view_menu[] = { { TEXT(T_SEARCH), "/", TEXT(T_HK_SEARCH), MENU_FUNC menu_for_frame, (void *)search_dlg, 0, 0 }, { TEXT(T_SEARCH_BACK), "?", TEXT(T_HK_SEARCH_BACK), MENU_FUNC menu_for_frame, (void *)search_back_dlg, 0, 0 }, { TEXT(T_FIND_NEXT), "n", TEXT(T_HK_FIND_NEXT), MENU_FUNC menu_for_frame, (void *)find_next, 0, 0 }, { TEXT(T_FIND_PREVIOUS), "N", TEXT(T_HK_FIND_PREVIOUS), MENU_FUNC menu_for_frame, (void *)find_next_back, 0, 0 }, { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_TOGGLE_HTML_PLAIN), "\\", TEXT(T_HK_TOGGLE_HTML_PLAIN), MENU_FUNC menu_toggle, NULL, 0, 0 }, { TEXT(T_DOCUMENT_INFO), "=", TEXT(T_HK_DOCUMENT_INFO), MENU_FUNC menu_doc_info, NULL, 0, 0 }, { TEXT(T_HEADER_INFO), "|", TEXT(T_HK_HEADER_INFO), MENU_FUNC menu_head_info, NULL, 0, 0 }, { TEXT(T_FRAME_AT_FULL_SCREEN), "f", TEXT(T_HK_FRAME_AT_FULL_SCREEN), MENU_FUNC menu_for_frame, (void *)set_frame, 0, 0 }, { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_HTML_OPTIONS), "", TEXT(T_HK_HTML_OPTIONS), MENU_FUNC menu_html_options, (void *)0, 0, 0 }, { TEXT(T_SAVE_HTML_OPTIONS), "", TEXT(T_HK_SAVE_HTML_OPTIONS), MENU_FUNC menu_save_html_options, (void *)0, 0, 0 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};struct menu_item view_menu_anon[] = { { TEXT(T_SEARCH), "/", TEXT(T_HK_SEARCH), MENU_FUNC menu_for_frame, (void *)search_dlg, 0, 0 }, { TEXT(T_SEARCH_BACK), "?", TEXT(T_HK_SEARCH_BACK), MENU_FUNC menu_for_frame, (void *)search_back_dlg, 0, 0 }, { TEXT(T_FIND_NEXT), "n", TEXT(T_HK_FIND_NEXT), MENU_FUNC menu_for_frame, (void *)find_next, 0, 0 }, { TEXT(T_FIND_PREVIOUS), "N", TEXT(T_HK_FIND_PREVIOUS), MENU_FUNC menu_for_frame, (void *)find_next_back, 0, 0 }, { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_TOGGLE_HTML_PLAIN), "\\", TEXT(T_HK_TOGGLE_HTML_PLAIN), MENU_FUNC menu_toggle, NULL, 0, 0 }, { TEXT(T_DOCUMENT_INFO), "=", TEXT(T_HK_DOCUMENT_INFO), MENU_FUNC menu_doc_info, NULL, 0, 0 }, { TEXT(T_FRAME_AT_FULL_SCREEN), "f", TEXT(T_HK_FRAME_AT_FULL_SCREEN), MENU_FUNC menu_for_frame, (void *)set_frame, 0, 0 }, { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_HTML_OPTIONS), "", TEXT(T_HK_HTML_OPTIONS), MENU_FUNC menu_html_options, (void *)0, 0, 0 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};struct menu_item help_menu[] = { { TEXT(T_ABOUT), "", TEXT(T_HK_ABOUT), MENU_FUNC menu_about, (void *)0, 0, 0 }, { TEXT(T_KEYS), "", TEXT(T_HK_KEYS), MENU_FUNC menu_keys, (void *)0, 0, 0 }, { TEXT(T_MANUAL), "", TEXT(T_HK_MANUAL), MENU_FUNC menu_manual, (void *)0, 0, 0 }, { TEXT(T_COPYING), "", TEXT(T_HK_COPYING), MENU_FUNC menu_copying, (void *)0, 0, 0 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};struct menu_item assoc_menu[] = { { TEXT(T_ADD), "", TEXT(T_HK_ADD), MENU_FUNC menu_add_ct, NULL, 0, 0 }, { TEXT(T_MODIFY), ">", TEXT(T_HK_MODIFY), MENU_FUNC menu_list_assoc, menu_add_ct, 1, 0 }, { TEXT(T_DELETE), ">", TEXT(T_HK_DELETE), MENU_FUNC menu_list_assoc, menu_del_ct, 1, 0 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};struct menu_item ext_menu[] = { { TEXT(T_ADD), "", TEXT(T_HK_ADD), MENU_FUNC menu_add_ext, NULL, 0, 0 }, { TEXT(T_MODIFY), ">", TEXT(T_HK_MODIFY), MENU_FUNC menu_list_ext, menu_add_ext, 1, 0 }, { TEXT(T_DELETE), ">", TEXT(T_HK_DELETE), MENU_FUNC menu_list_ext, menu_del_ext, 1, 0 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};struct menu_item setup_menu[] = { { TEXT(T_LANGUAGE), ">", TEXT(T_HK_LANGUAGE), MENU_FUNC menu_language_list, NULL, 1, 0 }, { TEXT(T_CHARACTER_SET), ">", TEXT(T_HK_CHARACTER_SET), MENU_FUNC charset_list, (void *)1, 1, 0 }, { TEXT(T_TERMINAL_OPTIONS), "", TEXT(T_HK_TERMINAL_OPTIONS), MENU_FUNC terminal_options, NULL, 0, 0 }, { TEXT(T_NETWORK_OPTIONS), "", TEXT(T_HK_NETWORK_OPTIONS), MENU_FUNC net_options, NULL, 0, 0 }, { TEXT(T_CACHE), "", TEXT(T_HK_CACHE), MENU_FUNC cache_opt, NULL, 0, 0 }, { TEXT(T_MAIL_AND_TELNEL), "", TEXT(T_HK_MAIL_AND_TELNEL), MENU_FUNC net_programs, NULL, 0, 0 }, { TEXT(T_ASSOCIATIONS), ">", TEXT(T_HK_ASSOCIATIONS), MENU_FUNC do_menu, assoc_menu, 1, 0 }, { TEXT(T_FILE_EXTENSIONS), ">", TEXT(T_HK_FILE_EXTENSIONS), MENU_FUNC do_menu, ext_menu, 1, 0 }, { "", "", M_BAR, NULL, NULL, 0, 0 }, { TEXT(T_SAVE_OPTIONS), "", TEXT(T_HK_SAVE_OPTIONS), MENU_FUNC write_config, NULL, 0, 0 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};struct menu_item setup_menu_anon[] = { { TEXT(T_LANGUAGE), ">", TEXT(T_HK_LANGUAGE), MENU_FUNC menu_language_list, NULL, 1, 0 }, { TEXT(T_CHARACTER_SET), ">", TEXT(T_HK_CHARACTER_SET), MENU_FUNC charset_list, (void *)1, 1, 0 }, { TEXT(T_TERMINAL_OPTIONS), "", TEXT(T_HK_TERMINAL_OPTIONS), MENU_FUNC terminal_options, NULL, 0, 0 }, /*{ TEXT(T_NETWORK_OPTIONS), "", TEXT(T_HK_NETWORK_OPTIONS), MENU_FUNC net_options, NULL, 0, 0,}*/ { NULL, NULL, 0, NULL, NULL, 0, 0 },};void do_view_menu(struct terminal *term, void *xxx, struct session *ses){ if (!anonymous) do_menu(term, view_menu, ses); else do_menu(term, view_menu_anon, ses);}void do_setup_menu(struct terminal *term, void *xxx, struct session *ses){ if (!anonymous) do_menu(term, setup_menu, ses); else do_menu(term, setup_menu_anon, ses);}struct menu_item main_menu[] = { { TEXT(T_FILE), "", TEXT(T_HK_FILE), MENU_FUNC do_file_menu, NULL, 1, 1 }, { TEXT(T_VIEW), "", TEXT(T_HK_VIEW), MENU_FUNC do_view_menu, NULL, 1, 1 }, { TEXT(T_LINK), "", TEXT(T_HK_LINK), MENU_FUNC link_menu, NULL, 1, 1 }, { TEXT(T_DOWNLOADS), "", TEXT(T_HK_DOWNLOADS), MENU_FUNC downloads_menu, NULL, 1, 1 }, { TEXT(T_SETUP), "", TEXT(T_HK_SETUP), MENU_FUNC do_setup_menu, NULL, 1, 1 }, { TEXT(T_HELP), "", TEXT(T_HK_HELP), MENU_FUNC do_menu, help_menu, 1, 1 }, { NULL, NULL, 0, NULL, NULL, 0, 0 },};void activate_bfu_technology(struct session *ses, int item){ struct terminal *term = ses->term; do_mainmenu(term, main_menu, ses, item);}struct history goto_url_history = { 0, { &goto_url_history.items, &goto_url_history.items } };void dialog_goto_url(struct session *ses, char *url){ input_field(ses->term, NULL, TEXT(T_GOTO_URL), TEXT(T_ENTER_URL), TEXT(T_OK), TEXT(T_CANCEL), ses, &goto_url_history, MAX_INPUT_URL_LEN, url, 0, 0, NULL, (void (*)(void *, unsigned char *)) goto_url, NULL);}void dialog_save_url(struct session *ses){ input_field(ses->term, NULL, TEXT(T_SAVE_URL), TEXT(T_ENTER_URL), TEXT(T_OK), TEXT(T_CANCEL), ses, &goto_url_history, MAX_INPUT_URL_LEN, "", 0, 0, NULL, (void (*)(void *, unsigned char *)) save_url, NULL);}struct history file_history = { 0, { &file_history.items, &file_history.items } };void query_file(struct session *ses, unsigned char *url, void (*std)(struct session *, unsigned char *), void (*cancel)(struct session *)){ unsigned char *file, *def; int dfl = 0; int l; get_filename_from_url(url, &file, &l); def = init_str(); add_to_str(&def, &dfl, download_dir); if (*def && !dir_sep(def[strlen(def) - 1])) add_chr_to_str(&def, &dfl, '/'); add_bytes_to_str(&def, &dfl, file, l); input_field(ses->term, NULL, TEXT(T_DOWNLOAD), TEXT(T_SAVE_TO_FILE), TEXT(T_OK), TEXT(T_CANCEL), ses, &file_history, MAX_INPUT_URL_LEN, def, 0, 0, NULL, (void (*)(void *, unsigned char *))std, (void (*)(void *))cancel); mem_free(def);}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){ input_field(ses->term, NULL, TEXT(T_SEARCH_BACK), TEXT(T_SEARCH_FOR_TEXT), TEXT(T_OK), TEXT(T_CANCEL), ses, &search_history, MAX_INPUT_URL_LEN, "", 0, 0, NULL, (void (*)(void *, unsigned char *)) search_for_back, NULL);}void search_dlg(struct session *ses, struct f_data_c *f, int a){ input_field(ses->term, NULL, TEXT(T_SEARCH), TEXT(T_SEARCH_FOR_TEXT), TEXT(T_OK), TEXT(T_CANCEL), ses, &search_history, MAX_INPUT_URL_LEN, "", 0, 0, NULL, (void (*)(void *, unsigned char *)) search_for, NULL);}void free_history_lists(){ free_list(goto_url_history.items); free_list(file_history.items); free_list(search_history.items);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -