// (c) 1995-2014 by Artsoft Entertainment
// Holger Schemel
// info@artsoft.org
-// http://www.artsoft.org/
+// https://www.artsoft.org/
// ----------------------------------------------------------------------------
// gadgets.c
// ============================================================================
}
if (next_free_gadget_id <= 0) // cannot get new gadget id
- Error(ERR_EXIT, "too much gadgets -- this should not happen");
+ Fail("too much gadgets -- this should not happen");
return id;
}
int alpha_max = SDL_ALPHA_OPAQUE;
int alpha_step = ALPHA_FADING_STEPSIZE(alpha_max);
- if (gi->mapped)
+ // only show mapped overlay touch buttons if touch screen is really used
+ if (gi->mapped && runtime.uses_touch_device)
{
if (alpha < alpha_max)
alpha = MIN(alpha + alpha_step, alpha_max);
while (tag != GDI_END)
{
- switch(tag)
+ switch (tag)
{
case GDI_IMAGE_ID:
gi->image_id = va_arg(ap, int);
break;
default:
- Error(ERR_EXIT, "HandleGadgetTags(): unknown tag %d", tag);
+ Fail("HandleGadgetTags(): unknown tag %d", tag);
}
tag = va_arg(ap, int); // read next tag
gi->height = 2 * border_ysize + font_height;
if (gi->selectbox.options == NULL)
- Error(ERR_EXIT, "selectbox gadget incomplete (missing options array)");
+ Fail("selectbox gadget incomplete (missing options array)");
gi->selectbox.num_values = 0;
while (gi->selectbox.options[gi->selectbox.num_values].text != NULL)
if (gi->width == 0 || gi->height == 0 ||
gs->items_max == 0 || gs->items_visible == 0)
- Error(ERR_EXIT, "scrollbar gadget incomplete (missing tags)");
+ Fail("scrollbar gadget incomplete (missing tags)");
// calculate internal scrollbar values
gs->size_min = (gi->type == GD_TYPE_SCROLLBAR_VERTICAL ?
if (gi == NULL || gi->deactivated || gi->mapped)
return;
+ // do not map overlay touch buttons if touch screen is not used
+ if (gi->overlay_touch_button && !runtime.uses_touch_device)
+ return;
+
gi->mapped = TRUE;
if (redraw)
struct GadgetInfo *gi = last_gi;
boolean gadget_changed = ((gi->event_mask & GD_EVENT_TEXT_LEAVING) != 0);
- // check if text gadget has changed its value
+ // check if text input gadget has changed its value
if (gi->type & GD_TYPE_TEXT_INPUT)
{
CheckRangeOfNumericInputGadget(gi);
gadget_changed = FALSE;
}
+ // check if text area gadget has changed its value
+ if (gi->type & GD_TYPE_TEXT_AREA)
+ {
+ if (!strEqual(gi->textarea.last_value, gi->textarea.value))
+ strcpy(gi->textarea.last_value, gi->textarea.value);
+ else
+ gadget_changed = FALSE;
+ }
+
// selectbox does not change its value when closed by clicking outside
if (gi->type & GD_TYPE_SELECTBOX)
gadget_changed = FALSE;
if (gadget_pressed) // gadget pressed the first time
{
// initialize delay counter
- DelayReached(&pressed_delay, 0);
+ ResetDelayCounter(&pressed_delay);
// start gadget delay with longer delay after first click on gadget
pressed_delay_value = GADGET_FRAME_DELAY_FIRST;
{
if (anyTextGadgetActive())
{
+ boolean gadget_changed = ((gi->event_mask & GD_EVENT_TEXT_LEAVING) != 0);
+
// restore previous text (before activating text gadget)
if (gi->type & GD_TYPE_TEXT_INPUT)
+ {
strcpy(gi->textinput.value, gi->textinput.last_value);
+ CheckRangeOfNumericInputGadget(gi);
+ }
+
+ // store current text for text area gadgets when pressing "Escape" key
+ if (gi->type & GD_TYPE_TEXT_AREA)
+ {
+ if (!strEqual(gi->textarea.last_value, gi->textarea.value))
+ strcpy(gi->textarea.last_value, gi->textarea.value);
+ else
+ gadget_changed = FALSE;
+ }
+
DrawGadget(gi, DG_UNPRESSED, gi->direct_draw);
+ if (gi->type & GD_TYPE_TEXT_AREA)
+ {
+ gi->event.type = GD_EVENT_TEXT_LEAVING;
+
+ DoGadgetCallbackAction(gi, gadget_changed);
+ }
+
last_gi = NULL;
StopTextInput();