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)
{
case GD_TYPE_NORMAL_BUTTON:
case GD_TYPE_CHECK_BUTTON:
case GD_TYPE_RADIO_BUTTON:
+
BlitBitmapOnBackground(gd->bitmap, drawto,
gd->x, gd->y, gi->width, gi->height,
gi->x, gi->y);
+
if (gi->deco.design.bitmap)
+ {
+ // make sure that decoration does not overlap gadget border
+ int deco_x = gi->deco.x + (pressed ? gi->deco.xshift : 0);
+ int deco_y = gi->deco.y + (pressed ? gi->deco.yshift : 0);
+ int deco_width = MIN(gi->deco.width, gi->width - deco_x);
+ int deco_height = MIN(gi->deco.height, gi->height - deco_y);
+
BlitBitmap(gi->deco.design.bitmap, drawto,
gi->deco.design.x, gi->deco.design.y,
- gi->deco.width, gi->deco.height,
- gi->x + gi->deco.x + (pressed ? gi->deco.xshift : 0),
- gi->y + gi->deco.y + (pressed ? gi->deco.yshift : 0));
+ deco_width, deco_height, gi->x + deco_x, gi->y + deco_y);
+ }
+
break;
case GD_TYPE_TEXT_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);
}