summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--screen.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/screen.c b/screen.c
index 58776548..338c00c5 100644
--- a/screen.c
+++ b/screen.c
@@ -1,4 +1,4 @@
-/* $Id: screen.c,v 1.97 2009-12-04 22:14:47 tcunha Exp $ */
+/* $Id: screen.c,v 1.98 2010-01-05 23:54:53 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -233,11 +233,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;