From 739b937b74547038615996749143a69f0707b0c0 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 3 Jan 2010 17:12:04 +0000 Subject: [PATCH] Fix selection behaviour when the cursor is moved backwards (ie so the selection start is after the end). --- screen.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/screen.c b/screen.c index a9fa81ec..0d4f6e73 100644 --- a/screen.c +++ b/screen.c @@ -234,11 +234,31 @@ screen_set_selection(struct screen *s, struct screen_sel *sel = &s->sel; memcpy(&sel->cell, gc, sizeof sel->cell); - sel->flag = 1; - if (ey < sy || (sy == ey && ex < sx)) { + + /* starting line < ending line -- downward selection. */ + if (sy < ey) { + sel->sx = sx; sel->sy = sy; + sel->ex = ex; sel->ey = ey; + return; + } + + /* starting line > ending line -- upward selection. */ + if (sy > ey) { + if (sx > 0) { + sel->sx = ex; sel->sy = ey; + sel->ex = sx - 1; sel->ey = sy; + } else { + sel->sx = ex; sel->sy = ey; + sel->ex = -1; sel->ey = sy - 1; + } + return; + } + + /* starting line == ending line. */ + if (ex < sx) { sel->sx = ex; sel->sy = ey; - sel->ex = sx; sel->ey = sy; + sel->ex = sx - 1; sel->ey = sy; } else { sel->sx = sx; sel->sy = sy; sel->ex = ex; sel->ey = ey;