diff --git a/src/pc/djui/djui_base.c b/src/pc/djui/djui_base.c index 698e92cb3..35114e389 100644 --- a/src/pc/djui/djui_base.c +++ b/src/pc/djui/djui_base.c @@ -1,5 +1,6 @@ #include #include "djui.h" +#include "djui_interactable.h" //////////////// // properties // @@ -389,6 +390,13 @@ void djui_base_destroy(struct DjuiBase* base) { base->interactable = NULL; } + // remove from interactable variable + if (base == gDjuiHovered) { gDjuiHovered = NULL; } + if (base == gDjuiCursorDownOn) { gDjuiCursorDownOn = NULL; } + if (base == gInteractableFocus) { gInteractableFocus = NULL; } + if (base == gInteractableBinding) { gInteractableBinding = NULL; } + if (base == gInteractableMouseDown) { gInteractableMouseDown = NULL; } + // destroy this base->destroy(base); } diff --git a/src/pc/djui/djui_checkbox.c b/src/pc/djui/djui_checkbox.c index d0cb3b529..3f2c3ed12 100644 --- a/src/pc/djui/djui_checkbox.c +++ b/src/pc/djui/djui_checkbox.c @@ -2,6 +2,7 @@ static void djui_checkbox_update_style(struct DjuiBase* base) { struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; + if (!checkbox) { return; } if (!checkbox->base.enabled) { djui_base_set_border_color(&checkbox->rect->base, 93, 93, 93, 255); djui_base_set_color(&checkbox->rect->base, 0, 0, 0, 0); diff --git a/src/pc/djui/djui_interactable.c b/src/pc/djui/djui_interactable.c index 90c0701e4..c5a05e43d 100644 --- a/src/pc/djui/djui_interactable.c +++ b/src/pc/djui/djui_interactable.c @@ -27,7 +27,7 @@ struct DjuiBase* gDjuiHovered = NULL; struct DjuiBase* gDjuiCursorDownOn = NULL; struct DjuiBase* gInteractableFocus = NULL; struct DjuiBase* gInteractableBinding = NULL; -static struct DjuiBase* sMouseDown = NULL; +struct DjuiBase* gInteractableMouseDown = NULL; bool gInteractableOverridePad = false; OSContPad gInteractablePad = { 0 }; static OSContPad sLastInteractablePad = { 0 }; @@ -399,17 +399,17 @@ void djui_interactable_update(void) { } else if ((padButtons & PAD_BUTTON_A) || (mouseButtons & MOUSE_BUTTON_1)) { // cursor down events if (gDjuiHovered != NULL) { - sMouseDown = gDjuiHovered; + gInteractableMouseDown = gDjuiHovered; gDjuiHovered = NULL; - djui_interactable_on_cursor_down_begin(sMouseDown, !mouseButtons); + djui_interactable_on_cursor_down_begin(gInteractableMouseDown, !mouseButtons); } else { - djui_interactable_on_cursor_down(sMouseDown); + djui_interactable_on_cursor_down(gInteractableMouseDown); } } else { // cursor up event - if (sMouseDown != NULL) { - djui_interactable_on_cursor_down_end(sMouseDown); - sMouseDown = NULL; + if (gInteractableMouseDown != NULL) { + djui_interactable_on_cursor_down_end(gInteractableMouseDown); + gInteractableMouseDown = NULL; } struct DjuiBase* lastHovered = gDjuiHovered; gDjuiHovered = NULL; diff --git a/src/pc/djui/djui_interactable.h b/src/pc/djui/djui_interactable.h index e24e01613..2ac9895b9 100644 --- a/src/pc/djui/djui_interactable.h +++ b/src/pc/djui/djui_interactable.h @@ -46,6 +46,7 @@ extern struct DjuiBase* gDjuiHovered; extern struct DjuiBase* gDjuiCursorDownOn; extern struct DjuiBase* gInteractableFocus; extern struct DjuiBase* gInteractableBinding; +extern struct DjuiBase* gInteractableMouseDown; bool djui_interactable_is_binding(void); void djui_interactable_set_binding(struct DjuiBase* base); diff --git a/src/pc/gfx/gfx_pc.c b/src/pc/gfx/gfx_pc.c index c76544b59..0bf308f11 100644 --- a/src/pc/gfx/gfx_pc.c +++ b/src/pc/gfx/gfx_pc.c @@ -314,7 +314,7 @@ static bool gfx_texture_cache_lookup(int tile, struct TextureHashmapNode **n, co hash = (hash >> HASH_SHIFT) & HASH_MASK; struct TextureHashmapNode **node = &gfx_texture_cache.hashmap[hash]; - while (*node != NULL && *node - gfx_texture_cache.pool < (int)gfx_texture_cache.pool_pos) { + while (node != NULL && *node != NULL && *node - gfx_texture_cache.pool < (int)gfx_texture_cache.pool_pos) { if (CMPADDR((*node)->texture_addr, orig_addr) && (*node)->fmt == fmt && (*node)->siz == siz) { gfx_rapi->select_texture(tile, (*node)->texture_id); *n = *node;