bfu.c

来自「this is the file used to browse web」· C语言 代码 · 共 1,481 行 · 第 1/4 页

C
1,481
字号
							memmove(di->cdata + di->cpos, di->cdata + di->cpos + 1, strlen(di->cdata) - di->cpos + 1);						goto dsp_f;					case ACT_KILL_TO_BOL:						memmove(di->cdata, di->cdata + di->cpos, strlen(di->cdata + di->cpos) + 1);						di->cpos = 0;						goto dsp_f;					case ACT_KILL_TO_EOL:						di->cdata[di->cpos] = 0;						goto dsp_f;				    	case ACT_COPY_CLIPBOARD: 						/* Copy to clipboard */						set_clipboard_text(di->cdata);						break;	/* We don't need to redraw */					case ACT_CUT_CLIPBOARD: 						/* Cut to clipboard */												set_clipboard_text(di->cdata);						di->cdata[0] = 0;						di->cpos = 0;						goto dsp_f;					case ACT_PASTE_CLIPBOARD: {						/* Paste from clipboard */						unsigned char * clipboard = get_clipboard_text();						if (clipboard) {							strncpy(di->cdata , clipboard, di->item->dlen);							di->cdata[di->item->dlen - 1] = 0;							di->cpos = strlen(di->cdata);							mem_free(clipboard);						}						goto dsp_f;					}					case ACT_AUTO_COMPLETE: 						do_tab_compl(term, &di->history, win);						goto dsp_f;					default:						if (ev->x >= ' ' && ev->x < 0x100 && !ev->y) {							if (strlen(di->cdata) + 1 < (size_t)di->item->dlen) {								memmove(di->cdata + di->cpos + 1, di->cdata + di->cpos, strlen(di->cdata) - di->cpos + 1);								di->cdata[di->cpos++] = ev->x;							}							goto dsp_f;						}				}				goto gh;				dsp_f:				display_dlg_item(dlg, di, 1);				redraw_from_window(dlg->win);				break;			}			if ((ev->x == KBD_ENTER && di->item->type == D_BUTTON) || ev->x == ' ') {				dlg_select_item(dlg, di);				break;			}			gh:			if (ev->x > ' ' && ev->x < 0x100) for (i = 0; i < dlg->n; i++)				if (dlg->dlg->items[i].type == D_BUTTON && upcase(_(dlg->dlg->items[i].text, term)[0]) == upcase(ev->x)) {					sel:					if (dlg->selected != i) {						display_dlg_item(dlg, &dlg->items[dlg->selected], 0);						display_dlg_item(dlg, &dlg->items[i], 1);						dlg->selected = i;					}					dlg_select_item(dlg, &dlg->items[i]);					goto bla;			}			if (ev->x == KBD_ENTER) for (i = 0; i < dlg->n; i++)				if (dlg->dlg->items[i].type == D_BUTTON && dlg->dlg->items[i].gid & B_ENTER) goto sel;			if (ev->x == KBD_ESC) for (i = 0; i < dlg->n; i++)				if (dlg->dlg->items[i].type == D_BUTTON && dlg->dlg->items[i].gid & B_ESC) goto sel;			if ((ev->x == KBD_TAB && !ev->y) || ev->x == KBD_DOWN || ev->x == KBD_RIGHT) {				display_dlg_item(dlg, &dlg->items[dlg->selected], 0);				if ((++dlg->selected) >= dlg->n) dlg->selected = 0;				display_dlg_item(dlg, &dlg->items[dlg->selected], 1);				redraw_from_window(dlg->win);				break;			}			if ((ev->x == KBD_TAB && ev->y) || ev->x == KBD_UP || ev->x == KBD_LEFT) {				display_dlg_item(dlg, &dlg->items[dlg->selected], 0);				if ((--dlg->selected) < 0) dlg->selected = dlg->n - 1;				display_dlg_item(dlg, &dlg->items[dlg->selected], 1);				redraw_from_window(dlg->win);				break;			}			break;		case EV_ABORT:			/* Moved this line up so that the dlg would have access to its 				member vars before they get freed. */ 			if (dlg->dlg->abort) dlg->dlg->abort(dlg);			for (i = 0; i < dlg->n; i++) {				struct dialog_item_data *di = &dlg->items[i];				if (di->cdata) mem_free(di->cdata);				free_list(di->history);			}			freeml(dlg->ml);	}	bla:;}int check_number(struct dialog_data *dlg, struct dialog_item_data *di){	unsigned char *end;	long l = strtol(di->cdata, (char **)(void *)&end, 10);	if (!*di->cdata || *end) {		msg_box(dlg->win->term, NULL, TEXT(T_BAD_NUMBER), AL_CENTER, TEXT(T_NUMBER_EXPECTED), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC);		return 1;	}	if (l < di->item->gid || l > di->item->gnum) {		msg_box(dlg->win->term, NULL, TEXT(T_BAD_NUMBER), AL_CENTER, TEXT(T_NUMBER_OUT_OF_RANGE), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC);		return 1;	}	return 0;}int check_nonempty(struct dialog_data *dlg, struct dialog_item_data *di){	unsigned char *p;	for (p = di->cdata; *p; p++) if (*p > ' ') return 0;	msg_box(dlg->win->term, NULL, TEXT(T_BAD_STRING), AL_CENTER, TEXT(T_EMPTY_STRING_NOT_ALLOWED), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC);	return 1;}int cancel_dialog(struct dialog_data *dlg, struct dialog_item_data *di){	/*struct dialog *dl = dlg->dlg;*/	delete_window(dlg->win);	/*mem_free(dl);*/	return 0;}int check_dialog(struct dialog_data *dlg){	int i;	for (i = 0; i < dlg->n; i++)		if (dlg->dlg->items[i].type == D_CHECKBOX || dlg->dlg->items[i].type == D_FIELD || dlg->dlg->items[i].type == D_FIELD_PASS)			if (dlg->dlg->items[i].fn && dlg->dlg->items[i].fn(dlg, &dlg->items[i])) {				dlg->selected = i;				redraw_dialog(dlg);				return 1;			}	return 0;}int ok_dialog(struct dialog_data *dlg, struct dialog_item_data *di){	int i;	void (*fn)(void *) = dlg->dlg->refresh;	void *data = dlg->dlg->refresh_data;	if (check_dialog(dlg)) return 1;	for (i = 0; i < dlg->n; i++)		memcpy(dlg->dlg->items[i].data, dlg->items[i].cdata, dlg->dlg->items[i].dlen);	if (fn) fn(data);	i = cancel_dialog(dlg, di);	return i;}void center_dlg(struct dialog_data *dlg){	dlg->x = (dlg->win->term->x - dlg->xw) / 2;	dlg->y = (dlg->win->term->y - dlg->yw) / 2;}void draw_dlg(struct dialog_data *dlg){	fill_area(dlg->win->term, dlg->x, dlg->y, dlg->xw, dlg->yw, COLOR_DIALOG);}void max_text_width(struct terminal *term, unsigned char *text, int *width){	text = _(text, term);	do {		int c = 0;		while (*text && *text != '\n') text++, c++;		if (c > *width) *width = c;	} while (*(text++));}void min_text_width(struct terminal *term, unsigned char *text, int *width){	text = _(text, term);	do {		int c = 0;		while (*text && *text != '\n' && *text != ' ') text++, c++;		if (c > *width) *width = c;	} while (*(text++));}void dlg_format_text(struct terminal *term, struct terminal *t2, unsigned char *text, int x, int *y, int w, int *rw, int co, int align){	text = _(text, t2);	do {		unsigned char *tx;		unsigned char *tt = text;		int s;		int xx = x;		do {			while (*text && *text != '\n' && *text != ' ') {				/*if (term) set_char(term, xx, *y, co | *text);*/				text++, xx++;			}			tx = ++text;			xx++;			if (*(text - 1) != ' ') break;			while (*tx && *tx != '\n' && *tx != ' ') tx++;		} while (tx - text + xx - x <= w);		s = (align & AL_MASK) == AL_CENTER ? (w - (xx - 1 - x)) / 2 : 0;		if (s < 0) s = 0;		while (tt < text - 1) {			if (s >= w) {				s = 0, (*y)++;				if (rw) *rw = w;				rw = NULL;			}			if (term) set_char(term, x + s, *y, co | *tt);			s++, tt++;		}		if (rw && xx - 1 - x > *rw) *rw = xx - 1 - x;		(*y)++;	} while (*(text - 1));}void max_buttons_width(struct terminal *term, struct dialog_item_data *butt, int n, int *width){	int w = -2;	int i;	for (i = 0; i < n; i++) w += strlen(_((butt++)->item->text, term)) + 6;	if (w > *width) *width = w;}void min_buttons_width(struct terminal *term, struct dialog_item_data *butt, int n, int *width){	int i;	for (i = 0; i < n; i++) {		int w = strlen(_((butt++)->item->text, term)) + 4;		if (w > *width) *width = w;	}}void dlg_format_buttons(struct terminal *term, struct terminal *t2, struct dialog_item_data *butt, int n, int x, int *y, int w, int *rw, int align){	int i1 = 0;	while (i1 < n) {		int i2 = i1 + 1;		int mw;		while (i2 < n) {			mw = 0;			max_buttons_width(t2, butt + i1, i2 - i1 + 1, &mw);			if (mw <= w) i2++;			else break;		}		mw = 0;		max_buttons_width(t2, butt + i1, i2 - i1, &mw);		if (rw && mw > *rw) if ((*rw = mw) > w) *rw = w;		if (term) {			int i;			int p = x + ((align & AL_MASK) == AL_CENTER ? (w - mw) / 2 : 0);			for (i = i1; i < i2; i++) {				butt[i].x = p;				butt[i].y = *y;				p += (butt[i].l = strlen(_(butt[i].item->text, t2)) + 4) + 2;			}		}		*y += 2;		i1 = i2;	}}void dlg_format_checkbox(struct terminal *term, struct terminal *t2, struct dialog_item_data *chkb, int x, int *y, int w, int *rw, unsigned char *text){	if (term) {		chkb->x = x;		chkb->y = *y;	}	if (rw) *rw -= 4;	dlg_format_text(term, t2, text, x + 4, y, w - 4, rw, COLOR_DIALOG_CHECKBOX_TEXT, AL_LEFT);	if (rw) *rw += 4;}void dlg_format_checkboxes(struct terminal *term, struct terminal *t2, struct dialog_item_data *chkb, int n, int x, int *y, int w, int *rw, unsigned char **texts){	while (n) {		dlg_format_checkbox(term, t2, chkb, x, y, w, rw, _(texts[0], t2));		texts++; chkb++; n--;	}}void checkboxes_width(struct terminal *term, unsigned char **texts, int *w, void (*fn)(struct terminal *, unsigned char *, int *)){	while (texts[0]) {		*w -= 4;		fn(term, _(texts[0], term), w);		*w += 4;		texts++;	}}void dlg_format_field(struct terminal *term, struct terminal *t2, struct dialog_item_data *item, int x, int *y, int w, int *rw, int align){	item->x = x;	item->y = *y;	item->l = w;	/*if ((item->l = w) > item->item->dlen - 1) item->l = item->item->dlen - 1;*/	if (rw && item->l > *rw) if ((*rw = item->l) > w) *rw = w;	(*y)++;}/* Layout for generic boxes */void dlg_format_box(struct terminal *term, struct terminal *t2, struct dialog_item_data *item, int x, int *y, int w, int *rw, int align) {	item->x = x;	item->y = *y;	item->l = w;	if (rw && item->l > *rw) if ((*rw = item->l) > w) *rw = w;	(*y) += item->item->gid;}void max_group_width(struct terminal *term, unsigned char **texts, struct dialog_item_data *item, int n, int *w){	int ww = 0;	while (n--) {		int wx = item->item->type == D_CHECKBOX ? 4 : item->item->type == D_BUTTON ? strlen(_(item->item->text, term)) + 5 : (size_t)item->item->dlen + 1;		wx += strlen(_(texts[0], term));		if (n) wx++;		ww += wx;		texts++;		item++;	}	if (ww > *w) *w = ww;}void min_group_width(struct terminal *term, unsigned char **texts, struct dialog_item_data *item, int n, int *w){	while (n--) {		int wx = item->item->type == D_CHECKBOX ? 4 : item->item->type == D_BUTTON ? strlen(_(item->item->text, term)) + 5 : (size_t)item->item->dlen + 1;		wx += strlen(_(texts[0], term));		if (wx > *w) *w = wx;		texts++;		item++;	}}void dlg_format_group(struct terminal *term, struct terminal *t2, unsigned char **texts, struct dialog_item_data *item, int n, int x, int *y, int w, int *rw){	int nx = 0;	while (n--) {		int sl;		int wx = item->item->type == D_CHECKBOX ? 4 : item->item->type == D_BUTTON ? strlen(_(item->item->text, t2)) + 5 : (size_t)item->item->dlen + 1;		if (_(texts[0], t2)[0]) sl = strlen(_(texts[0], t2));		else sl = -1;		wx += sl;		if (nx && nx + wx > w) {			nx = 0;			(*y) += 2;		}		if (term) {			print_text(term, x + nx + 4 * (item->item->type == D_CHECKBOX), *y, strlen(_(texts[0], t2)), _(texts[0], t2), COLOR_DIALOG_TEXT);			item->x = x + nx + (sl + 1) * (item->item->type != D_CHECKBOX);			item->y = *y;			if (item->item->type == D_FIELD || item->item->type == D_FIELD_PASS) item->l = item->item->dlen;		}		if (rw && nx + wx > *rw) if ((*rw = nx + wx) > w) *rw = w;		nx += wx + 1;		texts++;		item++;	}	(*y)++;}void checkbox_list_fn(struct dialog_data *dlg){	struct terminal *term = dlg->win->term;	int max = 0, min = 0;	int w, rw;	int y = 0;

⌨️ 快捷键说明

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