aboutsummaryrefslogtreecommitdiff
path: root/window-copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'window-copy.c')
-rw-r--r--window-copy.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/window-copy.c b/window-copy.c
index c2d9b9ad..e35e6070 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -353,9 +353,6 @@ window_copy_pageup(struct window_pane *wp, int half_page)
oy = screen_hsize(data->backing) + data->cy - data->oy;
ox = window_copy_find_length(wp, oy);
- if (data->lineflag == LINE_SEL_LEFT_RIGHT && oy == data->sely)
- window_copy_other_end(wp);
-
if (data->cx != ox) {
data->lastcx = data->cx;
data->lastsx = ox;
@@ -370,9 +367,13 @@ window_copy_pageup(struct window_pane *wp, int half_page)
n = screen_size_y(s) - 2;
}
- if (data->oy + n > screen_hsize(data->backing))
+ if (data->oy + n > screen_hsize(data->backing)) {
data->oy = screen_hsize(data->backing);
- else
+ if (data->cy < n)
+ data->cy = 0;
+ else
+ data->cy -= n;
+ } else
data->oy += n;
if (data->screen.sel == NULL || !data->rectflag) {
@@ -397,9 +398,6 @@ window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit)
oy = screen_hsize(data->backing) + data->cy - data->oy;
ox = window_copy_find_length(wp, oy);
- if (data->lineflag == LINE_SEL_RIGHT_LEFT && oy == data->sely)
- window_copy_other_end(wp);
-
if (data->cx != ox) {
data->lastcx = data->cx;
data->lastsx = ox;
@@ -414,9 +412,13 @@ window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit)
n = screen_size_y(s) - 2;
}
- if (data->oy < n)
+ if (data->oy < n) {
data->oy = 0;
- else
+ if (data->cy + (n - data->oy) >= screen_size_y(data->backing))
+ data->cy = screen_size_y(data->backing) - 1;
+ else
+ data->cy += n - data->oy;
+ } else
data->oy -= n;
if (data->screen.sel == NULL || !data->rectflag) {
@@ -527,7 +529,7 @@ window_copy_command(struct window_pane *wp, struct client *c, struct session *s,
return;
command = args->argv[0];
- if (m != NULL && m->valid)
+ if (m != NULL && m->valid && !MOUSE_WHEEL(m->b))
window_copy_move_mouse(m);
if (args->argc == 1) {
@@ -1170,7 +1172,6 @@ window_copy_search(struct window_pane *wp, int direction)
window_copy_move_right(s, &fx, &fy);
else
window_copy_move_left(s, &fx, &fy);
- window_copy_clear_selection(wp);
wrapflag = options_get_number(wp->window->options, "wrap-search");
cis = window_copy_is_lowercase(data->searchstr);
@@ -1271,11 +1272,13 @@ window_copy_goto_line(struct window_pane *wp, const char *linestr)
{
struct window_copy_mode_data *data = wp->modedata;
const char *errstr;
- u_int lineno;
+ int lineno;
- lineno = strtonum(linestr, 0, screen_hsize(data->backing), &errstr);
+ lineno = strtonum(linestr, -1, INT_MAX, &errstr);
if (errstr != NULL)
return;
+ if (lineno < 0 || (u_int)lineno > screen_hsize(data->backing))
+ lineno = screen_hsize(data->backing);
data->oy = lineno;
window_copy_update_selection(wp, 1);
@@ -1296,7 +1299,7 @@ window_copy_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
style_apply(&gc, oo, "mode-style");
gc.flags |= GRID_FLAG_NOPALETTE;
- if (py == 0) {
+ if (py == 0 && s->rupper < s->rlower) {
if (data->searchmark == NULL) {
size = xsnprintf(hdr, sizeof hdr,
"[%u/%u]", data->oy, screen_hsize(data->backing));
@@ -1685,7 +1688,7 @@ window_copy_copy_pipe(struct window_pane *wp, struct session *s,
expanded = format_single(NULL, arg, NULL, s, NULL, wp);
job = job_run(expanded, s, NULL, NULL, NULL, NULL, NULL, JOB_NOWAIT);
- bufferevent_write(job->event, buf, len);
+ bufferevent_write(job_get_event(job), buf, len);
free(expanded);
window_copy_copy_buffer(wp, bufname, buf, len);
@@ -1808,6 +1811,7 @@ window_copy_clear_selection(struct window_pane *wp)
screen_clear_selection(&data->screen);
data->cursordrag = CURSORDRAG_NONE;
+ data->lineflag = LINE_SEL_NONE;
py = screen_hsize(data->backing) + data->cy - data->oy;
px = window_copy_find_length(wp, py);
@@ -2079,7 +2083,7 @@ window_copy_cursor_up(struct window_pane *wp, int scroll_only)
}
}
- if (data->screen.sel != NULL || !data->rectflag) {
+ if (data->screen.sel == NULL || !data->rectflag) {
py = screen_hsize(data->backing) + data->cy - data->oy;
px = window_copy_find_length(wp, py);
if ((data->cx >= data->lastsx && data->cx != px) ||