From ee9a4082b6a313dc15fcb24801cc54937777c662 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Tue, 21 Jan 2014 16:25:55 -0800 Subject: [PATCH] Allow down arrow to enter pager. Clean up repainting within reader_readline --- pager.cpp | 30 +++++++++++++++++++++--------- reader.cpp | 37 +++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/pager.cpp b/pager.cpp index 0960fe507..b1fc92265 100644 --- a/pager.cpp +++ b/pager.cpp @@ -988,16 +988,28 @@ const completion_t *pager_t::select_next_completion_in_direction(selection_direc /* Handle the case of nothing selected yet */ if (selected_completion_idx == PAGER_SELECTION_NONE) { - if (selection_direction_is_cardinal(direction)) + switch (direction) { - /* Cardinal directions do nothing unless something is selected */ - return NULL; - } - else - { - /* Forward/backward do something sane */ - selected_completion_idx = (direction == direction_next ? 0 : completions.size() - 1); - return selected_completion(rendering); + /* These directions do something sane */ + case direction_south: + case direction_next: + case direction_prev: + if (direction == direction_prev) + { + selected_completion_idx = completions.size() - 1; + } + else + { + selected_completion_idx = 0; + } + return selected_completion(rendering); + + /* These do nothing */ + case direction_north: + case direction_east: + case direction_west: + default: + return NULL; } } diff --git a/reader.cpp b/reader.cpp index 76c5490a6..fe06a386e 100644 --- a/reader.cpp +++ b/reader.cpp @@ -1540,6 +1540,7 @@ static void clear_pager() { data->pager.clear(); data->current_page_rendering = page_rendering_t(); + reader_repaint_needed(); } } @@ -3088,6 +3089,8 @@ const wchar_t *reader_readline(void) clear_pager(); break; } + + //fprintf(stderr, "\n\nchar: %ls\n\n", describe_char(c).c_str()); const wchar_t * const buff = data->command_line.c_str(); switch (c) @@ -3102,7 +3105,7 @@ const wchar_t *reader_readline(void) data->buff_pos--; } - reader_repaint(); + reader_repaint_needed(); break; } @@ -3121,7 +3124,7 @@ const wchar_t *reader_readline(void) accept_autosuggestion(true); } - reader_repaint(); + reader_repaint_needed(); break; } @@ -3130,7 +3133,7 @@ const wchar_t *reader_readline(void) { data->buff_pos = 0; - reader_repaint(); + reader_repaint_needed(); break; } @@ -3139,13 +3142,12 @@ const wchar_t *reader_readline(void) { data->buff_pos = data->command_length(); - reader_repaint(); + reader_repaint_needed(); break; } case R_NULL: { - reader_repaint_if_needed(); break; } @@ -3236,9 +3238,6 @@ const wchar_t *reader_readline(void) /* Start the cycle at the beginning */ completion_cycle_idx = (size_t)(-1); - - /* Repaint */ - reader_repaint_if_needed(); } break; @@ -3370,8 +3369,7 @@ const wchar_t *reader_readline(void) } data->search_buff.clear(); reader_super_highlight_me_plenty(data->buff_pos); - reader_repaint(); - + reader_repaint_needed(); } break; @@ -3445,7 +3443,7 @@ const wchar_t *reader_readline(void) } finished=1; data->buff_pos=data->command_length(); - reader_repaint(); + reader_repaint_needed(); break; } @@ -3466,7 +3464,7 @@ const wchar_t *reader_readline(void) default: { s_reset(&data->screen, screen_reset_abandon_line); - reader_repaint(); + reader_repaint_needed(); break; } @@ -3570,7 +3568,7 @@ const wchar_t *reader_readline(void) else if (data->buff_pos > 0) { data->buff_pos--; - reader_repaint(); + reader_repaint_needed(); } break; } @@ -3585,7 +3583,7 @@ const wchar_t *reader_readline(void) else if (data->buff_pos < data->command_length()) { data->buff_pos++; - reader_repaint(); + reader_repaint_needed(); } else { @@ -3654,7 +3652,8 @@ const wchar_t *reader_readline(void) case R_UP_LINE: case R_DOWN_LINE: { - if (is_navigating_pager_contents()) + /* If we are already navigating the pager, or if we pressed down with non-empty pager contents, begin navigation */ + if (is_navigating_pager_contents() || (c == R_DOWN_LINE && ! data->pager.empty())) { select_completion_in_direction(c == R_UP_LINE ? direction_north : direction_south, cycle_command_line, cycle_cursor_pos); } @@ -3692,7 +3691,7 @@ const wchar_t *reader_readline(void) line_offset_old = data->buff_pos - parse_util_get_offset_from_line(data->command_line, line_old); total_offset_new = parse_util_get_offset(data->command_line, line_new, line_offset_old - 4*(indent_new-indent_old)); data->buff_pos = total_offset_new; - reader_repaint(); + reader_repaint_needed(); } } @@ -3703,7 +3702,7 @@ const wchar_t *reader_readline(void) { data->suppress_autosuggestion = true; data->autosuggestion.clear(); - reader_repaint(); + reader_repaint_needed(); break; } @@ -3811,7 +3810,7 @@ const wchar_t *reader_readline(void) } data->command_line_changed(); reader_super_highlight_me_plenty(data->buff_pos); - reader_repaint(); + reader_repaint_needed(); break; } @@ -3853,6 +3852,8 @@ const wchar_t *reader_readline(void) } last_char = c; + + reader_repaint_if_needed(); } writestr(L"\n");