shithub: puzzles

Download patch

ref: ed63f9c50efeb26f3decade7dc50c7b0efa008ae
parent: f3168895c89e706c53c881f53ba3dfc0fc1150ec
author: Simon Tatham <anakin@pobox.com>
date: Tue Jan 31 03:38:42 EST 2012

Sort out a bit of confusion between mouse- and keyboard-driven drags
in Rectangles. Mouse drags now take priority - you can't start a
keyboard drag while the mouse is held down, and starting a mouse drag
instantly cancels an unfinished keyboard drag - and also I've fixed an
assertion failure which would come up if you had the keyboard cursor
visible at the end of a mouse drag (by pressing arrow keys while the
mouse was held down).

[originally from svn r9393]

--- a/rect.c
+++ b/rect.c
@@ -2377,6 +2377,21 @@
     coord_round(FROMCOORD((float)x), FROMCOORD((float)y), &xc, &yc);
 
     if (button == LEFT_BUTTON || button == RIGHT_BUTTON) {
+        if (ui->drag_start_x >= 0 && ui->cur_dragging) {
+            /*
+             * If a keyboard drag is in progress, unceremoniously
+             * cancel it.
+             */
+            ui->drag_start_x = -1;
+            ui->drag_start_y = -1;
+            ui->drag_end_x = -1;
+            ui->drag_end_y = -1;
+            ui->x1 = -1;
+            ui->y1 = -1;
+            ui->x2 = -1;
+            ui->y2 = -1;
+            ui->dragged = FALSE;
+        }
         startdrag = TRUE;
         ui->cur_visible = ui->cur_dragging = FALSE;
         active = TRUE;
@@ -2383,7 +2398,10 @@
         erasing = (button == RIGHT_BUTTON);
     } else if (button == LEFT_RELEASE || button == RIGHT_RELEASE) {
         /* We assert we should have had a LEFT_BUTTON first. */
-        assert(!ui->cur_visible);
+        if (ui->cur_visible) {
+            ui->cur_visible = FALSE;
+            active = TRUE;
+        }
         assert(!ui->cur_dragging);
         enddrag = TRUE;
         erasing = (button == RIGHT_RELEASE);
@@ -2394,6 +2412,13 @@
         if (!ui->cur_dragging) return "";
         coord_round((float)ui->cur_x + 0.5F, (float)ui->cur_y + 0.5F, &xc, &yc);
     } else if (IS_CURSOR_SELECT(button)) {
+        if (ui->drag_start_x >= 0 && !ui->cur_dragging) {
+            /*
+             * If a mouse drag is in progress, ignore attempts to
+             * start a keyboard one.
+             */
+            return NULL;
+        }
         if (!ui->cur_visible) {
             assert(!ui->cur_dragging);
             ui->cur_visible = TRUE;