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

📄 bfu.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 5 页
字号:
						s = 2;					}			}			if (!s) {				delete_window_ev(win, (ev->x >= KBD_F1 && ev->x <= KBD_F12) || ev->y & KBD_ALT ? ev : NULL);				break;			}			draw_to_window(win, (void (*)(struct terminal *, void *))display_mainmenu, menu);			if (s == 2) select_mainmenu(win->term, menu);			break;		case EV_ABORT:			break;	}}struct menu_item *new_menu(int free_i){	struct menu_item *mi;	mi = mem_calloc(sizeof(struct menu_item));	mi->free_i = free_i;	return mi;}void add_to_menu(struct menu_item **mi, unsigned char *text, unsigned char *rtext, unsigned char *hotkey, void (*func)(struct terminal *, void *, void *), void *data, int in_m, int pos){	struct menu_item *mii;	int n;	if (pos != -1) {		n = pos;		if ((*mi)[n].text) internal("invalid menu position %d", n);	} else {		for (n = 0; (*mi)[n].text; n++) if (n == MAXINT) overalloc();	}	if (((unsigned)n + 2) > MAXINT / sizeof(struct menu_item)) overalloc();	mii = mem_realloc(*mi, (n + 2) * sizeof(struct menu_item));	*mi = mii;	memcpy(mii + n + 1, mii + n, sizeof(struct menu_item));	mii[n].text = text;	mii[n].rtext = rtext;	mii[n].hotkey = hotkey;	mii[n].func = func;	mii[n].data = data;	mii[n].in_m = in_m;}void do_dialog(struct terminal *term, struct dialog *dlg, struct memory_list *ml){	struct dialog_data *dd;	struct dialog_item *d;	int n = 0;	for (d = dlg->items; d->type != D_END; d++) {		if (n == MAXINT) overalloc();		n++;	}	if ((unsigned)n > (MAXINT - sizeof(struct dialog_data)) / sizeof(struct dialog_item_data)) overalloc();	dd = mem_calloc(sizeof(struct dialog_data) + sizeof(struct dialog_item_data) * n);	dd->dlg = dlg;	dd->n = n;	dd->ml = ml;	add_window(term, dialog_func, dd);}void display_dlg_item(struct dialog_data *dlg, struct dialog_item_data *di, int sel){	struct terminal *term = dlg->win->term;	if (!F) switch (di->item->type) {		int co;		unsigned char *text, *t, *tt;		case D_CHECKBOX:			if (di->item->gid)	/* radio */			{				if (di->checked) print_text(term, di->x, di->y, 3, "[X]", COLOR_DIALOG_CHECKBOX);				else print_text(term, di->x, di->y, 3, "[ ]", COLOR_DIALOG_CHECKBOX);			}			else	/* checkbox */			{				if (di->checked) print_text(term, di->x, di->y, 3, "[X]", COLOR_DIALOG_CHECKBOX);				else print_text(term, di->x, di->y, 3, "[ ]", COLOR_DIALOG_CHECKBOX);			}			if (sel) {				set_cursor(term, di->x + 1, di->y, di->x + 1, di->y);				set_window_ptr(dlg->win, di->x, di->y);			}			break;		case D_FIELD:		case D_FIELD_PASS:			if (di->vpos + di->l <= di->cpos) di->vpos = di->cpos - di->l + 1;			if (di->vpos > di->cpos) di->vpos = di->cpos;			if (di->vpos < 0) di->vpos = 0;			fill_area(term, di->x, di->y, di->l, 1, COLOR_DIALOG_FIELD);			if (di->item->type == D_FIELD_PASS) {				t = stracpy(di->cdata);				for (tt = t; *tt; *tt++ = '*');			} else t = di->cdata;			print_text(term, di->x, di->y, strlen(t + di->vpos) <= (size_t)di->l ? (int)strlen(t + di->vpos) : di->l, t + di->vpos, COLOR_DIALOG_FIELD_TEXT);			if (di->item->type == D_FIELD_PASS) mem_free(t);			if (sel) {				set_cursor(term, di->x + di->cpos - di->vpos, di->y, di->x + di->cpos - di->vpos, di->y);				set_window_ptr(dlg->win, di->x, di->y);			}			break;		case D_BUTTON:			co = sel ? COLOR_DIALOG_BUTTON_SELECTED : COLOR_DIALOG_BUTTON;			text = _(di->item->text, term);			print_text(term, di->x, di->y, 2, "[ ", co);			print_text(term, di->x + 2, di->y, strlen(text), text, co);			print_text(term, di->x + 2 + strlen(text), di->y, 2, " ]", co);			if (sel) {				set_cursor(term, di->x + 2, di->y, di->x + 2, di->y);				set_window_ptr(dlg->win, di->x, di->y);			}			break;		default:			internal("display_dlg_item: unknown item: %d", di->item->type);#ifdef G	} else {		struct rect rr;		struct graphics_device *dev = term->dev;		if (!dlg->s) restrict_clip_area(dev, &rr, dlg->rr.x1, dlg->rr.y1, dlg->rr.x2, dlg->rr.y2);		switch (di->item->type) {			int p, pp;			struct style *st;			unsigned char *text, *text2, *text3, *tt, *t;			struct rect r;			case D_CHECKBOX:				p = di->x;				if (di->checked) {					if (!sel) g_print_text(drv, dev, di->x, di->y, bfu_style_bw, di->item->gid?(G_DIALOG_RADIO_L G_DIALOG_RADIO_X G_DIALOG_RADIO_R):(G_DIALOG_CHECKBOX_L G_DIALOG_CHECKBOX_X G_DIALOG_CHECKBOX_R), &p);					else {						g_print_text(drv, dev, di->x, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_L:G_DIALOG_CHECKBOX_L, &p);						g_print_text(drv, dev, p, di->y, bfu_style_bw_u, di->item->gid?G_DIALOG_RADIO_X:G_DIALOG_CHECKBOX_X, &p);						g_print_text(drv, dev, p, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_R:G_DIALOG_CHECKBOX_R, &p);					}				} else {					int s = g_text_width(bfu_style_bw, di->item->gid?G_DIALOG_RADIO_X:G_DIALOG_CHECKBOX_X);					g_print_text(drv, dev, di->x, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_L:G_DIALOG_CHECKBOX_L, &p);					if (!sel) drv->fill_area(dev, p, di->y, p + s, di->y + G_BFU_FONT_SIZE, bfu_bg_color), p += s;					else {						restrict_clip_area(dev, &r, p, di->y, p + s, di->y + G_BFU_FONT_SIZE);						g_print_text(drv, dev, p, di->y, bfu_style_bw_u, "          ", NULL);						p += s;						drv->set_clip_area(dev, &r);					}					g_print_text(drv, dev, p, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_R:G_DIALOG_CHECKBOX_R, &p);				}				di->l = p - di->x;				if (sel) set_window_ptr(dlg->win, di->x, di->y + G_BFU_FONT_SIZE);				if (dlg->s) exclude_from_set(&dlg->s, di->x, di->y, p, di->y + G_BFU_FONT_SIZE);				break;			case D_FIELD:			case D_FIELD_PASS:				if (!(text = memacpy(di->cdata, di->cpos))) break;				if (*(text2 = text3 = di->cdata + di->cpos)) {					GET_UTF_8(text3, p);					text2 = memacpy(text2, text3 - text2);				} else {					text2 = stracpy(" ");					text3 = "";				}				if (!text2) {					mem_free(text);					break;				}				text3 = stracpy(text3);				if (di->item->type == D_FIELD_PASS) {					unsigned d;					for (tt = t = text; *tt; ) {						t = tt;						GET_UTF_8(tt, d);						*t++ = '*';					}					*t = 0;					if (di->cdata[di->cpos]) {						for (tt = t = text2; *tt; ) {							t = tt;							GET_UTF_8(tt, d);							*t++ = '*';						}						*t = 0;						for (tt = t = text3; *tt; ) {							t = tt;							GET_UTF_8(tt, d);							*t++ = '*';						}						*t = 0;					}				}				p = g_text_width(bfu_style_wb_mono, text);				pp = g_text_width(bfu_style_wb_mono, text2);				if (di->vpos + di->l < p + pp) di->vpos = p + pp - di->l;				if (di->vpos > p) di->vpos = p;				if (di->vpos < 0) di->vpos = 0;				if (dlg->s) exclude_from_set(&dlg->s, di->x, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE);				restrict_clip_area(dev, &r, di->x, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE);				p = di->x - di->vpos;				g_print_text(drv, dev, p, di->y, bfu_style_wb_mono, text, &p);				g_print_text(drv, dev, p, di->y, sel ? bfu_style_wb_mono_u : bfu_style_wb_mono, text2, &p);				g_print_text(drv, dev, p, di->y, bfu_style_wb_mono, text3, &p);				drv->fill_area(dev, p, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE, bfu_fg_color);				drv->set_clip_area(dev, &r);				mem_free(text);				mem_free(text2);				mem_free(text3);				if (sel) {					set_window_ptr(dlg->win, di->x, di->y);				}				break;			case D_BUTTON:				st = sel ? bfu_style_wb_b : bfu_style_bw;				text = _(di->item->text, term);				text2 = mem_alloc(strlen(text) + 5);				strcpy(text2, G_DIALOG_BUTTON_L);				strcpy(text2 + 2, text);				strcat(text2, G_DIALOG_BUTTON_R);				di->l = 0;				g_print_text(drv, dev, di->x, di->y, st, text2, &di->l);				mem_free(text2);				if (dlg->s) exclude_from_set(&dlg->s, di->x, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE);				if (sel) set_window_ptr(dlg->win, di->x, di->y + G_BFU_FONT_SIZE);				break;			default:				internal("display_dlg_item: unknown item: %d", di->item->type);		}		if (!dlg->s) drv->set_clip_area(dev, &rr);#endif	}}struct dspd {	struct dialog_data *dlg;	struct dialog_item_data *di;	int sel;};void u_display_dlg_item(struct terminal *term, void *p){	struct dspd *d = p;	display_dlg_item(d->dlg, d->di, d->sel);}void x_display_dlg_item(struct dialog_data *dlg, struct dialog_item_data *di, int sel){	struct dspd dspd;	dspd.dlg = dlg, dspd.di = di, dspd.sel = sel;	draw_to_window(dlg->win, u_display_dlg_item, &dspd);}void dlg_select_item(struct dialog_data *dlg, struct dialog_item_data *di){	if (di->item->type == D_CHECKBOX) {		if (!di->item->gid) di -> checked = *(int *)di->cdata = !*(int *)di->cdata;		else {			int i;			for (i = 0; i < dlg->n; i++) {				if (dlg->items[i].item->type == D_CHECKBOX && dlg->items[i].item->gid == di->item->gid) {					*(int *)dlg->items[i].cdata = di->item->gnum;					dlg->items[i].checked = 0;					x_display_dlg_item(dlg, &dlg->items[i], 0);				}			}			di->checked = 1;		}		x_display_dlg_item(dlg, di, 1);	}	else if (di->item->type == D_BUTTON) di->item->fn(dlg, di);}void dlg_set_history(struct dialog_item_data *di){	unsigned char *s = "";	int l;	if ((void *)di->cur_hist != &di->history) s = di->cur_hist->d;	if ((l = strlen(s)) > di->item->dlen) l = di->item->dlen - 1;	memcpy(di->cdata, s, l);	di->cdata[l] = 0;	di->cpos = l;	di->vpos = 0;}int dlg_mouse(struct dialog_data *dlg, struct dialog_item_data *di, struct event *ev){	switch (di->item->type) {		case D_BUTTON:			if (gf_val(ev->y != di->y, ev->y < di->y || ev->y >= di->y + G_BFU_FONT_SIZE) || ev->x < di->x || ev->x >= di->x + (int)gf_val(strlen(_(di->item->text, dlg->win->term)) + 4, (size_t)di->l)) return 0;			if (dlg->selected != di - dlg->items) {				x_display_dlg_item(dlg, &dlg->items[dlg->selected], 0);				dlg->selected = di - dlg->items;				x_display_dlg_item(dlg, di, 1);			}			if ((ev->b & BM_ACT) == B_UP) dlg_select_item(dlg, di);			return 1;		case D_FIELD:		case D_FIELD_PASS:			if (gf_val(ev->y != di->y, ev->y < di->y || ev->y >= di->y + G_BFU_FONT_SIZE) || ev->x < di->x || ev->x >= di->x + di->l) return 0;			if (!F) {				if ((size_t)(di->cpos = di->vpos + ev->x - di->x) > strlen(di->cdata)) di->cpos = strlen(di->cdata);#ifdef G			} else {				int p, u;				unsigned char *t = di->cdata;				p = di->x - di->vpos;				while (1) {					di->cpos = t - di->cdata;					if (!*t) break;					GET_UTF_8(t, u);					if (!u) continue;					p += g_char_width(bfu_style_wb_mono, u);					if (p > ev->x) break;				}#endif			}			if (dlg->selected != di - dlg->items) {				x_display_dlg_item(dlg, &dlg->items[dlg->selected], 0);				dlg->selected = di - dlg->items;				x_display_dlg_item(dlg, di, 1);			} else x_display_dlg_item(dlg, di, 1);			return 1;		case D_CHECKBOX:			if (gf_val(ev->y != di->y, ev->y < di->y || ev->y >= di->y + G_BFU_FONT_SIZE) || ev->x < di->x || ev->x >= di->x + gf_val(3, di->l)) return 0;			if (dlg->selected != di - dlg->items) {				x_display_dlg_item(dlg, &dlg->items[dlg->selected], 0);				dlg->selected = di - dlg->items;				x_display_dlg_item(dlg, di, 1);			}			if ((ev->b & BM_ACT) == B_UP) dlg_select_item(dlg, di);			return 1;	}	return 0;}void redraw_dialog_items(struct terminal *term, struct dialog_data *dlg){	int i;	for (i = 0; i < dlg->n; i++) display_dlg_item(dlg, &dlg->items[i], i == dlg->selected);}int dlg_is_braille_moving(struct dialog_data *dlg){	return dlg->win->term->spec->braille && (dlg->dlg->fn == msg_box_fn || dlg->dlg->fn == download_window_function);}void redraw_dialog(struct terminal *term, struct dialog_data *dlg){#ifdef G	int i;#endif	dlg->dlg->fn(dlg);	redraw_dialog_items(term, dlg);	if (dlg_is_braille_moving(dlg)) {		if (dlg->brl_y < dlg->items[0].y - 3)			set_cursor(term, dlg->x + 6, dlg->y + 3 + dlg->brl_y, dlg->x + 6, dlg->y + 3 + dlg->brl_y);	}#ifdef G	if (F) {		drv->set_clip_area(term->dev, &dlg->r);		for (i = 0; i < dlg->s->m; i++) if (is_rect_valid(&dlg->s->r[i]))			drv->fill_area(term->dev, dlg->s->r[i].x1, dlg->s->r[i].y1, dlg->s->r[i].x2, dlg->s->r[i].y2, bfu_bg_color);		mem_free(dlg->s);		dlg->s = NULL;	}#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -