added scrolling any scrollbars under the mouse pointer with mouse wheel
[rocksndiamonds.git] / src / libgame / gadgets.c
index 1c52ec5d422e5ce591426280d792a62af9871c49..75d0a8558970bcb8b2da5ba4f74ec5c4a25e85c2 100644 (file)
@@ -96,6 +96,16 @@ static struct GadgetInfo *getGadgetInfoFromMousePosition(int mx, int my,
     boolean check_horizontal = (IS_WHEEL_BUTTON_HORIZONTAL(button) ||
                                GetKeyModState() & KMOD_Shift);
 
+    /* check for the first active scrollbar directly under the mouse pointer */
+    for (gi = gadget_list_first_entry; gi != NULL; gi = gi->next)
+    {
+      if (gi->mapped && gi->active &&
+         (gi->type & GD_TYPE_SCROLLBAR) &&
+         mx >= gi->x && mx < gi->x + gi->width &&
+         my >= gi->y && my < gi->y + gi->height)
+       return gi;
+    }
+
     /* check for the first active scrollbar with matching mouse wheel area */
     for (gi = gadget_list_first_entry; gi != NULL; gi = gi->next)
     {
@@ -704,6 +714,10 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
       return;
   }
 
+  // do not use direct gadget drawing anymore; this worked as a speed-up once,
+  // but would slow things down a lot now the screen is always fully redrawn
+  direct = FALSE;
+
   if (direct)
   {
     BlitBitmap(drawto, window,
@@ -980,14 +994,12 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap)
        gi->drawing.area_ysize = va_arg(ap, int);
 
        /* determine dependent values for drawing area gadget, if needed */
-       if (gi->width == 0 && gi->height == 0 &&
-           gi->drawing.item_xsize !=0 && gi->drawing.item_ysize !=0)
+       if (gi->drawing.item_xsize != 0 && gi->drawing.item_ysize != 0)
        {
          gi->width = gi->drawing.area_xsize * gi->drawing.item_xsize;
          gi->height = gi->drawing.area_ysize * gi->drawing.item_ysize;
        }
-       else if (gi->drawing.item_xsize == 0 && gi->drawing.item_ysize == 0 &&
-                gi->width != 0 && gi->height != 0)
+       else if (gi->width != 0 && gi->height != 0)
        {
          gi->drawing.item_xsize = gi->width / gi->drawing.area_xsize;
          gi->drawing.item_ysize = gi->height / gi->drawing.area_ysize;
@@ -1010,14 +1022,12 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap)
        gi->drawing.item_ysize = va_arg(ap, int);
 
        /* determine dependent values for drawing area gadget, if needed */
-       if (gi->width == 0 && gi->height == 0 &&
-           gi->drawing.area_xsize !=0 && gi->drawing.area_ysize !=0)
+       if (gi->drawing.area_xsize != 0 && gi->drawing.area_ysize != 0)
        {
          gi->width = gi->drawing.area_xsize * gi->drawing.item_xsize;
          gi->height = gi->drawing.area_ysize * gi->drawing.item_ysize;
        }
-       else if (gi->drawing.area_xsize == 0 && gi->drawing.area_ysize == 0 &&
-                gi->width != 0 && gi->height != 0)
+       else if (gi->width != 0 && gi->height != 0)
        {
          gi->drawing.area_xsize = gi->width / gi->drawing.item_xsize;
          gi->drawing.area_ysize = gi->height / gi->drawing.item_ysize;
@@ -1779,7 +1789,7 @@ boolean HandleGadgets(int mx, int my, int button)
        {
          boolean scroll_single_step = ((GetKeyModState() & KMOD_Alt) != 0);
 
-         item_steps = (scroll_single_step ? 1 : DEFAULT_WHEEL_STEPS);
+         item_steps = (scroll_single_step ? 1 : wheel_steps);
          item_direction = (button == MB_WHEEL_UP ||
                            button == MB_WHEEL_LEFT ? -1 : +1);
        }