version 1.165, 2017/05/03 05:53:34 |
version 1.166, 2017/05/17 15:20:23 |
|
|
/* Enable status line prompt. */ |
/* Enable status line prompt. */ |
void |
void |
status_prompt_set(struct client *c, const char *msg, const char *input, |
status_prompt_set(struct client *c, const char *msg, const char *input, |
int (*callbackfn)(void *, const char *, int), void (*freefn)(void *), |
prompt_input_cb inputcb, prompt_free_cb freecb, void *data, int flags) |
void *data, int flags) |
|
{ |
{ |
struct format_tree *ft; |
struct format_tree *ft; |
time_t t; |
time_t t; |
|
|
c->prompt_buffer = utf8_fromcstr(tmp); |
c->prompt_buffer = utf8_fromcstr(tmp); |
c->prompt_index = utf8_strlen(c->prompt_buffer); |
c->prompt_index = utf8_strlen(c->prompt_buffer); |
|
|
c->prompt_callbackfn = callbackfn; |
c->prompt_inputcb = inputcb; |
c->prompt_freefn = freefn; |
c->prompt_freecb = freecb; |
c->prompt_data = data; |
c->prompt_data = data; |
|
|
c->prompt_hindex = 0; |
c->prompt_hindex = 0; |
|
|
|
|
if ((flags & PROMPT_INCREMENTAL) && *tmp != '\0') { |
if ((flags & PROMPT_INCREMENTAL) && *tmp != '\0') { |
xasprintf(&cp, "=%s", tmp); |
xasprintf(&cp, "=%s", tmp); |
c->prompt_callbackfn(c->prompt_data, cp, 0); |
c->prompt_inputcb(c, c->prompt_data, cp, 0); |
free(cp); |
free(cp); |
} |
} |
|
|
|
|
if (c->prompt_string == NULL) |
if (c->prompt_string == NULL) |
return; |
return; |
|
|
if (c->prompt_freefn != NULL && c->prompt_data != NULL) |
if (c->prompt_freecb != NULL && c->prompt_data != NULL) |
c->prompt_freefn(c->prompt_data); |
c->prompt_freecb(c->prompt_data); |
|
|
free(c->prompt_string); |
free(c->prompt_string); |
c->prompt_string = NULL; |
c->prompt_string = NULL; |
|
|
if (key >= '0' && key <= '9') |
if (key >= '0' && key <= '9') |
goto append_key; |
goto append_key; |
s = utf8_tocstr(c->prompt_buffer); |
s = utf8_tocstr(c->prompt_buffer); |
c->prompt_callbackfn(c->prompt_data, s, 1); |
c->prompt_inputcb(c, c->prompt_data, s, 1); |
status_prompt_clear(c); |
status_prompt_clear(c); |
free(s); |
free(s); |
return (1); |
return (1); |
|
|
s = utf8_tocstr(c->prompt_buffer); |
s = utf8_tocstr(c->prompt_buffer); |
if (*s != '\0') |
if (*s != '\0') |
status_prompt_add_history(s); |
status_prompt_add_history(s); |
if (c->prompt_callbackfn(c->prompt_data, s, 1) == 0) |
if (c->prompt_inputcb(c, c->prompt_data, s, 1) == 0) |
status_prompt_clear(c); |
status_prompt_clear(c); |
free(s); |
free(s); |
break; |
break; |
case '\033': /* Escape */ |
case '\033': /* Escape */ |
case '\003': /* C-c */ |
case '\003': /* C-c */ |
if (c->prompt_callbackfn(c->prompt_data, NULL, 1) == 0) |
if (c->prompt_inputcb(c, c->prompt_data, NULL, 1) == 0) |
status_prompt_clear(c); |
status_prompt_clear(c); |
break; |
break; |
case '\022': /* C-r */ |
case '\022': /* C-r */ |
|
|
s = utf8_tocstr(c->prompt_buffer); |
s = utf8_tocstr(c->prompt_buffer); |
if (strlen(s) != 1) |
if (strlen(s) != 1) |
status_prompt_clear(c); |
status_prompt_clear(c); |
else if (c->prompt_callbackfn(c->prompt_data, s, 1) == 0) |
else if (c->prompt_inputcb(c, c->prompt_data, s, 1) == 0) |
status_prompt_clear(c); |
status_prompt_clear(c); |
free(s); |
free(s); |
} |
} |
|
|
if (c->prompt_flags & PROMPT_INCREMENTAL) { |
if (c->prompt_flags & PROMPT_INCREMENTAL) { |
s = utf8_tocstr(c->prompt_buffer); |
s = utf8_tocstr(c->prompt_buffer); |
xasprintf(&cp, "%c%s", prefix, s); |
xasprintf(&cp, "%c%s", prefix, s); |
c->prompt_callbackfn(c->prompt_data, cp, 0); |
c->prompt_inputcb(c, c->prompt_data, cp, 0); |
free(cp); |
free(cp); |
free(s); |
free(s); |
} |
} |