aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-07-12 16:12:34 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-07-12 16:12:34 +0000
commitfa8333eddb747e9b3c2a72c4fab4308137891f49 (patch)
tree8c758175284f8bfee65f1d475a893bca8e9016e1
parent22355ce947da7acd8863d7f7a467324ad030faec (diff)
downloadrtmux-fa8333eddb747e9b3c2a72c4fab4308137891f49.tar.gz
rtmux-fa8333eddb747e9b3c2a72c4fab4308137891f49.tar.bz2
rtmux-fa8333eddb747e9b3c2a72c4fab4308137891f49.zip
Merge three copies of identical code to move the cursor x position into a
single function, from Kalle Olavi Niemitalo.
-rw-r--r--window-copy.c116
1 files changed, 35 insertions, 81 deletions
diff --git a/window-copy.c b/window-copy.c
index 5aff70ff..fb249698 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -48,6 +48,7 @@ void window_copy_copy_line(
struct window_pane *, char **, size_t *, u_int, u_int, u_int);
int window_copy_is_space(struct window_pane *, u_int, u_int);
u_int window_copy_find_length(struct window_pane *, u_int);
+void window_copy_set_cursor_x(struct window_pane *, u_int);
void window_copy_cursor_start_of_line(struct window_pane *);
void window_copy_cursor_end_of_line(struct window_pane *);
void window_copy_cursor_left(struct window_pane *);
@@ -542,30 +543,15 @@ window_copy_find_length(struct window_pane *wp, u_int py)
return (px);
}
+/*
+ * Set the cursor X coordinate and scroll horizontally to make it visible.
+ * Also redraw the selection or the cursor, as needed.
+ */
void
-window_copy_cursor_start_of_line(struct window_pane *wp)
-{
- struct window_copy_mode_data *data = wp->modedata;
-
- if (data->ox != 0)
- window_copy_scroll_right(wp, data->ox);
- data->cx = 0;
-
- if (window_copy_update_selection(wp))
- window_copy_redraw_lines(wp, data->cy, 1);
- else
- window_copy_update_cursor(wp);
-}
-
-void
-window_copy_cursor_end_of_line(struct window_pane *wp)
+window_copy_set_cursor_x(struct window_pane *wp, u_int px)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *s = &data->screen;
- u_int px, py;
-
- py = screen_hsize(&wp->base) + data->cy - data->oy;
- px = window_copy_find_length(wp, py);
/* On screen. */
if (px > data->ox && px <= data->ox + screen_size_x(s) - 1)
@@ -600,6 +586,33 @@ window_copy_cursor_end_of_line(struct window_pane *wp)
}
void
+window_copy_cursor_start_of_line(struct window_pane *wp)
+{
+ struct window_copy_mode_data *data = wp->modedata;
+
+ if (data->ox != 0)
+ window_copy_scroll_right(wp, data->ox);
+ data->cx = 0;
+
+ if (window_copy_update_selection(wp))
+ window_copy_redraw_lines(wp, data->cy, 1);
+ else
+ window_copy_update_cursor(wp);
+}
+
+void
+window_copy_cursor_end_of_line(struct window_pane *wp)
+{
+ struct window_copy_mode_data *data = wp->modedata;
+ u_int px, py;
+
+ py = screen_hsize(&wp->base) + data->cy - data->oy;
+ px = window_copy_find_length(wp, py);
+
+ window_copy_set_cursor_x(wp, px);
+}
+
+void
window_copy_cursor_left(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
@@ -748,43 +761,13 @@ window_copy_cursor_next_word(struct window_pane *wp)
}
out:
- /* On screen. */
- if (px > data->ox && px <= data->ox + screen_size_x(s) - 1)
- data->cx = px - data->ox;
-
- /* Off right of screen. */
- if (px > data->ox + screen_size_x(s) - 1) {
- /* Move cursor to last and scroll screen. */
- window_copy_scroll_left(
- wp, px - data->ox - (screen_size_x(s) - 1));
- data->cx = screen_size_x(s) - 1;
- }
-
- /* Off left of screen. */
- if (px <= data->ox) {
- if (px < screen_size_x(s) - 1) {
- /* Short enough to fit on screen. */
- window_copy_scroll_right(wp, data->ox);
- data->cx = px;
- } else {
- /* Too long to fit on screen. */
- window_copy_scroll_right(
- wp, data->ox - (px - (screen_size_x(s) - 1)));
- data->cx = screen_size_x(s) - 1;
- }
- }
-
- if (window_copy_update_selection(wp))
- window_copy_redraw_lines(wp, data->cy, 1);
- else
- window_copy_update_cursor(wp);
+ window_copy_set_cursor_x(wp, px);
}
void
window_copy_cursor_previous_word(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
- struct screen *s = &data->screen;
u_int ox, px, py, skip;
ox = px = data->ox + data->cx;
@@ -830,36 +813,7 @@ window_copy_cursor_previous_word(struct window_pane *wp)
}
out:
- /* On screen. */
- if (px > data->ox && px <= data->ox + screen_size_x(s) - 1)
- data->cx = px - data->ox;
-
- /* Off right of screen. */
- if (px > data->ox + screen_size_x(s) - 1) {
- /* Move cursor to last and scroll screen. */
- window_copy_scroll_left(
- wp, px - data->ox - (screen_size_x(s) - 1));
- data->cx = screen_size_x(s) - 1;
- }
-
- /* Off left of screen. */
- if (px <= data->ox) {
- if (px < screen_size_x(s) - 1) {
- /* Short enough to fit on screen. */
- window_copy_scroll_right(wp, data->ox);
- data->cx = px;
- } else {
- /* Too long to fit on screen. */
- window_copy_scroll_right(
- wp, data->ox - (px - (screen_size_x(s) - 1)));
- data->cx = screen_size_x(s) - 1;
- }
- }
-
- if (window_copy_update_selection(wp))
- window_copy_redraw_lines(wp, data->cy, 1);
- else
- window_copy_update_cursor(wp);
+ window_copy_set_cursor_x(wp, px);
}
void