Skip to content

0.4.0: Extend to External Display - #4

Merged
Mtbolanos merged 6 commits into
mainfrom
external-display
Oct 14, 2026
Merged

Mtbolanos merged 6 commits into
mainfrom
external-display

Conversation

@Mtbolanos

Copy link
Copy Markdown
Owner

0.4.0

  • Extend to External Display (Settings → Graphics, activado por defecto): con una pantalla conectada (USB-C/HDMI o AirPlay), el juego pasa a ella a su resolución real de salida y el dispositivo queda como control. El menú abierto con ••• se muestra en el dispositivo y el abierto desde un control, en la pantalla externa. Native Screen Resolution y Lock at 60 FPS no aplican mientras tanto. Los FPS siguen la tasa de la pantalla donde está el juego.
  • Los controles táctiles se ocultan solos con un gamepad conectado (el botón de menú se mantiene).
  • Las fuentes del menú se generan una vez, a la densidad del dispositivo; ya no se reconstruyen durante el juego.
  • ImGui se dibuja con tolerancia de redondeo (escalas no enteras, como un iPad en una tele 4K).
  • El delegate de la pantalla externa se registra en tiempo de ejecución, sin parchear las líneas del parche de escenas de SDL.
  • CI: scripts/check-sdl-patches.sh verifica que los parches de SDL apliquen sobre un checkout limpio y se reconozcan sobre uno ya parchado (caché).
  • README actualizado.

Pruebas en dispositivo: MaskPad en iPhone 16 Pro Max y iPad Pro M1, con tele 4K, conexión en caliente y Stage Manager.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HV5aPxGAoSFXjdZ5dsEUJd


Generated by Claude Code

Matías Bolaños Simpson and others added 6 commits October 13, 2026 15:11
…troller

- External display (USB-C/HDMI, AirPlay): the game moves to it and this device
  keeps the touch controls (or an idle screen with a controller). A touch-opened
  menu shows on the device; a controller-opened menu stays on the display.
- New setting Extend to External Display (on). Native Screen Resolution and
  Lock at 60 FPS are disabled while the game is on the external display.
- The refresh rate follows the screen that shows the game.
- Touch controls hide while a game controller is connected (menu button stays).
- TEMPORARY: Documents/external-display.txt log for testing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HV5aPxGAoSFXjdZ5dsEUJd
…ders at its real output mode

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HV5aPxGAoSFXjdZ5dsEUJd
… UI test failures

- Fonts are rasterized once at the device's density; the atlas is never rebuilt
  at runtime (the ports' fonts point to resource memory the atlas does not own),
  which corrupted the menu text after switching screens.
- ImGui is drawn when the framebuffer matches within a pixel, so non-integer
  external display scales (iPad on a 4K TV) do not skip every frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HV5aPxGAoSFXjdZ5dsEUJd
…them

The CI simulator reports a GameController device, which hid the touch controls
and failed testControlPressReleaseToggleAndLifecycleCancellation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HV5aPxGAoSFXjdZ5dsEUJd
The SDL patch for external display scenes edited lines of sdl2-uikit-scenes.patch,
so a reused (cached) SDL checkout failed the scenes patch 'already applied' check
and the build aborted. libultraship now wraps SDL's scene configuration at load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HV5aPxGAoSFXjdZ5dsEUJd
…plication

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HV5aPxGAoSFXjdZ5dsEUJd
@Mtbolanos
Mtbolanos merged commit 22cd224 into main Oct 14, 2026
3 checks passed
@Mtbolanos
Mtbolanos deleted the external-display branch October 14, 2026 02:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant