Fix to propagate the last color before highlighting completes, and to avoid repainting when highlighting completes if the color does not change

This commit is contained in:
ridiculousfish 2012-10-03 12:19:27 -07:00
parent 956f99365a
commit 9b60af4d52

View file

@ -542,7 +542,11 @@ void reader_pop_current_filename()
void reader_data_t::command_line_changed() { void reader_data_t::command_line_changed() {
ASSERT_IS_MAIN_THREAD(); ASSERT_IS_MAIN_THREAD();
size_t len = command_length(); size_t len = command_length();
colors.resize(len);
/* When we grow colors, propagate the last color (if any), under the assumption that usually it will be correct. If it is, it avoids a repaint. */
color_t last_color = colors.empty() ? color_t() : colors.back();
colors.resize(len, last_color);
indents.resize(len); indents.resize(len);
/* Update the gen count */ /* Update the gen count */
@ -2314,17 +2318,19 @@ static void highlight_search(void) {
static void highlight_complete(background_highlight_context_t *ctx, int result) { static void highlight_complete(background_highlight_context_t *ctx, int result) {
ASSERT_IS_MAIN_THREAD(); ASSERT_IS_MAIN_THREAD();
if (ctx->string_to_highlight == data->command_line) { if (ctx->string_to_highlight == data->command_line) {
/* The data hasn't changed, so swap in our colors */ /* The data hasn't changed, so swap in our colors. The colors may not have changed, so do nothing if they have not. */
assert(ctx->colors.size() == data->command_length()); assert(ctx->colors.size() == data->command_length());
data->colors.swap(ctx->colors); if (data->colors != ctx->colors)
{
data->colors.swap(ctx->colors);
//data->repaint_needed = 1;
//s_reset( &data->screen, 1 ); //data->repaint_needed = 1;
//s_reset( &data->screen, 1 );
sanity_check();
highlight_search(); sanity_check();
reader_repaint(); highlight_search();
reader_repaint();
}
} }
/* Free our context */ /* Free our context */