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

📄 view_gr.c

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