int mx = MIN(MAX(0, gfx.mouse_x), WIN_XSIZE - 1);
int my = MIN(MAX(0, gfx.mouse_y), WIN_YSIZE - 1);
- viewport_x = mx + part->control_info.x;
- viewport_y = my + part->control_info.y;
+ // prevent displaying off-screen custom mouse cursor in upper left corner
+ if (gfx.mouse_x == POS_OFFSCREEN &&
+ gfx.mouse_y == POS_OFFSCREEN)
+ mx = my = POS_OFFSCREEN;
+
+ viewport_x = mx - part->control_info.x;
+ viewport_y = my - part->control_info.y;
viewport_width = part->graphic_info.width;
viewport_height = part->graphic_info.height;
part->viewport_width = viewport_width;
part->viewport_height = viewport_height;
- changed = TRUE;
+ if (part->control_info.class != get_hash_from_key("pointer"))
+ changed = TRUE;
}
return changed;
}
static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
- boolean *anything_clicked,
+ boolean *click_consumed,
boolean *any_event_action,
int event_value, char *info_text)
{
{
struct GlobalAnimPartControlInfo *part2 = &anim2->part[part2_nr];
- if (part2->state != ANIM_STATE_RUNNING)
+ if (!(part2->state & ANIM_STATE_RUNNING))
continue;
if (isClickablePart(part2, mask))
{
part2->triggered = TRUE;
- *anything_clicked = clickConsumed(part); // click was on "part"!
+ *click_consumed = clickConsumed(part); // click was on "part"!
#if DEBUG_ANIM_EVENTS
printf("::: => %d.%d TRIGGERED BY %s OF %d.%d\n",
printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text);
#endif
- boolean anything_clicked = FALSE;
+ boolean click_consumed = FALSE;
boolean any_event_action = FALSE;
// check if this event is defined to trigger other animations
- InitGlobalAnim_Triggered(part, &anything_clicked, &any_event_action,
+ InitGlobalAnim_Triggered(part, &click_consumed, &any_event_action,
event_value, info_text);
}
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
{
- boolean anything_clicked = FALSE;
+ boolean click_consumed = FALSE;
boolean any_part_clicked = FALSE;
boolean any_event_action = FALSE;
int mode_nr;
if (!part->clickable)
continue;
- if (part->state != ANIM_STATE_RUNNING)
+ if (!(part->state & ANIM_STATE_RUNNING))
continue;
// always handle "any" click events (clicking anywhere on screen) ...
#endif
part->clicked = TRUE;
- anything_clicked = clickConsumed(part);
+ click_consumed = clickConsumed(part);
}
// always handle "unclick:any" events (releasing anywhere on screen) ...
#endif
part->clicked = TRUE;
- anything_clicked = clickConsumed(part);
+ click_consumed = clickConsumed(part);
}
// ... but only handle the first (topmost) clickable animation
#endif
part->clicked = TRUE;
- anything_clicked = clickConsumed(part);
+ click_consumed = clickConsumed(part);
}
// check if this click is defined to trigger other animations
- InitGlobalAnim_Triggered(part, &anything_clicked, &any_event_action,
+ InitGlobalAnim_Triggered(part, &click_consumed, &any_event_action,
ANIM_EVENT_CLICK, "CLICK");
}
}
}
}
- if (anything_clicked)
+ if (click_consumed)
{
handle_click = TRUE;
handle_click = FALSE;
}
- return (anything_clicked || any_event_action);
+ return (click_consumed || any_event_action);
}
static void ResetGlobalAnim_Clickable(void)