GlobalInputs F1-F12 + Escape, Screen sense destruir finestra, escalat al GPU, presets i fons canvas (v0.11.0)

This commit is contained in:
JailDesigner committed 2026-04-19 14:27:16 +02:00
1 parent 837eb73398
commit 297dc85e47
23 files changed
+653 -34

No files matched your search

+58
View File
@@ -156,6 +156,64 @@ void Screen::applyCrtPiParams(const Rendering::CrtPiParams& params) {
}
}
void Screen::setWindowZoom(int zoom) {
config_.zoom = zoom;
adjustWindowSize();
}
void Screen::setFullscreen(bool fullscreen) {
config_.fullscreen = fullscreen;
SDL_SetWindowFullscreen(window_, fullscreen);
SDL_SyncWindow(window_);
adjustWindowSize();
}
void Screen::setVSync(bool vsync) {
config_.vsync = vsync;
if (shader_backend_ != nullptr) {
shader_backend_->setVSync(vsync);
} else if (renderer_ != nullptr) {
SDL_SetRenderVSync(renderer_, vsync ? 1 : 0);
}
}
void Screen::setScalingMode(Defaults::ScalingMode mode) {
config_.scaling_mode = mode;
if (shader_backend_ != nullptr) {
shader_backend_->setScalingMode(mode);
} else if (renderer_ != nullptr) {
SDL_SetRenderLogicalPresentation(renderer_, GameCanvas::WIDTH, GameCanvas::HEIGHT, toSdlPresentation(mode));
}
}
// Fullscreen manté la resolució del desktop; en mode finestra recalculem i
// reposicionem. A Wayland el compositor ignora SDL_SetWindowPosition, així
// que allí el reset queda en mans del WM.
void Screen::adjustWindowSize() {
if (config_.fullscreen) { return; }
int old_w = 0;
int old_h = 0;
SDL_GetWindowSize(window_, &old_w, &old_h);
int old_x = 0;
int old_y = 0;
SDL_GetWindowPosition(window_, &old_x, &old_y);
const int NEW_W = GameCanvas::WIDTH * config_.zoom;
const int NEW_H = GameCanvas::HEIGHT * config_.zoom;
const int NEW_X = old_x + ((old_w - NEW_W) / 2);
const int NEW_Y = old_y + ((old_h - NEW_H) / 2);
SDL_SetWindowSize(window_, NEW_W, NEW_H);
SDL_SyncWindow(window_);
const char* driver = SDL_GetCurrentVideoDriver();
const bool IS_WAYLAND = (driver != nullptr && SDL_strcmp(driver, "wayland") == 0);
if (!IS_WAYLAND) {
SDL_SetWindowPosition(window_, std::max(NEW_X, 0), std::max(NEW_Y, 0));
}
}
void Screen::clear(std::uint8_t r, std::uint8_t g, std::uint8_t b) {
const std::uint32_t COLOR = (0xFFU << 24) | (static_cast<std::uint32_t>(r) << 16) | (static_cast<std::uint32_t>(g) << 8) | static_cast<std::uint32_t>(b);
std::ranges::fill(canvas_, COLOR);