From 975161e2cc16e9a1e12067e90696ba9d1d8b95d8 Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 15 Jul 2026 18:39:54 +0200 Subject: [PATCH] Fehler bei Vollbild und NinePAtch behoben --- .../main/java/de/blight/editor/EditorApp.java | 3 -- .../main/java/de/blight/game/BlightGame.java | 39 ++++++++++--------- .../game/animation/AnimationLibrary.java | 3 +- .../java/de/blight/game/scene/WorldScene.java | 5 ++- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/blight-editor/src/main/java/de/blight/editor/EditorApp.java b/blight-editor/src/main/java/de/blight/editor/EditorApp.java index f5cf9df..33ede67 100644 --- a/blight-editor/src/main/java/de/blight/editor/EditorApp.java +++ b/blight-editor/src/main/java/de/blight/editor/EditorApp.java @@ -7331,9 +7331,6 @@ public class EditorApp extends Application { final boolean isNewGame = pendingNewGame; pendingNewGame = false; // Editor minimieren, damit das GLFW-Vollbild-Fenster keinen Focus-Konkurrenten hat. - // GLFW_AUTO_ICONIFY würde das Vollbild-Fenster sonst sofort minimieren, weil der - // Editor beim Starten noch den Fokus hat. Der JVM-Start des Spiels dauert mehrere - // Sekunden – das Fenster ist längst minimiert, bevor GLFW das Fenster anlegt. Platform.runLater(() -> { if (primaryStage != null) primaryStage.setIconified(true); }); new Thread(() -> { try { diff --git a/blight-game/src/main/java/de/blight/game/BlightGame.java b/blight-game/src/main/java/de/blight/game/BlightGame.java index 497f160..48cf77e 100644 --- a/blight-game/src/main/java/de/blight/game/BlightGame.java +++ b/blight-game/src/main/java/de/blight/game/BlightGame.java @@ -101,10 +101,11 @@ public class BlightGame extends SimpleApplication { settings.setBitsPerPixel(32); settings.setVSync(gs.vsync); settings.setSamples(gs.samples); - // X11 erzwingen: auf Systemen mit Wayland-Libs läuft GLFW sonst im Wayland-Modus, - // was libdecor-Fensterrahmen auch im Vollbild aktiviert. - settings.setX11PlatformPreferred(true); - + // Nur unter X11-Linux: GLFW auf X11-Backend festlegen, damit libdecor keine + // Fensterrahmen im Vollbild hinzufügt. Unter nativem Wayland nicht setzen. + if ("x11".equalsIgnoreCase(System.getenv("XDG_SESSION_TYPE"))) { + settings.setX11PlatformPreferred(true); + } // Splash vor GLFW-Fenstererstellung schließen: verhindert auto-iconify // (JWindow kann X11-Fokus zurückbekommen → GLFW-Vollbild sofort minimiert) if (gs.fullscreen && app.splashWindow != null) { @@ -474,10 +475,11 @@ public class BlightGame extends SimpleApplication { } // Vollbild sicherstellen: GLFW ist hier bereits durch JME3 initialisiert. - // Problem: GLFW_AUTO_ICONIFY (default true) minimiert das Vollbild-Fenster sofort, - // wenn beim Start ein anderes Fenster (z.B. Editor) noch den Fokus hat. - // Der Editor minimiert sich inzwischen selbst vor dem Spielstart – dieser Fix greift - // dennoch als Fallback und korrigiert außerdem einen falschen Monitor-Index. + // Problem: JME3 erstellt das Fenster sofort sichtbar. Cinnamon/Muffin (GLFW 3.5 nutzt + // _NET_WM_STATE_FULLSCREEN statt OverrideRedirect) schiebt das Fenster beim ersten + // Erscheinen um eine Panel-Höhe nach unten (z.B. Y+32), bevor der WM den State + // vollständig verarbeitet hat. glfwSetWindowMonitor() erzwingt einen Neuaufbau des + // Fullscreen-States und setzt die Position auf den Monitor-Origin zurück. private void fixFullscreenMonitor() { if (!(context instanceof LwjglWindow)) { log.warn("[Grafik] Kein LwjglWindow-Kontext, Vollbild-Fix übersprungen"); @@ -526,22 +528,21 @@ public class BlightGame extends SimpleApplication { } } - if (currentMonitor == target) { - // Bereits korrekt im Vollbild auf dem richtigen Monitor – kein Monitor-Wechsel, - // da glfwSetWindowMonitor sonst den OverrideRedirect-Zustand stören kann. - log.info("[Grafik] Fenster ist bereits Vollbild auf dem Ziel-Monitor – nur Fokus setzen"); - GLFW.glfwFocusWindow(win); - return; - } - - // Falscher Monitor oder fensterbasierter Modus → Vollbild erzwingen GLFWVidMode vm = GLFW.glfwGetVideoMode(target); if (vm == null) { log.warn("[Grafik] Kein VideoMode für Ziel-Monitor"); return; } - log.info("[Grafik] Setze Vollbild: {}×{}@{}Hz (war: Monitor-Handle={})", - vm.width(), vm.height(), vm.refreshRate(), currentMonitor); + + // Windowed → Fullscreen Toggle: + // JME3 erstellt das Fenster sofort sichtbar; Cinnamon setzt Y+32 (Panel-Offset) + // bevor _NET_WM_STATE_FULLSCREEN vollständig verarbeitet ist. + // Kurz in den Fenstermodus wechseln und zurück → WM verarbeitet den + // State neu und setzt Y korrekt auf Monitor-Origin. + log.info("[Grafik] Vollbild-Fix: Toggle Fenstermodus → Vollbild auf Monitor {} ({}×{}@{}Hz)", + target, vm.width(), vm.height(), vm.refreshRate()); + GLFW.glfwSetWindowMonitor(win, 0L, awt.x, awt.y, vm.width(), vm.height(), 0); + GLFW.glfwWaitEventsTimeout(0.1); GLFW.glfwSetWindowMonitor(win, target, 0, 0, vm.width(), vm.height(), vm.refreshRate()); GLFW.glfwFocusWindow(win); diff --git a/blight-game/src/main/java/de/blight/game/animation/AnimationLibrary.java b/blight-game/src/main/java/de/blight/game/animation/AnimationLibrary.java index e8b3de3..9dba1c8 100644 --- a/blight-game/src/main/java/de/blight/game/animation/AnimationLibrary.java +++ b/blight-game/src/main/java/de/blight/game/animation/AnimationLibrary.java @@ -27,7 +27,8 @@ public class AnimationLibrary extends BaseAppState { private static final Logger log = LoggerFactory.getLogger(AnimationLibrary.class); private static final String[] ASSET_BASES = { - "blight-assets/src/main/resources", + "blight-assets/src/main/resources", // CWD = Projekt-Root (Editor-Subprocess) + "../blight-assets/src/main/resources", // CWD = blight-game/ (Direktstart) "assets", ".", }; diff --git a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java index 810adf0..dc8ae37 100644 --- a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java +++ b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java @@ -565,9 +565,12 @@ public class WorldScene extends BaseAppState { private static final String[] MODEL_SAVE_ROOTS = { - "blight-assets/src/main/resources", + "blight-assets/src/main/resources", // CWD = Projekt-Root (Editor-Subprocess) + "../blight-assets/src/main/resources", // CWD = blight-game/ (Direktstart) "blight-assets/bin/main", + "../blight-assets/bin/main", "blight-assets/build/resources/main", + "../blight-assets/build/resources/main", "assets", };