Upstream's x86_64-macos zip holds an arm64 dylib and it publishes no Linux
binary, so shaders only worked on Apple silicon and Windows. A reusable
librashader.yml builds the C API from a pinned tag/commit (archive SHA-256
verified, cargo xtask build --profile optimized --locked) for x86_64 and
aarch64 macOS (MACOSX_DEPLOYMENT_TARGET=11.0) and x86_64/aarch64 Linux on the
Ubuntu 22.04 packaging runners, cached by commit+target+rust, uploaded as
librashader-<triple>.
macOS builds both slices from the same source and lipo-merges them;
check-universal.sh and make-universal.sh lose the arm64-only exception.
AppImage and .deb bundle librashader.so beside the executable (already probed).
CMake gains -DVJ_LIBRASHADER_LIB. The packaged libraries are loaded by CI,
including the x86_64 slice under Rosetta. release.yml leaves librashader-*
intermediates out of the release assets.
Refs #950
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The macOS bar mirrors File > Boot BIOS (CD BIOS, cartridge boot ROM, BIOS settings) and the View
items VSync and Library on home screen. F1 toggles the in-window menu bar under a native one, so
anything the native bar lacks stays reachable. .desktop lists the types shared-mime-info already
defines for .cue / .cdi / .chd. Windows clearRecents is a no-op (SHARD_PIDL NULL clears the user's
whole Recent list).
Refs #833
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
One menu model (app/src/platform/commands.cpp) feeds every native surface: the macOS menu bar
and Dock menu (Objective-C++, replacing SDL's default menu after init and leaving SDL's app
delegate alone), and an optional tray / menu-bar icon through SDL_tray. A click posts a command
event, so nothing runs inside Cocoa's menu-tracking loop.
macOS: native menu bar with Cmd shortcuts (the in-window bar is hidden), Dock menu with recent
games, NSDocumentController recents, App Nap held while a game runs, document types plus an
exported UTI.
Windows: dark title bar, AppUserModelID shared with the installer shortcuts, Explorer / Jump
List recents, per-monitor-v2 + long-path manifest, optional per-user file associations in the
installer.
Linux: shared-mime-info types, MimeType= and desktop Actions, app id as WM_CLASS / Wayland
app_id (was com.provenance-emu.virtualjaguar), mime XML in the .deb and Flatpak.
All: screensaver allowed in the library / while paused and blocked while a game runs
(SDL disables it for the whole run by default), fullscreen state follows the OS, Show in
Finder / Explorer, launcher-argument filter (-psn_).
Tests: platform_unit (model, dispatch, recents, associations, event round trip),
platform_assoc_sync (extension lists and the app id agree across C++, Info.plist, installer,
.desktop, mime XML), native_menu_dump (macOS: builds and checks the real NSMenu).
Refs #833
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
A single manifest (app/packaging/flatpak) builds the checked-out tree offline: SDL3,
Dear ImGui, rcheevos, the librashader headers, slang-shaders, the libretro dats and
the 41 pinned cheat files are hash-pinned sources. New cache variable
VJ_APP_CHEATS_SOURCE_DIR lets VJCheatData take the cheats from a local folder.
render.sh derives the Flathub form (git source) from the same file.
Refs #839
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
cmake --install now sweeps the bundled data beside the executable (cheats,
libretro-db, shaders, librashader) into <prefix>/bin, with licences and, on
Linux, desktop/appstream/icon files. Scripts assemble the macOS .app (universal
via lipo, Resources base path, hardened runtime + entitlements, notarization
helpers), the DMG, the Inno Setup installer + portable zip, the AppImage and
the .deb. Package-manager manifests are templates rendered by render.sh.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>