degesch: fix switching of buffers by command

Readline used to erase the new buffer's contents.

Defer processing.
This commit is contained in:
Přemysl Eric Janouch 2016-01-07 22:12:29 +01:00
parent a259e96405
commit 1d3910fd8e
1 changed files with 27 additions and 8 deletions

View File

@ -1532,6 +1532,9 @@ struct app_context
struct input input; ///< User interface struct input input; ///< User interface
struct poller_idle input_event; ///< Pending input event
struct str_vector pending_input; ///< Pending input lines
int *nick_palette; ///< A 256-color palette for nicknames int *nick_palette; ///< A 256-color palette for nicknames
size_t nick_palette_len; ///< Number of entries in nick_palette size_t nick_palette_len; ///< Number of entries in nick_palette
@ -1609,6 +1612,7 @@ app_context_init (struct app_context *self)
free (encoding); free (encoding);
input_init (&self->input); input_init (&self->input);
str_vector_init (&self->pending_input);
str_init (&self->input_buffer); str_init (&self->input_buffer);
self->nick_palette = self->nick_palette =
@ -1647,6 +1651,7 @@ app_context_free (struct app_context *self)
iconv_close (self->term_to_utf8); iconv_close (self->term_to_utf8);
input_free (&self->input); input_free (&self->input);
str_vector_free (&self->pending_input);
str_free (&self->input_buffer); str_free (&self->input_buffer);
free (self->editor_filename); free (self->editor_filename);
@ -11067,15 +11072,17 @@ on_readline_input (char *line)
if (*line) if (*line)
add_history (line); add_history (line);
// Normally, the text is deleted _afterwards_ // readline always erases the input line after returning from here,
rl_replace_line ("", false); // but we don't want that in order to allow correct buffer switching
process_input (ctx, line); str_vector_add_owned (&ctx->pending_input, line);
free (line); poller_idle_set (&ctx->input_event);
} }
else else
{ {
// Prevent readline from showing the prompt twice for w/e reason
input_hide (&ctx->input); input_hide (&ctx->input);
input_restore (&ctx->input); input_restore (&ctx->input);
input_ding (&ctx->input); input_ding (&ctx->input);
} }
@ -11324,10 +11331,9 @@ on_editline_return (EditLine *editline, int key)
// process_input() expects a multibyte string // process_input() expects a multibyte string
const LineInfo *info_mb = el_line (editline); const LineInfo *info_mb = el_line (editline);
char copy[info_mb->lastchar - info_mb->buffer + 1]; str_vector_add_owned (&ctx->pending_input,
memcpy (copy, info_mb->buffer, sizeof copy - 1); xstrndup (info_mb->buffer, info_mb->lastchar - info_mb->buffer));
copy[sizeof copy - 1] = '\0'; poller_idle_set (&ctx->input_event);
process_input (ctx, copy);
el_cursor (editline, len - point); el_cursor (editline, len - point);
el_wdeletestr (editline, len); el_wdeletestr (editline, len);
@ -11873,6 +11879,15 @@ on_date_change_timer (struct app_context *ctx)
rearm_date_change_timer (ctx); rearm_date_change_timer (ctx);
} }
static void
on_pending_input (struct app_context *ctx)
{
poller_idle_reset (&ctx->input_event);
for (size_t i = 0; i < ctx->pending_input.len; i++)
process_input (ctx, ctx->pending_input.vector[i]);
str_vector_reset (&ctx->pending_input);
}
static void static void
init_poller_events (struct app_context *ctx) init_poller_events (struct app_context *ctx)
{ {
@ -11899,6 +11914,10 @@ init_poller_events (struct app_context *ctx)
poller_timer_init (&ctx->autoaway_tmr, &ctx->poller); poller_timer_init (&ctx->autoaway_tmr, &ctx->poller);
ctx->autoaway_tmr.dispatcher = (poller_timer_fn) on_autoaway_timer; ctx->autoaway_tmr.dispatcher = (poller_timer_fn) on_autoaway_timer;
ctx->autoaway_tmr.user_data = ctx; ctx->autoaway_tmr.user_data = ctx;
poller_idle_init (&ctx->input_event, &ctx->poller);
ctx->input_event.dispatcher = (poller_idle_fn) on_pending_input;
ctx->input_event.user_data = ctx;
} }
// --- Tests ------------------------------------------------------------------- // --- Tests -------------------------------------------------------------------