📄 view.c
字号:
} if (x < scrollmargin * 2) { return scroll_mouse_left(ses, doc_view); } if (x >= doc_view->box.width - scrollmargin * 2) { return scroll_mouse_right(ses, doc_view); } return FRAME_EVENT_OK; } return FRAME_EVENT_IGNORED;}#endif /* CONFIG_MOUSE */static enum frame_event_statusframe_ev(struct session *ses, struct document_view *doc_view, struct term_event *ev){ assertm(doc_view && doc_view->document, "document not formatted"); if_assert_failed return FRAME_EVENT_IGNORED; assert(ses && ev); if_assert_failed return FRAME_EVENT_IGNORED; /* When changing frame, vs may be NULL. See bug 525. */ if (!doc_view->vs) return FRAME_EVENT_IGNORED; switch (ev->ev) { case EVENT_KBD: return frame_ev_kbd(ses, doc_view, ev);#ifdef CONFIG_MOUSE case EVENT_MOUSE: return frame_ev_mouse(ses, doc_view, ev);#endif /* CONFIG_MOUSE */ default: return FRAME_EVENT_IGNORED; }}struct document_view *current_frame(struct session *ses){ struct document_view *doc_view = NULL; int current_frame_number; assert(ses); if_assert_failed return NULL; if (!have_location(ses)) return NULL; current_frame_number = cur_loc(ses)->vs.current_link; if (current_frame_number == -1) current_frame_number = 0; foreach (doc_view, ses->scrn_frames) { if (document_has_frames(doc_view->document)) continue; if (!current_frame_number--) return doc_view; } doc_view = ses->doc_view; assert(doc_view && doc_view->document); if_assert_failed return NULL; if (document_has_frames(doc_view->document)) return NULL; return doc_view;}static enum frame_event_statussend_to_frame(struct session *ses, struct document_view *doc_view, struct term_event *ev){ enum frame_event_status status; assert(ses && ses->tab && ses->tab->term && ev); if_assert_failed return FRAME_EVENT_IGNORED; status = frame_ev(ses, doc_view, ev); if (status == FRAME_EVENT_REFRESH) refresh_view(ses, doc_view, 0); else print_screen_status(ses); return status;}#ifdef CONFIG_MOUSEstatic intdo_mouse_event(struct session *ses, struct term_event *ev, struct document_view *doc_view){ struct term_event evv; struct document_view *matched = NULL, *first = doc_view; assert(ses && ev); if_assert_failed return 0; if (!doc_view) return 0; do { assert(doc_view && doc_view->document); if_assert_failed return 0; assertm(doc_view->document->options.box.x == doc_view->box.x && doc_view->document->options.box.y == doc_view->box.y, "Jonas' 1.565 -> 1.566 patch sucks"); if_assert_failed return 0; if (check_mouse_position(ev, &doc_view->box)) { matched = doc_view; break; } next_frame(ses, 1); doc_view = current_frame(ses); } while (doc_view != first); if (!matched) return 0; if (doc_view != first) draw_formatted(ses, 0); set_mouse_term_event(&evv, ev->info.mouse.x - doc_view->box.x, ev->info.mouse.y - doc_view->box.y, ev->info.mouse.button); return send_to_frame(ses, doc_view, &evv);}/* Returns the session if event cleanup should be done or NULL if no cleanup is * needed. */static struct session *send_mouse_event(struct session *ses, struct document_view *doc_view, struct term_event *ev){ struct terminal *term = ses->tab->term; struct term_event_mouse *mouse = &ev->info.mouse; if (mouse->y == 0 && check_mouse_action(ev, B_DOWN) && !check_mouse_wheel(ev)) { struct window *m; activate_bfu_technology(ses, -1); m = term->windows.next; m->handler(m, ev); return ses; } /* Handle tabs navigation if tabs bar is displayed. */ if (ses->status.show_tabs_bar && mouse->y == term->height - 1 - !!ses->status.show_status_bar) { int tab_num = get_tab_number_by_xpos(term, mouse->x); struct window *tab = get_current_tab(term); if (check_mouse_action(ev, B_UP)) { if (check_mouse_button(ev, B_MIDDLE) && term->current_tab == tab_num && mouse->y == term->prev_mouse_event.y) { if (tab->data == ses) ses = NULL; close_tab(term, tab->data); } return ses; } if (check_mouse_button(ev, B_WHEEL_UP)) { switch_current_tab(ses, -1); } else if (check_mouse_button(ev, B_WHEEL_DOWN)) { switch_current_tab(ses, 1); } else if (tab_num != -1) { switch_to_tab(term, tab_num, -1); if (check_mouse_button(ev, B_MIDDLE)) { do_not_ignore_next_mouse_event(term); } else if (check_mouse_button(ev, B_RIGHT)) { tab_menu(tab->data, mouse->x, mouse->y, 1); } } return ses; } if (!do_mouse_event(ses, ev, doc_view) && check_mouse_button(ev, B_RIGHT)) { tab_menu(ses, mouse->x, mouse->y, 0); return NULL; }#ifdef CONFIG_LEDS if (ses->status.show_leds && mouse->y == term->height - 1 && mouse->x >= term->width - LEDS_COUNT - 3) { menu_leds_info(term, NULL, NULL); return NULL; }#endif return NULL;}#endif /* CONFIG_MOUSE */static voidtry_typeahead(struct session *ses, struct document_view *doc_view, struct term_event *ev, enum main_action action_id){ switch (get_opt_int("document.browse.search.typeahead")) { case 0: return; case 1: action_id = ACT_MAIN_SEARCH_TYPEAHEAD_LINK; break; case 2: action_id = ACT_MAIN_SEARCH_TYPEAHEAD_TEXT; break; default: INTERNAL("invalid value for document.browse.search.typeahead"); } search_typeahead(ses, doc_view, action_id); /* Cross your fingers -- I'm just asking * for an infinite loop! -- Miciah */ term_send_event(ses->tab->term, ev);}/* Returns the session if event cleanup should be done or NULL if no cleanup is * needed. */static struct session *send_kbd_event(struct session *ses, struct document_view *doc_view, struct term_event *ev){ int event; enum main_action action_id; if (doc_view && send_to_frame(ses, doc_view, ev) != FRAME_EVENT_IGNORED) return NULL; action_id = kbd_action(KEYMAP_MAIN, ev, &event); if (action_id == ACT_MAIN_QUIT) { if (check_kbd_key(ev, KBD_CTRL_C))quit: action_id = ACT_MAIN_REALLY_QUIT; } switch (do_action(ses, action_id, 0)) { case FRAME_EVENT_SESSION_DESTROYED: return NULL; case FRAME_EVENT_IGNORED: break; case FRAME_EVENT_OK: case FRAME_EVENT_REFRESH: return ses; } if (action_id == ACT_MAIN_SCRIPTING_FUNCTION) {#ifdef CONFIG_SCRIPTING trigger_event(event, ses);#endif return NULL; } if (check_kbd_key(ev, KBD_CTRL_C)) goto quit; if (get_kbd_modifier(ev) & KBD_MOD_ALT) { struct window *win; get_kbd_modifier(ev) &= ~KBD_MOD_ALT; activate_bfu_technology(ses, -1); win = ses->tab->term->windows.next; win->handler(win, ev); if (ses->tab->term->windows.next == win) { delete_window(win); get_kbd_modifier(ev) |= KBD_MOD_ALT; return NULL; } if (doc_view && get_opt_int("document.browse.accesskey" ".priority") <= 0 && try_document_key(ses, doc_view, ev) == FRAME_EVENT_REFRESH) { /* The document ate the key! */ refresh_view(ses, doc_view, 0); return NULL; } return ses; } if (!(get_kbd_modifier(ev) & KBD_MOD_CTRL)) { if (doc_view) try_typeahead(ses, doc_view, ev, action_id); } return NULL;}voidsend_event(struct session *ses, struct term_event *ev){ assert(ses && ev); if_assert_failed return; if (ev->ev == EVENT_KBD) { struct document_view *doc_view = current_frame(ses); ses = send_kbd_event(ses, doc_view, ev); }#ifdef CONFIG_MOUSE else if (ev->ev == EVENT_MOUSE) { struct document_view *doc_view = current_frame(ses); ses = send_mouse_event(ses, doc_view, ev); }#endif /* CONFIG_MOUSE */ /* @ses may disappear ie. in close_tab() */ if (ses) ses->kbdprefix.repeat_count = 0;}enum frame_event_statusdownload_link(struct session *ses, struct document_view *doc_view, action_id_T action_id){ struct link *link = get_current_link(doc_view); void (*download)(void *ses, unsigned char *file) = start_download; if (!link) return FRAME_EVENT_OK; if (ses->download_uri) { done_uri(ses->download_uri); ses->download_uri = NULL; } switch (action_id) { case ACT_MAIN_LINK_DOWNLOAD_RESUME: download = resume_download; case ACT_MAIN_LINK_DOWNLOAD: ses->download_uri = get_link_uri(ses, doc_view, link); break; case ACT_MAIN_LINK_DOWNLOAD_IMAGE: if (!link->where_img) break; ses->download_uri = get_uri(link->where_img, 0); break; default: INTERNAL("I think you forgot to take your medication, mental boy!"); return FRAME_EVENT_OK; } if (!ses->download_uri) return FRAME_EVENT_OK; set_session_referrer(ses, doc_view->document->uri); query_file(ses, ses->download_uri, ses, download, NULL, 1); return FRAME_EVENT_OK;}enum frame_event_statusview_image(struct session *ses, struct document_view *doc_view, int xxxx){ struct link *link = get_current_link(doc_view); if (link && link->where_img) goto_url(ses, link->where_img); return FRAME_EVENT_OK;}enum frame_event_statussave_as(struct session *ses, struct document_view *doc_view, int magic){ assert(ses); if_assert_failed return FRAME_EVENT_OK; if (!have_location(ses)) return FRAME_EVENT_OK; if (ses->download_uri) done_uri(ses->download_uri); ses->download_uri = get_uri_reference(cur_loc(ses)->vs.uri); assert(doc_view && doc_view->document && doc_view->document->uri); if_assert_failed return FRAME_EVENT_OK; set_session_referrer(ses, doc_view->document->uri); query_file(ses, ses->download_uri, ses, start_download, NULL, 1); return FRAME_EVENT_OK;}static voidsave_formatted_finish(struct terminal *term, int h, void *data, int resume){ struct document *document = data; assert(term && document); if_assert_failed return; if (h == -1) return; if (dump_to_file(document, h)) { info_box(term, 0, N_("Save error"), ALIGN_CENTER, N_("Error writing to file")); } close(h);}static voidsave_formatted(void *data, unsigned char *file){ struct session *ses = data; struct document_view *doc_view; assert(ses && ses->tab && ses->tab->term && file); if_assert_failed return; doc_view = current_frame(ses); assert(doc_view && doc_view->document); if_assert_failed return; create_download_file(ses->tab->term, file, NULL, 0, 0, save_formatted_finish, doc_view->document);}enum frame_event_statussave_formatted_dlg(struct session *ses, struct document_view *doc_view, int xxxx){ query_file(ses, doc_view->vs->uri, ses, save_formatted, NULL, 1); return FRAME_EVENT_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -