rnd-19990125-1
[rocksndiamonds.git] / src / buttons.c
index 721a8335b47a7d899595d4f7720f26582b2f4a4a..1d29e9a513bd5f50d3e85c318022b5343a432392 100644 (file)
@@ -1658,33 +1658,7 @@ static struct GadgetInfo *getGadgetInfoFromMousePosition(int mx, int my)
     if (gi->mapped &&
        mx >= gi->x && mx < gi->x + gi->width &&
        my >= gi->y && my < gi->y + gi->height)
-    {
-
-#if 0
-      if (gi->type & GD_TYPE_SCROLLBAR)
-      {
-       int mpos, gpos;
-
-       if (gi->type == GD_TYPE_SCROLLBAR_HORIZONTAL)
-       {
-         mpos = mx;
-         gpos = gi->x;
-       }
-       else
-       {
-         mpos = my;
-         gpos = gi->y;
-       }
-
-       if (mpos >= gpos + gi->scrollbar.position &&
-           mpos < gpos + gi->scrollbar.position + gi->scrollbar.size)
-         break;
-      }
-      else
-#endif
-
        break;
-    }
 
     gi = gi->next;
   }
@@ -1847,6 +1821,27 @@ struct GadgetInfo *CreateGadget(int first_tag, ...)
        new_gadget->design_border = va_arg(ap, int);
        break;
 
+      case GDI_DECORATION_DESIGN:
+       new_gadget->deco.design.pixmap = va_arg(ap, Pixmap);
+       new_gadget->deco.design.x = va_arg(ap, int);
+       new_gadget->deco.design.y = va_arg(ap, int);
+       break;
+
+      case GDI_DECORATION_POSITION:
+       new_gadget->deco.x = va_arg(ap, int);
+       new_gadget->deco.y = va_arg(ap, int);
+       break;
+
+      case GDI_DECORATION_SIZE:
+       new_gadget->deco.width = va_arg(ap, int);
+       new_gadget->deco.height = va_arg(ap, int);
+       break;
+
+      case GDI_DECORATION_SHIFTING:
+       new_gadget->deco.xshift = va_arg(ap, int);
+       new_gadget->deco.yshift = va_arg(ap, int);
+       break;
+
       case GDI_EVENT_MASK:
        new_gadget->event_mask = va_arg(ap, unsigned long);
        break;
@@ -2025,6 +2020,12 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
     case GD_TYPE_RADIO_BUTTON:
       XCopyArea(display, gd->pixmap, drawto, gc,
                gd->x, gd->y, gi->width, gi->height, gi->x, gi->y);
+      if (gi->deco.design.pixmap)
+       XCopyArea(display, gi->deco.design.pixmap, drawto, gc,
+                 gi->deco.design.x, gi->deco.design.y,
+                 gi->deco.width, gi->deco.height,
+                 gi->x + gi->deco.x + (pressed ? gi->deco.xshift : 0),
+                 gi->y + gi->deco.y + (pressed ? gi->deco.yshift : 0));
       break;
 
     case GD_TYPE_TEXTINPUT_ALPHANUMERIC:
@@ -2233,14 +2234,20 @@ void ModifyTextInputNumberValue(struct GadgetInfo *gi, int new_value)
 /* global pointer to gadget actually in use (when mouse button pressed) */
 static struct GadgetInfo *last_gi = NULL;
 
-void MapGadget(struct GadgetInfo *gi)
+static void MapGadgetExt(struct GadgetInfo *gi, boolean redraw)
 {
   if (gi == NULL || gi->mapped)
     return;
 
   gi->mapped = TRUE;
 
-  DrawGadget(gi, DG_UNPRESSED, DG_BUFFERED);
+  if (redraw)
+    DrawGadget(gi, DG_UNPRESSED, DG_BUFFERED);
+}
+
+void MapGadget(struct GadgetInfo *gi)
+{
+  MapGadgetExt(gi, TRUE);
 }
 
 void UnmapGadget(struct GadgetInfo *gi)
@@ -2254,6 +2261,55 @@ void UnmapGadget(struct GadgetInfo *gi)
     last_gi = NULL;
 }
 
+#define MAX_NUM_GADGETS                1024
+#define MULTIMAP_UNMAP         (1 << 0)
+#define MULTIMAP_REMAP         (1 << 1)
+#define MULTIMAP_REDRAW                (1 << 2)
+#define MULTIMAP_PLAYFIELD     (1 << 3)
+#define MULTIMAP_DOOR_1                (1 << 4)
+#define MULTIMAP_DOOR_2                (1 << 5)
+#define MULTIMAP_ALL           (MULTIMAP_PLAYFIELD | \
+                                MULTIMAP_DOOR_1 | \
+                                MULTIMAP_DOOR_2)
+
+static void MultiMapGadgets(int mode)
+{
+  struct GadgetInfo *gi = gadget_list_first_entry;
+  static boolean map_state[MAX_NUM_GADGETS];
+  int map_count = 0;
+
+  while (gi)
+  {
+    if ((mode & MULTIMAP_PLAYFIELD && gi->x < SX + SXSIZE) ||
+       (mode & MULTIMAP_DOOR_1 && gi->x >= DX && gi->y < DY + DYSIZE) ||
+       (mode & MULTIMAP_DOOR_1 && gi->x >= DX && gi->y > DY + DYSIZE))
+    {
+      if (mode & MULTIMAP_UNMAP)
+      {
+       map_state[map_count++ % MAX_NUM_GADGETS] = gi->mapped;
+       UnmapGadget(gi);
+      }
+      else
+      {
+       if (map_state[map_count++ % MAX_NUM_GADGETS])
+         MapGadgetExt(gi, (mode & MULTIMAP_REDRAW));
+      }
+    }
+
+    gi = gi->next;
+  }
+}
+
+void UnmapAllGadgets()
+{
+  MultiMapGadgets(MULTIMAP_ALL | MULTIMAP_UNMAP);
+}
+
+void RemapAllGadgets()
+{
+  MultiMapGadgets(MULTIMAP_ALL | MULTIMAP_REMAP);
+}
+
 void HandleGadgets(int mx, int my, int button)
 {
   static struct GadgetInfo *last_info_gi = NULL;