--- st.c | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/st.c b/st.c index 5946c7c..8398102 100644 --- a/st.c +++ b/st.c _AT_@ -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); _AT_@ -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); _AT_@ -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 _AT_@ -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: /* _AT_@ -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; } _AT_@ -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; } } _AT_@ -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) { _AT_@ -894,7 +900,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 _AT_@ -1449,7 +1455,7 @@ selscroll(int orig, int n) { sel.oe.x = term.col; } } - selsort(); + selnormalize(); } } -- 2.0.0 -- Ivan "Colona" DelalandeReceived on Tue Jun 03 2014 - 04:34:58 CEST
This archive was generated by hypermail 2.3.0 : Tue Jun 03 2014 - 04:36:06 CEST