major cleanup of preprocessor hell
[rocksndiamonds.git] / src / libgame / gadgets.c
index 3d593a9b1f12ba6ee05346c898bcb6775ddf29ee..9c974b872ed91f485820fe4378e17478f19b9fd0 100644 (file)
@@ -1,15 +1,13 @@
-/***********************************************************
-* Artsoft Retro-Game Library                               *
-*----------------------------------------------------------*
-* (c) 1994-2006 Artsoft Entertainment                      *
-*               Holger Schemel                             *
-*               Detmolder Strasse 189                      *
-*               33604 Bielefeld                            *
-*               Germany                                    *
-*               e-mail: info@artsoft.org                   *
-*----------------------------------------------------------*
-* gadgets.c                                                *
-***********************************************************/
+// ============================================================================
+// Artsoft Retro-Game Library
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+//                         Holger Schemel
+//                 info@artsoft.org
+//                 http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// gadgets.c
+// ============================================================================
 
 #include <stdarg.h>
 #include <string.h>
@@ -26,6 +24,9 @@
 #define DG_BUFFERED            0
 #define DG_DIRECT              1
 
+#define GADGET_DEACTIVATED(g)  ((g)->x < 0 || (g)->y < 0)
+
+
 static struct GadgetInfo *gadget_list_first_entry = NULL;
 static struct GadgetInfo *gadget_list_last_entry = NULL;
 static struct GadgetInfo *last_info_gi = NULL;
@@ -381,16 +382,9 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
                                   gi->height - 2 * border_y);
 
        /* gadget text value */
-#if 1
        DrawTextBuffer(gi->x + border_x, gi->y + border_y, gi->textarea.value,
-                      font_nr, gi->textarea.xsize, -1, gi->textarea.ysize,
+                      font_nr, gi->textarea.xsize, -1, gi->textarea.ysize, 0,
                       BLIT_ON_BACKGROUND, FALSE, FALSE, FALSE);
-#else
-       DrawTextToTextArea(gi->x + border_x, gi->y + border_y,
-                          gi->textarea.value, font_nr, gi->textarea.xsize,
-                          gi->textarea.xsize, gi->textarea.ysize,
-                          BLIT_ON_BACKGROUND);
-#endif
 
        cursor_letter = gi->textarea.value[gi->textarea.cursor_position];
        cursor_string[0] = (cursor_letter != '\0' ? cursor_letter : ' ');
@@ -706,9 +700,15 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
                 gi->selectbox.x,     gi->selectbox.y);
   }
   else
-    redraw_mask |= (gi->x < gfx.sx + gfx.sxsize ? REDRAW_FIELD :
-                   gi->y < gfx.dy + gfx.dysize ? REDRAW_DOOR_1 :
-                   gi->y > gfx.vy ? REDRAW_DOOR_2 : REDRAW_DOOR_3);
+  {
+    int x = gi->x;
+    int y = gi->y;
+
+    redraw_mask |= (IN_GFX_FIELD_FULL(x, y) ? REDRAW_FIELD :
+                   IN_GFX_DOOR_1(x, y) ? REDRAW_DOOR_1 :
+                   IN_GFX_DOOR_2(x, y) ? REDRAW_DOOR_2 :
+                   IN_GFX_DOOR_3(x, y) ? REDRAW_DOOR_3 : REDRAW_ALL);
+  }
 }
 
 static int get_minimal_size_for_numeric_input(int minmax_value)
@@ -1248,6 +1248,9 @@ void FreeGadget(struct GadgetInfo *gi)
 {
   struct GadgetInfo *gi_previous = gadget_list_first_entry;
 
+  if (gi == NULL)
+    return;
+
   /* prevent "last_info_gi" from pointing to memory that will be freed */
   if (last_info_gi == gi)
     last_info_gi = NULL;
@@ -1292,7 +1295,7 @@ static struct GadgetInfo *last_gi = NULL;
 
 static void MapGadgetExt(struct GadgetInfo *gi, boolean redraw)
 {
-  if (gi == NULL || gi->mapped)
+  if (gi == NULL || gi->mapped || GADGET_DEACTIVATED(gi))
     return;
 
   gi->mapped = TRUE;
@@ -1324,9 +1327,11 @@ void UnmapGadget(struct GadgetInfo *gi)
 #define MULTIMAP_PLAYFIELD     (1 << 3)
 #define MULTIMAP_DOOR_1                (1 << 4)
 #define MULTIMAP_DOOR_2                (1 << 5)
+#define MULTIMAP_DOOR_3                (1 << 6)
 #define MULTIMAP_ALL           (MULTIMAP_PLAYFIELD | \
-                                MULTIMAP_DOOR_1 | \
-                                MULTIMAP_DOOR_2)
+                                MULTIMAP_DOOR_1    | \
+                                MULTIMAP_DOOR_2    | \
+                                MULTIMAP_DOOR_3)
 
 static void MultiMapGadgets(int mode)
 {
@@ -1336,12 +1341,13 @@ static void MultiMapGadgets(int mode)
 
   while (gi != NULL)
   {
-    if ((mode & MULTIMAP_PLAYFIELD &&
-        gi->x < gfx.sx + gfx.sxsize) ||
-       (mode & MULTIMAP_DOOR_1 &&
-        gi->x >= gfx.dx && gi->y < gfx.dy + gfx.dysize) ||
-       (mode & MULTIMAP_DOOR_2 &&
-        gi->x >= gfx.dx && gi->y > gfx.dy + gfx.dysize) ||
+    int x = gi->x;
+    int y = gi->y;
+
+    if ((mode & MULTIMAP_PLAYFIELD && IN_GFX_FIELD_FULL(x, y)) ||
+       (mode & MULTIMAP_DOOR_1 && IN_GFX_DOOR_1(x, y)) ||
+       (mode & MULTIMAP_DOOR_2 && IN_GFX_DOOR_2(x, y)) ||
+       (mode & MULTIMAP_DOOR_3 && IN_GFX_DOOR_3(x, y)) ||
        (mode & MULTIMAP_ALL) == MULTIMAP_ALL)
     {
       if (mode & MULTIMAP_UNMAP)
@@ -1399,18 +1405,18 @@ boolean anyTextGadgetActive()
 
 static boolean insideSelectboxLine(struct GadgetInfo *gi, int mx, int my)
 {
-  return(gi != NULL &&
-        gi->type & GD_TYPE_SELECTBOX &&
-        mx >= gi->x && mx < gi->x + gi->width &&
-        my >= gi->y && my < gi->y + gi->height);
+  return (gi != NULL &&
+         gi->type & GD_TYPE_SELECTBOX &&
+         mx >= gi->x && mx < gi->x + gi->width &&
+         my >= gi->y && my < gi->y + gi->height);
 }
 
 static boolean insideSelectboxArea(struct GadgetInfo *gi, int mx, int my)
 {
-  return(gi != NULL &&
-        gi->type & GD_TYPE_SELECTBOX &&
-        mx >= gi->selectbox.x && mx < gi->selectbox.x + gi->selectbox.width &&
-        my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height);
+  return (gi != NULL &&
+         gi->type & GD_TYPE_SELECTBOX &&
+         mx >= gi->selectbox.x && mx < gi->selectbox.x + gi->selectbox.width &&
+         my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height);
 }
 
 void ClickOnGadget(struct GadgetInfo *gi, int button)
@@ -1431,8 +1437,8 @@ void ClickOnGadget(struct GadgetInfo *gi, int button)
 
 boolean HandleGadgets(int mx, int my, int button)
 {
-  static unsigned long pressed_delay = 0;
-  static unsigned long pressed_delay_value = GADGET_FRAME_DELAY;
+  static unsigned int pressed_delay = 0;
+  static unsigned int pressed_delay_value = GADGET_FRAME_DELAY;
   static int last_button = 0;
   static int last_mx = 0, last_my = 0;
   static int pressed_mx = 0, pressed_my = 0;
@@ -1458,7 +1464,6 @@ boolean HandleGadgets(int mx, int my, int button)
   boolean gadget_dragging;
   boolean gadget_released;
   boolean gadget_released_inside;
-  boolean gadget_released_inside_select_line;
   boolean gadget_released_inside_select_area;
   boolean gadget_released_off_borders;
   boolean changed_position = FALSE;
@@ -1560,15 +1565,9 @@ boolean HandleGadgets(int mx, int my, int button)
 
   /* when handling selectbox, set additional state values */
   if (gadget_released_inside && (last_gi->type & GD_TYPE_SELECTBOX))
-  {
-    gadget_released_inside_select_line = insideSelectboxLine(last_gi, mx, my);
     gadget_released_inside_select_area = insideSelectboxArea(last_gi, mx, my);
-  }
   else
-  {
-    gadget_released_inside_select_line = FALSE;
     gadget_released_inside_select_area = FALSE;
-  }
 
   /* setting state for handling over-large selectbox */
   if (keep_selectbox_open && (press_event || !mouse_inside_select_line))