From df74f0734a9f066f75834da0406b26cb06bd94f1 Mon Sep 17 00:00:00 2001 From: Alex Duchesne Date: Mon, 17 Mar 2025 13:25:39 -0400 Subject: [PATCH] Launcher: Added a default background option for themes Currently in a theme the background files are named `background_.png`. The problem is that sometimes retro-go adds new tabs, which causes themes to have missing backgrounds. So I added a fallback. Theme can now provide a file named `background.png` that will be used when a tab-specific background isn't found. This also enables themes to provide a single background file if they don't want per-tab ones. --- THEMING.md | 12 ++++---- launcher/main/gui.c | 4 ++- themes/classic/README.md | 3 ++ themes/classic/background.png | Bin 0 -> 15099 bytes themes/classic/theme.json | 53 ++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 themes/classic/README.md create mode 100644 themes/classic/background.png create mode 100644 themes/classic/theme.json diff --git a/THEMING.md b/THEMING.md index c20ee570..b1ad125a 100644 --- a/THEMING.md +++ b/THEMING.md @@ -12,6 +12,7 @@ A theme is a folder placed in `sd:/retro-go/themes` containing the following fil ```` /retro-go/themes └── example + ├── background.png ├── background_*.png ├── banner_*.png ├── logo_*.png @@ -21,11 +22,12 @@ A theme is a folder placed in `sd:/retro-go/themes` containing the following fil | Name | Format | Description | Required | |--|--|--|--| -| theme.json | JSON | Contains the theme metadata (description, author, colors, etc) | Yes | -| preview.png | PNG 160x120 | Theme preview to be displayed in the theme selector | No | -| background_X.png | PNG 320x240 | Launcher backgrounds where X is the name of the launcher tab | No | -| banner_X.png | PNG 272x24 | Launcher banners where X is the name of the launcher tab | No | -| logo_X.png | PNG 46x50 | Launcher logos where X is the name of the launcher tab | No | +| `theme.json` | JSON | Contains the theme metadata (description, author, colors, etc) | Yes | +| `preview.png` | PNG 160x120 | Theme preview to be displayed in the theme selector | No | +| `background.png` | PNG 320x240 | Launcher's default background | No | +| `background_.png` | PNG 320x240 | Launcher's per-tab backgrounds | No | +| `banner_.png` | PNG 272x24 | Launcher's per-tab banners | No | +| `logo_.png` | PNG 46x50 | Launcher's per-tab logos | No | ### theme.json diff --git a/launcher/main/gui.c b/launcher/main/gui.c index ef429709..f914af5a 100644 --- a/launcher/main/gui.c +++ b/launcher/main/gui.c @@ -400,7 +400,9 @@ void gui_draw_background(tab_t *tab, int shade) if (!tab->background) { - tab->background = gui_get_image("background", tab->name); + tab->background = gui_get_image("background", tab->name); // Try background_.png + if (!tab->background) + tab->background = gui_get_image("background", NULL); // Fallback to a background.png tab->background_shade = 0; if (tab->background && (tab->background->width != gui.width || tab->background->height != gui.height)) { diff --git a/themes/classic/README.md b/themes/classic/README.md new file mode 100644 index 00000000..a63391cc --- /dev/null +++ b/themes/classic/README.md @@ -0,0 +1,3 @@ +This is the classic theme built into retro-go at compile time. + +It is meant to replicate the look of early retro-go builds. diff --git a/themes/classic/background.png b/themes/classic/background.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f93815f7e3d13e38d00a626e5e2b9163f542ff GIT binary patch literal 15099 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