Skip to content

Commit 975ab9a

Browse files
themes: only enqueue MMCE decorator art on selection transitions
Separate MMCE items-list decorator cover request initiation from draw-time retrieval. Track selected submenu item ID + startup string in items list state, and only call cacheGetTexture on actual selection changes. Keep draw path display-only via cacheGetTextureIfReady when selection is unchanged. Non-MMCE modes retain existing behavior.
1 parent e71d8b0 commit 975ab9a

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

include/themes.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ typedef struct
6464

6565
const char *decorator;
6666
mutable_image_t *decoratorImage;
67+
68+
int lastSelectedItemId;
69+
char lastSelectedStartup[256];
6770
} items_list_t;
6871

6972
typedef struct theme_element

src/themes.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,20 @@ static void drawItemsList(struct menu_list *menu, struct submenu_list *item, con
908908
if (item) {
909909
items_list_t *itemsList = (items_list_t *)elem->extended;
910910
item_list_t *list = menu->item->userdata;
911+
int mmceSelectionChanged = 0;
912+
char *selectedStartup = NULL;
913+
914+
if (list != NULL && list->mode == MMCE_MODE && itemsList->decoratorImage != NULL && itemsList->decoratorImage->cache != NULL) {
915+
selectedStartup = list->itemGetStartup(list, item->item.id);
916+
if (selectedStartup == NULL)
917+
selectedStartup = "";
918+
919+
if (itemsList->lastSelectedItemId != item->item.id || strcmp(itemsList->lastSelectedStartup, selectedStartup) != 0) {
920+
mmceSelectionChanged = 1;
921+
itemsList->lastSelectedItemId = item->item.id;
922+
snprintf(itemsList->lastSelectedStartup, sizeof(itemsList->lastSelectedStartup), "%s", selectedStartup);
923+
}
924+
}
911925

912926
int posX = elem->posX, posY = elem->posY;
913927
if (elem->aligned) {
@@ -927,10 +941,13 @@ static void drawItemsList(struct menu_list *menu, struct submenu_list *item, con
927941
if (itemsList->decoratorImage) {
928942
GSTEXTURE *itemIconTex;
929943

930-
/* MMCE main-page row art must never queue fresh IO; only use already-ready textures. */
931944
if (list != NULL && list->mode == MMCE_MODE && itemsList->decoratorImage->cache != NULL) {
932945
image_cache_t *cache = itemsList->decoratorImage->cache;
933-
itemIconTex = cacheGetTextureIfReady(cache, &ps->item.cache_id[cache->userId], &ps->item.cache_uid[cache->userId]);
946+
947+
if (mmceSelectionChanged && ps == item)
948+
itemIconTex = getGameImageTexture(cache, menu->item->userdata, &ps->item);
949+
else
950+
itemIconTex = cacheGetTextureIfReady(cache, &ps->item.cache_id[cache->userId], &ps->item.cache_uid[cache->userId]);
934951
} else
935952
itemIconTex = getGameImageTexture(itemsList->decoratorImage->cache, menu->item->userdata, &ps->item);
936953

@@ -972,6 +989,8 @@ static void initItemsList(const char *themePath, config_set_t *themeConfig, them
972989
itemsList->decorator = decorator; // Will be used later (thmValidate)
973990

974991
itemsList->decoratorImage = NULL;
992+
itemsList->lastSelectedItemId = -1;
993+
itemsList->lastSelectedStartup[0] = '\0';
975994

976995
elem->extended = itemsList;
977996
// elem->endElem = &endBasic; does the job

0 commit comments

Comments
 (0)