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;
}
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;
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:
/* 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)
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;