forked from speccytools/fusex
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathissues.jsonl
More file actions
39 lines (39 loc) · 51.4 KB
/
issues.jsonl
File metadata and controls
39 lines (39 loc) · 51.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{"_type":"issue","id":"fuse-yqk","title":"Investigate Windows CI link failure for unittests/displaytest.exe missing WinMain@16","description":"Windows CI is failing to link unittests/displaytest.exe with an undefined WinMain@16 entry point. Investigate the build/link configuration for the display test on Windows and implement the fix needed so the unittest target links successfully in CI.","status":"in_progress","priority":1,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-12T05:07:58Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T05:08:31Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-3tt","title":"Keyboard fidelity cleanup for SDL2 UI","description":"Improve SDL2 keyboard handling so physical-key behavior and core emulator usability take priority over perfect text-entry or layout fidelity. Resolve concrete key mapping and event handling issues needed for dependable emulator control, including press/release behavior, repeat handling, and focus transitions, before taking on joystick or mouse/grab follow-up.","design":"Use physical-key semantics as the guiding rule for SDL2 keyboard behavior in this tranche. Text/layout fidelity improvements can be follow-up work once dependable emulator control is in place.","acceptance_criteria":"SDL2 key press and key release events map correctly for the essential emulator controls exercised in routine use. Repeat handling avoids obvious stuck-key or duplicate-action problems during normal emulator interaction. Losing and regaining window focus does not leave keys logically stuck or otherwise break subsequent keyboard input. Keyboard behavior is judged primarily by physical-key semantics and emulator usability rather than by text-entry or layout-perfect fidelity. Joystick and mouse/grab behavior remain outside the scope of this issue.","status":"closed","priority":1,"issue_type":"task","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:35Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T13:48:37Z","closed_at":"2026-04-11T13:48:37Z","close_reason":"SDL2 keyboard input now uses physical-key semantics for core keys, releases stuck keys on focus loss, and was verified locally by the user.","dependencies":[{"issue_id":"fuse-3tt","depends_on_id":"fuse-n5p","type":"blocks","created_at":"2026-04-11T21:57:08Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":1,"dependent_count":3,"comment_count":0}
{"_type":"issue","id":"fuse-k8e","title":"Native SDL2 sound backend with callback and sfifo","description":"Add sound/sdl2sound.c as a conservative SDL2 audio backend that follows the existing callback-driven buffering model and sfifo integration instead of redesigning the audio pipeline. Keep the backend independently selectable from the UI backend. When UI=sdl2 and SDL2 sound is available, default the sound backend to SDL2 sound while still allowing manual override.","design":"Keep the audio architecture conservative: callback plus sfifo, separate sound/sdl2sound.c module, and no broader audio rewrite. Default coupling for UI=sdl2 is a selection rule only, not a requirement that UI and audio backends always match.","acceptance_criteria":"sound/sdl2sound.c builds as a separate SDL2 audio backend and can be selected without changing the chosen UI backend. The backend opens the SDL2 audio device successfully for normal use and closes it cleanly on shutdown or backend teardown. Audio output uses the existing callback plus sfifo buffering model rather than a new pipeline. In normal emulator use there is no obvious persistent underrun, stall, or dead-air behavior attributable to the backend implementation. Backend selection remains independent of UI selection even though, when UI=sdl2 and SDL2 sound is available, the default sound backend becomes SDL2 sound unless manually overridden.","status":"closed","priority":1,"issue_type":"feature","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:18Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T12:51:45Z","closed_at":"2026-04-11T12:51:45Z","close_reason":"SDL2 sound now uses an SDL audio-device callback with sfifo buffering and was verified locally by the user.","dependencies":[{"issue_id":"fuse-k8e","depends_on_id":"fuse-pir","type":"blocks","created_at":"2026-04-11T21:57:06Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0}
{"_type":"issue","id":"fuse-wgi","title":"Minimal native SDL2 UI backend","description":"Introduce ui/sdl2/ as a native SDL2 frontend that reaches basic emulator usability using the existing software rendering and scaler flow. Focus this milestone on starting the emulator, running a responsive event loop, presenting frames in a window, and supporting essential keyboard-driven emulator use, not on text/layout-perfect fidelity or later modernization.","design":"This backend should stay native to ui/sdl2/ and reuse the existing software framebuffer and scaler flow for now. Prioritize dependable physical-key emulator usability over text-entry or layout fidelity in this early milestone.","acceptance_criteria":"Building with UI=sdl2 produces a working native SDL2 frontend under ui/sdl2/. Launching the emulator with UI=sdl2 starts successfully, opens an SDL2 window, and redraws visible emulator frames through the existing software/scaler path. The SDL2 event loop remains responsive during normal emulator use, including routine input and window interaction. Essential keyboard-driven emulator use works well enough for routine control and testing. Quit and shutdown paths exit cleanly without leaving the process hung or the SDL2 UI in a broken state.","status":"closed","priority":1,"issue_type":"feature","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:12Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T12:41:30Z","closed_at":"2026-04-11T12:41:30Z","close_reason":"SDL2 backend now presents visible emulator frames correctly; verified by user after fixing the 16-bit presentation path.","dependencies":[{"issue_id":"fuse-wgi","depends_on_id":"fuse-pir","type":"blocks","created_at":"2026-04-11T21:57:05Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0}
{"_type":"issue","id":"fuse-pir","title":"Build/configure groundwork for UI=sdl2 and SDL2 sound selection","description":"Add configure and build-system groundwork for a distinct UI=sdl2 backend and a separate SDL2 sound backend without regressing existing SDL1 codepaths. This task is only about selection, dependency plumbing, and default resolution rules, while keeping UI and audio independently selectable. When UI=sdl2 and SDL2 sound is available, default the sound backend to SDL2 sound while still allowing manual override.","design":"Keep this limited to configure/build and backend selection plumbing. Do not introduce a hybrid SDL1/SDL2 runtime path or an internal SDL1 compatibility layer just to simplify option handling.","acceptance_criteria":"Configure/build logic exposes UI=sdl2 as a distinct selectable UI backend rather than folding it into the SDL1 path. Build/dependency handling distinguishes SDL1 and SDL2 requirements so SDL2-enabled targets can be built without rewriting the SDL1 backend path. UI and audio selection remain independent, so UI=sdl2 can be paired with a non-SDL2 audio backend and SDL2 sound can be selected without requiring UI=sdl2. When UI=sdl2 and SDL2 sound is available, default the sound backend to SDL2 sound while still allowing manual override. Existing SDL1 UI and audio builds continue to configure and build unchanged when SDL2 support is disabled or not selected.","status":"closed","priority":1,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:06Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T12:17:46Z","closed_at":"2026-04-11T12:17:46Z","close_reason":"Implemented SDL2 build/configure groundwork with UI=sdl2 selection, SDL2 sound selection/defaulting, temporary scaffolding sources, and SDL2 UI exclusion of SDL1 sound.","dependency_count":0,"dependent_count":3,"comment_count":0}
{"_type":"issue","id":"fuse-7en","title":"Epic: native SDL2 UI and SDL2 sound backends","description":"Track the SDL2 migration as separate native backends in ui/sdl2/ and sound/sdl2sound.c. Sequence the work as build/configure groundwork first, then minimal SDL2 UI and SDL2 sound, then display cleanup, fullscreen/window behavior, and keyboard fidelity, with joystick, mouse/grab, and final parity cleanup staying as later follow-up. Keep UI and audio independently selectable, preserve the existing software rendering and scaler flow for this tranche, and clarify the default sound rule as: When UI=sdl2 and SDL2 sound is available, default the sound backend to SDL2 sound while still allowing manual override. Explicitly exclude any hybrid SDL1/SDL2 backend, internal SDL1 compatibility layer, or renderer/texture modernization in this epic.","design":"Architectural boundaries for this epic: add native SDL2 implementations as separate modules in ui/sdl2/ and sound/sdl2sound.c, keep backend selection independent between UI and audio, and treat renderer/texture modernization as separate future work rather than a prerequisite.","acceptance_criteria":"The epic description and child issue set explicitly cover build/configure groundwork, minimal SDL2 UI, SDL2 sound, display cleanup, fullscreen/window management, keyboard fidelity, deferred joystick, deferred mouse/grab, and final parity cleanup. The documented sequencing matches the current dependency graph, including fuse-pir blocking fuse-wgi and fuse-k8e, fuse-n5p depending on both fuse-wgi and fuse-k8e, and later input/window follow-up work remaining downstream. The epic text explicitly states that UI and audio stay independently selectable, the existing software/scaler flow stays in scope for this tranche, and the default sound rule is: When UI=sdl2 and SDL2 sound is available, default the sound backend to SDL2 sound while still allowing manual override. The epic text explicitly excludes any hybrid SDL1/SDL2 backend, internal SDL1 compatibility layer, or renderer/texture modernization in this tranche.","status":"closed","priority":1,"issue_type":"feature","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:55:31Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T01:58:45Z","closed_at":"2026-04-12T01:58:45Z","close_reason":"All SDL2 UI and SDL2 sound backend milestone work is now complete, documented, formatted, and locally verified; remaining future improvements can be tracked separately from this epic.","dependencies":[{"issue_id":"fuse-7en","depends_on_id":"fuse-3tt","type":"blocks","created_at":"2026-04-11T21:57:15Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-4vn","type":"blocks","created_at":"2026-04-11T21:57:15Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-e8p","type":"blocks","created_at":"2026-04-11T21:57:16Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-k8e","type":"blocks","created_at":"2026-04-11T21:57:13Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-l6g","type":"blocks","created_at":"2026-04-11T21:57:14Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-n5p","type":"blocks","created_at":"2026-04-11T21:57:14Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-pir","type":"blocks","created_at":"2026-04-11T21:57:12Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-qqg","type":"blocks","created_at":"2026-04-11T21:57:17Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-7en","depends_on_id":"fuse-wgi","type":"blocks","created_at":"2026-04-11T21:57:13Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":9,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-vv2","title":"Investigate SF #516 GTK3 screen artifacts","description":"Track SourceForge bug #516 (\"Artifacts on screen\"): investigate GTK3 rendering artifacts seen on 4K/high-DPI displays, confirm reproduction conditions, and identify the likely cause or workaround in the GTK3 rendering path.","status":"closed","priority":2,"issue_type":"bug","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-05-02T23:42:08Z","created_by":"Fredrick Meunier","updated_at":"2026-05-04T12:04:01Z","started_at":"2026-05-02T23:42:12Z","closed_at":"2026-05-04T12:04:01Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-079","title":"Fix Windows libspectrum cache path mismatch","description":"The Windows libspectrum workflow restores and saves Cygwin packages from C:\\cygwin-packages, but cygwin-install-action defaults to D:\\cygwin-packages when the D: work volume exists. This causes actions/cache/save to warn that the configured path does not exist. Acceptance: restore/save uses the same package-cache path that the install action uses, and successful runs no longer log Cache save failed for the libspectrum Windows job.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-27T02:17:48Z","created_by":"Fredrick Meunier","updated_at":"2026-05-04T12:05:05Z","started_at":"2026-04-27T02:18:45Z","closed_at":"2026-05-04T12:05:05Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-9d1","title":"Update deprecated GitHub Actions versions","description":"Several workflows still use actions/checkout@v4, actions/upload-artifact@v4, and actions/download-artifact@v4, which trigger deprecation warnings because they run on Node.js 20. Acceptance: workflow references are updated to supported majors so successful runs no longer log the deprecated action runtime warnings.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-27T00:55:17Z","created_by":"Fredrick Meunier","updated_at":"2026-05-04T12:04:24Z","started_at":"2026-04-27T00:56:13Z","closed_at":"2026-05-04T12:04:24Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-0ct","title":"Stop Windows Actions exit code 128 cleanup warnings","description":"Windows GitHub Actions release/build jobs finish successfully but log warnings from actions/checkout post-job cleanup: D:\\cygwin\\bin\\git.exe exits with code 128 after reporting dubious ownership for the /cygdrive/... workspace path. The build installs Cygwin after checkout, which leaves Cygwin git on PATH for checkout cleanup while checkout only marked the Windows-form workspace path as safe. Acceptance: Windows workflows no longer emit the exit code 128 warnings in successful runs.","notes":"Root cause:\n- actions/checkout post-job cleanup runs after Cygwin installation, so it ends up invoking D:\\cygwin\\bin\\git.exe.\n- checkout marks the Windows workspace path as safe in its temporary HOME, but Cygwin git sees the repository as /cygdrive/d/... and reports dubious ownership.\n- The resulting post-job git cleanup warning does not fail the build, but it logs exit code 128 on successful runs.\n\nImplemented fix:\n- Set persist-credentials: false on both checkout steps in .github/workflows/build_windows_sub.yml.\n- These jobs do not push, so they do not need checkout to persist auth for post-job cleanup.\n- This should avoid the noisy checkout post-job credential cleanup path that was tripping over Cygwin git.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-27T00:06:18Z","created_by":"Fredrick Meunier","updated_at":"2026-05-04T12:04:48Z","started_at":"2026-04-27T00:07:06Z","closed_at":"2026-05-04T12:04:48Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-1tq","title":"Review Windows release artifact names for SDL variants","description":"User feedback suggests the SDL and SDL2 Windows release artifacts should be named with an explicit 'win32' segment, such as fuse-\u003cversion\u003e-win32-sdl.zip and fuse-\u003cversion\u003e-win32-sdl2.zip, to better distinguish them in the SourceForge files directory. Review the desired naming scheme for zip and installer artifacts, assess compatibility with existing expectations, and implement the chosen convention if appropriate.","status":"open","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-26T22:32:55Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T22:32:55Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-msy","title":"Investigate Win32 file drag-and-drop loading","description":"On Windows 10, the Win32 build appears to accept drag initiation visually but dropping a TAP file onto the emulator does not load the game. Investigate Win32 drag-and-drop handling for TAP and similar file types, reproduce the issue if possible, and fix the drop path. Acceptance: dropping a TAP file onto the Win32 emulator loads it as expected, or the failure is explained and narrowed with a concrete follow-up.","status":"open","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-26T22:28:23Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T22:28:23Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-vvh","title":"Ensure Windows release text files use CRLF line endings","description":"Windows release artifacts currently appear to ship text files with LF line endings. Investigate whether the release workflow is missing the package that provides the autoconf-detected UNIX2DOS tool or otherwise failing to convert *.txt and related release text files to CRLF. Acceptance: Windows release zip and installer outputs contain CRLF line endings for the intended text files.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-26T22:28:21Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T22:35:38Z","started_at":"2026-04-26T22:35:15Z","closed_at":"2026-04-26T22:35:38Z","close_reason":"Installed the Cygwin dos2unix package in the Windows build workflow so configure can detect unix2dos and the existing dist-win32 packaging rules convert release text files to CRLF.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-7o2","title":"Verify Windows installer uninstall support","description":"User feedback asked whether the Windows NSIS installers provide an uninstaller. Confirm the current installer behavior, verify that uninstall metadata and the uninstaller executable work as expected on installed builds, and fix or document any gaps. Acceptance: installer uninstall support is verified and any issues are tracked or resolved.","status":"in_progress","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-26T22:28:19Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T22:42:46Z","started_at":"2026-04-26T22:42:46Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-4oy","title":"Review Windows installer install directory per UI variant","description":"The win32, SDL, and SDL2 NSIS installers currently appear to target the same installation directory, which prevents multiple variants from being installed side by side. Review whether the installer directory should vary by UI variant, assess compatibility and user-expectation tradeoffs, and implement a change if appropriate. Acceptance: decide the intended behavior and align the installer path logic with that decision.","notes":"Sizing research:\n- This looks like a small-to-medium installer change, mostly confined to data/win32/installer.nsi.in.\n- The current variant collision is caused by shared installer identifiers: installDir \"$PROGRAMFILES\\Fuse\", uninstall registry key \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Fuse\", and Start Menu folder \"$SMPROGRAMS\\Fuse\".\n- The setup filename already varies by @UI@, so packaging output naming is mostly in place already.\n- A minimal side-by-side-install fix should separate at least the install directory, uninstall registry key, and Start Menu folder per UI variant.\n- Changing only installDir would be incomplete because shared uninstall metadata or shortcuts would still let variants interfere with each other.\n- Additional review is needed for the previous-version uninstall logic, which currently assumes one shared uninstall entry and may need to become variant-specific as well.\n- Expected effort: small code diff, but medium behavior/testing risk because Windows install/upgrade/uninstall paths can regress subtly.","status":"open","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-26T22:27:23Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T23:04:47Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-veg","title":"Include widget font in SDL2 Windows package","description":"The Windows installer packages expect ui/widget/fuse.font for widget-based UIs. The current distribution.mk only copies that font for the SDL1 variant, so the SDL2 installer emits a missing-file warning and omits the font. Update the Windows packaging rule so SDL2 packages include fuse.font as well.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-26T07:18:12Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T07:18:37Z","started_at":"2026-04-26T07:18:18Z","closed_at":"2026-04-26T07:18:37Z","close_reason":"Updated the Windows packaging rule so both SDL and SDL2 widget-based builds create ui/widget and copy fuse.font into the package before the installer is built.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-n4z","title":"Fix Windows installer variant naming","description":"The manual Windows release workflow now builds installers successfully for the win32 variant, but SDL and SDL2 jobs fail because the NSIS template hardcodes the output file name to '-win32-setup.exe'. The dist-win32-exe target expects the installer name to follow the active UI variant (win32, sdl, sdl2). Update the installer template so the output file name tracks the configured UI.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-26T07:13:58Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T07:15:11Z","started_at":"2026-04-26T07:14:49Z","closed_at":"2026-04-26T07:15:11Z","close_reason":"Updated the NSIS installer template so the output filename uses the configured UI variant rather than hardcoding 'win32', matching the expectations of the dist-win32-exe packaging target for win32, sdl, and sdl2 builds.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-t4u","title":"Fix Windows release NSIS path","description":"The manual Windows release workflow installs NSIS successfully with Chocolatey, but the subsequent Cygwin packaging step fails with 'ERROR: cannot locate makensis tool' because CYGWIN_NOWINPATH prevents the Cygwin shell from seeing the Chocolatey shim path. Update the shared Windows build workflow so makensis is visible to the Cygwin packaging step when installer builds are enabled.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-26T06:19:03Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T06:56:13Z","started_at":"2026-04-26T06:19:51Z","closed_at":"2026-04-26T06:56:13Z","close_reason":"Replaced the fragile makensis symlink with a Cygwin wrapper script that resolves the Chocolatey shim and the common NSIS install locations before invoking the Windows executable.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-4ro","title":"Fix Windows checkout safe.directory warnings","description":"The Windows GitHub Actions jobs finish successfully but actions/checkout emits post-job exit code 128 warnings because checkout cleanup safelists the workspace using a Windows path while later Cygwin git operations see the same repository via /cygdrive/... . Update the shared Windows workflows so both path forms are registered as safe directories early in the job.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-26T02:04:10Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T02:06:25Z","started_at":"2026-04-26T02:06:03Z","closed_at":"2026-04-26T02:06:25Z","close_reason":"Registered both Windows and /cygdrive workspace paths as safe directories in the shared Windows checkout workflow so actions/checkout post-job cleanup no longer trips Git's dubious ownership check.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-6al","title":"Fix Windows SDL notice packaging","description":"The Windows release packaging currently includes both SDL and SDL2 entries in LICENSES.txt regardless of the selected UI variant, and the SDL2 release artifact can miss the corresponding 3rd-party notice files. Update the shared Windows packaging path so each variant only documents and ships the runtime notices for DLLs actually included in that package.","status":"closed","priority":2,"issue_type":"bug","owner":"fredm@spamcop.net","created_at":"2026-04-25T23:16:42Z","created_by":"Fredrick Meunier","updated_at":"2026-04-25T23:58:54Z","started_at":"2026-04-25T23:17:38Z","closed_at":"2026-04-25T23:58:54Z","close_reason":"Added a repo-managed SDL2 fallback notice for the Windows packaging path so SDL2 builds still ship 3rd-party license detail when the Cygwin SDL2 package exposes no discoverable notice files on the runner.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-4cu","title":"Fill Windows CI package metadata and license gaps","description":"Why: Comparing the CI-produced win32 package against public Windows releases shows that the DLL/toolchain family is broadly consistent with older releases such as 1.5.6, but the CI package is missing important release metadata and license material needed for a distributable archive. What: update the Windows packaging path so CI/manual release builds include README-win32.txt, LICENSES.txt, and the 3rd-party license files, and make LICENSES.txt reflect the actual shipped DLL set (including current CI-specific runtime libraries such as iconv/liblzma/libFLAC/libOGG where applicable). Context: the main gap is packaging/documentation parity rather than the core DLL approach; installer generation is tracked separately.","status":"closed","priority":2,"issue_type":"task","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-23T11:28:21Z","created_by":"Fredrick Meunier","updated_at":"2026-04-24T12:47:23Z","started_at":"2026-04-24T02:23:36Z","closed_at":"2026-04-24T12:47:23Z","close_reason":"Implemented and verified the Windows release packaging updates: added README-win32.txt and LICENSES.txt to the package, copied third-party notices into 3rd-party with package-qualified .txt names, installed the missing manual-generation tools in Windows CI, and restored release-style zip naming.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-6r5.5","title":"Package release-style Windows artifacts without 7z","description":"Produce the release-style Windows deliverables for each manual build run, specifically zip archives and setup.exe installers, and ensure the workflow no longer emits 7z artifacts for this path.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-22T12:35:03Z","created_by":"Fredrick Meunier","updated_at":"2026-04-26T04:59:54Z","closed_at":"2026-04-26T04:59:54Z","close_reason":"Extended the shared Windows build workflow to optionally install NSIS, build release-style setup.exe installers alongside zip artifacts, and enabled that installer path for the manual Windows release workflow without changing the default PR build behavior.","dependencies":[{"issue_id":"fuse-6r5.5","depends_on_id":"fuse-6r5","type":"parent-child","created_at":"2026-04-22T22:35:02Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-6r5.5","depends_on_id":"fuse-6r5.3","type":"blocks","created_at":"2026-04-22T22:35:16Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0}
{"_type":"issue","id":"fuse-6r5.4","title":"Define manual Windows release workflow contract","description":"Document the intended workflow shape before implementation: manual GitHub Actions entrypoint, artifact-only scope, required outputs, required inputs, source defaults/overrides, and which existing reusable workflows should be reused instead of duplicating logic.","design":"Workflow contract:\n- Add a new manual GitHub Actions workflow for Windows release builds using workflow_dispatch.\n- Output scope is artifacts only; no GitHub release creation in v1.\n- Default Fuse source is the current repository checkout on master.\n- Default libspectrum source is the canonical SourceForge git repository on master.\n- Optional overrides are tag-only inputs: fuse_tag and libspectrum_tag. Empty inputs mean use the defaults.\n- Build all three 32-bit Windows variants in one run: win32, sdl, and sdl2.\n- Produce release-style artifacts only: zip and setup.exe for each variant. Do not produce 7z artifacts.\n- Fail the workflow when manually selected Fuse and libspectrum tags are incompatible; do not add fallback resolution.\n- Reuse existing reusable workflows where practical, especially build_libspectrum_windows_sub.yml and build_windows_sub.yml, extending shared logic instead of duplicating full jobs.\n- Keep artifact names aligned with historical SourceForge naming: fuse-\u003cversion\u003e-win32.zip, fuse-\u003cversion\u003e-win32-setup.exe, fuse-\u003cversion\u003e-sdl.zip, fuse-\u003cversion\u003e-sdl-setup.exe, fuse-\u003cversion\u003e-sdl2.zip, and fuse-\u003cversion\u003e-sdl2-setup.exe.","notes":"Implementation notes:\n- The legacy windows_release.yml captures some prior intent but is stale relative to the current reusable workflow interfaces.\n- The current reusable Windows build path already builds zip artifacts, but not installers; installer generation should be added by extending shared packaging logic rather than reviving the legacy workflow as-is.\n- build_libspectrum_windows_sub.yml already supports fetching libspectrum from the canonical SourceForge repository by ref and is the preferred base for libspectrum selection.\n- build_windows_sub.yml is the preferred base for the Fuse-side build matrix, source checkout, configure verification, and artifact upload behavior.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-22T12:35:00Z","created_by":"Fredrick Meunier","updated_at":"2026-04-22T12:36:45Z","started_at":"2026-04-22T12:36:40Z","closed_at":"2026-04-22T12:36:45Z","close_reason":"Recorded the manual Windows release workflow contract in the issue design and notes for follow-on implementation tasks.","dependencies":[{"issue_id":"fuse-6r5.4","depends_on_id":"fuse-6r5","type":"parent-child","created_at":"2026-04-22T22:35:00Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":0,"dependent_count":2,"comment_count":0}
{"_type":"issue","id":"fuse-6r5.3","title":"Add Windows release build matrix for win32 SDL and SDL2","description":"Implement the Windows build steps for the planned manual release workflow so it can build the win32, SDL, and SDL2 variants, reusing the repository's existing reusable workflows or shared job logic where that is practical.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-22T12:34:59Z","created_by":"Fredrick Meunier","updated_at":"2026-04-25T22:46:10Z","started_at":"2026-04-25T22:45:04Z","closed_at":"2026-04-25T22:46:10Z","close_reason":"Updated the manual Windows release workflow to reuse the shared Windows build job for win32, SDL, and SDL2 variants in a single run.","dependencies":[{"issue_id":"fuse-6r5.3","depends_on_id":"fuse-6r5","type":"parent-child","created_at":"2026-04-22T22:34:59Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-6r5.3","depends_on_id":"fuse-6r5.4","type":"blocks","created_at":"2026-04-22T22:35:17Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0}
{"_type":"issue","id":"fuse-6r5.2","title":"Add workflow_dispatch inputs and source selection defaults","description":"Implement the manual workflow inputs for optional fuse_tag and libspectrum_tag overrides while keeping the default Fuse source on the current checkout/master and the default libspectrum source on canonical SourceForge master.","notes":"Implementation approach:\n- Make this a minimal, low-risk change centered on source/ref selection.\n- Keep it isolated to a manual workflow path so existing automated workflows are unaffected.\n- Aim for a testable result that resolves and passes through default sources and optional fuse_tag/libspectrum_tag overrides, without yet tackling full packaging changes.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-22T12:34:58Z","created_by":"Fredrick Meunier","updated_at":"2026-04-25T22:42:19Z","started_at":"2026-04-22T12:39:41Z","closed_at":"2026-04-25T22:42:19Z","close_reason":"Implemented the manual windows_release workflow inputs for optional fuse_tag and libspectrum_tag overrides while preserving the default Fuse checkout and canonical SourceForge libspectrum master behavior. Verified by successful workflow runs.","dependencies":[{"issue_id":"fuse-6r5.2","depends_on_id":"fuse-6r5","type":"parent-child","created_at":"2026-04-22T22:34:58Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-6r5.2","depends_on_id":"fuse-6r5.4","type":"blocks","created_at":"2026-04-22T22:35:16Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0}
{"_type":"issue","id":"fuse-6r5.1","title":"Add compatibility checks and finalize artifact-only workflow orchestration","description":"Wire the manual Windows release workflow together so it publishes artifacts only, fails fast when the selected Fuse and libspectrum versions are incompatible, and cleanly orchestrates the reusable build and packaging pieces end to end.","status":"open","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-22T12:34:57Z","created_by":"Fredrick Meunier","updated_at":"2026-04-22T12:34:57Z","dependencies":[{"issue_id":"fuse-6r5.1","depends_on_id":"fuse-6r5","type":"parent-child","created_at":"2026-04-22T22:34:57Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-6r5.1","depends_on_id":"fuse-6r5.2","type":"blocks","created_at":"2026-04-22T22:35:18Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-6r5.1","depends_on_id":"fuse-6r5.5","type":"blocks","created_at":"2026-04-22T22:35:19Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":2,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-6r5","title":"Add manual Windows release-build GitHub Actions workflow","description":"Track the planned manual GitHub Actions workflow for Windows release builds. Scope: artifact-only workflow_dispatch entrypoint; default Fuse source from the current checkout/master and libspectrum from canonical SourceForge master; optional fuse_tag and libspectrum_tag overrides; build win32, sdl, and sdl2 variants; emit release-style zip and setup.exe artifacts; do not produce 7z artifacts; fail fast on incompatible Fuse/libspectrum versions; reuse existing reusable workflows where practical.","notes":"Incremental sequencing note:\n- Prefer fuse-6r5.2 as the next implementation step.\n- Rationale: it is the smallest additive change, can be isolated to a manual workflow entrypoint, and should not affect existing PR/build workflows because nothing runs unless manually dispatched.\n- Expected outcome: a testable manual workflow contract for selecting default refs and optional tag overrides before wiring the full build matrix and packaging.","status":"open","priority":2,"issue_type":"epic","owner":"fredm@spamcop.net","created_at":"2026-04-22T12:34:36Z","created_by":"Fredrick Meunier","updated_at":"2026-04-22T12:40:58Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-arr","title":"Add GitHub Actions CI coverage for SDL2 target","description":"Why: GitHub Actions CI does not currently build the SDL2 target, so regressions there can slip through. What: extend CI coverage to build the SDL2 target as part of the automated workflow.","status":"closed","priority":2,"issue_type":"task","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-12T03:30:29Z","created_by":"Fredrick Meunier","updated_at":"2026-04-22T12:05:36Z","closed_at":"2026-04-22T12:05:36Z","close_reason":"SDL2 target is covered by GitHub Actions workflows on Linux, macOS, and Windows.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-uyv","title":"Run SDL2 unit tests under make check","description":"Ensure the SDL2-specific unit test binaries are included in the automake test harness so /Applications/Xcode.app/Contents/Developer/usr/bin/make check-am\n/Applications/Xcode.app/Contents/Developer/usr/bin/make check-local\n./fuse --unittests\n\nThe Free Unix Spectrum Emulator (Fuse) version 1.7.0.\n(c) 1999-2026 Philip Kendall and others; see the file\n'AUTHORS' for more details.\n\nFor help, please mail \u003cfuse-emulator-devel@lists.sf.net\u003e or use\nthe forums at \u003chttp://sourceforge.net/p/fuse-emulator/discussion/\u003e.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nFinal return value: 0 (should be 0)\n./unittests/displaytest executes them along with the existing unit tests.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-12T02:03:55Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T02:06:26Z","closed_at":"2026-04-12T02:06:26Z","close_reason":"Extended the existing check-local test hook so make check now runs the SDL2 display, joystick, and mouse unit tests in addition to the existing Fuse unit test binaries.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-tbw","title":"Document and format SDL2 backend","description":"Add user-facing documentation for the completed SDL2 backend work, especially fullscreen mode selection and mouse/grab behavior, and run the project formatter over the SDL2 source files to normalize style without changing behavior.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-12T01:53:22Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T01:58:44Z","closed_at":"2026-04-12T01:58:44Z","close_reason":"Documented SDL2 fullscreen and mouse behavior in the man page and ran the documented uncrustify formatting pass over the SDL2 backend, SDL2 sound source, and SDL2-related tests.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-6hh","title":"Add SDL2 fixed fullscreen mode selection","description":"Restore the valued SDL1-style fixed fullscreen mode behavior in the SDL2 backend. The SDL2 UI should retain desktop fullscreen support where appropriate, but also support explicit fullscreen display mode selection/fitting behavior comparable to SDL1, using the existing fullscreen-mode setting/plumbing where feasible.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-12T00:58:27Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T01:27:45Z","closed_at":"2026-04-12T01:27:45Z","close_reason":"Restored SDL1-style fixed fullscreen mode behavior for SDL2, including list/index/WxH selection, automatic fullscreen mode choice biased by scaler fit and refresh preference, and unit coverage for the mode-selection logic.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-h6s","title":"Add SDL2 presentation helper test seam","description":"Create a minimal, C89-friendly test seam for SDL2 presentation logic by extracting pure helper functions and simple inline view structs without abstracting hot-path rendering through indirect calls. Use it to add unit coverage for fullscreen offset/layout and scaler-selection decisions that currently live inside the SDL2 display backend.","status":"closed","priority":2,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-11T23:09:12Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T23:23:45Z","closed_at":"2026-04-11T23:23:45Z","close_reason":"Added a C89-friendly SDL2 presentation helper seam with unit coverage for fullscreen offsets, rect transforms, icon placement, and fullscreen scaler selection without introducing hot-path indirection.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-l6g","title":"Fullscreen and window management for SDL2 UI","description":"Implement SDL2-native fullscreen transitions and window management behavior once core presentation is correct. Cover sizing, mode changes, and window lifecycle behavior needed for routine use, without expanding scope into deferred joystick or mouse/grab work.","acceptance_criteria":"The SDL2 UI supports usable fullscreen and windowed operation with correct transitions, sizing, and window lifecycle behavior on top of the cleaned-up display path; remaining joystick and mouse/grab concerns stay deferred.","status":"closed","priority":2,"issue_type":"task","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:29Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T14:12:31Z","closed_at":"2026-04-11T14:12:31Z","close_reason":"SDL2 fullscreen/window handling now supports the General options fullscreen toggle, centers fullscreen presentation, adjusts scaler choice for fullscreen use, restores the windowed scaler on exit, and was verified locally by the user.","dependencies":[{"issue_id":"fuse-l6g","depends_on_id":"fuse-n5p","type":"blocks","created_at":"2026-04-11T21:57:08Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":1,"dependent_count":3,"comment_count":0}
{"_type":"issue","id":"fuse-n5p","title":"Display correctness and presentation cleanup for SDL2 UI","description":"Clean up SDL2 display presentation after the minimal SDL2 UI and SDL2 sound milestones are in place, while explicitly keeping the existing software rendering and scaler flow for this tranche. Focus on concrete correctness issues such as pixel format handling, redraw/expose paths, presentation stability, and scaling behavior before fullscreen or broader polish.","design":"This is a display-correctness pass on top of the existing software/scaler path, not a rendering-architecture rewrite. Keep SDL2 presentation behavior compatible with the current frame production flow so later fullscreen and input work build on a stable base.","acceptance_criteria":"SDL2 presentation handles the intended pixel formats correctly without obvious channel swaps, corruption, or format-mismatch artifacts in normal emulator use. Frame presentation is stable over time, without obvious flicker, runaway redraw behavior, or stale-frame display during routine operation. Redraw and expose/update paths refresh the window correctly after events that require repainting. Scaling and final presentation match the expected behavior of the current software rendering and scaler flow rather than introducing a new renderer/texture pipeline. The task leaves the software/scaler flow in place and does not expand scope into renderer/texture modernization.","status":"closed","priority":2,"issue_type":"task","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:24Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T13:23:46Z","closed_at":"2026-04-11T13:23:46Z","close_reason":"SDL2 display presentation now handles redraw/expose correctly, keeps status/media overlays in sync, and was verified locally by the user.","dependencies":[{"issue_id":"fuse-n5p","depends_on_id":"fuse-k8e","type":"blocks","created_at":"2026-04-11T21:57:07Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-n5p","depends_on_id":"fuse-wgi","type":"blocks","created_at":"2026-04-11T21:57:06Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":2,"dependent_count":3,"comment_count":0}
{"_type":"issue","id":"fuse-nqf","title":"Use libspectrum_new0 in SDL2 display allocations","description":"Replace the remaining direct calloc usage in the SDL2 display backend with the project-standard typed libspectrum_new0 allocator and matching libspectrum_free cleanup for consistency with the rest of the codebase.","status":"closed","priority":3,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-12T03:20:30Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T03:21:27Z","closed_at":"2026-04-12T03:21:27Z","close_reason":"Replaced the remaining direct calloc usage in the SDL2 display backend with libspectrum_new0 and paired tmp_screen buffer cleanup with libspectrum_free for allocator consistency.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"fuse-qqg","title":"Final SDL2 parity cleanup","description":"Track remaining SDL2 backend parity gaps and cleanup once build/configure, minimal UI, SDL2 sound, display, fullscreen/window, keyboard, joystick, and mouse/grab work are all complete. Use this to capture residual polish rather than front-loading modernization.","acceptance_criteria":"Remaining SDL2 parity gaps are enumerated and cleaned up after the earlier milestones finish; no major known parity blocker remains for the SDL2 UI and SDL2 sound backends; renderer/texture modernization remains out of scope unless separately justified.","status":"closed","priority":3,"issue_type":"task","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:53Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T00:55:53Z","closed_at":"2026-04-12T00:55:53Z","close_reason":"Cleaned up the remaining practical SDL2 parity gaps by restoring mouse grab across window recreation and allowing held-key repeat through the widget UI. No major known SDL2 parity blocker remains; SDL1-style fixed fullscreen mode selection remains out of scope for this cleanup.","dependencies":[{"issue_id":"fuse-qqg","depends_on_id":"fuse-4vn","type":"blocks","created_at":"2026-04-11T21:57:11Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-qqg","depends_on_id":"fuse-e8p","type":"blocks","created_at":"2026-04-11T21:57:12Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":2,"dependent_count":1,"comment_count":0}
{"_type":"issue","id":"fuse-e8p","title":"Mouse and grab behavior for SDL2 UI","description":"Add SDL2 mouse handling and grab/capture behavior only after the core SDL2 milestones are stable. Treat this as deferred follow-up work after build/configure, minimal UI, SDL2 sound, display cleanup, fullscreen/window management, and keyboard fidelity.","acceptance_criteria":"SDL2 mouse input and grab/capture behavior are implemented after the prerequisite SDL2 UI milestones are complete; behavior is usable without requiring a hybrid SDL1/SDL2 path or unrelated renderer modernization.","status":"closed","priority":3,"issue_type":"task","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:47Z","created_by":"Fredrick Meunier","updated_at":"2026-04-12T00:44:36Z","closed_at":"2026-04-12T00:44:36Z","close_reason":"Implemented SDL2 mouse grab/release behavior with relative mode and window grab, added unit tests for mouse grab policy, fixed fullscreen status icon null-safety, and verified the runtime behavior locally with acceptable residual macOS cursor-hide quirks.","dependencies":[{"issue_id":"fuse-e8p","depends_on_id":"fuse-3tt","type":"blocks","created_at":"2026-04-11T21:57:10Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-e8p","depends_on_id":"fuse-l6g","type":"blocks","created_at":"2026-04-11T21:57:10Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":2,"dependent_count":2,"comment_count":0}
{"_type":"issue","id":"fuse-4vn","title":"Joystick support for SDL2 UI","description":"Add SDL2 joystick/game-controller support only after build/configure, minimal UI, SDL2 sound, display cleanup, fullscreen/window management, and keyboard fidelity are all in place. Keep this as a follow-up integration task rather than broadening earlier milestones.","acceptance_criteria":"SDL2 joystick support is implemented after the prerequisite SDL2 UI and input/display milestones are complete; it integrates cleanly with the native SDL2 backend without reopening earlier architectural decisions.","status":"closed","priority":3,"issue_type":"task","assignee":"Fredrick Meunier","owner":"fredm@spamcop.net","created_at":"2026-04-11T11:56:40Z","created_by":"Fredrick Meunier","updated_at":"2026-04-11T23:41:02Z","closed_at":"2026-04-11T23:41:02Z","close_reason":"Added native SDL2 joystick support with button/axis/hat event handling, fixed configure-time SDL2 joystick enablement, added unit tests for joystick event translation, and verified behavior with a real joystick.","dependencies":[{"issue_id":"fuse-4vn","depends_on_id":"fuse-3tt","type":"blocks","created_at":"2026-04-11T21:57:09Z","created_by":"Fredrick Meunier","metadata":"{}"},{"issue_id":"fuse-4vn","depends_on_id":"fuse-l6g","type":"blocks","created_at":"2026-04-11T21:57:09Z","created_by":"Fredrick Meunier","metadata":"{}"}],"dependency_count":2,"dependent_count":2,"comment_count":0}
{"_type":"memory","key":"sdl2-renderer-backend-guidance","value":"Future SDL2 renderer/texture backend guidance: keep current surface/scaler parity backend as the stable path; if revisiting a renderer path, use it as a separate follow-up rather than replacing the parity backend wholesale. Practical lessons from historical SDL2 attempts and this branch: (1) renderer backbuffers must be explicitly cleared every frame before drawing because SDL render backbuffers are invalid after present; assume no preserved contents across frames. (2) Dirty-rect updates interact badly with non-integer SDL scaling/filtering and can leave interpolation artifacts at update borders; if using renderer scaling with non-integer factors, prefer full texture updates or be extremely conservative about dirty regions. (3) Relative mouse mode is the right SDL2 approach for grab/ungrab; keep emulator input on key events and treat any SDL_TEXTINPUT support as widget-text-entry-only, not Spectrum input. (4) Fixed software scalers and free SDL scaling become conceptually messy when mixed; for parity/default behavior preserve fixed Fuse scaler semantics, and if adding a freely resizeable SDL scaler mode, make it an explicit alternative mode rather than silently changing existing scaler behavior. (5) Avoid relying on WM-specific aspect-hint logic as a core behavior; it proved fragile and WM-dependent historically. (6) If using textures, RGB565 remains a sensible source format, but be careful about assumptions around filtering, clipping, and fullscreen border clearing. (7) If pursuing renderer fullscreen/window logic, test resize, maximized window, fullscreen transitions, and border clearing across multiple platforms/GPUs early, especially Intel/X11-style cases historically prone to stale backbuffer artifacts. (8) The current branch intentionally retained SDL1-style fixed fullscreen mode selection because it is a valued user feature; do not drop that behavior casually in a renderer redesign."}