diff --git a/window-copy.c b/window-copy.c index 33743cea3..8b117be92 100644 --- a/window-copy.c +++ b/window-copy.c @@ -49,8 +49,8 @@ static void window_copy_next_paragraph(struct window_mode_entry *); static void window_copy_previous_paragraph(struct window_mode_entry *); static void window_copy_redraw_selection(struct window_mode_entry *, u_int); static void window_copy_redraw_lines(struct window_mode_entry *, u_int, - u_int); -static void window_copy_redraw_screen(struct window_mode_entry *); + u_int, int); +static void window_copy_redraw_screen(struct window_mode_entry *, int); static void window_copy_do_refresh(struct window_mode_entry *, int); static void window_copy_refresh_timer(int, short, void *); static void window_copy_refresh_arm(struct window_mode_entry *); @@ -66,7 +66,7 @@ static u_int window_copy_cursor_offset(struct window_mode_entry *, u_int, static u_int window_copy_cursor_unoffset(struct window_mode_entry *, u_int, u_int); static void window_copy_write_line(struct window_mode_entry *, - struct screen_write_ctx *, u_int); + struct screen_write_ctx *, u_int, int); static void window_copy_write_lines(struct window_mode_entry *, struct screen_write_ctx *, u_int, u_int); static char *window_copy_match_at_cursor(struct window_copy_mode_data *); @@ -212,6 +212,7 @@ enum { enum window_copy_cmd_action { WINDOW_COPY_CMD_NOTHING, + WINDOW_COPY_CMD_MOVE, WINDOW_COPY_CMD_REDRAW, WINDOW_COPY_CMD_CANCEL, }; @@ -628,7 +629,7 @@ window_copy_init(struct window_mode_entry *wme, screen_write_start(&ctx, &data->screen); for (i = 0; i < screen_size_y(&data->screen); i++) - window_copy_write_line(wme, &ctx, i); + window_copy_write_line(wme, &ctx, i, 1); screen_write_cursormove(&ctx, window_copy_cursor_offset(wme, data->cx, screen_size_x(&data->screen)), data->cy, 0); screen_write_stop(&ctx); @@ -742,10 +743,10 @@ window_copy_vadd(struct window_pane *wp, int parse, const char *fmt, va_list ap) * (If there's any history at all, it has changed.) */ if (screen_hsize(data->backing)) - window_copy_redraw_lines(wme, 0, 1); + window_copy_redraw_lines(wme, 0, 1, 1); /* Write the new lines. */ - window_copy_redraw_lines(wme, old_cy, backing->cy - old_cy + 1); + window_copy_redraw_lines(wme, old_cy, backing->cy - old_cy + 1, 1); screen_write_stop(&ctx); } @@ -863,7 +864,7 @@ window_copy_scroll1(struct window_mode_entry *wme, struct window_pane *wp, window_copy_search_marks(wme, NULL, data->searchregex, 1); window_copy_update_selection(wme, 1, 0); window_pane_scrollbar_show(wp, 1); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } void @@ -917,7 +918,7 @@ window_copy_pageup1(struct window_mode_entry *wme, int half_page) window_copy_search_marks(wme, NULL, data->searchregex, 1); window_copy_update_selection(wme, 1, 0); window_pane_scrollbar_show(wme->wp, 1); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } void @@ -978,7 +979,7 @@ window_copy_pagedown1(struct window_mode_entry *wme, int half_page, window_copy_search_marks(wme, NULL, data->searchregex, 1); window_copy_update_selection(wme, 1, 0); window_pane_scrollbar_show(wme->wp, 1); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); return (0); } @@ -1223,7 +1224,7 @@ window_copy_resize(struct window_mode_entry *wme, u_int sx, u_int sy) } window_copy_size_changed(wme); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } static const char * @@ -1292,7 +1293,7 @@ window_copy_cmd_back_to_indentation(struct window_copy_cmd_state *cs) struct window_mode_entry *wme = cs->wme; window_copy_cursor_back_to_indentation(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1305,7 +1306,7 @@ window_copy_cmd_begin_selection(struct window_copy_cmd_state *cs) if (m != NULL) { window_copy_start_drag(c, m); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } data->lineflag = LINE_SEL_NONE; @@ -1323,7 +1324,7 @@ window_copy_cmd_stop_selection(struct window_copy_cmd_state *cs) data->cursordrag = CURSORDRAG_NONE; data->lineflag = LINE_SEL_NONE; data->selflag = SEL_CHAR; - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1579,7 +1580,7 @@ window_copy_cmd_cursor_down(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_down(wme, 0); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1594,7 +1595,7 @@ window_copy_cmd_cursor_down_and_cancel(struct window_copy_cmd_state *cs) window_copy_cursor_down(wme, 0); if (cy == data->cy && data->oy == 0) return (WINDOW_COPY_CMD_CANCEL); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1605,7 +1606,7 @@ window_copy_cmd_cursor_left(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_left(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1619,7 +1620,7 @@ window_copy_cmd_cursor_right(struct window_copy_cmd_state *cs) window_copy_cursor_right(wme, data->screen.sel != NULL && data->rectflag); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } /* Scroll line containing the cursor to the given position. */ @@ -1687,7 +1688,7 @@ window_copy_cmd_scroll_to_mouse(struct window_copy_cmd_state *cs) tty_window_offset(&c->tty, &tty_ox, &tty_oy, &tty_sx, &tty_sy); window_copy_scroll(wp, c->tty.mouse_slider_mpos, m->y, tty_oy, scroll_exit); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } /* Scroll line containing the cursor to the top. */ @@ -1705,7 +1706,7 @@ window_copy_cmd_cursor_up(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_up(wme, 0); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1736,7 +1737,7 @@ window_copy_cmd_end_of_line(struct window_copy_cmd_state *cs) struct window_mode_entry *wme = cs->wme; window_copy_cursor_end_of_line(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1750,7 +1751,7 @@ window_copy_cmd_halfpage_down(struct window_copy_cmd_state *cs) if (window_copy_pagedown1(wme, 1, data->scroll_exit)) return (WINDOW_COPY_CMD_CANCEL); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1764,7 +1765,7 @@ window_copy_cmd_halfpage_down_and_cancel(struct window_copy_cmd_state *cs) if (window_copy_pagedown1(wme, 1, 1)) return (WINDOW_COPY_CMD_CANCEL); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1775,7 +1776,7 @@ window_copy_cmd_halfpage_up(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_pageup1(wme, 1); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1860,7 +1861,7 @@ window_copy_cmd_jump_again(struct window_copy_cmd_state *cs) window_copy_cursor_jump_to_back(wme); break; } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1888,7 +1889,7 @@ window_copy_cmd_jump_reverse(struct window_copy_cmd_state *cs) window_copy_cursor_jump_to(wme); break; } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -1987,7 +1988,7 @@ window_copy_cmd_previous_matching_bracket(struct window_copy_cmd_state *cs) window_copy_scroll_to(wme, px, py, 0); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2108,7 +2109,7 @@ window_copy_cmd_next_matching_bracket(struct window_copy_cmd_state *cs) window_copy_scroll_to(wme, px, py, 0); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2119,7 +2120,7 @@ window_copy_cmd_next_paragraph(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_next_paragraph(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2130,7 +2131,7 @@ window_copy_cmd_next_space(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_next_word(wme, ""); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2141,7 +2142,7 @@ window_copy_cmd_next_space_end(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_next_word_end(wme, "", 0); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2155,7 +2156,7 @@ window_copy_cmd_next_word(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_next_word(wme, separators); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2169,7 +2170,7 @@ window_copy_cmd_next_word_end(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_next_word_end(wme, separators, 0); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2182,7 +2183,7 @@ window_copy_cmd_other_end(struct window_copy_cmd_state *cs) data->selflag = SEL_CHAR; if ((np % 2) != 0) window_copy_other_end(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2200,7 +2201,7 @@ window_copy_cmd_selection_mode(struct window_copy_cmd_state *cs) data->selflag = SEL_WORD; } else if (strcasecmp(s, "line") == 0 || strcasecmp(s, "l") == 0) data->selflag = SEL_LINE; - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2214,7 +2215,7 @@ window_copy_cmd_page_down(struct window_copy_cmd_state *cs) if (window_copy_pagedown1(wme, 0, data->scroll_exit)) return (WINDOW_COPY_CMD_CANCEL); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2227,7 +2228,7 @@ window_copy_cmd_page_down_and_cancel(struct window_copy_cmd_state *cs) if (window_copy_pagedown1(wme, 0, 1)) return (WINDOW_COPY_CMD_CANCEL); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2238,7 +2239,7 @@ window_copy_cmd_page_up(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_pageup1(wme, 0); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2249,7 +2250,7 @@ window_copy_cmd_previous_paragraph(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_previous_paragraph(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2260,7 +2261,7 @@ window_copy_cmd_previous_space(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_previous_word(wme, "", 1); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2274,7 +2275,7 @@ window_copy_cmd_previous_word(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_previous_word(wme, separators, 1); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2286,7 +2287,7 @@ window_copy_cmd_rectangle_on(struct window_copy_cmd_state *cs) data->lineflag = LINE_SEL_NONE; window_copy_rectangle_set(wme, 1); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2298,7 +2299,7 @@ window_copy_cmd_rectangle_off(struct window_copy_cmd_state *cs) data->lineflag = LINE_SEL_NONE; window_copy_rectangle_set(wme, 0); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2310,7 +2311,7 @@ window_copy_cmd_rectangle_toggle(struct window_copy_cmd_state *cs) data->lineflag = LINE_SEL_NONE; window_copy_rectangle_set(wme, !data->rectflag); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2320,7 +2321,7 @@ window_copy_cmd_scroll_exit_on(struct window_copy_cmd_state *cs) data->scroll_exit = 1; - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2330,7 +2331,7 @@ window_copy_cmd_scroll_exit_off(struct window_copy_cmd_state *cs) data->scroll_exit = 0; - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2340,7 +2341,7 @@ window_copy_cmd_scroll_exit_toggle(struct window_copy_cmd_state *cs) data->scroll_exit = !data->scroll_exit; - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2350,11 +2351,21 @@ window_copy_cmd_scroll_down(struct window_copy_cmd_state *cs) struct window_copy_mode_data *data = wme->data; u_int np = wme->prefix; + /* + * If at the bottom and scroll_exit is active with no selection, + * cancel/exit copy-mode. Otherwise nothing can change, so return + * WINDOW_COPY_CMD_NOTHING. + */ + if (data->oy == 0) { + if (data->scroll_exit && data->screen.sel == NULL) + return (WINDOW_COPY_CMD_CANCEL); + return (WINDOW_COPY_CMD_NOTHING); + } for (; np != 0; np--) window_copy_cursor_down(wme, 1); if (data->scroll_exit && data->oy == 0 && data->screen.sel == NULL) return (WINDOW_COPY_CMD_CANCEL); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2368,18 +2379,25 @@ window_copy_cmd_scroll_down_and_cancel(struct window_copy_cmd_state *cs) window_copy_cursor_down(wme, 1); if (data->oy == 0) return (WINDOW_COPY_CMD_CANCEL); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action window_copy_cmd_scroll_up(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; + struct window_copy_mode_data *data = wme->data; u_int np = wme->prefix; + /* + * If at the top, nothing can change, so return WINDOW_COPY_CMD_NOTHING + * and do not repaint anything. + */ + if (data->oy == screen_hsize(data->backing)) + return (WINDOW_COPY_CMD_NOTHING); for (; np != 0; np--) window_copy_cursor_up(wme, 1); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2396,7 +2414,7 @@ window_copy_cmd_search_again(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_search_down(wme, data->searchregex); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2413,7 +2431,7 @@ window_copy_cmd_search_reverse(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_search_up(wme, data->searchregex); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2481,7 +2499,7 @@ window_copy_cmd_select_word(struct window_copy_cmd_state *cs) else { window_copy_update_cursor(wme, px, data->cy); if (window_copy_update_selection(wme, 1, 1)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); } data->endselrx = data->cx; data->endselry = screen_hsize(data->backing) + data->cy - data->oy; @@ -2511,7 +2529,7 @@ window_copy_cmd_start_of_line(struct window_copy_cmd_state *cs) struct window_mode_entry *wme = cs->wme; window_copy_cursor_start_of_line(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2590,7 +2608,7 @@ window_copy_cmd_pipe_no_clear(struct window_copy_cmd_state *cs) window_copy_pipe(wme, s, command); free(command); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2621,7 +2639,7 @@ window_copy_cmd_goto_line(struct window_copy_cmd_state *cs) if (*arg0 != '\0') window_copy_goto_line(wme, arg0); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2639,7 +2657,7 @@ window_copy_cmd_jump_backward(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_jump_back(wme); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2657,7 +2675,7 @@ window_copy_cmd_jump_forward(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_jump(wme); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2675,7 +2693,7 @@ window_copy_cmd_jump_to_backward(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_jump_to_back(wme); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2693,7 +2711,7 @@ window_copy_cmd_jump_to_forward(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_cursor_jump_to(wme); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2702,7 +2720,7 @@ window_copy_cmd_jump_to_mark(struct window_copy_cmd_state *cs) struct window_mode_entry *wme = cs->wme; window_copy_jump_to_mark(wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2711,7 +2729,7 @@ window_copy_cmd_next_prompt(struct window_copy_cmd_state *cs) struct window_mode_entry *wme = cs->wme; window_copy_cursor_prompt(wme, 1, args_has(cs->wargs, 'o')); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2720,7 +2738,7 @@ window_copy_cmd_previous_prompt(struct window_copy_cmd_state *cs) struct window_mode_entry *wme = cs->wme; window_copy_cursor_prompt(wme, 0, args_has(cs->wargs, 'o')); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2731,7 +2749,7 @@ window_copy_cmd_search_backward(struct window_copy_cmd_state *cs) u_int np = wme->prefix; if (!window_copy_expand_search_string(cs)) - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); if (data->searchstr != NULL) { data->searchtype = WINDOW_COPY_SEARCHUP; @@ -2740,7 +2758,7 @@ window_copy_cmd_search_backward(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_search_up(wme, 1); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2751,7 +2769,7 @@ window_copy_cmd_search_backward_text(struct window_copy_cmd_state *cs) u_int np = wme->prefix; if (!window_copy_expand_search_string(cs)) - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); if (data->searchstr != NULL) { data->searchtype = WINDOW_COPY_SEARCHUP; @@ -2760,7 +2778,7 @@ window_copy_cmd_search_backward_text(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_search_up(wme, 0); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2771,7 +2789,7 @@ window_copy_cmd_search_forward(struct window_copy_cmd_state *cs) u_int np = wme->prefix; if (!window_copy_expand_search_string(cs)) - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); if (data->searchstr != NULL) { data->searchtype = WINDOW_COPY_SEARCHDOWN; @@ -2780,7 +2798,7 @@ window_copy_cmd_search_forward(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_search_down(wme, 1); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2791,7 +2809,7 @@ window_copy_cmd_search_forward_text(struct window_copy_cmd_state *cs) u_int np = wme->prefix; if (!window_copy_expand_search_string(cs)) - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); if (data->searchstr != NULL) { data->searchtype = WINDOW_COPY_SEARCHDOWN; @@ -2800,7 +2818,7 @@ window_copy_cmd_search_forward_text(struct window_copy_cmd_state *cs) for (; np != 0; np--) window_copy_search_down(wme, 0); } - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -2811,7 +2829,7 @@ window_copy_cmd_search_backward_incremental(struct window_copy_cmd_state *cs) const char *arg0 = args_string(cs->wargs, 0); const char *ss = data->searchstr; char prefix; - enum window_copy_cmd_action action = WINDOW_COPY_CMD_NOTHING; + enum window_copy_cmd_action action = WINDOW_COPY_CMD_MOVE; data->timeout = 0; @@ -2868,7 +2886,7 @@ window_copy_cmd_search_forward_incremental(struct window_copy_cmd_state *cs) const char *arg0 = args_string(cs->wargs, 0); const char *ss = data->searchstr; char prefix; - enum window_copy_cmd_action action = WINDOW_COPY_CMD_NOTHING; + enum window_copy_cmd_action action = WINDOW_COPY_CMD_MOVE; data->timeout = 0; @@ -2989,7 +3007,7 @@ window_copy_refresh_timer(__unused int fd, __unused short events, void *arg) follow = (data->oy == 0 && data->cy == screen_size_y(&data->screen) - 1); window_copy_do_refresh(wme, follow); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); /* The timer runs outside key handling, so force a repaint. */ wp->flags |= PANE_REDRAW; wp->flags &= ~PANE_UNSEENCHANGES; @@ -3026,14 +3044,14 @@ static enum window_copy_cmd_action window_copy_cmd_refresh_on(struct window_copy_cmd_state *cs) { window_copy_refresh_start(cs->wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action window_copy_cmd_refresh_off(struct window_copy_cmd_state *cs) { window_copy_refresh_stop(cs->wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -3045,7 +3063,7 @@ window_copy_cmd_refresh_toggle(struct window_copy_cmd_state *cs) window_copy_refresh_stop(cs->wme); else window_copy_refresh_start(cs->wme); - return (WINDOW_COPY_CMD_NOTHING); + return (WINDOW_COPY_CMD_MOVE); } static enum window_copy_cmd_action @@ -3716,7 +3734,7 @@ window_copy_command(struct window_mode_entry *wme, struct client *c, cs.s = s; cs.wl = wl; - action = WINDOW_COPY_CMD_NOTHING; + action = WINDOW_COPY_CMD_MOVE; for (i = 0; i < nitems(window_copy_cmd_table); i++) { if (strcmp(window_copy_cmd_table[i].command, command) == 0) { flags = window_copy_cmd_table[i].flags; @@ -3755,7 +3773,7 @@ window_copy_command(struct window_mode_entry *wme, struct client *c, window_copy_clear_marks(wme); data->searchx = data->searchy = -1; } - if (action == WINDOW_COPY_CMD_NOTHING) + if (action == WINDOW_COPY_CMD_MOVE) action = WINDOW_COPY_CMD_REDRAW; } wme->prefix = 1; @@ -3763,15 +3781,13 @@ window_copy_command(struct window_mode_entry *wme, struct client *c, if (action == WINDOW_COPY_CMD_CANCEL) window_pane_reset_mode(wp); else if (action == WINDOW_COPY_CMD_REDRAW) - window_copy_redraw_screen(wme); - else if (action == WINDOW_COPY_CMD_NOTHING) { + window_copy_redraw_screen(wme, 1); + else if (action == WINDOW_COPY_CMD_MOVE) { /* - * Nothing is not actually nothing - most commands at least - * move the cursor (what would be the point of a command that - * literally does nothing?) and in that case we need to redraw - * the first line to update the indicator. + * If the cursor moves or a similar trivial change is made, + * only redraw the first line to update the indicator. */ - window_copy_redraw_lines(wme, 0, 1); + window_copy_redraw_lines(wme, 0, 1, 0); } } @@ -3808,7 +3824,7 @@ window_copy_scroll_to(struct window_mode_entry *wme, u_int px, u_int py, if (data->oy != old_oy) window_pane_scrollbar_show(wme->wp, 1); if (!no_redraw) - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } static int @@ -4596,7 +4612,7 @@ window_copy_search(struct window_mode_entry *wme, int direction, int regex) } } } - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); screen_free(&ss); return (found); @@ -4849,7 +4865,7 @@ window_copy_goto_line(struct window_mode_entry *wme, const char *linestr) } window_copy_update_selection(wme, 1, 0); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } static void @@ -5119,7 +5135,7 @@ window_copy_set_line_numbers(struct window_pane *wp, int enabled) if (data == NULL || data->line_numbers == enabled) return; data->line_numbers = enabled; - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } int @@ -5141,7 +5157,7 @@ window_copy_get_current_offset(struct window_pane *wp, u_int *offset, static void window_copy_write_line(struct window_mode_entry *wme, - struct screen_write_ctx *ctx, u_int py) + struct screen_write_ctx *ctx, u_int py, int clear) { struct window_pane *wp = wme->wp; struct window_copy_mode_data *data = wme->data; @@ -5166,7 +5182,8 @@ window_copy_write_line(struct window_mode_entry *wme, content_sx = sx; screen_write_cursormove(ctx, 0, py, 0); - screen_write_clearline(ctx, 8); + if (clear) + screen_write_clearline(ctx, 8); ft = format_create_defaults(NULL, NULL, NULL, NULL, wp); @@ -5237,7 +5254,7 @@ window_copy_write_lines(struct window_mode_entry *wme, u_int yy; for (yy = py; yy < py + ny; yy++) - window_copy_write_line(wme, ctx, yy); + window_copy_write_line(wme, ctx, yy, 1); } static void @@ -5265,11 +5282,12 @@ window_copy_redraw_selection(struct window_mode_entry *wme, u_int old_y) if (end < gd->sy + data->oy - 1) end++; } - window_copy_redraw_lines(wme, start, end - start + 1); + window_copy_redraw_lines(wme, start, end - start + 1, 0); } static void -window_copy_redraw_lines(struct window_mode_entry *wme, u_int py, u_int ny) +window_copy_redraw_lines(struct window_mode_entry *wme, u_int py, u_int ny, + int clear) { struct window_pane *wp = wme->wp; struct window_copy_mode_data *data = wme->data; @@ -5280,7 +5298,7 @@ window_copy_redraw_lines(struct window_mode_entry *wme, u_int py, u_int ny) if (window_copy_line_number_width(wme) != 0) { screen_write_start(&ctx, &data->screen); for (i = py; i < py + ny; i++) - window_copy_write_line(wme, &ctx, i); + window_copy_write_line(wme, &ctx, i, clear); screen_write_cursormove(&ctx, window_copy_cursor_offset(wme, data->cx, screen_size_x(s)), data->cy, 0); @@ -5294,7 +5312,7 @@ window_copy_redraw_lines(struct window_mode_entry *wme, u_int py, u_int ny) else screen_write_start_pane(&ctx, wp, NULL); for (i = py; i < py + ny; i++) - window_copy_write_line(wme, &ctx, i); + window_copy_write_line(wme, &ctx, i, clear); screen_write_cursormove(&ctx, window_copy_cursor_offset(wme, data->cx, screen_size_x(s)), data->cy, 0); @@ -5304,11 +5322,11 @@ window_copy_redraw_lines(struct window_mode_entry *wme, u_int py, u_int ny) } static void -window_copy_redraw_screen(struct window_mode_entry *wme) +window_copy_redraw_screen(struct window_mode_entry *wme, int clear) { struct window_copy_mode_data *data = wme->data; - window_copy_redraw_lines(wme, 0, screen_size_y(&data->screen)); + window_copy_redraw_lines(wme, 0, screen_size_y(&data->screen), clear); } static void @@ -5318,7 +5336,7 @@ window_copy_style_changed(struct window_mode_entry *wme) if (data->screen.sel != NULL) window_copy_set_selection(wme, 0, 1); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } static void @@ -5439,7 +5457,7 @@ window_copy_update_cursor(struct window_mode_entry *wme, u_int cx, u_int cy) if (s->sel != NULL || data->lineflag != LINE_SEL_NONE || old_cy != data->cy) { - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 0); return; } if (width >= screen_size_x(s)) @@ -5447,7 +5465,7 @@ window_copy_update_cursor(struct window_mode_entry *wme, u_int cx, u_int cy) else content_sx = screen_size_x(s) - width; if (old_cx >= content_sx || data->cx >= content_sx) { - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 0); return; } screen_write_start_pane(&ctx, wp, NULL); @@ -5458,9 +5476,9 @@ window_copy_update_cursor(struct window_mode_entry *wme, u_int cx, u_int cy) return; } if (old_cx == screen_size_x(s)) - window_copy_redraw_lines(wme, old_cy, 1); + window_copy_redraw_lines(wme, old_cy, 1, 1); if (data->cx == screen_size_x(s)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); else { screen_write_start_pane(&ctx, wp, NULL); screen_write_cursormove(&ctx, @@ -5587,16 +5605,16 @@ window_copy_set_selection(struct window_mode_entry *wme, int may_redraw, cy = data->cy; if (data->cursordrag == CURSORDRAG_ENDSEL) { if (sy < cy) - window_copy_redraw_lines(wme, sy, cy - sy + 1); + window_copy_redraw_lines(wme, sy, cy - sy + 1, 1); else - window_copy_redraw_lines(wme, cy, sy - cy + 1); + window_copy_redraw_lines(wme, cy, sy - cy + 1, 1); } else { if (endsy < cy) { window_copy_redraw_lines(wme, endsy, - cy - endsy + 1); + cy - endsy + 1, 1); } else { window_copy_redraw_lines(wme, cy, - endsy - cy + 1); + endsy - cy + 1, 1); } } } @@ -6076,7 +6094,7 @@ window_copy_other_end(struct window_mode_entry *wme) data->cx = hsize; window_copy_update_selection(wme, 1, 1); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } static void @@ -6153,9 +6171,9 @@ window_copy_cursor_up(struct window_mode_entry *wme, int scroll_only) window_copy_scroll_down(wme, 1); if (scroll_only) { if (data->cy == screen_size_y(s) - 1) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 0); else - window_copy_redraw_lines(wme, data->cy, 2); + window_copy_redraw_lines(wme, data->cy, 2, 0); } } else { if (norectsel) { @@ -6165,9 +6183,9 @@ window_copy_cursor_up(struct window_mode_entry *wme, int scroll_only) window_copy_update_cursor(wme, data->cx, data->cy - 1); if (window_copy_update_selection(wme, 1, 0)) { if (data->cy == screen_size_y(s) - 1) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); else - window_copy_redraw_lines(wme, data->cy, 2); + window_copy_redraw_lines(wme, data->cy, 2, 1); } } @@ -6179,7 +6197,7 @@ window_copy_cursor_up(struct window_mode_entry *wme, int scroll_only) { window_copy_update_cursor(wme, px, data->cy); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); } } @@ -6192,13 +6210,13 @@ window_copy_cursor_up(struct window_mode_entry *wme, int scroll_only) px = window_copy_find_length(wme, py); window_copy_update_cursor(wme, px, data->cy); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); } else if (data->lineflag == LINE_SEL_RIGHT_LEFT) { window_copy_update_cursor(wme, 0, data->cy); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); } } @@ -6232,7 +6250,7 @@ window_copy_cursor_down(struct window_mode_entry *wme, int scroll_only) data->cx = data->lastcx; window_copy_scroll_up(wme, 1); if (scroll_only && data->cy > 0) - window_copy_redraw_lines(wme, data->cy - 1, 2); + window_copy_redraw_lines(wme, data->cy - 1, 2, 0); } else { if (norectsel) { window_copy_update_cursor(wme, data->lastcx, @@ -6240,7 +6258,7 @@ window_copy_cursor_down(struct window_mode_entry *wme, int scroll_only) } else window_copy_update_cursor(wme, data->cx, data->cy + 1); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, data->cy - 1, 2); + window_copy_redraw_lines(wme, data->cy - 1, 2, 1); } if (norectsel) { @@ -6251,7 +6269,7 @@ window_copy_cursor_down(struct window_mode_entry *wme, int scroll_only) { window_copy_update_cursor(wme, px, data->cy); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); } } @@ -6264,13 +6282,13 @@ window_copy_cursor_down(struct window_mode_entry *wme, int scroll_only) px = window_copy_find_length(wme, py); window_copy_update_cursor(wme, px, data->cy); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); } else if (data->lineflag == LINE_SEL_RIGHT_LEFT) { window_copy_update_cursor(wme, 0, data->cy); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, data->cy, 1); + window_copy_redraw_lines(wme, data->cy, 1, 1); } } @@ -6540,7 +6558,7 @@ window_copy_cursor_prompt(struct window_mode_entry *wme, int direction, } window_copy_update_selection(wme, 1, 0); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } static void @@ -6564,21 +6582,22 @@ window_copy_scroll_up(struct window_mode_entry *wme, u_int ny) if (window_copy_line_numbers_active(wme)) { if (window_copy_line_number_mode(wme) != WINDOW_COPY_LINE_NUMBERS_ABSOLUTE) { - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 0); return; } screen_write_start(&ctx, &data->screen); screen_write_cursormove(&ctx, 0, 0, 0); screen_write_deleteline(&ctx, ny, 8); window_copy_write_lines(wme, &ctx, screen_size_y(s) - ny, ny); - window_copy_write_line(wme, &ctx, 0); + window_copy_write_line(wme, &ctx, 0, 0); if (screen_size_y(s) > 1) - window_copy_write_line(wme, &ctx, 1); + window_copy_write_line(wme, &ctx, 1, 0); if (screen_size_y(s) > 3) - window_copy_write_line(wme, &ctx, screen_size_y(s) - 2); + window_copy_write_line(wme, &ctx, + screen_size_y(s) - 2, 0); if (s->sel != NULL && screen_size_y(s) > ny) { window_copy_write_line(wme, &ctx, - screen_size_y(s) - ny - 1); + screen_size_y(s) - ny - 1, 0); } screen_write_cursormove(&ctx, window_copy_cursor_offset(wme, data->cx, screen_size_x(s)), @@ -6595,13 +6614,14 @@ window_copy_scroll_up(struct window_mode_entry *wme, u_int ny) screen_write_cursormove(&ctx, 0, 0, 0); screen_write_deleteline(&ctx, ny, 8); window_copy_write_lines(wme, &ctx, screen_size_y(s) - ny, ny); - window_copy_write_line(wme, &ctx, 0); + window_copy_write_line(wme, &ctx, 0, 0); if (screen_size_y(s) > 1) - window_copy_write_line(wme, &ctx, 1); + window_copy_write_line(wme, &ctx, 1, 0); if (screen_size_y(s) > 3) - window_copy_write_line(wme, &ctx, screen_size_y(s) - 2); + window_copy_write_line(wme, &ctx, screen_size_y(s) - 2, 0); if (s->sel != NULL && screen_size_y(s) > ny) - window_copy_write_line(wme, &ctx, screen_size_y(s) - ny - 1); + window_copy_write_line(wme, &ctx, screen_size_y(s) - ny - 1, + 0); screen_write_cursormove(&ctx, window_copy_cursor_offset(wme, data->cx, screen_size_x(s)), data->cy, 0); @@ -6633,7 +6653,7 @@ window_copy_scroll_down(struct window_mode_entry *wme, u_int ny) if (window_copy_line_numbers_active(wme)) { if (window_copy_line_number_mode(wme) != WINDOW_COPY_LINE_NUMBERS_ABSOLUTE) { - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 0); return; } screen_write_start(&ctx, &data->screen); @@ -6641,9 +6661,9 @@ window_copy_scroll_down(struct window_mode_entry *wme, u_int ny) screen_write_insertline(&ctx, ny, 8); window_copy_write_lines(wme, &ctx, 0, ny); if (s->sel != NULL && screen_size_y(s) > ny) - window_copy_write_line(wme, &ctx, ny); + window_copy_write_line(wme, &ctx, ny, 0); else if (ny == 1) - window_copy_write_line(wme, &ctx, 1); + window_copy_write_line(wme, &ctx, 1, 0); screen_write_cursormove(&ctx, window_copy_cursor_offset(wme, data->cx, screen_size_x(s)), data->cy, 0); @@ -6660,9 +6680,9 @@ window_copy_scroll_down(struct window_mode_entry *wme, u_int ny) screen_write_insertline(&ctx, ny, 8); window_copy_write_lines(wme, &ctx, 0, ny); if (s->sel != NULL && screen_size_y(s) > ny) - window_copy_write_line(wme, &ctx, ny); + window_copy_write_line(wme, &ctx, ny, 0); else if (ny == 1) /* nuke position */ - window_copy_write_line(wme, &ctx, 1); + window_copy_write_line(wme, &ctx, 1, 0); screen_write_cursormove(&ctx, window_copy_cursor_offset(wme, data->cx, screen_size_x(s)), data->cy, 0); screen_write_stop(&ctx); @@ -6683,7 +6703,7 @@ window_copy_rectangle_set(struct window_mode_entry *wme, int rectflag) window_copy_update_cursor(wme, px, data->cy); window_copy_update_selection(wme, 1, 0); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } static void @@ -6761,7 +6781,7 @@ window_copy_start_drag(struct client *c, struct mouse_event *m) break; } - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); window_copy_drag_update(c, m); } @@ -6856,7 +6876,7 @@ window_copy_jump_to_mark(struct window_mode_entry *wme) data->my = tmy; data->showmark = 1; window_copy_update_selection(wme, 0, 0); - window_copy_redraw_screen(wme); + window_copy_redraw_screen(wme, 1); } /* Scroll up if the cursor went off the visible screen. */ @@ -6882,7 +6902,7 @@ window_copy_acquire_cursor_up(struct window_mode_entry *wme, u_int hsize, } window_copy_update_cursor(wme, px, cy); if (window_copy_update_selection(wme, 1, 0)) - window_copy_redraw_lines(wme, cy, nd); + window_copy_redraw_lines(wme, cy, nd, 1); } /* Scroll down if the cursor went off the visible screen. */ @@ -6911,5 +6931,5 @@ window_copy_acquire_cursor_down(struct window_mode_entry *wme, u_int hsize, else window_copy_update_cursor(wme, px, cy); if (window_copy_update_selection(wme, 1, no_reset)) - window_copy_redraw_lines(wme, oldy, nd); + window_copy_redraw_lines(wme, oldy, nd, 1); }