aboutsummaryrefslogtreecommitdiffhomepage
path: root/reader.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-02-17 18:24:47 -0800
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-02-18 18:51:11 -0800
commited89df7e9d9ac21e84417f744f1b8759bdaba7e5 (patch)
tree14f62f8b0aee0c03e01ad6450266403f56fe436a /reader.cpp
parent1bedc16544fb28892704f01195ebd4dd90dd1fbb (diff)
Some minor cleanup of reader.cpp in preparation to unify highlighting with autosuggestion
Diffstat (limited to 'reader.cpp')
-rw-r--r--reader.cpp93
1 files changed, 33 insertions, 60 deletions
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<color_t> 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<double>(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<double>(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. */