xC: fix some corner cases around terminal handling

This commit is contained in:
Přemysl Eric Janouch 2022-08-29 14:04:50 +02:00
parent 91db8e6e54
commit 313a65180e
Signed by: p
GPG Key ID: A0420B94F92B9493

14
xC.c
View File

@ -789,7 +789,7 @@ input_el__redisplay (void *input)
static char * static char *
input_el__make_prompt (EditLine *editline) input_el__make_prompt (EditLine *editline)
{ {
struct input_el *self; struct input_el *self = NULL;
el_get (editline, EL_CLIENTDATA, &self); el_get (editline, EL_CLIENTDATA, &self);
if (!self->prompt) if (!self->prompt)
return ""; return "";
@ -1058,8 +1058,13 @@ input_el_buffer_switch (void *input, input_buffer_t input_buffer)
static void static void
input_el_buffer_destroy (void *input, input_buffer_t input_buffer) input_el_buffer_destroy (void *input, input_buffer_t input_buffer)
{ {
(void) input; struct input_el *self = input;
struct input_el_buffer *buffer = input_buffer; struct input_el_buffer *buffer = input_buffer;
if (self->active && self->current == buffer)
{
el_wset (self->editline, EL_HIST, history, NULL);
self->current = NULL;
}
history_wend (buffer->history); history_wend (buffer->history);
free (buffer->saved_line); free (buffer->saved_line);
@ -4349,6 +4354,10 @@ buffer_print_read_marker (struct app_context *ctx, FILE *stream, int flush_opts)
static void static void
buffer_print_backlog (struct app_context *ctx, struct buffer *buffer) buffer_print_backlog (struct app_context *ctx, struct buffer *buffer)
{ {
// Buffers can be activated, or their lines modified, as automatic actions.
if (ctx->terminal_suspended)
return;
// The prompt can take considerable time to redraw // The prompt can take considerable time to redraw
CALL (ctx->input, hide); CALL (ctx->input, hide);
@ -11269,6 +11278,7 @@ handle_command_buffer (struct handler_args *a)
else if (!strcasecmp_ascii (action, "clear")) else if (!strcasecmp_ascii (action, "clear"))
{ {
buffer_clear (a->buffer); buffer_clear (a->buffer);
if (a->buffer == ctx->current_buffer)
buffer_print_backlog (ctx, a->buffer); buffer_print_backlog (ctx, a->buffer);
} }
else if (!strcasecmp_ascii (action, "move")) else if (!strcasecmp_ascii (action, "move"))