static const char *prompt_esc(Vis *vis, const char *keys, const Arg *arg) { Win *prompt = vis->win; if (view_cursors_multiple(prompt->view)) { view_cursors_clear(prompt->view); } else { prompt_restore(prompt); prompt_hide(prompt); } return keys; }
static const char *prompt_enter(Vis *vis, const char *keys, const Arg *arg) { Win *prompt = vis->win; View *view = prompt->view; Text *txt = prompt->file->text; Win *win = prompt->parent; char *cmd = NULL; Filerange range = view_selection_get(view); if (!text_range_valid(&range)) range = text_object_line(txt, view_cursor_get(view)); if (text_range_valid(&range)) cmd = text_bytes_alloc0(txt, range.start, text_range_size(&range)); if (!win || !cmd) { vis_info_show(vis, "Prompt window invalid\n"); prompt_restore(prompt); prompt_hide(prompt); free(cmd); return keys; } size_t len = strlen(cmd); if (len > 0 && cmd[len-1] == '\n') cmd[len-1] = '\0'; bool lastline = (range.end == text_size(txt)); prompt_restore(prompt); if (vis_prompt_cmd(vis, cmd)) { prompt_hide(prompt); if (!lastline) { text_delete(txt, range.start, text_range_size(&range)); text_appendf(txt, "%s\n", cmd); } } else { vis->win = prompt; vis->mode = &vis_modes[VIS_MODE_INSERT]; } free(cmd); vis_draw(vis); return keys; }
static void prompt_run_callback(ObPrompt *self, gint result) { prompt_ref(self); if (self->func) { gboolean clean = self->func(self, self->focus->result, self->data); if (clean && self->cleanup) self->cleanup(self, self->data); } prompt_hide(self); prompt_unref(self); }
static const char *prompt_backspace(Vis *vis, const char *keys, const Arg *arg) { Win *prompt = vis->win; Text *txt = prompt->file->text; size_t size = text_size(txt); size_t pos = view_cursor_get(prompt->view); char c; if (pos == size && (pos == 1 || (size >= 2 && text_byte_get(txt, size-2, &c) && c == '\n'))) { prompt_restore(prompt); prompt_hide(prompt); } else { vis_operator(vis, VIS_OP_DELETE); vis_motion(vis, VIS_MOVE_CHAR_PREV); } return keys; }
void prompt_unref(ObPrompt *self) { if (self && --self->ref == 0) { gint i; if (self->mapped) prompt_hide(self); prompt_list = g_list_remove(prompt_list, self); obt_keyboard_context_unref(self->ic); for (i = 0; i < self->n_buttons; ++i) { window_remove(self->button[i].window); XDestroyWindow(obt_display, self->button[i].window); } XDestroyWindow(obt_display, self->msg.window); XDestroyWindow(obt_display, self->super.window); g_slice_free(ObPrompt, self); } }