]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - terminal.c
Do not send raw mouse events in the middle of a selection operation, even if
[PuTTY.git] / terminal.c
index db61a1ac3c93ea52459b404f25a18733cd94b294..956af211c2271cf796ef8dc32f89c4421e3443b2 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Terminal emulator.
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
@@ -4822,10 +4826,12 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
                != newline[j].attr) {
                int k;
 
-               for (k = laststart; k < j; k++)
-                   term->disptext[i]->chars[k].attr |= ATTR_INVALID;
+               if (!dirtyrect) {
+                   for (k = laststart; k < j; k++)
+                       term->disptext[i]->chars[k].attr |= ATTR_INVALID;
 
-               dirtyrect = TRUE;
+                   dirtyrect = TRUE;
+               }
            }
 
            if (dirtyrect)
@@ -5572,7 +5578,16 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
     selpoint.x = x;
     unlineptr(ldata);
 
-    if (raw_mouse) {
+    /*
+     * If we're in the middle of a selection operation, we ignore raw
+     * mouse mode until it's done (we must have been not in raw mouse
+     * mode when it started).
+     * This makes use of Shift for selection reliable, and avoids the
+     * host seeing mouse releases for which they never saw corresponding
+     * presses.
+     */
+    if (raw_mouse &&
+       (term->selstate != ABOUT_TO) && (term->selstate != DRAGGING)) {
        int encstate = 0, r, c;
        char abuf[16];