X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=5251e70660909f70de4fbda7b501cf33cc14a9e3;hb=8e968739c3cfc4e9f7088a9ea360bc4f37e9ad9f;hp=509531533f2f37769958bceb246d256e480d3129;hpb=911ba5674bc4eb53a2ed548856a50032c39ca7f2;p=st.git diff --git a/st.c b/st.c index 5095315..5251e70 100644 --- a/st.c +++ b/st.c @@ -679,8 +679,14 @@ selected(int x, int y) { void selsnap(int mode, int *x, int *y, int direction) { + int i; + switch(mode) { case SNAP_WORD: + /* + * Snap around if the word wraps around at the end or + * beginning of a line. + */ for(;;) { if(direction < 0 && *x <= 0) { if(*y > 0 && term.line[*y - 1][term.col-1].mode @@ -701,13 +707,20 @@ selsnap(int mode, int *x, int *y, int direction) { } } - if(term.line[*y][*x + direction].c[0] == ' ') + if(strchr(worddelimiters, + term.line[*y][*x + direction].c[0])) { break; + } *x += direction; } break; case SNAP_LINE: + /* + * Snap around if the the previous line or the current one + * has set ATTR_WRAP at its end. Then the whole next or + * previous line will be selected. + */ *x = (direction < 0) ? 0 : term.col - 1; if(direction < 0 && *y > 0) { for(; *y > 0; *y += direction) { @@ -726,6 +739,16 @@ 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; } } @@ -879,7 +902,7 @@ bpress(XEvent *e) { void selcopy(void) { char *str, *ptr; - int x, y, bufsize, size; + int x, y, bufsize, size, i, ex; Glyph *gp, *last; if(sel.bx == -1) { @@ -917,6 +940,21 @@ selcopy(void) { */ if(y < sel.e.y && !((gp-1)->mode & ATTR_WRAP)) *ptr++ = '\n'; + + /* + * If the last selected line expands in the selection + * after the visible text '\n' is appended. + */ + if(y == sel.e.y) { + i = term.col; + while(--i > 0 && term.line[y][i].c[0] == ' ') + /* nothing */; + ex = sel.e.x; + if(sel.b.y == sel.e.y && sel.e.x < sel.b.x) + ex = sel.b.x; + if(i < ex) + *ptr++ = '\n'; + } } *ptr = 0; } @@ -3496,8 +3534,15 @@ run(void) { xev--; if(!FD_ISSET(cmdfd, &rfd) && !FD_ISSET(xfd, &rfd)) { if(blinkset) { - drawtimeout.tv_usec = 1000 * \ - blinktimeout; + if(TIMEDIFF(now, lastblink) \ + > blinktimeout) { + drawtimeout.tv_usec = 1; + } else { + drawtimeout.tv_usec = (1000 * \ + (blinktimeout - \ + TIMEDIFF(now, + lastblink))); + } } else { tv = NULL; }