diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java index 5af27b6a60..e22f32ae9c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java @@ -72,6 +72,8 @@ public class CrashWindow extends Stage { FXUtils.setIcon(this); setTitle(i18n("message.error")); + FXUtils.addMacOSCloseWindowHandler(this, null); + setOnCloseRequest(e -> javafx.application.Platform.exit()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index 90a2c3111b..5b77263a38 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -58,9 +58,7 @@ import javafx.scene.paint.Paint; import javafx.scene.shape.Rectangle; import javafx.scene.text.Text; import javafx.scene.text.TextFlow; -import javafx.stage.FileChooser; -import javafx.stage.Screen; -import javafx.stage.Stage; +import javafx.stage.*; import javafx.util.Duration; import javafx.util.StringConverter; import org.glavo.url.WebURL; @@ -109,10 +107,7 @@ import java.nio.file.Path; import java.nio.file.PathMatcher; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.ToIntFunction; +import java.util.function.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -1200,6 +1195,18 @@ public final class FXUtils { }); } + public static void addMacOSCloseWindowHandler(Window window, @Nullable Supplier restriction) { + window.addEventHandler(KeyEvent.KEY_PRESSED, event -> { + if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS + && event.isMetaDown() + && event.getCode() == KeyCode.W + && (restriction == null || restriction.get())) { + window.fireEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSE_REQUEST)); + event.consume(); + } + }); + } + public static N prepareNode(N node) { Scene dummyScene = new Scene(node); StyleSheets.init(dummyScene); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index bcd117dbb3..380357070c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -114,6 +114,8 @@ public class GameCrashWindow extends Stage { setTitle(i18n("game.crash.title")); FXUtils.setIcon(this); + FXUtils.addMacOSCloseWindowHandler(this, null); + analyzeCrashReport(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java index 1a382e04c7..6ac9d2daf2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -100,6 +100,8 @@ public final class LogWindow extends Stage { } this.gameProcess = gameProcess; + + FXUtils.addMacOSCloseWindowHandler(this, () -> !gameProcess.isRunning()); } public void logLine(Log log) {