From d3e7f0533cacbe8dc912a702bf51109ede78820b Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 9 Jun 2018 00:23:48 +0200 Subject: [PATCH] added "passthrough" option for clickable global animations This change adds a new option for the "graphicsinfo.conf" file for defining a "passthrough" option for global animations that causes clicks on clickable global animations not to be consumed, but to be passed-through to the underlying screen controls (or other global animations under the clicked global animation). The new option works like this: global.anim_1.part_1.MAIN.anim_event: click global.anim_1.part_1.MAIN.style: passthrough_clicks The second option is the new one (the first one already existed). When clicking this global animation (on the main menu screen), the click will passed-through to the main menu screen to be further processed by screen controls like gadgets or menu buttons. --- src/anim.c | 13 ++++++++++--- src/libgame/misc.c | 3 +++ src/libgame/system.h | 3 +++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/anim.c b/src/anim.c index d1ae06a1..0a4946a2 100644 --- a/src/anim.c +++ b/src/anim.c @@ -1003,6 +1003,13 @@ static boolean isClickedPart(struct GlobalAnimPartControlInfo *part, return TRUE; } +static boolean setPartClicked(struct GlobalAnimPartControlInfo *part) +{ + part->clicked = TRUE; + + return (part->control_info.style & STYLE_PASSTHROUGH ? FALSE : TRUE); +} + int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) { struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[part->mode_nr]; @@ -1510,7 +1517,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) // always handle "any" click events (clicking anywhere on screen) ... if (isClickablePart(part, ANIM_EVENT_ANY)) - anything_clicked = part->clicked = TRUE; + anything_clicked = setPartClicked(part); // ... but only handle the first (topmost) clickable animation if (any_part_clicked) @@ -1530,7 +1537,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) any_part_clicked = TRUE; if (isClickablePart(part, ANIM_EVENT_SELF)) - anything_clicked = part->clicked = TRUE; + anything_clicked = setPartClicked(part); // check if this click is defined to trigger other animations int gic_anim_nr = part->old_anim_nr + 1; // X as in "anim_X" @@ -1556,7 +1563,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) if (isClickablePart(part2, mask)) { - anything_clicked = part2->clicked = TRUE; + setPartClicked(part2); #if 0 printf("::: %d.%d TRIGGER CLICKED [%d]\n", anim2_nr, part2_nr, diff --git a/src/libgame/misc.c b/src/libgame/misc.c index d57b5030..4a71d544 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -2928,6 +2928,9 @@ int get_parameter_value(char *value_raw, char *suffix, int type) if (string_has_parameter(value, "reverse")) result |= STYLE_REVERSE; + + if (string_has_parameter(value, "passthrough_clicks")) + result |= STYLE_PASSTHROUGH; } else if (strEqual(suffix, ".fade_mode")) { diff --git a/src/libgame/system.h b/src/libgame/system.h index ab8f43b0..e396a369 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -330,6 +330,9 @@ #define STYLE_INNER_CORNERS (1 << 1) #define STYLE_REVERSE (1 << 2) +/* values for special event handling style (used for global animation) */ +#define STYLE_PASSTHROUGH (1 << 3) + #define STYLE_DEFAULT STYLE_NONE /* values for special global animation events */ -- 2.34.1