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

📄 inpfield.c

📁 一个很有名的浏览器
💻 C
📖 第 1 页 / 共 2 页
字号:
			}			return EVENT_PROCESSED;		case B_WHEEL_DOWN:			if (check_mouse_action(ev, B_DOWN) &&			    (void *) widget_data->info.field.cur_hist != &widget_data->info.field.history) {				widget_data->info.field.cur_hist = widget_data->info.field.cur_hist->next;				dlg_set_history(widget_data);				select_widget(dlg_data, widget_data);			}			return EVENT_PROCESSED;	}	widget_data->info.field.cpos = widget_data->info.field.vpos				     + ev->info.mouse.x - widget_data->box.x;	int_upper_bound(&widget_data->info.field.cpos, strlen(widget_data->cdata));	select_widget(dlg_data, widget_data);	return EVENT_PROCESSED;}static t_handler_event_statuskbd_field(struct dialog_data *dlg_data, struct widget_data *widget_data){	struct window *win = dlg_data->win;	struct terminal *term = win->term;	struct term_event *ev = dlg_data->term_event;	switch (kbd_action(KEYMAP_EDIT, ev, NULL)) {		case ACT_EDIT_UP:			if (!widget_has_history(widget_data))				return EVENT_NOT_PROCESSED;			if ((void *) widget_data->info.field.cur_hist->prev != &widget_data->info.field.history) {				widget_data->info.field.cur_hist = widget_data->info.field.cur_hist->prev;				dlg_set_history(widget_data);				goto display_field;			}			break;		case ACT_EDIT_DOWN:			if (!widget_has_history(widget_data))				return EVENT_NOT_PROCESSED;			if ((void *) widget_data->info.field.cur_hist != &widget_data->info.field.history) {				widget_data->info.field.cur_hist = widget_data->info.field.cur_hist->next;				dlg_set_history(widget_data);				goto display_field;			}			break;		case ACT_EDIT_RIGHT:			if (widget_data->info.field.cpos < strlen(widget_data->cdata))				widget_data->info.field.cpos++;			goto display_field;		case ACT_EDIT_LEFT:			if (widget_data->info.field.cpos > 0)				widget_data->info.field.cpos--;			goto display_field;		case ACT_EDIT_HOME:			widget_data->info.field.cpos = 0;			goto display_field;		case ACT_EDIT_END:			widget_data->info.field.cpos = strlen(widget_data->cdata);			goto display_field;		case ACT_EDIT_BACKSPACE:			if (widget_data->info.field.cpos) {				memmove(widget_data->cdata + widget_data->info.field.cpos - 1,					widget_data->cdata + widget_data->info.field.cpos,					strlen(widget_data->cdata) - widget_data->info.field.cpos + 1);				widget_data->info.field.cpos--;			}			goto display_field;		case ACT_EDIT_DELETE:			{				int cdata_len = strlen(widget_data->cdata);				if (widget_data->info.field.cpos >= cdata_len) goto display_field;				memmove(widget_data->cdata + widget_data->info.field.cpos,					widget_data->cdata + widget_data->info.field.cpos + 1,					cdata_len - widget_data->info.field.cpos + 1);				goto display_field;			}		case ACT_EDIT_KILL_TO_BOL:			memmove(widget_data->cdata,					widget_data->cdata + widget_data->info.field.cpos,					strlen(widget_data->cdata + widget_data->info.field.cpos) + 1);			widget_data->info.field.cpos = 0;			goto display_field;		case ACT_EDIT_KILL_TO_EOL:			widget_data->cdata[widget_data->info.field.cpos] = 0;			goto display_field;		case ACT_EDIT_COPY_CLIPBOARD:			/* Copy to clipboard */			set_clipboard_text(widget_data->cdata);			return EVENT_PROCESSED;		case ACT_EDIT_CUT_CLIPBOARD:			/* Cut to clipboard */			set_clipboard_text(widget_data->cdata);			widget_data->cdata[0] = 0;			widget_data->info.field.cpos = 0;			goto display_field;		case ACT_EDIT_PASTE_CLIPBOARD:			{				/* Paste from clipboard */				unsigned char *clipboard = get_clipboard_text();				if (!clipboard) goto display_field;				safe_strncpy(widget_data->cdata, clipboard, widget_data->widget->datalen);				widget_data->info.field.cpos = strlen(widget_data->cdata);				mem_free(clipboard);				goto display_field;			}		case ACT_EDIT_AUTO_COMPLETE:			if (!widget_has_history(widget_data))				return EVENT_NOT_PROCESSED;			do_tab_compl(dlg_data, &widget_data->info.field.history);			goto display_field;		case ACT_EDIT_AUTO_COMPLETE_UNAMBIGUOUS:			if (!widget_has_history(widget_data))				return EVENT_NOT_PROCESSED;			do_tab_compl_unambiguous(dlg_data, &widget_data->info.field.history);			goto display_field;		case ACT_EDIT_REDRAW:			redraw_terminal_cls(term);			return EVENT_PROCESSED;		default:			if (check_kbd_textinput_key(ev)) {				unsigned char *text = widget_data->cdata;				int textlen = strlen(text);				if (textlen >= widget_data->widget->datalen - 1)					goto display_field;				/* Shift to position of the cursor */				textlen -= widget_data->info.field.cpos;				text	+= widget_data->info.field.cpos++;				memmove(text + 1, text, textlen + 1);				*text = get_kbd_key(ev);				goto display_field;			}	}	return EVENT_NOT_PROCESSED;display_field:	display_widget(dlg_data, widget_data);	redraw_from_window(dlg_data->win);	return EVENT_PROCESSED;}static t_handler_event_statusclear_field(struct dialog_data *dlg_data, struct widget_data *widget_data){	widget_data->info.field.cpos = 0;	if (widget_data->widget->datalen)		memset(widget_data->cdata, 0, widget_data->widget->datalen);	return EVENT_PROCESSED;}struct widget_ops field_ops = {	display_field,	init_field,	mouse_field,	kbd_field,	NULL,	clear_field,};struct widget_ops field_pass_ops = {	display_field_pass,	init_field,	mouse_field,	kbd_field,	NULL,	clear_field,};/* Input lines */static voidinput_line_layouter(struct dialog_data *dlg_data){	struct input_line *input_line = dlg_data->dlg->udata;	struct session *ses = input_line->ses;	struct window *win = dlg_data->win;	int y = win->term->height - 1		- ses->status.show_status_bar		- ses->status.show_tabs_bar;	dlg_format_field(win->term, dlg_data->widgets_data, 0,			 &y, win->term->width, NULL, ALIGN_LEFT);}static t_handler_event_statusinput_line_event_handler(struct dialog_data *dlg_data){	struct input_line *input_line = dlg_data->dlg->udata;	input_line_handler handler = input_line->handler;	enum edit_action action;	struct widget_data *widget_data = dlg_data->widgets_data;	struct term_event *ev = dlg_data->term_event;	/* Noodle time */	switch (ev->ev) {	case EVENT_KBD:		action = kbd_action(KEYMAP_EDIT, ev, NULL);		/* Handle some basic actions such as quiting for empty buffers */		switch (action) {		case ACT_EDIT_ENTER:		case ACT_EDIT_NEXT_ITEM:		case ACT_EDIT_PREVIOUS_ITEM:			if (widget_has_history(widget_data))				add_to_input_history(widget_data->widget->info.field.history,						     input_line->buffer, 1);			break;		case ACT_EDIT_BACKSPACE:			if (!*input_line->buffer)				goto cancel_input_line;			break;		case ACT_EDIT_CANCEL:			goto cancel_input_line;		default:			break;		}		/* First let the input field do its business */		kbd_field(dlg_data, widget_data);		break;	case EVENT_MOUSE:#ifdef CONFIG_MOUSE		if (ev->info.mouse.y != dlg_data->win->y) {			delete_window_ev(dlg_data->win, ev);			return EVENT_PROCESSED;		}#endif		return EVENT_NOT_PROCESSED;	case EVENT_REDRAW:		/* Try to catch the redraw event initiated by the history		 * completion and only respond if something was actually		 * updated. Meaning we have new data in the line buffer that		 * should be propagated to the line handler. */		if (!widget_has_history(widget_data)		    || widget_data->info.field.cpos <= 0		    || widget_data->info.field.cpos <= strlen(input_line->buffer))			return EVENT_NOT_PROCESSED;		/* Fall thru */	case EVENT_RESIZE:		action = ACT_EDIT_REDRAW;		break;	default:		return EVENT_NOT_PROCESSED;	}	update_dialog_data(dlg_data);send_action_to_handler:	/* Then pass it on to the specialized handler */	switch (handler(input_line, action)) {	case INPUT_LINE_CANCEL:cancel_input_line:		cancel_dialog(dlg_data, widget_data);		break;	case INPUT_LINE_REWIND:		/* This is stolen kbd_field() handling for ACT_EDIT_BACKSPACE */		memmove(widget_data->cdata + widget_data->info.field.cpos - 1,			widget_data->cdata + widget_data->info.field.cpos,			strlen(widget_data->cdata) - widget_data->info.field.cpos + 1);		widget_data->info.field.cpos--;		update_dialog_data(dlg_data);		goto send_action_to_handler;	case INPUT_LINE_PROCEED:		break;	}	/* Hack: We want our caller to perform its redrawing routine,	 * even if we did process the event here. */	if (action == ACT_EDIT_REDRAW) return EVENT_NOT_PROCESSED;	/* Completely bypass any further dialog event handling */	return EVENT_PROCESSED;}voidinput_field_line(struct session *ses, unsigned char *prompt, void *data,		 struct input_history *history, input_line_handler handler){	struct dialog *dlg;	unsigned char *buffer;	struct input_line *input_line;	assert(ses);	dlg = calloc_dialog(INPUT_LINE_WIDGETS, sizeof(*input_line));	if (!dlg) return;	input_line = (void *) get_dialog_offset(dlg, INPUT_LINE_WIDGETS);	input_line->ses = ses;	input_line->data = data;	input_line->handler = handler;	buffer = input_line->buffer;	dlg->handle_event = input_line_event_handler;	dlg->layouter = input_line_layouter;	dlg->layout.only_widgets = 1;	dlg->udata = input_line;	add_dlg_field_float2(dlg, prompt, 0, 0, NULL, INPUT_LINE_BUFFER_SIZE,			     buffer, history);	do_dialog(ses->tab->term, dlg, getml(dlg, NULL));}

⌨️ 快捷键说明

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