📄 view_gr.c
字号:
unset_link(fd); if (!fd->vs->view_pos) { fd->vs->orig_view_pos = fd->vs->view_pos; return 0; } fd->vs->view_pos -= fd->f_data->opt.yw - fd->f_data->hsb * G_SCROLL_BAR_WIDTH; fd->vs->orig_view_pos = fd->vs->view_pos; return 3; } if (0) { down: if (fd->vs->view_pos == fd->f_data->y - fd->yw + fd->f_data->hsb * G_SCROLL_BAR_WIDTH) { fd->vs->orig_view_pos = fd->vs->view_pos; return 0; } fd->vs->view_pos += 64; fd->vs->orig_view_pos = fd->vs->view_pos; return 3; } if (0) { up: if (!fd->vs->view_pos) { fd->vs->orig_view_pos = fd->vs->view_pos; return 0; } fd->vs->view_pos -= 64; fd->vs->orig_view_pos = fd->vs->view_pos; return 3; } if (ev->x == KBD_DEL || (upcase(ev->x) == 'N' && ev->y & KBD_CTRL)) { if (fd->vs->view_pos == fd->f_data->y - fd->yw + fd->f_data->hsb * G_SCROLL_BAR_WIDTH) { fd->vs->orig_view_pos = fd->vs->view_pos; return 0; } fd->vs->view_pos += 32; fd->vs->orig_view_pos = fd->vs->view_pos; return 3; } if (ev->x == KBD_INS || (upcase(ev->x) == 'P' && ev->y & KBD_CTRL)) { if (!fd->vs->view_pos) { fd->vs->orig_view_pos = fd->vs->view_pos; return 0; } fd->vs->view_pos -= 32; fd->vs->orig_view_pos = fd->vs->view_pos; return 3; } if (/*ev->x == KBD_DOWN*/ 0) { down1: if (fd->vs->view_pos == fd->f_data->y - fd->yw + fd->f_data->hsb * G_SCROLL_BAR_WIDTH) { fd->vs->orig_view_pos = fd->vs->view_pos; return 0; } fd->vs->view_pos += 16; fd->vs->orig_view_pos = fd->vs->view_pos; return 3; } if (/*ev->x == KBD_UP*/ 0) { up1: if (!fd->vs->view_pos) { fd->vs->orig_view_pos = fd->vs->view_pos; return 0; } fd->vs->view_pos -= 16; fd->vs->orig_view_pos = fd->vs->view_pos; return 3; } if (ev->x == KBD_DOWN) { return g_next_link(fd, 1); } if (ev->x == KBD_UP) { return g_next_link(fd, -1); } if (ev->x == '[') { left: if (!fd->vs->view_posx) { fd->vs->orig_view_posx = fd->vs->view_posx; return 0; } fd->vs->view_posx -= 64; fd->vs->orig_view_posx = fd->vs->view_posx; return 3; } if (ev->x == ']') { right: if (fd->vs->view_posx == fd->f_data->x - fd->xw + fd->f_data->vsb * G_SCROLL_BAR_WIDTH) { fd->vs->orig_view_posx = fd->vs->view_posx; return 0; } fd->vs->view_posx += 64; fd->vs->orig_view_posx = fd->vs->view_posx; return 3; } if (/*ev->x == KBD_LEFT*/ 0) { left1: if (!fd->vs->view_posx) { fd->vs->orig_view_posx = fd->vs->view_posx; return 0; } fd->vs->view_posx -= 16; fd->vs->orig_view_posx = fd->vs->view_posx; return 3; } if (/*ev->x == KBD_RIGHT*/ 0) { right1: if (fd->vs->view_posx == fd->f_data->x - fd->xw + fd->f_data->vsb * G_SCROLL_BAR_WIDTH) { fd->vs->orig_view_posx = fd->vs->view_posx; return 0; } fd->vs->view_posx += 16; fd->vs->orig_view_posx = fd->vs->view_posx; return 3; } if (ev->x == KBD_HOME || (upcase(ev->x) == 'A' && ev->y & KBD_CTRL)) { fd->vs->view_pos = 0; fd->vs->orig_view_pos = fd->vs->view_pos; unset_link(fd); return 3; } if (ev->x == KBD_END || (upcase(ev->x) == 'E' && ev->y & KBD_CTRL)) { fd->vs->view_pos = fd->f_data->y; fd->vs->orig_view_pos = fd->vs->view_pos; unset_link(fd); return 3; } if (upcase(ev->x) == 'F' && !(ev->y & (KBD_ALT | KBD_CTRL))) { set_frame(ses, fd, 0); return 2; } if (ev->x == '#') { ses->ds.images ^= 1; html_interpret_recursive(fd); ses->ds.images ^= 1; return 1; } if (ev->x == 'i' && !(ev->y & KBD_ALT)) { if (!F || fd->f_data->opt.plain != 2) frm_view_image(ses, fd); return 2; } if (ev->x == 'I' && !(ev->y & KBD_ALT)) { if (!anonymous) frm_download_image(ses, fd); return 2; } if (upcase(ev->x) == 'D' && !(ev->y & KBD_ALT)) { if (!anonymous) frm_download(ses, fd); return 2; } if (ev->x == '/') { search_dlg(ses, fd, 0); return 2; } if (ev->x == '?') { search_back_dlg(ses, fd, 0); return 2; } if (ev->x == 'n' && !(ev->y & KBD_ALT)) { find_next(ses, fd, 0); return 2; } if (ev->x == 'N' && !(ev->y & KBD_ALT)) { find_next_back(ses, fd, 0); return 2; } break; } return 0;}void draw_title(struct f_data_c *f){ unsigned char *title = stracpy(!drv->set_title ? f->f_data && f->f_data->title ? f->f_data->title : (unsigned char *)"" : f->rq && f->rq->url ? f->rq->url : (unsigned char *)""); int b, z, w; struct graphics_device *dev = f->ses->term->dev; if (drv->set_title && strchr(title, POST_CHAR)) *strchr(title, POST_CHAR) = 0; w = g_text_width(bfu_style_bw, title); z = 0; g_print_text(drv, dev, 0, 0, bfu_style_bw, " <- ", &z); f->ses->back_size = z; b = (dev->size.x2 - w) - 16; if (b < z) b = z; drv->fill_area(dev, z, 0, b, G_BFU_FONT_SIZE, bfu_bg_color); g_print_text(drv, dev, b, 0, bfu_style_bw, title, &b); drv->fill_area(dev, b, 0, dev->size.x2, G_BFU_FONT_SIZE, bfu_bg_color); mem_free(title);}struct f_data *srch_f_data;void get_searched_sub(struct g_object *p, struct g_object *c){ if (c->draw == (void (*)(struct f_data_c *, struct g_object *, int, int))g_text_draw) { struct g_object_text *t = (struct g_object_text *)c; int pos = srch_f_data->srch_string_size; t->srch_pos = pos; add_to_str(&srch_f_data->srch_string, &srch_f_data->srch_string_size, t->text); } if (c->get_list) c->get_list(c, get_searched_sub); if (c->draw == (void (*)(struct f_data_c *, struct g_object *, int, int))g_line_draw) { if (srch_f_data->srch_string_size && srch_f_data->srch_string[srch_f_data->srch_string_size - 1] != ' ') add_to_str(&srch_f_data->srch_string, &srch_f_data->srch_string_size, " "); }}void g_get_search_data(struct f_data *f){ int i; srch_f_data = f; if (f->srch_string) return; f->srch_string = init_str(); f->srch_string_size = 0; if (f->root && f->root->get_list) f->root->get_list(f->root, get_searched_sub); while (f->srch_string_size && f->srch_string[f->srch_string_size - 1] == ' ') { f->srch_string[--f->srch_string_size] = 0; } for (i = 0; i < f->srch_string_size; i++) if (f->srch_string[i] == 1) f->srch_string[i] = ' ';}static struct g_object_text *fnd_obj;static int fnd_x, fnd_y, fnd_found;static int fnd_obj_dist;/*#define dist(a,b) (a<b?b-a:a-b)*/static inline int dist_to_rect(int x, int y, int x1, int y1, int x2, int y2){ int w; if (x < x1) w = x1 - x; else if (x > x2) w = x - x2; else w = 0; if (y < y1) w += y1 - y; else if (y > y2) w += y - y2; return w;}void find_nearest_sub(struct g_object *p, struct g_object *c){ if (fnd_found) return; /*printf("object: x=%d, y=%d\n", c->x, c->y);*/ if (c->draw == (void (*)(struct f_data_c *, struct g_object *, int, int))g_text_draw) { struct g_object_text *t = (struct g_object_text *)c; int x=fnd_x, y=fnd_y; int tx=t->x, ty=t->y; int a; /*c->parent=p;*/ get_object_pos(c, &tx, &ty); /*for (o = c; o; o = o->parent) ty += o->y;*/ /* nevim proc s tx+=o->x to je blbe, ale takhle to chodi OK -- BRain */ /*for (o = (struct g_object*)fnd_obj; o; o = o->parent) fy += o->y, fx+=o->x;*/ /*printf("fnd: myx=%d, myy=%d, obj: x=%d, y=%d, w=%d, h=%d, text=>%s<\n", x, y, tx, ty, t->xw, t->yw, t->text);*/ if (!fnd_obj) { fnd_obj=t; fnd_obj_dist = dist_to_rect(x, y, tx, ty, tx+t->xw, ty+t->yw); if (x>=tx&&x<tx+t->xw&&y>=ty&&y<ty+t->yw) { fnd_found=1; return;} } else { if (x>=tx&&x<tx+t->xw&&y>=ty&&y<ty+t->yw) {fnd_obj=t; fnd_found=1; return;} /*if ( (dist(ty, y)<dist(fy,y) || dist(ty+t->yw,y)<dist(fy+fnd_obj->yw,y)) && (dist(tx, x)<dist(fx,x) || dist(tx+t->xw,x)<dist(fx+fnd_obj->xw,x)) ) fnd_obj=t;*/ if ((a = dist_to_rect(x, y, tx, ty, tx+t->xw, ty+t->yw)) < fnd_obj_dist) { fnd_obj_dist = a; fnd_obj = t; } } } if (c->get_list) c->get_list(c, find_nearest_sub); }struct g_object_text * g_find_nearest_object(struct f_data *f, int x, int y){ fnd_obj=NULL; fnd_x=x; fnd_y=y; fnd_found=0; if (f->root && f->root->get_list) f->root->get_list(f->root, find_nearest_sub); return fnd_obj;}unsigned char *search_word;int find_refline;int find_direction;int find_opt_yy;int find_opt_y;int find_opt_yw;int find_opt_x;int find_opt_xw;void find_next_sub(struct g_object *p, struct g_object *c){ if (c->draw == (void (*)(struct f_data_c *, struct g_object *, int, int))g_text_draw) { struct g_object_text *t = (struct g_object_text *)c; int start = t->srch_pos; int end = t->srch_pos + strlen(t->text); int found; BIN_SEARCH(n_highlight_positions, B_EQUAL, B_ABOVE, *, found); if (found != -1) { int x, y, yy; get_object_pos(c, &x, &y); y += t->yw / 2; yy = y; if (yy < find_refline) yy += MAXINT / 2; if (find_direction < 0) yy = MAXINT - yy; if (find_opt_yy == -1 || yy > find_opt_yy) { int i, l, ll; find_opt_yy = yy; find_opt_y = y; find_opt_yw = t->style->height; find_opt_x = x; find_opt_xw = t->xw; l = strlen(t->text); ll = strlen(search_word); for (i = 0; i < l; i++) { unsigned char *tt; if (!(compare_case_utf8(t->text + i, search_word))) goto no_ch; tt = memacpy(t->text, i); find_opt_x += g_text_width(t->style, tt); find_opt_xw = g_text_width(t->style, search_word); mem_free(tt); goto fnd; no_ch:; } fnd:; /*debug("-%s-%s-: %d %d", t->text, search_word, find_opt_x, find_opt_xw);*/ } } } if (c->get_list) c->get_list(c, find_next_sub);}void g_find_next_str(struct f_data *f){ find_opt_yy = -1; if (f->root && f->root->get_list) f->root->get_list(f->root, find_next_sub);}void g_find_next(struct f_data_c *f, int a){ g_get_search_data(f->f_data); g_get_search(f->f_data, f->ses->search_word); search_word = f->ses->search_word; if (!f->f_data->n_search_positions) msg_box(f->ses->term, NULL, TEXT(T_SEARCH), AL_CENTER, TEXT(T_SEARCH_STRING_NOT_FOUND), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC); highlight_positions = f->f_data->search_positions; highlight_lengths = f->f_data->search_lengths; n_highlight_positions = f->f_data->n_search_positions; if ((!a && f->ses->search_direction == -1) || (a && f->ses->search_direction == 1)) find_refline = f->vs->view_pos; else find_refline = f->vs->view_pos + f->yw - f->f_data->hsb * G_SCROLL_BAR_WIDTH; find_direction = -f->ses->search_direction; g_find_next_str(f->f_data); highlight_positions = NULL; highlight_lengths = NULL; n_highlight_positions = 0; if (find_opt_yy == -1) goto d; if (!a || find_opt_y < f->vs->view_pos || find_opt_y + find_opt_yw >= f->vs->view_pos + f->yw - f->f_data->hsb * G_SCROLL_BAR_WIDTH) { f->vs->view_pos = find_opt_y - (f->yw - f->f_data->hsb * G_SCROLL_BAR_WIDTH) / 2; f->vs->orig_view_pos = f->vs->view_pos; } if (find_opt_x < f->vs->view_posx || find_opt_x + find_opt_xw >= f->vs->view_posx + f->xw - f->f_data->vsb * G_SCROLL_BAR_WIDTH) { f->vs->view_posx = find_opt_x + find_opt_xw / 2 - (f->xw - f->f_data->vsb * G_SCROLL_BAR_WIDTH) / 2; f->vs->orig_view_posx = f->vs->view_posx; } d:draw_fd(f);}void init_grview(void){ int i, w = g_text_width(bfu_style_wb_mono, " "); for (i = 32; i < 128; i++) { unsigned char a[2]; a[0] = i, a[1] = 0; if (g_text_width(bfu_style_wb_mono, a) != w) internal("Monospaced font is not monospaced (error at char %d, width %d, wanted width %d)", i, (int)g_text_width(bfu_style_wb_mono, a), w); } scroll_bar_frame_color = dip_get_color_sRGB(G_SCROLL_BAR_FRAME_COLOR); scroll_bar_area_color = dip_get_color_sRGB(G_SCROLL_BAR_AREA_COLOR); scroll_bar_bar_color = dip_get_color_sRGB(G_SCROLL_BAR_BAR_COLOR);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -