Use flags for input callback instead of a single int done so the

callback can be told about cursor movement in an incremental prompt.
This commit is contained in:
nicm
2026-06-23 20:07:58 +00:00
parent de086f9848
commit c0a5e10313
7 changed files with 53 additions and 39 deletions

View File

@@ -670,9 +670,10 @@ static enum cmd_retval
status_prompt_accept(__unused struct cmdq_item *item, void *data)
{
struct client *c = data;
void *pd = c->prompt_data;
if (c->prompt_string != NULL) {
c->prompt_inputcb(c, c->prompt_data, "y", 1);
c->prompt_inputcb(c, pd, "y", KEYC_NONE, PROMPT_INPUT_DONE);
status_prompt_clear(c);
}
return (CMD_RETURN_NORMAL);
@@ -735,7 +736,7 @@ status_prompt_set(struct client *c, struct cmd_find_state *fs,
c->flags |= CLIENT_REDRAWSTATUS;
if (flags & PROMPT_INCREMENTAL)
c->prompt_inputcb(c, c->prompt_data, "=", 0);
c->prompt_inputcb(c, data, "=", KEYC_NONE, 0);
if ((flags & PROMPT_SINGLE) && (flags & PROMPT_ACCEPT))
cmdq_append(c, cmdq_get_callback(status_prompt_accept, c));
@@ -1440,20 +1441,34 @@ status_prompt_incremental_exit_key(key_code key)
return (0);
}
/* Fire input callback when done. */
static int
status_prompt_done(struct client *c, const char *s)
{
struct prompt_data *pd = c->prompt_data;
if (c->prompt_inputcb(c, pd, s, KEYC_NONE, PROMPT_INPUT_DONE) == 0) {
status_prompt_clear(c);
return (0);
}
return (1);
}
/* Handle keys in prompt. */
int
status_prompt_key(struct client *c, key_code key)
{
struct prompt_data *pd = c->prompt_data;
struct options *oo = c->session->options;
char *s, *cp, prefix = '=';
const char *histstr, *separators = NULL, *keystring;
const char *histstr, *separators = NULL, *ks;
size_t size, idx;
struct utf8_data tmp;
int keys, word_is_separators;
if (c->prompt_flags & PROMPT_KEY) {
keystring = key_string_lookup_key(key, 0);
c->prompt_inputcb(c, c->prompt_data, keystring, 1);
ks = key_string_lookup_key(key, 0);
c->prompt_inputcb(c, pd, ks, KEYC_NONE, PROMPT_INPUT_DONE);
status_prompt_clear(c);
return (0);
}
@@ -1466,7 +1481,7 @@ status_prompt_key(struct client *c, key_code key)
if (key >= '0' && key <= '9')
goto append_key;
s = utf8_tocstr(c->prompt_buffer);
c->prompt_inputcb(c, c->prompt_data, s, 1);
c->prompt_inputcb(c, pd, s, KEYC_NONE, PROMPT_INPUT_DONE);
status_prompt_clear(c);
free(s);
return (1);
@@ -1501,10 +1516,11 @@ process_key:
if ((c->prompt_flags & PROMPT_INCREMENTAL) &&
status_prompt_incremental_exit_key(key)) {
s = utf8_tocstr(c->prompt_buffer);
c->prompt_inputcb(c, c->prompt_data, s, 1);
status_prompt_clear(c);
free(s);
return (1);
if (status_prompt_done(c, s) == 0) {
free(s);
return (1);
}
return (0);
}
switch (key) {
@@ -1543,8 +1559,7 @@ process_key:
case KEYC_BSPACE:
case 'h'|KEYC_CTRL:
if (c->prompt_flags & PROMPT_BSPACE_EXIT && size == 0) {
if (c->prompt_inputcb(c, c->prompt_data, NULL, 1) == 0)
status_prompt_clear(c);
status_prompt_done(c, NULL);
break;
}
if (c->prompt_index != 0) {
@@ -1689,16 +1704,14 @@ process_key:
s = utf8_tocstr(c->prompt_buffer);
if (*s != '\0')
status_prompt_add_history(s, c->prompt_type);
if (c->prompt_inputcb(c, c->prompt_data, s, 1) == 0)
status_prompt_clear(c);
status_prompt_done(c, s);
free(s);
break;
case '\033': /* Escape */
case '['|KEYC_CTRL:
case 'c'|KEYC_CTRL:
case 'g'|KEYC_CTRL:
if (c->prompt_inputcb(c, c->prompt_data, NULL, 1) == 0)
status_prompt_clear(c);
status_prompt_done(c, NULL);
break;
case 'r'|KEYC_CTRL:
if (~c->prompt_flags & PROMPT_INCREMENTAL)
@@ -1763,8 +1776,7 @@ append_key:
status_prompt_clear(c);
else {
s = utf8_tocstr(c->prompt_buffer);
if (c->prompt_inputcb(c, c->prompt_data, s, 1) == 0)
status_prompt_clear(c);
status_prompt_done(c, s);
free(s);
}
}
@@ -1774,7 +1786,7 @@ changed:
if (c->prompt_flags & PROMPT_INCREMENTAL) {
s = utf8_tocstr(c->prompt_buffer);
xasprintf(&cp, "%c%s", prefix, s);
c->prompt_inputcb(c, c->prompt_data, cp, 0);
c->prompt_inputcb(c, pd, cp, KEYC_NONE, 0);
free(cp);
free(s);
}