From 30881d7077fd01e6b3b654cfadf216b6cc84b615 Mon Sep 17 00:00:00 2001 From: neveler <55753029+neveler@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:51:57 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=8B=96=E5=8A=A8=E6=A0=87=E9=A2=98=E6=A0=8F=E9=80=80=E5=87=BA?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java index 68fd45c9e2..10369c0261 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java @@ -101,7 +101,7 @@ public DecoratorSkin(Decorator control) { // https://github.com/HMCL-dev/HMCL/issues/4290 if (OperatingSystem.CURRENT_OS != OperatingSystem.MACOS) { onWindowsStatusChange = observable -> { - if (primaryStage.isIconified() || primaryStage.isFullScreen() || primaryStage.isMaximized()) { + if (primaryStage.isIconified() || primaryStage.isFullScreen()) { root.removeEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); root.removeEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.removeEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); @@ -446,6 +446,11 @@ private void onMouseDragged(MouseEvent mouseEvent) { stageInitHeight = primaryStage.getHeight(); } + if (primaryStage.isMaximized()) { + primaryStage.setMaximized(false); + mouseInitX = primaryStage.getWidth() / 2; + } + if (primaryStage.isFullScreen() || !mouseEvent.isPrimaryButtonDown() || mouseEvent.isStillSincePress()) return; From 42006934f0280a41529e43e6364cc6f84895a185 Mon Sep 17 00:00:00 2001 From: neveler <55753029+neveler@users.noreply.github.com> Date: Sat, 10 Jan 2026 20:32:36 +0800 Subject: [PATCH 2/4] update --- .../hmcl/ui/decorator/DecoratorSkin.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java index 10369c0261..6a31ad4f70 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java @@ -101,7 +101,7 @@ public DecoratorSkin(Decorator control) { // https://github.com/HMCL-dev/HMCL/issues/4290 if (OperatingSystem.CURRENT_OS != OperatingSystem.MACOS) { onWindowsStatusChange = observable -> { - if (primaryStage.isIconified() || primaryStage.isFullScreen()) { + if (primaryStage.isIconified() || primaryStage.isFullScreen() || primaryStage.isMaximized()) { root.removeEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); root.removeEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.removeEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); @@ -328,6 +328,15 @@ private Node createNavBar(Decorator skinnable, double leftPaneWidth, boolean can } if (onTitleBarDoubleClick != null) center.setOnMouseClicked(onTitleBarDoubleClick); + center.setOnMouseDragged(mouseEvent -> { + if (primaryStage.isMaximized()) { + primaryStage.setMaximized(false); + getSkinnable().setDragging(true); + primaryStage.setX(mouseEvent.getScreenX() - (primaryStage.getWidth() / 2)); + primaryStage.setY(mouseEvent.getScreenY()); + mouseEvent.consume(); + } + }); navBar.setCenter(center); if (canRefresh) { @@ -446,11 +455,6 @@ private void onMouseDragged(MouseEvent mouseEvent) { stageInitHeight = primaryStage.getHeight(); } - if (primaryStage.isMaximized()) { - primaryStage.setMaximized(false); - mouseInitX = primaryStage.getWidth() / 2; - } - if (primaryStage.isFullScreen() || !mouseEvent.isPrimaryButtonDown() || mouseEvent.isStillSincePress()) return; From 7e31bddcc2da4cb081967a01e729200920cdae48 Mon Sep 17 00:00:00 2001 From: neveler <55753029+neveler@users.noreply.github.com> Date: Sat, 10 Jan 2026 21:40:46 +0800 Subject: [PATCH 3/4] update --- .../hmcl/ui/decorator/DecoratorSkin.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java index 6a31ad4f70..49fee9bc64 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java @@ -95,7 +95,6 @@ public DecoratorSkin(Decorator control) { skinnable.getSnackbar().registerSnackbarContainer(parent); EventHandler onMouseReleased = this::onMouseReleased; - EventHandler onMouseDragged = this::onMouseDragged; EventHandler onMouseMoved = this::onMouseMoved; // https://github.com/HMCL-dev/HMCL/issues/4290 @@ -103,11 +102,9 @@ public DecoratorSkin(Decorator control) { onWindowsStatusChange = observable -> { if (primaryStage.isIconified() || primaryStage.isFullScreen() || primaryStage.isMaximized()) { root.removeEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); - root.removeEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.removeEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); } else { root.addEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); - root.addEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.addEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); } }; @@ -126,7 +123,6 @@ public DecoratorSkin(Decorator control) { onWindowsStatusChange = null; onTitleBarDoubleClick = null; root.addEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); - root.addEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.addEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); } @@ -328,15 +324,7 @@ private Node createNavBar(Decorator skinnable, double leftPaneWidth, boolean can } if (onTitleBarDoubleClick != null) center.setOnMouseClicked(onTitleBarDoubleClick); - center.setOnMouseDragged(mouseEvent -> { - if (primaryStage.isMaximized()) { - primaryStage.setMaximized(false); - getSkinnable().setDragging(true); - primaryStage.setX(mouseEvent.getScreenX() - (primaryStage.getWidth() / 2)); - primaryStage.setY(mouseEvent.getScreenY()); - mouseEvent.consume(); - } - }); + center.setOnMouseDragged(this::onTitleBarDragged); navBar.setCenter(center); if (canRefresh) { @@ -444,11 +432,17 @@ private void onMouseReleased(MouseEvent mouseEvent) { getSkinnable().setDragging(false); } - private void onMouseDragged(MouseEvent mouseEvent) { + private void onTitleBarDragged(MouseEvent mouseEvent) { + if (primaryStage.isFullScreen()) return; if (!getSkinnable().isDragging()) { getSkinnable().setDragging(true); mouseInitX = mouseEvent.getScreenX(); mouseInitY = mouseEvent.getScreenY(); + if (primaryStage.isMaximized()) { + primaryStage.setMaximized(false); + primaryStage.setX(mouseInitX - primaryStage.getWidth() / 2); + primaryStage.setY(0); + } stageInitX = primaryStage.getX(); stageInitY = primaryStage.getY(); stageInitWidth = primaryStage.getWidth(); From 57fa81bbeec01799252027322002134f9a75d829 Mon Sep 17 00:00:00 2001 From: neveler <55753029+neveler@users.noreply.github.com> Date: Mon, 12 Jan 2026 21:39:57 +0800 Subject: [PATCH 4/4] update --- .../hmcl/ui/decorator/DecoratorSkin.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java index 49fee9bc64..6c6a824b89 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java @@ -95,6 +95,7 @@ public DecoratorSkin(Decorator control) { skinnable.getSnackbar().registerSnackbarContainer(parent); EventHandler onMouseReleased = this::onMouseReleased; + EventHandler onMouseDragged = this::onMouseDragged; EventHandler onMouseMoved = this::onMouseMoved; // https://github.com/HMCL-dev/HMCL/issues/4290 @@ -102,9 +103,11 @@ public DecoratorSkin(Decorator control) { onWindowsStatusChange = observable -> { if (primaryStage.isIconified() || primaryStage.isFullScreen() || primaryStage.isMaximized()) { root.removeEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); + root.removeEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.removeEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); } else { root.addEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); + root.addEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.addEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); } }; @@ -123,6 +126,7 @@ public DecoratorSkin(Decorator control) { onWindowsStatusChange = null; onTitleBarDoubleClick = null; root.addEventFilter(MouseEvent.MOUSE_RELEASED, onMouseReleased); + root.addEventFilter(MouseEvent.MOUSE_DRAGGED, onMouseDragged); root.addEventFilter(MouseEvent.MOUSE_MOVED, onMouseMoved); } @@ -324,7 +328,18 @@ private Node createNavBar(Decorator skinnable, double leftPaneWidth, boolean can } if (onTitleBarDoubleClick != null) center.setOnMouseClicked(onTitleBarDoubleClick); - center.setOnMouseDragged(this::onTitleBarDragged); + center.setOnMouseDragged(mouseEvent -> { + if (!getSkinnable().isDragging() && primaryStage.isMaximized()) { + getSkinnable().setDragging(true); + mouseInitX = mouseEvent.getScreenX(); + mouseInitY = mouseEvent.getScreenY(); + primaryStage.setMaximized(false); + stageInitWidth = primaryStage.getWidth(); + stageInitHeight = primaryStage.getHeight(); + primaryStage.setY(stageInitY = 0); + primaryStage.setX(stageInitX = mouseInitX - stageInitWidth / 2); + } + }); navBar.setCenter(center); if (canRefresh) { @@ -432,17 +447,11 @@ private void onMouseReleased(MouseEvent mouseEvent) { getSkinnable().setDragging(false); } - private void onTitleBarDragged(MouseEvent mouseEvent) { - if (primaryStage.isFullScreen()) return; + private void onMouseDragged(MouseEvent mouseEvent) { if (!getSkinnable().isDragging()) { getSkinnable().setDragging(true); mouseInitX = mouseEvent.getScreenX(); mouseInitY = mouseEvent.getScreenY(); - if (primaryStage.isMaximized()) { - primaryStage.setMaximized(false); - primaryStage.setX(mouseInitX - primaryStage.getWidth() / 2); - primaryStage.setY(0); - } stageInitX = primaryStage.getX(); stageInitY = primaryStage.getY(); stageInitWidth = primaryStage.getWidth();