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

📄 view_gr.c

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