X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fgadgets.c;h=d2af524ac4353ceb8505c59351ea8e9834ca17e0;hb=0ef9c7d4b387b42f40d2f226920e306d588544f7;hp=7b92820009b1138c5d1f8a2dd40a414bdf6e46a1;hpb=caf3da0a0e3af75eb8d10f83e5105581402b387e;p=rocksndiamonds.git diff --git a/src/libgame/gadgets.c b/src/libgame/gadgets.c index 7b928200..d2af524a 100644 --- a/src/libgame/gadgets.c +++ b/src/libgame/gadgets.c @@ -828,6 +828,7 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) int border_xsize = gi->border.xsize; int border_ysize = gi->border.ysize; int button_size = gi->border.xsize_selectbutton; + int bottom_screen_border = gfx.sy + gfx.sysize - font_height; Bitmap *src_bitmap; int src_x, src_y; @@ -848,10 +849,10 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap) gi->selectbox.x = gi->x; gi->selectbox.y = gi->y + gi->height; - if (gi->selectbox.y + gi->selectbox.height > gfx.real_sy + gfx.full_sysize) + if (gi->selectbox.y + gi->selectbox.height > bottom_screen_border) gi->selectbox.y = gi->y - gi->selectbox.height; if (gi->selectbox.y < 0) - gi->selectbox.y = gfx.real_sy + gfx.full_sysize - gi->selectbox.height; + gi->selectbox.y = bottom_screen_border - gi->selectbox.height; getFontCharSource(font_nr, FONT_ASCII_CURSOR, &src_bitmap, &src_x, &src_y); src_x += font_width / 2; @@ -1130,6 +1131,13 @@ void HandleGadgets(int mx, int my, int button) if (gadget_list_first_entry == NULL) return; + /* simulated release of mouse button over last gadget */ + if (mx == -1 && my == -1 && button == 0) + { + mx = last_mx; + my = last_my; + } + /* check which gadget is under the mouse pointer */ new_gi = getGadgetInfoFromMousePosition(mx, my); @@ -1191,7 +1199,7 @@ void HandleGadgets(int mx, int my, int button) /* if mouse button pressed inside activated selectbox, select value */ if (my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height) gi->selectbox.current_index = - (my - gi->selectbox.y - gi->border.xsize) / getFontWidth(gi->font); + (my - gi->selectbox.y - gi->border.ysize) / getFontHeight(gi->font); if (gi->selectbox.current_index < 0) gi->selectbox.current_index = 0; @@ -1237,8 +1245,8 @@ void HandleGadgets(int mx, int my, int button) (mx >= gi->x && mx < gi->x + gi->width && my >= gi->y && my < gi->y + gi->height); gadget_released_inside_select_area = - (mx >= gi->selectbox.x && mx < gi->selectbox.x+gi->selectbox.width && - my >= gi->selectbox.y && my < gi->selectbox.y+gi->selectbox.height); + (mx >= gi->selectbox.x && mx < gi->selectbox.x + gi->selectbox.width && + my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height); } else { @@ -1296,7 +1304,7 @@ void HandleGadgets(int mx, int my, int button) /* if mouse moving inside activated selectbox, select value */ if (my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height) gi->selectbox.current_index = - (my - gi->selectbox.y - gi->border.xsize) / getFontWidth(gi->font); + (my - gi->selectbox.y - gi->border.ysize) / getFontHeight(gi->font); if (gi->selectbox.current_index < 0) gi->selectbox.current_index = 0; @@ -1462,7 +1470,7 @@ void HandleGadgets(int mx, int my, int button) /* if mouse moving inside activated selectbox, select value */ if (my >= gi->selectbox.y && my < gi->selectbox.y + gi->selectbox.height) gi->selectbox.current_index = - (my - gi->selectbox.y - gi->border.xsize) / getFontWidth(gi->font); + (my - gi->selectbox.y - gi->border.ysize) / getFontHeight(gi->font); if (gi->selectbox.current_index < 0) gi->selectbox.current_index = 0; @@ -1546,6 +1554,10 @@ void HandleGadgets(int mx, int my, int button) gi->event_mask & GD_EVENT_OFF_BORDERS) gi->callback_action(gi); } + + /* handle gadgets unmapped/mapped between pressing and releasing */ + if (release_event && !gadget_released && new_gi) + new_gi->state = GD_BUTTON_UNPRESSED; } void HandleGadgetsKeyInput(Key key)