📄 inpfield.c
字号:
} 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 + -