📄 view_gr.c
字号:
} else xx=x; xx+=fs->vpos; xx=xx<0?0:xx; yy=a->link_order; yy+=fs->vypos; if ((ln = format_text(fs->value, l->form->cols, l->form->wrap))) { int a; for (a = 0; ln[a].st; a++) if (a==yy){ int bla=utf8_diff(ln[a].en,ln[a].st); fs->state=ln[a].st-fs->value; fs->state = utf8_add(fs->value + fs->state, xx<bla?xx:bla) - fs->value; break; } mem_free(ln); } return; } if (l->type!=L_FIELD||!(fs=find_form_state(fd,l->form)))return; if (g_char_width(a->style,' ')) { xx=x/g_char_width(a->style,' '); } else xx=x; fs->state=utf8_add(fs->value + ((size_t)fs->vpos > strlen(fs->value) ? strlen(fs->value) : (size_t)fs->vpos), (xx<0?0:xx)) - fs->value; } }}void g_text_mouse(struct f_data_c *fd, struct g_object_text *a, int x, int y, int b){ int e; g_set_current_link(fd, a, x, y, (b == (B_UP | B_LEFT)));#ifdef JS if (fd->vs&&fd->f_data&&fd->vs->current_link>=0&&fd->vs->current_link<fd->f_data->nlinks) { /* fd->vs->current links is a valid link */ struct link *l=&(fd->f_data->links[fd->vs->current_link]); if (l->js_event&&l->js_event->up_code&&(b&BM_ACT)==B_UP) jsint_execute_code(fd,l->js_event->up_code,strlen(l->js_event->up_code),-1,-1,-1, NULL); if (l->js_event&&l->js_event->down_code&&(b&BM_ACT)==B_DOWN) jsint_execute_code(fd,l->js_event->down_code,strlen(l->js_event->down_code),-1,-1,-1, NULL); }#endif if (b == (B_UP | B_LEFT)) { int ix = ismap_x, iy = ismap_y, il = ismap_link; ismap_x = x; ismap_y = y; ismap_link = a->ismap; e = enter(fd->ses, fd, 1); ismap_x = ix; ismap_y = iy; ismap_link = il; if (e) { print_all_textarea = 1; draw_one_object(fd, (struct g_object *)a); print_all_textarea = 0; } if (e == 2) fd->f_data->locked_on = (struct g_object *)a; return; } if (b == (B_UP | B_RIGHT)) { if (fd->vs->current_link != -1) link_menu(fd->ses->term, NULL, fd->ses); }}void process_sb_event(struct f_data_c *fd, int off, int h){ int spos, epos; int w = h ? fd->f_data->hsbsize : fd->f_data->vsbsize; get_scrollbar_pos(w - 4, h ? fd->f_data->x : fd->f_data->y, w, h ? fd->vs->view_posx : fd->vs->view_pos, &spos, &epos); spos += 2; epos += 2; /*debug("%d %d %d", spos, epos, off);*/ if (off >= spos && off < epos) { fd->ses->scrolling = 1; fd->ses->scrolltype = h; fd->ses->scrolloff = off - spos - 1; return; } if (off < spos) if (h) fd->vs->view_posx -= fd->xw - fd->f_data->vsb * G_SCROLL_BAR_WIDTH; else fd->vs->view_pos -= fd->yw - fd->f_data->hsb * G_SCROLL_BAR_WIDTH; else if (h) fd->vs->view_posx += fd->xw - fd->f_data->vsb * G_SCROLL_BAR_WIDTH; else fd->vs->view_pos += fd->yw - fd->f_data->hsb * G_SCROLL_BAR_WIDTH; fd->vs->orig_view_pos = fd->vs->view_pos; fd->vs->orig_view_posx = fd->vs->view_posx; draw_graphical_doc(fd->ses->term, fd, 1);}void process_sb_move(struct f_data_c *fd, int off){ int h = fd->ses->scrolltype; int w = h ? fd->f_data->hsbsize : fd->f_data->vsbsize; int rpos = off - 2 - fd->ses->scrolloff; int st, en; get_scrollbar_pos(w - 4, h ? fd->f_data->x : fd->f_data->y, w, h ? fd->vs->view_posx : fd->vs->view_pos, &st, &en); if (en - st >= w - 4) return; /* *(h ? &fd->vs->view_posx : &fd->vs->view_pos) = rpos * (h ? fd->f_data->x : fd->f_data->y) / (w - 4); */ if (!(w - 4 - (en - st))) return; *(h ? &fd->vs->view_posx : &fd->vs->view_pos) = rpos * (double)(h ? fd->f_data->x - w : fd->f_data->y - w) / (w - 4 - (en - st)); fd->vs->orig_view_pos = fd->vs->view_pos; fd->vs->orig_view_posx = fd->vs->view_posx; draw_graphical_doc(fd->ses->term, fd, 1);}static inline int ev_in_rect(struct event *ev, int x1, int y1, int x2, int y2){ return ev->x >= x1 && ev->y >= y1 && ev->x < x2 && ev->y < y2;}int is_link_in_view(struct f_data_c *fd, int nl){ struct link *l = &fd->f_data->links[nl]; return fd->vs->view_pos < l->r.y2 && fd->vs->view_pos + fd->f_data->opt.yw - fd->f_data->hsb * G_SCROLL_BAR_WIDTH > l->r.y1;}int skip_link(struct f_data_c *fd, int nl){ struct link *l = &fd->f_data->links[nl]; return !l->where && !l->form;}void redraw_link(struct f_data_c *fd, int nl){ struct link *l = &fd->f_data->links[nl]; struct rect r; memcpy(&r, &l->r, sizeof(struct rect)); r.x1 += fd->f_data->opt.xp - fd->vs->view_posx; r.x2 += fd->f_data->opt.xp - fd->vs->view_posx; r.y1 += fd->f_data->opt.yp - fd->vs->view_pos; r.y2 += fd->f_data->opt.yp - fd->vs->view_pos; t_redraw(fd->ses->term->dev, &r);}int lr_link(struct f_data_c *fd, int nl){ struct link *l = &fd->f_data->links[nl]; int xx = fd->vs->view_posx; if (l->r.x2 > fd->vs->view_posx + fd->xw - fd->f_data->vsb * G_SCROLL_BAR_WIDTH) fd->vs->view_posx = l->r.x2 - (fd->xw - fd->f_data->vsb * G_SCROLL_BAR_WIDTH); if (l->r.x1 < fd->vs->view_posx) fd->vs->view_posx = l->r.x1; fd->vs->orig_view_posx = fd->vs->view_posx; return xx != fd->vs->view_posx;}int g_next_link(struct f_data_c *fd, int dir){ int orig_link = -1; int r = 2; int n, pn; if (fd->vs->current_link >= 0 && fd->vs->current_link < fd->f_data->nlinks) { orig_link = fd->vs->current_link; n = (pn = fd->vs->current_link) + dir; } else retry: n = dir > 0 ? 0 : fd->f_data->nlinks - 1, pn = -1; again: if (n < 0 || n >= fd->f_data->nlinks) { if (r == 1) { fd->vs->current_link = -1; if (fd->vs->view_pos > fd->f_data->y - fd->yw + fd->f_data->hsb * G_SCROLL_BAR_WIDTH) fd->vs->view_pos = fd->f_data->y - fd->yw + fd->f_data->hsb * G_SCROLL_BAR_WIDTH; if (fd->vs->view_pos < 0) fd->vs->view_pos = 0; if (orig_link != -1 && is_link_in_view(fd, orig_link)) fd->vs->current_link = orig_link; fd->vs->orig_link = fd->vs->current_link; if (fd->vs->current_link == -1) fd->ses->locked_link = 0; return 1; } if (dir < 0) { 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; } else { if (fd->vs->view_pos >= fd->f_data->y - fd->yw + fd->f_data->hsb * G_SCROLL_BAR_WIDTH) 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; } r = 1; goto retry; } if (!is_link_in_view(fd, n) || skip_link(fd, n)) { n += dir; goto again; } if (fd->vs->current_link >= 0 && fd->vs->current_link < fd->f_data->nlinks) { redraw_link(fd, fd->vs->current_link); } fd->vs->current_link = n; fd->vs->orig_link = fd->vs->current_link; fd->vs->g_display_link = 1; redraw_link(fd, n); fd->ses->locked_link = 0; if (fd->f_data->links[fd->vs->current_link].type == L_FIELD || fd->f_data->links[fd->vs->current_link].type == L_AREA) { if ((fd->f_data->locked_on = fd->f_data->links[fd->vs->current_link].obj)) fd->ses->locked_link = 1; } set_textarea(fd->ses, fd, dir < 0 ? KBD_DOWN : KBD_UP); change_screen_status(fd->ses); print_screen_status(fd->ses); if (lr_link(fd, fd->vs->current_link)) r = 1; return r;}void unset_link(struct f_data_c *fd){ int n = fd->vs->current_link; fd->vs->current_link = -1; fd->vs->orig_link = fd->vs->current_link; fd->vs->g_display_link = 0; fd->ses->locked_link = 0; if (n >= 0 && n < fd->f_data->nlinks) { redraw_link(fd, n); }}int g_frame_ev(struct session *ses, struct f_data_c *fd, struct event *ev){ int x, y; if (!fd->f_data) return 0; switch (ev->ev) { case EV_MOUSE: if ((ev->b & BM_BUTT) == B_WHEELUP) goto up; if ((ev->b & BM_BUTT) == B_WHEELDOWN) goto down; if ((ev->b & BM_BUTT) == B_WHEELUP1) goto up1; if ((ev->b & BM_BUTT) == B_WHEELDOWN1) goto down1; if ((ev->b & BM_BUTT) == B_WHEELLEFT) goto left; if ((ev->b & BM_BUTT) == B_WHEELRIGHT) goto right; if ((ev->b & BM_BUTT) == B_WHEELLEFT1) goto left1; if ((ev->b & BM_BUTT) == B_WHEELRIGHT1) goto right1; x = ev->x; y = ev->y; if ((ev->b & BM_ACT) == B_MOVE) ses->scrolling = 0; if (ses->scrolling == 1) process_sb_move(fd, ses->scrolltype ? ev->x : ev->y); if (ses->scrolling == 2) { fd->vs->view_pos = -ev->y + ses->scrolloff; fd->vs->view_posx = -ev->x + ses->scrolltype; fd->vs->orig_view_pos = fd->vs->view_pos; fd->vs->orig_view_posx = fd->vs->view_posx; draw_graphical_doc(fd->ses->term, fd, 1); if ((ev->b & BM_ACT) == B_UP) { ses->scrolling = 0; } break; } if (ses->scrolling) { if ((ev->b & BM_ACT) == B_UP) { ses->scrolling = 0; } break; } if ((ev->b & BM_ACT) == B_DOWN && fd->f_data->vsb && ev_in_rect(ev, fd->xw - G_SCROLL_BAR_WIDTH, 0, fd->xw, fd->yw - fd->f_data->hsb * G_SCROLL_BAR_WIDTH)) { process_sb_event(fd, ev->y, 0); break; } if ((ev->b & BM_ACT) == B_DOWN && fd->f_data->hsb && ev_in_rect(ev, 0, fd->yw - G_SCROLL_BAR_WIDTH, fd->xw - fd->f_data->vsb * G_SCROLL_BAR_WIDTH, fd->yw)) { process_sb_event(fd, ev->x, 1); break; } if (fd->f_data->vsb && ev_in_rect(ev, fd->xw - G_SCROLL_BAR_WIDTH, 0, fd->xw, fd->yw)) return 0; if (fd->f_data->hsb && ev_in_rect(ev, 0, fd->yw - G_SCROLL_BAR_WIDTH, fd->xw, fd->yw)) return 0; if ((ev->b & BM_ACT) == B_DOWN && (ev->b & BM_BUTT) == B_MIDDLE) { scrll: ses->scrolltype = ev->x + fd->vs->view_posx; ses->scrolloff = ev->y + fd->vs->view_pos; ses->scrolling = 2; break; } previous_link=fd->vs->current_link; if (fd->vs->g_display_link) { fd->vs->g_display_link = 0; if (fd->vs->current_link >= 0 && fd->vs->current_link < fd->f_data->nlinks) redraw_link(fd, fd->vs->current_link); } if (!(ev->b == (B_LEFT | B_UP) && fd->f_data->hlt_len && fd->f_data->start_highlight_x == -1)) { fd->vs->current_link = -1; fd->vs->orig_link = fd->vs->current_link; fd->f_data->root->mouse_event(fd, fd->f_data->root, ev->x + fd->vs->view_posx, ev->y + fd->vs->view_pos, ev->b); if (previous_link!=fd->vs->current_link) change_screen_status(ses); print_screen_status(ses); } /* highlight text */ if ((ev->b & BM_ACT) == B_DOWN && (ev->b & BM_BUTT) == B_LEFT) { /* start highlighting */ fd->f_data->start_highlight_x = ev->x; fd->f_data->start_highlight_y = ev->y; fd->f_data->hlt_len = 0; fd->f_data->hlt_pos = -1; return 1; } if (((ev->b & BM_ACT) == B_DRAG || (ev->b & BM_ACT) == B_UP) && (ev->b & BM_BUTT) == B_LEFT) { /* stop highlighting */ struct g_object_text *t; if (fd->f_data->start_highlight_x != -1) { if (abs(ev->x - fd->f_data->start_highlight_x) < 8 && abs(ev->y - fd->f_data->start_highlight_y) < 8) goto skip_hl; t=g_find_nearest_object(fd->f_data, fd->f_data->start_highlight_x + fd->vs->view_posx, fd->f_data->start_highlight_y + fd->vs->view_pos); if (t) { g_get_search_data(fd->f_data); fd->f_data->hlt_pos=t->srch_pos+g_find_text_pos(t, fd->f_data->start_highlight_x+fd->vs->view_posx); fd->f_data->hlt_len=0; } fd->f_data->start_highlight_x = -1; fd->f_data->start_highlight_y = -1; } if (fd->f_data->hlt_pos == -1) goto skip_hl; t=g_find_nearest_object(fd->f_data, ev->x + fd->vs->view_posx, ev->y + fd->vs->view_pos); if (t) { int end; g_get_search_data(fd->f_data); end=t->srch_pos+g_find_text_pos(t, ev->x+fd->vs->view_posx); fd->f_data->hlt_len=end-fd->f_data->hlt_pos; if ((ev->b & BM_ACT) == B_UP || (ev->b & BM_ACT) == B_DRAG) { unsigned char *m = memacpy(fd->f_data->srch_string + fd->f_data->hlt_pos + (fd->f_data->hlt_len > 0 ? 0 : fd->f_data->hlt_len), fd->f_data->hlt_len > 0 ? fd->f_data->hlt_len : -fd->f_data->hlt_len); if (m) { unsigned char *p = m; while ((p = strchr(p, 1))) *p++ = ' '; if (*m) set_clipboard_text(fd->ses->term, m); mem_free(m); } } return 1; } } skip_hl:#ifdef JS /* process onmouseover/onmouseout handlers */ if (previous_link!=fd->vs->current_link) { struct link* lnk=NULL; if (previous_link>=0&&previous_link<fd->f_data->nlinks)lnk=&(fd->f_data->links[previous_link]); if (lnk&&lnk->js_event&&lnk->js_event->out_code) jsint_execute_code(fd,lnk->js_event->out_code,strlen(lnk->js_event->out_code),-1,-1,-1, NULL); lnk=NULL; if (fd->vs->current_link>=0&&fd->vs->current_link<fd->f_data->nlinks)lnk=&(fd->f_data->links[fd->vs->current_link]); if (lnk&&lnk->js_event&&lnk->js_event->over_code) jsint_execute_code(fd,lnk->js_event->over_code,strlen(lnk->js_event->over_code),-1,-1,-1, NULL); }#endif if ((ev->b & BM_ACT) == B_DOWN && (ev->b & BM_BUTT) == B_RIGHT && fd->vs->current_link == -1) goto scrll; break; case EV_KBD: if (ses->locked_link && fd->vs->current_link >= 0 && fd->vs->current_link < fd->f_data->nlinks && (fd->f_data->links[fd->vs->current_link].type == L_FIELD || fd->f_data->links[fd->vs->current_link].type == L_AREA)) { if (field_op(ses, fd, &fd->f_data->links[fd->vs->current_link], ev, 0)) { if (fd->f_data->locked_on) { print_all_textarea = 1; draw_one_object(fd, fd->f_data->locked_on); print_all_textarea = 0; return 2; } return 1; } if (ev->x == KBD_ENTER) { return enter(ses, fd, 0); } } if (ev->x == KBD_RIGHT || ev->x == KBD_ENTER) { struct link *l; if (fd->vs->current_link >= 0 && fd->vs->current_link < fd->f_data->nlinks) { l = &fd->f_data->links[fd->vs->current_link]; set_window_ptr(ses->win, fd->f_data->opt.xp + l->r.x1 - fd->vs->view_posx, fd->f_data->opt.yp + l->r.y1 - fd->vs->view_pos); } else { set_window_ptr(ses->win, fd->f_data->opt.xp, fd->f_data->opt.yp); } return enter(ses, fd, 0); } if (ev->x == KBD_PAGE_DOWN || (ev->x == ' ' && !(ev->y & KBD_ALT)) || (upcase(ev->x) == 'F' && ev->y & KBD_CTRL)) { unset_link(fd); 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 += 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 (ev->x == '*') { ses->ds.display_images ^= 1; html_interpret_recursive(ses->screen); return 1; } if (ev->x == KBD_PAGE_UP || (upcase(ev->x) == 'B' && !(ev->y & KBD_ALT))) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -