⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 view.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 5 页
字号:
	/*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 + -