From 50ab408816b8d701d6540731ef0e81a7c9271671 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 30 Oct 2001 22:02:15 +0000 Subject: [PATCH] Word-by-word (double-click) selection now spans line breaks if the line break was created by wrapping. (Equivalently, if the selection would _paste_ as a single word without a newline in the middle, then it will _select_ in the same way.) git-svn-id: svn://svn.tartarus.org/sgt/putty@1347 cda61777-01e9-0310-a592-d414129be87e --- terminal.c | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/terminal.c b/terminal.c index 412f6b4e..1e2d50c6 100644 --- a/terminal.c +++ b/terminal.c @@ -3067,6 +3067,7 @@ static pos sel_spread_half(pos p, int dir) { unsigned long *ldata; short wvalue; + int topy = -count234(scrollback); ldata = lineptr(p.y); @@ -3093,11 +3094,47 @@ static pos sel_spread_half(pos p, int dir) */ wvalue = wordtype(ldata[p.x]); if (dir == +1) { - while (p.x < cols && wordtype(ldata[p.x + 1]) == wvalue) - p.x++; + while (1) { + if (p.x < cols-1) { + if (wordtype(ldata[p.x + 1]) == wvalue) + p.x++; + else + break; + } else { + if (ldata[cols] & LATTR_WRAPPED) { + unsigned long *ldata2; + ldata2 = lineptr(p.y+1); + if (wordtype(ldata2[0]) == wvalue) { + p.x = 0; + p.y++; + ldata = ldata2; + } else + break; + } else + break; + } + } } else { - while (p.x > 0 && wordtype(ldata[p.x - 1]) == wvalue) - p.x--; + while (1) { + if (p.x > 0) { + if (wordtype(ldata[p.x - 1]) == wvalue) + p.x--; + else + break; + } else { + unsigned long *ldata2; + if (p.y <= topy) + break; + ldata2 = lineptr(p.y-1); + if ((ldata2[cols] & LATTR_WRAPPED) && + wordtype(ldata2[cols-1]) == wvalue) { + p.x = cols-1; + p.y--; + ldata = ldata2; + } else + break; + } + } } break; case SM_LINE: -- 2.11.0