added gadget flag to create pixel precise mouse movement events
authorHolger Schemel <info@artsoft.org>
Mon, 6 Mar 2017 17:30:28 +0000 (18:30 +0100)
committerHolger Schemel <info@artsoft.org>
Fri, 23 Mar 2018 22:21:10 +0000 (23:21 +0100)
src/libgame/gadgets.c
src/libgame/gadgets.h

index 6b7d2592f435849b3bd8fb0f8798227278a18ca7..668641bd30be64133832e37550cbc06eccedd803 100644 (file)
@@ -1681,16 +1681,20 @@ boolean HandleGadgets(int mx, int my, int button)
   {
     int last_x = gi->event.x;
     int last_y = gi->event.y;
+    int last_mx = gi->event.mx;
+    int last_my = gi->event.my;
 
-    gi->event.x = mx - gi->x;
-    gi->event.y = my - gi->y;
+    gi->event.x = gi->event.mx = mx - gi->x;
+    gi->event.y = gi->event.my = my - gi->y;
 
     if (gi->type == GD_TYPE_DRAWING_AREA)
     {
       gi->event.x /= gi->drawing.item_xsize;
       gi->event.y /= gi->drawing.item_ysize;
 
-      if (last_x != gi->event.x || last_y != gi->event.y)
+      if (last_x != gi->event.x || last_y != gi->event.y ||
+         ((last_mx != gi->event.mx || last_my != gi->event.my) &&
+          gi->event_mask & GD_EVENT_PIXEL_PRECISE))
        changed_position = TRUE;
     }
     else if (gi->type & GD_TYPE_TEXT_INPUT && button != 0 && !motion_status)
index 8cd4716c133e40fcd70794de9a0d35b125effccf..2fcc82f0fe148d99f03ed3c0dc59a3948586979c 100644 (file)
@@ -50,6 +50,7 @@
 #define GD_EVENT_TEXT_LEAVING          (1 << 6)
 #define GD_EVENT_INFO_ENTERING         (1 << 7)
 #define GD_EVENT_INFO_LEAVING          (1 << 8)
+#define GD_EVENT_PIXEL_PRECISE         (1 << 9)
 
 /* gadget button states */
 #define GD_BUTTON_UNPRESSED            0
@@ -143,6 +144,7 @@ struct GadgetEvent
 {
   unsigned int type;                   /* event type */
   int button;                          /* button number for button events */
+  int mx, my;                          /* raw gadget position at event time */
   int x, y;                            /* gadget position at event time */
   boolean off_borders;                 /* mouse pointer outside gadget? */
   int item_x, item_y, item_position;   /* new item position */