|
@@ -441,7 +441,7 @@ static void selclear(XEvent *);
|
|
|
static void selrequest(XEvent *);
|
|
|
|
|
|
static void selinit(void);
|
|
|
-static void selsort(void);
|
|
|
+static void selnormalize(void);
|
|
|
static inline bool selected(int, int);
|
|
|
static char *getsel(void);
|
|
|
static void selcopy(void);
|
|
@@ -657,8 +657,19 @@ y2row(int y) {
|
|
|
return LIMIT(y, 0, term.row-1);
|
|
|
}
|
|
|
|
|
|
+static int tlinelen(int y) {
|
|
|
+ int i = term.col;
|
|
|
+
|
|
|
+ while (i > 0 && term.line[y][i - 1].c[0] == ' ')
|
|
|
+ --i;
|
|
|
+
|
|
|
+ return i;
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
-selsort(void) {
|
|
|
+selnormalize(void) {
|
|
|
+ int i;
|
|
|
+
|
|
|
if(sel.ob.y == sel.oe.y) {
|
|
|
sel.nb.x = MIN(sel.ob.x, sel.oe.x);
|
|
|
sel.ne.x = MAX(sel.ob.x, sel.oe.x);
|
|
@@ -668,6 +679,15 @@ selsort(void) {
|
|
|
}
|
|
|
sel.nb.y = MIN(sel.ob.y, sel.oe.y);
|
|
|
sel.ne.y = MAX(sel.ob.y, sel.oe.y);
|
|
|
+
|
|
|
+ /* expand selection over line breaks */
|
|
|
+ if (sel.type == SEL_RECTANGULAR)
|
|
|
+ return;
|
|
|
+ i = tlinelen(sel.nb.y);
|
|
|
+ if (i < sel.nb.x)
|
|
|
+ sel.nb.x = i;
|
|
|
+ if (tlinelen(sel.ne.y) <= sel.ne.x)
|
|
|
+ sel.ne.x = term.col - 1;
|
|
|
}
|
|
|
|
|
|
static inline bool
|
|
@@ -683,8 +703,6 @@ selected(int x, int y) {
|
|
|
|
|
|
void
|
|
|
selsnap(int mode, int *x, int *y, int direction) {
|
|
|
- int i;
|
|
|
-
|
|
|
switch(mode) {
|
|
|
case SNAP_WORD:
|
|
|
/*
|
|
@@ -716,7 +734,7 @@ selsnap(int mode, int *x, int *y, int direction) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if(strchr(worddelimiters,
|
|
|
+ if(*x >= tlinelen(*y) || strchr(worddelimiters,
|
|
|
term.line[*y][*x+direction].c[0])) {
|
|
|
break;
|
|
|
}
|
|
@@ -747,18 +765,6 @@ selsnap(int mode, int *x, int *y, int direction) {
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
- default:
|
|
|
- /*
|
|
|
- * Select the whole line when the end of line is reached.
|
|
|
- */
|
|
|
- if(direction > 0) {
|
|
|
- i = term.col;
|
|
|
- while(--i > 0 && term.line[*y][i].c[0] == ' ')
|
|
|
- /* nothing */;
|
|
|
- if(i > 0 && i < *x)
|
|
|
- *x = term.col - 1;
|
|
|
- }
|
|
|
- break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -780,7 +786,7 @@ getbuttoninfo(XEvent *e) {
|
|
|
selsnap(sel.snap, &sel.oe.x, &sel.oe.y, -1);
|
|
|
selsnap(sel.snap, &sel.ob.x, &sel.ob.y, +1);
|
|
|
}
|
|
|
- selsort();
|
|
|
+ selnormalize();
|
|
|
|
|
|
sel.type = SEL_REGULAR;
|
|
|
for(type = 1; type < LEN(selmasks); ++type) {
|
|
@@ -896,7 +902,7 @@ bpress(XEvent *e) {
|
|
|
}
|
|
|
selsnap(sel.snap, &sel.ob.x, &sel.ob.y, -1);
|
|
|
selsnap(sel.snap, &sel.oe.x, &sel.oe.y, +1);
|
|
|
- selsort();
|
|
|
+ selnormalize();
|
|
|
|
|
|
/*
|
|
|
* Draw selection, unless it's regular and we don't want to
|
|
@@ -1451,7 +1457,7 @@ selscroll(int orig, int n) {
|
|
|
sel.oe.x = term.col;
|
|
|
}
|
|
|
}
|
|
|
- selsort();
|
|
|
+ selnormalize();
|
|
|
}
|
|
|
}
|
|
|
|