chiark / gitweb /
Clean up the behaviour of drags off the edge of the grid. These have
authorSimon Tatham <anakin@pobox.com>
Fri, 10 Jun 2005 13:05:24 +0000 (13:05 +0000)
committerSimon Tatham <anakin@pobox.com>
Fri, 10 Jun 2005 13:05:24 +0000 (13:05 +0000)
always been a convenient way to cancel a drag you decided was an
error, but now it's more obvious that this is the case.

[originally from svn r5941]

rect.c

diff --git a/rect.c b/rect.c
index 95d1d8cb8e96309dfb0f05a69d999f15ad635aef..46060a4fd0fcf4b0afe20e84fa560dc4917dc91b 100644 (file)
--- a/rect.c
+++ b/rect.c
@@ -2138,11 +2138,11 @@ static void coord_round(float x, float y, int *xr, int *yr)
                 /* Vertical edge: x-coord of corner,
                  * y-coord of square centre. */
                 *xr = 2 * (int)xv;
-                *yr = 1 + 2 * (int)ys;
+                *yr = 1 + 2 * (int)floor(ys);
             } else {
                 /* Horizontal edge: x-coord of square centre,
                  * y-coord of corner. */
-                *xr = 1 + 2 * (int)xs;
+                *xr = 1 + 2 * (int)floor(xs);
                 *yr = 2 * (int)yv;
             }
         }
@@ -2233,19 +2233,26 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
         ui->dragged = TRUE;
         active = TRUE;
 
-       ui->x1 = ui->drag_start_x;
-       ui->x2 = ui->drag_end_x;
-       if (ui->x2 < ui->x1) { t = ui->x1; ui->x1 = ui->x2; ui->x2 = t; }
-
-       ui->y1 = ui->drag_start_y;
-       ui->y2 = ui->drag_end_y;
-       if (ui->y2 < ui->y1) { t = ui->y1; ui->y1 = ui->y2; ui->y2 = t; }
-
-       ui->x1 = ui->x1 / 2;               /* rounds down */
-       ui->x2 = (ui->x2+1) / 2;           /* rounds up */
-       ui->y1 = ui->y1 / 2;               /* rounds down */
-       ui->y2 = (ui->y2+1) / 2;           /* rounds up */
-
+       if (xc >= 0 && xc <= 2*from->w &&
+           yc >= 0 && yc <= 2*from->h) {
+            ui->x1 = ui->drag_start_x;
+            ui->x2 = ui->drag_end_x;
+            if (ui->x2 < ui->x1) { t = ui->x1; ui->x1 = ui->x2; ui->x2 = t; }
+
+            ui->y1 = ui->drag_start_y;
+            ui->y2 = ui->drag_end_y;
+            if (ui->y2 < ui->y1) { t = ui->y1; ui->y1 = ui->y2; ui->y2 = t; }
+
+            ui->x1 = ui->x1 / 2;               /* rounds down */
+            ui->x2 = (ui->x2+1) / 2;           /* rounds up */
+            ui->y1 = ui->y1 / 2;               /* rounds down */
+            ui->y2 = (ui->y2+1) / 2;           /* rounds up */
+        } else {
+            ui->x1 = -1;
+            ui->y1 = -1;
+            ui->x2 = -1;
+            ui->y2 = -1;
+        }
     }
 
     ret = NULL;