The menu entry borrowed the Ports icon, which is what "give it a theme
folder that already has artwork" buys you. EmulationStation offers nothing
better on its own: a system's logo is resolved through the theme
(SystemData::getProperty("image") -> theme's system/logo, path built from
the system's theme folder), and there is no user-level override anywhere —
not in the settings, not in the ROM folder, not in the binary.
So `menu.logo` installs the file where the themes look. The logo folder is
found rather than assumed: it is the folder holding the most logos of
systems every theme has (ports, snes, nes, …), because themes keep them in
art/logos, _inc/systems/logos, _art/Colorlogos and worse. On the box that
found 7 of 9 themes; the other two do not use ${system.theme} at all, and
there ES falls back to drawing the store's name as text, which is a fine
answer.
Two safeguards, since this writes outside the store's own folder for the
first time: the file is named after `menu.theme`, which now defaults to the
store id so no theme's own artwork can be overwritten, and every path
installed is recorded in state.json — an uninstall removes exactly those,
a pre-existing file of that name is reported and left alone.
Themes that ship with the system image are under /usr/share, and Batocera's
root is a RAM overlay: the copy works but does not survive a reboot. The
sync puts it back, and the log says so, naming batocera-save-overlay.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
67 lines
1.2 KiB
JSON
67 lines
1.2 KiB
JSON
{
|
|
"store": {
|
|
"id": "example",
|
|
"name": "Example Store",
|
|
"base_url": "https://example.org",
|
|
"api": {
|
|
"catalog": "/api/software",
|
|
"download": "/api/download"
|
|
}
|
|
},
|
|
"paths": {
|
|
"roms_root": "/userdata/roms",
|
|
"subfolder": "example"
|
|
},
|
|
"emulationstation": {
|
|
"menu": {
|
|
"mode": "system",
|
|
"name": null,
|
|
"theme": null,
|
|
"logo": null,
|
|
"updater": true,
|
|
"labels": {}
|
|
},
|
|
"ports_entry": null,
|
|
"folder_name": "Example Store",
|
|
"restart": true,
|
|
"config_dir": null
|
|
},
|
|
"catalog": {
|
|
"statuses": [
|
|
"released",
|
|
"archived"
|
|
],
|
|
"owner_id": null,
|
|
"only": [],
|
|
"exclude": []
|
|
},
|
|
"platforms": {
|
|
"c64": {
|
|
"system": "c64",
|
|
"kind": "cartridge",
|
|
"ext": ".prg",
|
|
"enabled": true
|
|
},
|
|
"tic80": {
|
|
"system": "tic80",
|
|
"kind": "cartridge",
|
|
"ext": ".tic",
|
|
"enabled": true
|
|
},
|
|
"bevy": {
|
|
"system": "ports",
|
|
"install": "port",
|
|
"kind": {
|
|
"x86_64": "linux_x64",
|
|
"aarch64": "linux_arm64"
|
|
},
|
|
"ext": ".zip",
|
|
"enabled": false
|
|
}
|
|
},
|
|
"behavior": {
|
|
"prune": true,
|
|
"timeout": 30,
|
|
"insecure": false
|
|
}
|
|
} |