commit - 0d82c695b43613c6508e266c083e619188143d6d
commit + dfd1efcc0cf22803275753d2e0b80b9a4ef8b3b0
blob - 04250afb914714d4ed340644da020f3da8c3479e
blob + 5166bb92007b10bf358f59ffe7e3566e82816bed
--- cmd.c
+++ cmd.c
void
cmd_execute_extended_command(struct buffer *buffer)
{
- size_t len;
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = eecmd_select,
+ .abort = exit_minibuffer,
+ .history = eecmd_history,
+ .complfn = compl_eecmd,
+ .must_select = 1,
+ };
GUARD_RECURSIVE_MINIBUFFER();
- enter_minibuffer(sensible_self_insert, eecmd_select, exit_minibuffer,
- eecmd_history, compl_eecmd, NULL, 1);
-
- len = sizeof(ministate.prompt);
- strlcpy(ministate.prompt, "", len);
-
- if (thiskey.meta)
- strlcat(ministate.prompt, "M-", len);
-
- strlcat(ministate.prompt, ui_keyname(thiskey.key), len);
-
- if (thiskey.meta)
- strlcat(ministate.prompt, " ", len);
+ enter_minibuffer(&m, "%s%s%s", thiskey.meta ? "M-" : "",
+ ui_keyname(thiskey.key), thiskey.meta ? " " : "");
}
void
void
cmd_tab_select(struct buffer *buffer)
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = ts_select,
+ .abort = exit_minibuffer,
+ .complfn = compl_ts,
+ .must_select = 1,
+ };
+
GUARD_RECURSIVE_MINIBUFFER();
- enter_minibuffer(sensible_self_insert, ts_select, exit_minibuffer,
- NULL, compl_ts, NULL, 1);
- strlcpy(ministate.prompt, "Select tab: ", sizeof(ministate.prompt));
+ enter_minibuffer(&m, "Select tab: ");
}
void
cmd_load_url(struct buffer *buffer)
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = lu_select,
+ .abort = exit_minibuffer,
+ .history = lu_history,
+ .complfn = compl_lu,
+ };
+
GUARD_RECURSIVE_MINIBUFFER();
- enter_minibuffer(sensible_self_insert, lu_select, exit_minibuffer,
- lu_history, compl_lu, NULL, 0);
- strlcpy(ministate.prompt, "Load URL: ", sizeof(ministate.prompt));
+ enter_minibuffer(&m, "Load URL: ");
}
void
cmd_load_current_url(struct buffer *buffer)
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = lu_select,
+ .abort = exit_minibuffer,
+ .history = lu_history,
+ .complfn = compl_lu,
+ .input = hist_cur(current_tab->hist),
+ };
+
GUARD_RECURSIVE_MINIBUFFER();
- enter_minibuffer(sensible_self_insert, lu_select, exit_minibuffer,
- lu_history, compl_lu, NULL, 0);
- strlcpy(ministate.prompt, "Load URL: ", sizeof(ministate.prompt));
- strlcpy(ministate.buf, hist_cur(current_tab->hist), sizeof(ministate.buf));
- ministate.buffer.cpoff = utf8_cplen(ministate.buf);
+ enter_minibuffer(&m, "Load URL: ");
}
void
void
cmd_bookmark_page(struct buffer *buffer)
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = bp_select,
+ .abort = exit_minibuffer,
+ .input = hist_cur(current_tab->hist),
+ };
+
GUARD_RECURSIVE_MINIBUFFER();
- enter_minibuffer(sensible_self_insert, bp_select, exit_minibuffer, NULL,
- NULL, NULL, 0);
- strlcpy(ministate.prompt, "Bookmark URL: ", sizeof(ministate.prompt));
- strlcpy(ministate.buf, hist_cur(current_tab->hist),
- sizeof(ministate.buf));
- ministate.buffer.cpoff = utf8_cplen(ministate.buf);
+ enter_minibuffer(&m, "Bookmark URL: ");
}
void
cmd_link_select(struct buffer *buffer)
{
struct line *l;
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = ls_select,
+ .abort = exit_minibuffer,
+ .complfn = compl_ls,
+ .compldata = NULL,
+ .must_select = 1,
+ };
GUARD_RECURSIVE_MINIBUFFER();
return;
}
- enter_minibuffer(sensible_self_insert, ls_select, exit_minibuffer,
- NULL, compl_ls, l, 1);
- strlcpy(ministate.prompt, "Select link: ", sizeof(ministate.prompt));
+ m.compldata = l;
+ enter_minibuffer(&m, "Select link: ");
}
void
cmd_swiper(struct buffer *buffer)
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = swiper_select,
+ .abort = exit_minibuffer,
+ .complfn = compl_swiper,
+ .compldata = TAILQ_FIRST(&buffer->head),
+ .must_select = 1,
+ };
+
GUARD_RECURSIVE_MINIBUFFER();
- enter_minibuffer(sensible_self_insert, swiper_select, exit_minibuffer,
- NULL, compl_swiper, TAILQ_FIRST(&buffer->head), 1);
- strlcpy(ministate.prompt, "Select line: ", sizeof(ministate.prompt));
+ enter_minibuffer(&m, "Select line: ");
}
void
cmd_toc(struct buffer *buffer)
{
struct line *l;
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = toc_select,
+ .abort = exit_minibuffer,
+ .complfn = compl_toc,
+ .compldata = NULL,
+ .must_select = 1,
+ };
GUARD_RECURSIVE_MINIBUFFER();
return;
}
- enter_minibuffer(sensible_self_insert, toc_select, exit_minibuffer,
- NULL, compl_toc, l, 1);
- strlcpy(ministate.prompt, "Select heading: ",
- sizeof(ministate.prompt));
+ m.compldata = l;
+ enter_minibuffer(&m, "Select heading: ");
}
void
void
cmd_use_certificate(struct buffer *buffer)
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = uc_select,
+ .abort = exit_minibuffer,
+ .complfn = compl_uc,
+ .must_select = 1,
+ };
+
GUARD_RECURSIVE_MINIBUFFER();
- enter_minibuffer(sensible_self_insert, uc_select, exit_minibuffer,
- NULL, compl_uc, NULL, 1);
- strlcpy(ministate.prompt, "Select certificate: ",
- sizeof(ministate.prompt));
+ enter_minibuffer(&m, "Select certificate: ");
}
void
void
cmd_search(struct buffer *buffer)
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = search_select,
+ .abort = exit_minibuffer,
+ };
+
GUARD_RECURSIVE_MINIBUFFER();
if (!strncmp(default_search_engine, "gopher://", 9)) {
return;
}
- enter_minibuffer(sensible_self_insert, search_select, exit_minibuffer, NULL,
- NULL, NULL, 0);
- strlcpy(ministate.prompt, "Search: ", sizeof(ministate.prompt));
+ enter_minibuffer(&m, "Search: ");
}
void
blob - d9af26cdb424daf1902c40e14b41286b33ac513c
blob + aa66579f5a6e60003957fce42c917fd2e491c48a
--- minibuffer.c
+++ minibuffer.c
}
void
-enter_minibuffer(void (*self_insert_fn)(void), void (*donefn)(const char *),
- void (*abortfn)(void), struct hist *hist,
- complfn *complfn, void *compldata, int must_select)
+enter_minibuffer(struct minibuffer *minibuffer, const char *fmt, ...)
{
- ministate.compl.must_select = must_select;
- ministate.compl.fn = complfn;
- ministate.compl.data = compldata;
+ va_list ap;
- in_minibuffer = complfn == NULL ? MB_READ : MB_COMPREAD;
+ va_start(ap, fmt);
+ vsnprintf(ministate.prompt, sizeof(ministate.prompt), fmt, ap);
+ va_end(ap);
+
+ ministate.compl.must_select = minibuffer->must_select;
+ ministate.compl.fn = minibuffer->complfn;
+ ministate.compl.data = minibuffer->compldata;
+
+ in_minibuffer = minibuffer->complfn == NULL ? MB_READ : MB_COMPREAD;
if (in_minibuffer == MB_COMPREAD) {
- populate_compl_buffer(complfn, compldata);
+ populate_compl_buffer(minibuffer->complfn,
+ minibuffer->compldata);
ui_schedule_redraw();
}
base_map = &minibuffer_map;
current_map = &minibuffer_map;
- base_map->unhandled_input = self_insert_fn;
+ base_map->unhandled_input = minibuffer->self_insert;
- ministate.donefn = donefn;
- ministate.abortfn = abortfn;
- memset(ministate.buf, 0, sizeof(ministate.buf));
+ ministate.donefn = minibuffer->done;
+ ministate.abortfn = minibuffer->abort;
+
+ ministate.buffer.cpoff = 0;
+ if (minibuffer->input) {
+ strlcpy(ministate.buf, minibuffer->input,
+ sizeof(ministate.buf));
+ ministate.vline.cplen = utf8_cplen(ministate.buf);
+ ministate.buffer.cpoff = ministate.vline.cplen;
+ } else {
+ ministate.buf[0] = '\0';
+ ministate.vline.cplen = ministate.buffer.cpoff = 0;
+ }
+
ministate.buffer.current_line = &ministate.vline;
ministate.buffer.current_line->parent->line = ministate.buf;
- ministate.buffer.cpoff = 0;
- strlcpy(ministate.buf, "", sizeof(ministate.prompt));
ministate.editing = 1;
- ministate.hist = hist;
+ ministate.hist = minibuffer->history;
if (ministate.hist)
hist_seek_start(ministate.hist);
}
void
yornp(const char *prompt, void (*fn)(int, void*), void *data)
{
- size_t len;
+ struct minibuffer m = {
+ .self_insert = yornp_self_insert,
+ .abort = yornp_abort,
+ };
if (in_minibuffer) {
fn(0, data);
yornp_cb = fn;
yornp_data = data;
- enter_minibuffer(yornp_self_insert, NULL,
- yornp_abort, NULL, NULL, NULL, 0);
-
- len = sizeof(ministate.prompt);
- strlcpy(ministate.prompt, prompt, len);
- strlcat(ministate.prompt, " (y or n) ", len);
+ enter_minibuffer(&m, "%s (y or n)", prompt);
}
void
minibuffer_read(const char *prompt, void (*fn)(const char *, struct tab *),
struct tab *data)
{
+ struct minibuffer m = {
+ .self_insert = read_self_insert,
+ .done = read_select,
+ .abort = read_abort,
+ .history = read_history,
+ };
+
if (in_minibuffer)
return;
read_cb = fn;
read_data = data;
- enter_minibuffer(read_self_insert, read_select, read_abort,
- read_history, NULL, NULL, 0);
-
- snprintf(ministate.prompt, sizeof(ministate.prompt), "%s: ", prompt);
+ enter_minibuffer(&m, "%s: ", prompt);
}
static void
blob - 3fbe22ac1c77f2531259668025199b8cb445025c
blob + 04aeaaa88d5ea7084fa21ef8f7debb4a59195fb9
--- minibuffer.h
+++ minibuffer.h
void uc_select(const char *);
void search_select(const char *);
-void enter_minibuffer(void(*)(void), void(*)(const char *), void(*)(void),
- struct hist *, complfn *, void *, int);
+struct minibuffer {
+ void (*self_insert)(void);
+ void (*done)(const char *);
+ void (*abort)(void);
+ struct hist *history;
+ complfn *complfn;
+ void *compldata;
+ int must_select;
+ const char *input;
+};
+void enter_minibuffer(struct minibuffer *, const char *, ...);
+
void exit_minibuffer(void);
void yornp(const char *, void (*)(int, void *), void *);
blob - 3d80b3f3f90db230627a5809a6ffa98ec5f41a27
blob + 941159cefca7f3fa6b04a98b83403efecdcbd827
--- ui.c
+++ ui.c
void
ui_require_input(struct tab *tab, int hide, void (*fn)(const char *))
{
+ struct minibuffer m = {
+ .self_insert = sensible_self_insert,
+ .done = fn,
+ .abort = exit_minibuffer,
+ .history = ir_history,
+ };
+
/* TODO: hard-switching to another tab is ugly */
switch_to_tab(tab);
- enter_minibuffer(sensible_self_insert, fn, exit_minibuffer,
- ir_history, NULL, NULL, 0);
- strlcpy(ministate.prompt, "Input required: ",
- sizeof(ministate.prompt));
+ enter_minibuffer(&m, "Input required: ");
redraw_tab(tab);
}