📄 view.c
字号:
/*if ((f->vs->view_posx = xm - f->xw) > xl) f->vs->view_posx = xl;*/ if (f->vs->view_posx + f->xw < xm) f->vs->view_posx = xm - f->xw; if (f->vs->view_posx > xl) f->vs->view_posx = xl; f->vs->orig_view_posx = f->vs->view_posx;}void set_pos_y(struct f_data_c *f, struct link *l){ int i; int ym = 0; int yl = f->f_data->y; for (i = 0; i < l->n; i++) { if (l->pos[i].y >= ym) ym = l->pos[i].y + 1; if (l->pos[i].y < yl) yl = l->pos[i].y; } if ((f->vs->view_pos = (ym + yl) / 2 - f->f_data->opt.yw / 2) > f->f_data->y - f->f_data->opt.yw) f->vs->view_pos = f->f_data->y - f->f_data->opt.yw; if (f->vs->view_pos < 0) f->vs->view_pos = 0; f->vs->orig_view_pos = f->vs->view_pos;}void update_braille_link(struct f_data_c *f){ int i; struct link *l1, *l2; struct view_state *vs = f->vs; struct f_data *f_data = f->f_data; if (vs->brl_x >= f->f_data->x && f->f_data->x) vs->brl_x = f->f_data->x - 1; if (vs->brl_x >= vs->view_posx + f->xw) vs->view_posx = vs->brl_x - f->xw + 1; if (vs->brl_x < vs->view_posx) vs->view_posx = vs->brl_x; if (vs->brl_y >= f_data->y && f_data->y) vs->brl_y = f->f_data->y - 1; if (vs->brl_y >= vs->view_pos + f->yw) vs->view_pos = vs->brl_y - f->yw + 1; if (vs->brl_y < vs->view_pos) vs->view_pos = vs->brl_y; vs->orig_brl_x = vs->brl_x; vs->orig_brl_y = vs->brl_y; vs->orig_view_pos = vs->view_pos; vs->orig_view_posx = vs->view_posx; if (vs->brl_y >= f_data->y) goto no_link; l1 = f_data->lines1[vs->brl_y]; l2 = f_data->lines2[vs->brl_y]; if (!l1 || !l2) goto no_link; for (; l1 <= l2; l1++) { for (i = 0; i < l1->n; i++) if (l1->pos[i].x == vs->brl_x && l1->pos[i].y == vs->brl_y) { if (l1 - f_data->links != vs->current_link) vs->brl_in_field = 0; vs->current_link = l1 - f_data->links; vs->orig_link = vs->current_link; return; } } no_link: vs->brl_in_field = 0; vs->current_link = -1; vs->orig_link = vs->current_link;}void find_link(struct f_data_c *f, int p, int s){ /* p=1 - top, p=-1 - bottom, s=0 - pgdn, s=1 - down */ int y; int l; struct link *link; struct link **line; if (f->ses->term->spec->braille) { update_braille_link(f); return; } line = p == -1 ? f->f_data->lines2 : f->f_data->lines1; if (p == -1) { y = f->vs->view_pos + f->yw - 1; if (y >= f->f_data->y) y = f->f_data->y - 1; } else { y = f->vs->view_pos; if (y < 0) y = 0; } if (y < 0 || y >= f->f_data->y) goto nolink; link = NULL; do { if (line[y] && (!link || (p > 0 ? line[y] < link : line[y] > link))) link = line[y]; y += p; } while (!(y < 0 || y < f->vs->view_pos || y >= f->vs->view_pos + f->f_data->opt.yw || y >= f->f_data->y)); if (!link) goto nolink; l = link - f->f_data->links; if (s == 0) { next_in_view(f, l, p, in_view, NULL); return; } f->vs->current_link = l; f->vs->orig_link = f->vs->current_link; set_pos_x(f, link); return; nolink: f->vs->current_link = -1; f->vs->orig_link = f->vs->current_link;}void page_down(struct session *ses, struct f_data_c *f, int a){ if (f->vs->view_pos + f->f_data->opt.yw < f->f_data->y) { f->vs->view_pos += f->f_data->opt.yw; f->vs->orig_view_pos = f->vs->view_pos; if (!ses->term->spec->braille) find_link(f, 1, a); } else { if (!ses->term->spec->braille) find_link(f, -1, a); else if (f->f_data->y) f->vs->brl_y = f->f_data->y - 1; } if (ses->term->spec->braille) { if (f->vs->view_pos > f->vs->brl_y) f->vs->brl_y = f->vs->view_pos; f->vs->orig_brl_y = f->vs->brl_y; update_braille_link(f); }}void page_up(struct session *ses, struct f_data_c *f, int a){ f->vs->view_pos -= f->yw; if (ses->term->spec->braille) { if (f->vs->view_pos + f->yw <= f->vs->brl_y) f->vs->brl_y = f->vs->view_pos + f->yw - 1; } else find_link(f, -1, a); if (f->vs->view_pos < 0) { f->vs->view_pos = 0; } f->vs->orig_view_pos = f->vs->view_pos; if (ses->term->spec->braille) { if (f->vs->brl_y < 0) f->vs->brl_y = 0; f->vs->orig_brl_y = f->vs->brl_y; update_braille_link(f); }}void down(struct session *ses, struct f_data_c *f, int a){ int l; if (ses->term->spec->braille) { if (f->vs->brl_y < f->f_data->y - 1) f->vs->brl_y++; else if (f->f_data->y) f->vs->brl_y = f->f_data->y - 1; else f->vs->brl_y = 0; f->vs->orig_brl_y = f->vs->brl_y; if (f->vs->brl_y >= f->vs->view_pos + f->yw) { page_down(ses, f, 1); return; } update_braille_link(f); return; } l = f->vs->current_link; /*if (f->vs->current_link >= f->nlinks - 1) return;*/ if (f->vs->current_link == -1 || !next_in_view(f, f->vs->current_link+1, 1, in_viewy, set_pos_x)) page_down(ses, f, 1); if (l != f->vs->current_link) set_textarea(ses, f, KBD_UP);}void up(struct session *ses, struct f_data_c *f, int a){ int l; if (ses->term->spec->braille) { if (f->vs->brl_y > 0) f->vs->brl_y--; else f->vs->brl_y = 0; f->vs->orig_brl_y = f->vs->brl_y; if (f->vs->brl_y < f->vs->view_pos) { page_up(ses, f, 0); return; } update_braille_link(f); return; } l = f->vs->current_link; if (f->vs->current_link == -1 || !next_in_view(f, f->vs->current_link-1, -1, in_viewy, set_pos_x)) page_up(ses, f, 1); if (l != f->vs->current_link) set_textarea(ses, f, KBD_DOWN);}void scroll(struct session *ses, struct f_data_c *f, int a){ if (f->vs->view_pos + f->f_data->opt.yw >= f->f_data->y && a > 0) return; f->vs->view_pos += a; if (f->vs->view_pos > f->f_data->y - f->f_data->opt.yw && a > 0) f->vs->view_pos = f->f_data->y - f->f_data->opt.yw; if (f->vs->view_pos < 0) f->vs->view_pos = 0; f->vs->orig_view_pos = f->vs->view_pos; if (ses->term->spec->braille) { if (f->vs->view_pos + f->yw <= f->vs->brl_y) f->vs->brl_y = f->vs->view_pos + f->yw - 1; if (f->vs->view_pos > f->vs->brl_y) f->vs->brl_y = f->vs->view_pos; f->vs->orig_brl_y = f->vs->brl_y; update_braille_link(f); return; } if (c_in_view(f)) return; find_link(f, a < 0 ? -1 : 1, 0);}void hscroll(struct session *ses, struct f_data_c *f, int a){ f->vs->view_posx += a; if (f->vs->view_posx >= f->f_data->x) f->vs->view_posx = f->f_data->x - 1; if (f->vs->view_posx < 0) f->vs->view_posx = 0; f->vs->orig_view_posx = f->vs->view_posx; if (ses->term->spec->braille) { if (f->vs->view_posx + f->xw <= f->vs->brl_x) f->vs->brl_x = f->vs->view_posx + f->xw - 1; if (f->vs->view_posx > f->vs->brl_x) f->vs->brl_x = f->vs->view_posx; f->vs->orig_brl_x = f->vs->brl_x; update_braille_link(f); return; } if (c_in_view(f)) return; find_link(f, 1, 0); /* !!! FIXME: check right margin */}void right(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { if (f->vs->brl_x < f->f_data->x - 1) f->vs->brl_x++; else if (f->f_data->x) f->vs->brl_x = f->f_data->x - 1; else f->vs->brl_x = 0; f->vs->orig_brl_x = f->vs->brl_x; if (f->vs->brl_x >= f->vs->view_posx + f->xw) { hscroll(ses, f, 1); return; } update_braille_link(f); return; }}void left(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { if (f->vs->brl_x > 0) f->vs->brl_x--; else f->vs->brl_x = 0; f->vs->orig_brl_x = f->vs->brl_x; if (f->vs->brl_x < f->vs->view_posx) { hscroll(ses, f, -1); return; } update_braille_link(f); return; }}int get_at_pos(struct f_data *f, int x, int y){ unsigned ch; struct line *ln; if (y < 0 || y >= f->y) return -1; ln = &f->data[y]; if (x < 0 || x >= ln->l) ch = ln->c; else ch = ln->d[x]; if (ch & 0x8000) return 0; ch &= 0xff; return ch != 0 && ch != 1 && ch != ' ' && ch != '~';}void cursor_word(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { int p = 1; int q; int x = f->vs->brl_x, y = f->vs->brl_y; while (1) { q = get_at_pos(f->f_data, x, y); if (q == -1) return; if (!p && q) { f->vs->brl_x = x; f->vs->brl_y = y; f->vs->orig_brl_x = f->vs->brl_x; f->vs->orig_brl_y = f->vs->brl_y; update_braille_link(f); return; } x++; if (x >= f->f_data->x) x = 0, y++; p = q; } }}void cursor_word_back(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { int p = 0; int q; int x = f->vs->brl_x, y = f->vs->brl_y; int px, py; while (1) { px = x, py = y; x--; if (x < 0) x = f->f_data->x - 1, y--; if (x < 0) x = 0; q = get_at_pos(f->f_data, x, y); if (q == -1) return; if (p && !q) { f->vs->brl_x = px; f->vs->brl_y = py; f->vs->orig_brl_x = f->vs->brl_x; f->vs->orig_brl_y = f->vs->brl_y; update_braille_link(f); return; } p = q; } }}void cursor_home(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { f->vs->brl_x = 0; f->vs->orig_brl_x = f->vs->brl_x; update_braille_link(f); return; }}void cursor_end(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { if (f->f_data->x) f->vs->brl_x = f->f_data->x - 1; else f->vs->brl_x = 0; f->vs->orig_brl_x = f->vs->brl_x; update_braille_link(f); return; }}void br_next_link(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { int y; struct link *l, *ol, *cl; struct view_state *vs = f->vs; struct f_data *f_data = f->f_data; if (vs->brl_y >= f_data->y) return; for (y = vs->brl_y; y < f_data->y; y++) if (f_data->lines1[y]) goto o; return; o: cl = NULL, ol = NULL; for (l = f_data->lines1[y]; l && l < f_data->links + f_data->nlinks && (!cl || l <= cl); l++) { if (!l->n) continue; if (a && !l->form) continue; if (l->pos[0].y > vs->brl_y || (l->pos[0].y == vs->brl_y && l->pos[0].x > vs->brl_x)) if (vs->current_link == -1 || l != f_data->links + vs->current_link) { if (!ol || l->pos[0].y < ol->pos[0].y || (l->pos[0].y == ol->pos[0].y && l->pos[0].x < ol->pos[0].x)) { ol = l; cl = f_data->lines2[ol->pos[0].y]; } } } if (!ol) return; vs->brl_x = ol->pos[0].x; vs->brl_y = ol->pos[0].y; while (vs->brl_y >= vs->view_pos + f->yw) { vs->view_pos += f->yw ? f->yw : 1; if (vs->view_pos >= f_data->y) vs->view_pos = f_data->y - !!f_data->y; vs->orig_view_pos = vs->view_pos; } vs->orig_brl_x = vs->brl_x; vs->orig_brl_y = vs->brl_y; set_pos_x(f, ol); update_braille_link(f); }}void br_prev_link(struct session *ses, struct f_data_c *f, int a){ if (ses->term->spec->braille) { int y; struct link *l, *ol, *cl; struct view_state *vs = f->vs; struct f_data *f_data = f->f_data; if (vs->brl_y >= f_data->y) return; for (y = vs->brl_y; y >= 0; y--) if (f_data->lines2[y]) goto o; return; o: cl = NULL, ol = NULL; for (l = f_data->lines2[y]; l && l >= f_data->links && (!cl || l >= cl); l--) { if (!l->n) goto cont; if (l->pos[0].y < vs->brl_y || (l->pos[0].y == vs->brl_y && l->pos[0].x < vs->brl_x)) if (vs->current_link == -1 || l != f_data->links + vs->current_link) { if (!ol || l->pos[0].y > ol->pos[0].y || (l->pos[0].y == ol->pos[0].y && l->pos[0].x > ol->pos[0].x)) { ol = l; cl = f_data->lines1[ol->pos[0].y]; } } cont: if (l == f_data->links) break; } if (!ol) return; vs->brl_x = ol->pos[0].x; vs->brl_y = ol->pos[0].y; while (vs->brl_y < vs->view_pos) { vs->view_pos -= f->yw ? f->yw : 1; if (vs->view_pos < 0) vs->view_pos = 0; vs->orig_view_pos = vs->view_pos; } vs->orig_brl_x = vs->brl_x; vs->orig_brl_y = vs->brl_y; set_pos_x(f, ol); update_braille_link(f); }}void home(struct session *ses, struct f_data_c *f, int a){ f->vs->view_pos = f->vs->view_posx = 0; f->vs->orig_view_pos = f->vs->view_pos; f->vs->orig_view_posx = f->vs->view_posx; if (ses->term->spec->braille) { f->vs->brl_x = f->vs->brl_y = 0; f->vs->orig_brl_x = f->vs->brl_x; f->vs->orig_brl_y = f->vs->brl_y; update_braille_link(f); return; } find_link(f, 1, 0);}void x_end(struct session *ses, struct f_data_c *f, int a){ f->vs->view_posx = 0; if (f->vs->view_pos < f->f_data->y - f->f_data->opt.yw) f->vs->view_pos = f->f_data->y - f->f_data->opt.yw; if (f->vs->view_pos < 0) f->vs->view_pos = 0; f->vs->orig_view_pos = f->vs->view_pos; f->vs->orig_view_posx = f->vs->view_posx; if (ses->term->spec->braille) { if (f->f_data->y) f->vs->brl_y = f->f_data->y - 1; else f->vs->brl_y = 0; f->vs->brl_x = 0; f->vs->orig_brl_x = f->vs->brl_x; f->vs->orig_brl_y = f->vs->brl_y; update_braille_link(f); return; } find_link(f, -1, 0);}int has_form_submit(struct f_data *f, struct form_control *form){ struct form_control *i; int q = 0; /*if (F) return 0;*/ foreach (i, f->forms) if (i->form_num == form->form_num) { if ((i->type == FC_SUBMIT || i->type == FC_IMAGE)) return 1; q = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -