X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fgadgets.c;h=a371bb473505a3f8eccfd5425d8e4a7c68d8e10c;hb=5f926b2dd808d7336f7ec63499fb0776e8513e97;hp=bace632babb8573e8fbf73fa306652f2033ce96f;hpb=94b124e87edbd2e12d7b83f45254fcbfff8554cd;p=rocksndiamonds.git diff --git a/src/libgame/gadgets.c b/src/libgame/gadgets.c index bace632b..a371bb47 100644 --- a/src/libgame/gadgets.c +++ b/src/libgame/gadgets.c @@ -1,22 +1,22 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Artsoft Retro-Game Library * *----------------------------------------------------------* -* (c) 1995-98 Artsoft Entertainment * -* Holger Schemel * -* Oststrasse 11a * -* 33604 Bielefeld * -* phone: ++49 +521 290471 * -* email: aeglos@valinor.owl.de * +* (c) 1994-2002 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* gadgets.c * +* gadgets.c * ***********************************************************/ #include #include -#include "libgame.h" - #include "gadgets.h" +#include "text.h" +#include "misc.h" /* values for DrawGadget() */ @@ -63,6 +63,21 @@ static int getNewGadgetID() return id; } +#if 0 +void DUMP_GADGET_MAP_STATE() +{ + struct GadgetInfo *gi = gadget_list_first_entry; + + while (gi) + { + printf("-XXX-1-> '%s': %s\n", + gi->info_text, (gi->mapped ? "mapped" : "not mapped")); + + gi = gi->next; + } +} +#endif + static struct GadgetInfo *getGadgetInfoFromMousePosition(int mx, int my) { struct GadgetInfo *gi = gadget_list_first_entry; @@ -82,11 +97,6 @@ static struct GadgetInfo *getGadgetInfoFromMousePosition(int mx, int my) static void default_callback_info(void *ptr) { -#if 0 - if (game_status == LEVELED) - HandleEditorGadgetInfoText(ptr); -#endif - return; } @@ -107,8 +117,9 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) case GD_TYPE_NORMAL_BUTTON: case GD_TYPE_CHECK_BUTTON: case GD_TYPE_RADIO_BUTTON: - BlitBitmap(gd->bitmap, drawto, - gd->x, gd->y, gi->width, gi->height, gi->x, gi->y); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x, gd->y, gi->width, gi->height, + gi->x, gi->y); if (gi->deco.design.bitmap) BlitBitmap(gi->deco.design.bitmap, drawto, gi->deco.design.x, gi->deco.design.y, @@ -146,7 +157,9 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) border, gi->height, gi->x + gi->width - border, gi->y); /* gadget text value */ - DrawText(gi->x + border, gi->y + border, text, FS_SMALL, font_type); + DrawTextExt(drawto, + gi->x + border, gi->y + border, text, + FS_SMALL, font_type, FONT_OPAQUE); cursor_letter = gi->text.value[gi->text.cursor_position]; cursor_string[0] = '~'; @@ -155,8 +168,10 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) /* draw cursor, if active */ if (pressed) - DrawText(gi->x + border + gi->text.cursor_position * font_width, - gi->y + border, cursor_string, FS_SMALL, font_type); + DrawTextExt(drawto, + gi->x + border + gi->text.cursor_position * font_width, + gi->y + border, cursor_string, + FS_SMALL, font_type, FONT_OPAQUE); } break; @@ -173,33 +188,37 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) int step_size_remain = size_body - num_steps * design_body; /* clear scrollbar area */ - ClearRectangle(backbuffer, gi->x, gi->y, gi->width, gi->height); + ClearRectangleOnBackground(backbuffer, gi->x, gi->y, + gi->width, gi->height); /* upper part of gadget */ - BlitBitmap(gd->bitmap, drawto, - gd->x, gd->y, - gi->width, gi->border.size, - xpos, ypos); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x, gd->y, + gi->width, gi->border.size, + xpos, ypos); /* middle part of gadget */ for (i=0; ibitmap, drawto, - gd->x, gd->y + gi->border.size, - gi->width, design_body, - xpos, ypos + gi->border.size + i * design_body); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x, gd->y + gi->border.size, + gi->width, design_body, + xpos, + ypos + gi->border.size + i * design_body); /* remaining middle part of gadget */ if (step_size_remain > 0) - BlitBitmap(gd->bitmap, drawto, - gd->x, gd->y + gi->border.size, - gi->width, step_size_remain, - xpos, ypos + gi->border.size + num_steps * design_body); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x, gd->y + gi->border.size, + gi->width, step_size_remain, + xpos, + ypos + gi->border.size + + num_steps * design_body); /* lower part of gadget */ - BlitBitmap(gd->bitmap, drawto, - gd->x, gd->y + design_full - gi->border.size, - gi->width, gi->border.size, - xpos, ypos + size_full - gi->border.size); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x, gd->y + design_full - gi->border.size, + gi->width, gi->border.size, + xpos, ypos + size_full - gi->border.size); } break; @@ -216,33 +235,37 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct) int step_size_remain = size_body - num_steps * design_body; /* clear scrollbar area */ - ClearRectangle(backbuffer, gi->x, gi->y, gi->width, gi->height); + ClearRectangleOnBackground(backbuffer, gi->x, gi->y, + gi->width, gi->height); /* left part of gadget */ - BlitBitmap(gd->bitmap, drawto, - gd->x, gd->y, - gi->border.size, gi->height, - xpos, ypos); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x, gd->y, + gi->border.size, gi->height, + xpos, ypos); /* middle part of gadget */ for (i=0; ibitmap, drawto, - gd->x + gi->border.size, gd->y, - design_body, gi->height, - xpos + gi->border.size + i * design_body, ypos); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x + gi->border.size, gd->y, + design_body, gi->height, + xpos + gi->border.size + i * design_body, + ypos); /* remaining middle part of gadget */ if (step_size_remain > 0) - BlitBitmap(gd->bitmap, drawto, - gd->x + gi->border.size, gd->y, - step_size_remain, gi->height, - xpos + gi->border.size + num_steps * design_body, ypos); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x + gi->border.size, gd->y, + step_size_remain, gi->height, + xpos + gi->border.size + + num_steps * design_body, + ypos); /* right part of gadget */ - BlitBitmap(gd->bitmap, drawto, - gd->x + design_full - gi->border.size, gd->y, - gi->border.size, gi->height, - xpos + size_full - gi->border.size, ypos); + BlitBitmapOnBackground(gd->bitmap, drawto, + gd->x + design_full - gi->border.size, gd->y, + gi->border.size, gi->height, + xpos + size_full - gi->border.size, ypos); } break; @@ -278,8 +301,13 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) case GDI_INFO_TEXT: { int max_textsize = MAX_INFO_TEXTSIZE - 1; + char *text = va_arg(ap, char *); + + if (text != NULL) + strncpy(gi->info_text, text, max_textsize); + else + max_textsize = 0; - strncpy(gi->info_text, va_arg(ap, char *), max_textsize); gi->info_text[max_textsize] = '\0'; } break; @@ -309,7 +337,9 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) break; case GDI_CHECKED: - gi->checked = va_arg(ap, boolean); + /* take care here: "boolean" is typedef'ed as "unsigned char", + which gets promoted to "int" */ + gi->checked = (boolean)va_arg(ap, int); break; case GDI_RADIO_NR: @@ -368,25 +398,25 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) break; case GDI_DESIGN_UNPRESSED: - gi->design[GD_BUTTON_UNPRESSED].bitmap = va_arg(ap, Bitmap); + gi->design[GD_BUTTON_UNPRESSED].bitmap = va_arg(ap, Bitmap *); gi->design[GD_BUTTON_UNPRESSED].x = va_arg(ap, int); gi->design[GD_BUTTON_UNPRESSED].y = va_arg(ap, int); break; case GDI_DESIGN_PRESSED: - gi->design[GD_BUTTON_PRESSED].bitmap = va_arg(ap, Bitmap); + gi->design[GD_BUTTON_PRESSED].bitmap = va_arg(ap, Bitmap *); gi->design[GD_BUTTON_PRESSED].x = va_arg(ap, int); gi->design[GD_BUTTON_PRESSED].y = va_arg(ap, int); break; case GDI_ALT_DESIGN_UNPRESSED: - gi->alt_design[GD_BUTTON_UNPRESSED].bitmap= va_arg(ap, Bitmap); + gi->alt_design[GD_BUTTON_UNPRESSED].bitmap= va_arg(ap, Bitmap *); gi->alt_design[GD_BUTTON_UNPRESSED].x = va_arg(ap, int); gi->alt_design[GD_BUTTON_UNPRESSED].y = va_arg(ap, int); break; case GDI_ALT_DESIGN_PRESSED: - gi->alt_design[GD_BUTTON_PRESSED].bitmap = va_arg(ap, Bitmap); + gi->alt_design[GD_BUTTON_PRESSED].bitmap = va_arg(ap, Bitmap *); gi->alt_design[GD_BUTTON_PRESSED].x = va_arg(ap, int); gi->alt_design[GD_BUTTON_PRESSED].y = va_arg(ap, int); break; @@ -400,7 +430,7 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) break; case GDI_DECORATION_DESIGN: - gi->deco.design.bitmap = va_arg(ap, Bitmap); + gi->deco.design.bitmap = va_arg(ap, Bitmap *); gi->deco.design.x = va_arg(ap, int); gi->deco.design.y = va_arg(ap, int); break; @@ -559,14 +589,14 @@ void RedrawGadget(struct GadgetInfo *gi) struct GadgetInfo *CreateGadget(int first_tag, ...) { - struct GadgetInfo *new_gadget = checked_malloc(sizeof(struct GadgetInfo)); + struct GadgetInfo *new_gadget = checked_calloc(sizeof(struct GadgetInfo)); va_list ap; /* always start with reliable default values */ - memset(new_gadget, 0, sizeof(struct GadgetInfo)); /* zero all fields */ new_gadget->id = getNewGadgetID(); new_gadget->callback_info = default_callback_info; new_gadget->callback_action = default_callback_action; + new_gadget->next = NULL; va_start(ap, first_tag); HandleGadgetTags(new_gadget, first_tag, ap); @@ -588,7 +618,7 @@ void FreeGadget(struct GadgetInfo *gi) { struct GadgetInfo *gi_previous = gadget_list_first_entry; - while (gi_previous && gi_previous->next != gi) + while (gi_previous != NULL && gi_previous->next != gi) gi_previous = gi_previous->next; if (gi == gadget_list_first_entry) @@ -597,7 +627,9 @@ void FreeGadget(struct GadgetInfo *gi) if (gi == gadget_list_last_entry) gadget_list_last_entry = gi_previous; - gi_previous->next = gi->next; + if (gi_previous != NULL) + gi_previous->next = gi->next; + free(gi); } @@ -849,15 +881,27 @@ void HandleGadgets(int mx, int my, int button) if (last_info_gi != new_gi || (new_gi && new_gi->type == GD_TYPE_DRAWING_AREA && changed_position)) { - last_info_gi = new_gi; - if (new_gi != NULL && (button == 0 || new_gi == last_gi)) { - new_gi->event.type = 0; + new_gi->event.type = GD_EVENT_INFO_ENTERING; new_gi->callback_info(new_gi); } - else + else if (last_info_gi != NULL) + { + last_info_gi->event.type = GD_EVENT_INFO_LEAVING; + last_info_gi->callback_info(last_info_gi); + +#if 0 default_callback_info(NULL); + + printf("It seems that we are leaving gadget [%s]!\n", + (last_info_gi != NULL && + last_info_gi->info_text != NULL ? + last_info_gi->info_text : "")); +#endif + } + + last_info_gi = new_gi; } if (gadget_pressed)