From ed89df7e9d9ac21e84417f744f1b8759bdaba7e5 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Fri, 17 Feb 2012 18:24:47 -0800 Subject: Some minor cleanup of reader.cpp in preparation to unify highlighting with autosuggestion --- reader.cpp | 93 ++++++++++++++++++++++---------------------------------------- 1 file changed, 33 insertions(+), 60 deletions(-) (limited to 'reader.cpp') diff --git a/reader.cpp b/reader.cpp index a98b2883..8d5e0d57 100644 --- a/reader.cpp +++ b/reader.cpp @@ -223,16 +223,8 @@ class reader_data_t */ wcstring_list_t search_prev; - /** - The current position in search_prev - */ - + /** The current position in search_prev */ int search_pos; - - /** - Current count of the buffers - */ - size_t buff_count; /** Length of the command */ size_t command_length() const { return command_line.size(); } @@ -240,14 +232,10 @@ class reader_data_t /** Ensures that our buffers are the right size */ void check_size(void); - /** - The current position of the cursor in buff. - */ + /** The current position of the cursor in buff. */ size_t buff_pos; - /** - Name of the current application - */ + /** Name of the current application */ wcstring app_name; /** The prompt command */ @@ -285,13 +273,13 @@ class reader_data_t /** When this is true, the reader will exit */ - int end_loop; + bool end_loop; /** If this is true, exit reader even if there are running jobs. This happens if we press e.g. ^D twice. */ - int prev_end_loop; + bool prev_end_loop; /** The current contents of the top item in the kill ring. @@ -548,14 +536,10 @@ void reader_pop_current_filename() /** Make sure buffers are large enough to hold the current string length */ -void reader_data_t::check_size() -{ - if( buff_count != command_length()) - { - buff_count = command_length(); - colors.resize(buff_count); - indents.resize(buff_count); - } +void reader_data_t::check_size() { + size_t len = command_length(); + colors.resize(len); + indents.resize(len); } @@ -1773,10 +1757,10 @@ void reader_sanity_check() if(!( data->buff_pos <= data->command_length() )) sanity_lose(); - if (data->colors.size() != data->buff_count) + if (data->colors.size() != data->command_length()) sanity_lose(); - if (data->indents.size() != data->buff_count) + if (data->indents.size() != data->command_length()) sanity_lose(); } @@ -2363,10 +2347,8 @@ public: */ const wcstring string_to_highlight; - /** - Malloc'd color buffer (same size as buff) - */ - int * color; + /** Color buffer */ + std::vector colors; /** The position to use for bracket matching @@ -2388,20 +2370,30 @@ public: */ const double when; - background_highlight_context_t(const wcstring &pbuff, int *pcolor, int phighlight_pos, highlight_function_t phighlight_func) : + background_highlight_context_t(const wcstring &pbuff, int phighlight_pos, highlight_function_t phighlight_func) : string_to_highlight(pbuff), - color(pcolor), match_highlight_pos(phighlight_pos), highlight_function(phighlight_func), vars(env_vars::highlighting_keys), when(timef()) { - + colors.resize(string_to_highlight.size(), 0); } - ~background_highlight_context_t() - { - free(color); + int threaded_highlight() { + const wchar_t *delayer = vars.get(L"HIGHLIGHT_DELAY"); + double secDelay = 0; + if (delayer) { + wcstring tmp = delayer; + secDelay = from_string(tmp); + } + if (secDelay > 0) usleep((useconds_t)(secDelay * 1E6)); + //write(0, "Start", 5); + if (! string_to_highlight.empty()) { + highlight_function( string_to_highlight.c_str(), &colors.at(0), match_highlight_pos, NULL /* error */, vars); + } + //write(0, "End", 3); + return 0; } }; @@ -2429,12 +2421,8 @@ static void highlight_complete(background_highlight_context_t *ctx, int result) ASSERT_IS_MAIN_THREAD(); if (ctx->string_to_highlight == data->command_line) { /* The data hasn't changed, so swap in our colors */ - size_t len = ctx->string_to_highlight.size(); - data->colors.clear(); - data->colors.insert(data->colors.begin(), ctx->color, ctx->color + len); - - free(ctx->color); - ctx->color = NULL; + assert(ctx->colors.size() == data->command_length()); + data->colors.swap(ctx->colors); //data->repaint_needed = 1; @@ -2450,17 +2438,7 @@ static void highlight_complete(background_highlight_context_t *ctx, int result) } static int threaded_highlight(background_highlight_context_t *ctx) { - const wchar_t *delayer = ctx->vars.get(L"HIGHLIGHT_DELAY"); - double secDelay = 0; - if (delayer) { - wcstring tmp = delayer; - secDelay = from_string(tmp); - } - if (secDelay > 0) usleep((useconds_t)(secDelay * 1E6)); - //write(0, "Start", 5); - ctx->highlight_function( ctx->string_to_highlight.c_str(), ctx->color, ctx->match_highlight_pos, NULL /* error */, ctx->vars ); - //write(0, "End", 3); - return 0; + return ctx->threaded_highlight(); } @@ -2477,13 +2455,8 @@ static void reader_super_highlight_me_plenty( int match_highlight_pos, array_lis { reader_sanity_check(); - int *color = (int *)calloc(data->buff_count + 1, sizeof *color); - background_highlight_context_t *ctx = new background_highlight_context_t(data->command_line, color, match_highlight_pos, data->highlight_function); -#if 1 + background_highlight_context_t *ctx = new background_highlight_context_t(data->command_line, match_highlight_pos, data->highlight_function); iothread_perform(threaded_highlight, highlight_complete, ctx); -#else - data->highlight_function( ctx->buff, ctx->color, match_highlight_pos, error, highlight_complete2, ctx ); -#endif highlight_search(); /* Here's a hack. Check to see if our autosuggestion still applies; if so, don't recompute it. Since the autosuggestion computation is asynchronous, this avoids "flashing" as you type into the autosuggestion. */ -- cgit v1.2.3