Dynamically size the fullscreen window; present design space via LETTERBOX
build-dev / nix-build (push) Successful in 42s
build-dev / nix-build (push) Successful in 42s
SDL_CreateWindow hardcoded a 1920x1080 backbuffer while SDL_WINDOW_FULLSCREEN
let compositors run a different output mode; the mismatched buffer reached
the panel unscaled — quarter-size in the top-left on 4K sets, cropped ("4x
too large") on smaller non-1080p panels under cage/Wayland. Logical
presentation never got to map the fixed design space because its target
(the backbuffer) was pinned to stale dimensions.
Size the fullscreen window from SDL_GetCurrentDisplayMode so the first
commit already matches scanout 1:1, switch logical presentation to LETTERBOX
(aspect-safe bars on non-16:9 panels), and route both through new
kDesignWidth/kDesignHeight constants. Harden getLayoutSize() to always write
its out params and null-check the renderer/render-window before use.
Log requested/window/pixel-buffer/render-output sizes at startup and on
every resize event so field units self-diagnose this bug class into
~/.local/radiantwave/log.txt. SDL_WINDOW_HIGH_PIXEL_DENSITY stays off on
purpose: kiosk panels are not HiDPI, and keeping the pixel buffer equal to
the display mode keeps compositor scanout unscaled.
This commit is contained in:
+41
-7
@@ -4,14 +4,48 @@
|
||||
|
||||
namespace radiantwave {
|
||||
|
||||
inline void getLayoutSize(SDL_Renderer* renderer, int* w, int* h)
|
||||
// Design resolution every page lays out against. The renderer's logical
|
||||
// presentation (LETTERBOX) scales this fixed space onto whatever
|
||||
// window/backbuffer the display actually provides.
|
||||
inline constexpr int kDesignWidth = 1920;
|
||||
inline constexpr int kDesignHeight = 1080;
|
||||
|
||||
// Returns the size pages should lay out against: the renderer's logical size
|
||||
// when presentation is active, otherwise the real window size. The output
|
||||
// params are always written — design constants are the last-resort fallback.
|
||||
inline void getLayoutSize(SDL_Renderer *renderer, int *w, int *h)
|
||||
{
|
||||
SDL_RendererLogicalPresentation mode = SDL_LOGICAL_PRESENTATION_DISABLED;
|
||||
if (!SDL_GetRenderLogicalPresentation(renderer, w, h, &mode) ||
|
||||
mode == SDL_LOGICAL_PRESENTATION_DISABLED || *w <= 0 || *h <= 0)
|
||||
{
|
||||
SDL_GetWindowSize(SDL_GetRenderWindow(renderer), w, h);
|
||||
}
|
||||
if (!w || !h)
|
||||
return;
|
||||
*w = kDesignWidth;
|
||||
*h = kDesignHeight;
|
||||
|
||||
if (!renderer)
|
||||
return;
|
||||
|
||||
SDL_RendererLogicalPresentation mode = SDL_LOGICAL_PRESENTATION_DISABLED;
|
||||
int logicalW = 0;
|
||||
int logicalH = 0;
|
||||
if (SDL_GetRenderLogicalPresentation(renderer, &logicalW, &logicalH,
|
||||
&mode) &&
|
||||
mode != SDL_LOGICAL_PRESENTATION_DISABLED && logicalW > 0 &&
|
||||
logicalH > 0) {
|
||||
*w = logicalW;
|
||||
*h = logicalH;
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_Window *window = SDL_GetRenderWindow(renderer);
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
int windowW = 0;
|
||||
int windowH = 0;
|
||||
SDL_GetWindowSize(window, &windowW, &windowH);
|
||||
if (windowW > 0 && windowH > 0) {
|
||||
*w = windowW;
|
||||
*h = windowH;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace radiantwave
|
||||
|
||||
Reference in New Issue
Block a user