X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fgadgets.c;h=937f7a3a22bd5e8c9b00bbe058d065ed8b0c5b1c;hb=ad39e47f9139a72a602fa65e783baf581919972d;hp=4cf008fc01eaaec6044f85d3de57e00bfd4cad36;hpb=115ce6f2da1914d68b0fe0e5f9082973190dacdd;p=rocksndiamonds.git diff --git a/src/libgame/gadgets.c b/src/libgame/gadgets.c index 4cf008fc..937f7a3a 100644 --- a/src/libgame/gadgets.c +++ b/src/libgame/gadgets.c @@ -213,6 +213,12 @@ static void default_callback_action(void *ptr) return; } +static void DoGadgetCallbackAction(struct GadgetInfo *gi, boolean changed) +{ + if (changed || gi->callback_action_always) + gi->callback_action(gi); +} + static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) { struct GadgetDesign *gd; @@ -841,6 +847,10 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) gi->direct_draw = (boolean)va_arg(ap, int); break; + case GDI_CALLBACK_ACTION_ALWAYS: + gi->callback_action_always = (boolean)va_arg(ap, int); + break; + case GDI_CHECKED: gi->checked = (boolean)va_arg(ap, int); break; @@ -1494,11 +1504,18 @@ void ClickOnGadget(struct GadgetInfo *gi, int button) if (button_status) HandleGadgets(-1, -1, 0); + int x = gi->x; + int y = gi->y; + + /* set cursor position to the end of the text for text input gadgets */ + if (gi->type & GD_TYPE_TEXT_INPUT) + x = gi->x + gi->width - 1; + /* simulate pressing mouse button over specified gadget */ - HandleGadgets(gi->x, gi->y, button); + HandleGadgets(x, y, button); /* simulate releasing mouse button over specified gadget */ - HandleGadgets(gi->x, gi->y, 0); + HandleGadgets(x, y, 0); } boolean HandleGadgets(int mx, int my, int button) @@ -1604,8 +1621,8 @@ boolean HandleGadgets(int mx, int my, int button) gi->event.type = GD_EVENT_TEXT_LEAVING; - if (gadget_changed && !(gi->type & GD_TYPE_SELECTBOX)) - gi->callback_action(gi); + if (!(gi->type & GD_TYPE_SELECTBOX)) + DoGadgetCallbackAction(gi, gadget_changed); last_gi = NULL; @@ -1858,8 +1875,8 @@ boolean HandleGadgets(int mx, int my, int button) gi->event.type = GD_EVENT_MOVING; gi->event.off_borders = FALSE; - if (gi->event_mask & GD_EVENT_MOVING && changed_position) - gi->callback_action(gi); + if (gi->event_mask & GD_EVENT_MOVING) + DoGadgetCallbackAction(gi, changed_position); return TRUE; } @@ -2014,9 +2031,9 @@ boolean HandleGadgets(int mx, int my, int button) gi->event.type = GD_EVENT_MOVING; gi->event.off_borders = gadget_moving_off_borders; - if (gi->event_mask & GD_EVENT_MOVING && changed_position && + if (gi->event_mask & GD_EVENT_MOVING && (gadget_moving_inside || gi->event_mask & GD_EVENT_OFF_BORDERS)) - gi->callback_action(gi); + DoGadgetCallbackAction(gi, changed_position); } if (gadget_released_inside) @@ -2048,10 +2065,8 @@ boolean HandleGadgets(int mx, int my, int button) gi->state = GD_BUTTON_UNPRESSED; gi->event.type = GD_EVENT_RELEASED; - if ((gi->event_mask & GD_EVENT_RELEASED) && gadget_changed) - { - gi->callback_action(gi); - } + if ((gi->event_mask & GD_EVENT_RELEASED)) + DoGadgetCallbackAction(gi, gadget_changed); } if (gadget_released_off_borders) @@ -2142,8 +2157,7 @@ boolean HandleGadgetsKeyInput(Key key) last_gi = NULL; } - if (gadget_changed) - gi->callback_action(gi); + DoGadgetCallbackAction(gi, gadget_changed); } else if (gi->type & GD_TYPE_TEXT_INPUT) /* only valid for text input */ {