Fix problems with window resizing in Linux

This commit is contained in:
Haowei Wen 2025-01-04 00:34:48 +08:00
parent b5cea83a8a
commit 56d20a5d08

View File

@ -48,8 +48,7 @@ public class DecoratorSkin extends SkinBase<Decorator> {
private final Stage primaryStage; private final Stage primaryStage;
private final TransitionPane navBarPane; private final TransitionPane navBarPane;
private double xOffset, yOffset, newX, newY, initX, initY; private double mouseInitX, mouseInitY, stageInitX, stageInitY, stageInitWidth, stageInitHeight;
private boolean titleBarTransparent = true;
/** /**
* Constructor for all SkinBase instances. * Constructor for all SkinBase instances.
@ -299,13 +298,6 @@ public class DecoratorSkin extends SkinBase<Decorator> {
return navBar; return navBar;
} }
private void updateInitMouseValues(MouseEvent mouseEvent) {
initX = mouseEvent.getScreenX();
initY = mouseEvent.getScreenY();
xOffset = mouseEvent.getSceneX();
yOffset = mouseEvent.getSceneY();
}
private boolean isRightEdge(double x, double y, Bounds boundsInParent) { private boolean isRightEdge(double x, double y, Bounds boundsInParent) {
return x < root.getWidth() && x >= root.getWidth() - root.snappedLeftInset(); return x < root.getWidth() && x >= root.getWidth() - root.snappedLeftInset();
} }
@ -322,46 +314,28 @@ public class DecoratorSkin extends SkinBase<Decorator> {
return x >= 0 && x <= root.snappedLeftInset(); return x >= 0 && x <= root.snappedLeftInset();
} }
private boolean setStageWidth(double width) { private void resizeStage(double newWidth, double newHeight) {
if (width >= primaryStage.getMinWidth() && width >= titleContainer.getMinWidth()) { if (newWidth < 0)
// Workaround for JDK-8344372 (https://github.com/openjdk/jfx/pull/1654) newWidth = primaryStage.getWidth();
// Width and height must be set simultaneously to avoid the bug if (newWidth < primaryStage.getMinWidth())
primaryStage.setWidth(width); newWidth = primaryStage.getMinWidth();
primaryStage.setHeight(primaryStage.getHeight()); if (newWidth < titleContainer.getMinWidth())
initX = newX; newWidth = titleContainer.getMinWidth();
return true;
} else { if (newHeight < 0)
if (width >= primaryStage.getMinWidth() && width <= titleContainer.getMinWidth()) { newHeight = primaryStage.getHeight();
primaryStage.setWidth(titleContainer.getMinWidth()); if (newHeight < primaryStage.getMinHeight())
primaryStage.setHeight(primaryStage.getHeight()); newHeight = primaryStage.getMinHeight();
if (newHeight < titleContainer.getMinHeight())
newHeight = titleContainer.getMinHeight();
// Width and height must be set simultaneously to avoid JDK-8344372 (https://github.com/openjdk/jfx/pull/1654)
primaryStage.setWidth(newWidth);
primaryStage.setHeight(newHeight);
} }
return false; private void onMouseMoved(MouseEvent mouseEvent) {
} if (!primaryStage.isFullScreen() && primaryStage.isResizable()) {
}
private boolean setStageHeight(double height) {
if (height >= primaryStage.getMinHeight() && height >= titleContainer.getHeight()) {
primaryStage.setHeight(height);
primaryStage.setWidth(primaryStage.getWidth());
initY = newY;
return true;
} else {
if (height >= primaryStage.getMinHeight() && height <= titleContainer.getHeight()) {
primaryStage.setHeight(titleContainer.getHeight());
primaryStage.setWidth(primaryStage.getWidth());
}
return false;
}
}
// ====
protected void onMouseMoved(MouseEvent mouseEvent) {
if (!primaryStage.isFullScreen()) {
updateInitMouseValues(mouseEvent);
if (primaryStage.isResizable()) {
double x = mouseEvent.getX(), y = mouseEvent.getY(); double x = mouseEvent.getX(), y = mouseEvent.getY();
Bounds boundsInParent = root.getBoundsInParent(); Bounds boundsInParent = root.getBoundsInParent();
double diagonalSize = root.snappedLeftInset() + 10; double diagonalSize = root.snappedLeftInset() + 10;
@ -400,76 +374,79 @@ public class DecoratorSkin extends SkinBase<Decorator> {
} else { } else {
root.setCursor(Cursor.DEFAULT); root.setCursor(Cursor.DEFAULT);
} }
}
} else { } else {
root.setCursor(Cursor.DEFAULT); root.setCursor(Cursor.DEFAULT);
} }
} }
protected void onMouseReleased(MouseEvent mouseEvent) { private void onMouseReleased(MouseEvent mouseEvent) {
getSkinnable().setDragging(false); getSkinnable().setDragging(false);
} }
protected void onMouseDragged(MouseEvent mouseEvent) { private void onMouseDragged(MouseEvent mouseEvent) {
if (!getSkinnable().isDragging()) {
getSkinnable().setDragging(true); getSkinnable().setDragging(true);
if (mouseEvent.isPrimaryButtonDown() && (this.xOffset != -1.0 || this.yOffset != -1.0)) { mouseInitX = mouseEvent.getScreenX();
if (!this.primaryStage.isFullScreen() && !mouseEvent.isStillSincePress()) { mouseInitY = mouseEvent.getScreenY();
this.newX = mouseEvent.getScreenX(); stageInitX = primaryStage.getX();
this.newY = mouseEvent.getScreenY(); stageInitY = primaryStage.getY();
double deltaX = this.newX - this.initX; stageInitWidth = primaryStage.getWidth();
double deltaY = this.newY - this.initY; stageInitHeight = primaryStage.getHeight();
}
if (primaryStage.isFullScreen() || !mouseEvent.isPrimaryButtonDown() || mouseEvent.isStillSincePress())
return;
double dx = mouseEvent.getScreenX() - mouseInitX;
double dy = mouseEvent.getScreenY() - mouseInitY;
Cursor cursor = root.getCursor(); Cursor cursor = root.getCursor();
if (Cursor.E_RESIZE == cursor) { if (getSkinnable().isAllowMove()) {
this.setStageWidth(this.primaryStage.getWidth() + deltaX); if (cursor == Cursor.DEFAULT) {
primaryStage.setX(stageInitX + dx);
primaryStage.setY(stageInitY + dy);
mouseEvent.consume(); mouseEvent.consume();
} else if (Cursor.NE_RESIZE == cursor) { }
if (this.setStageHeight(this.primaryStage.getHeight() - deltaY)) {
this.primaryStage.setY(this.primaryStage.getY() + deltaY);
} }
this.setStageWidth(this.primaryStage.getWidth() + deltaX); if (getSkinnable().isResizable()) {
if (cursor == Cursor.E_RESIZE) {
resizeStage(stageInitWidth + dx, -1);
mouseEvent.consume(); mouseEvent.consume();
} else if (Cursor.SE_RESIZE == cursor) {
this.setStageWidth(this.primaryStage.getWidth() + deltaX);
this.setStageHeight(this.primaryStage.getHeight() + deltaY);
mouseEvent.consume();
} else if (Cursor.S_RESIZE == cursor) {
this.setStageHeight(this.primaryStage.getHeight() + deltaY);
mouseEvent.consume();
} else if (Cursor.W_RESIZE == cursor) {
if (this.setStageWidth(this.primaryStage.getWidth() - deltaX)) {
this.primaryStage.setX(this.primaryStage.getX() + deltaX);
}
} else if (cursor == Cursor.S_RESIZE) {
resizeStage(-1, stageInitHeight + dy);
mouseEvent.consume(); mouseEvent.consume();
} else if (Cursor.SW_RESIZE == cursor) {
if (this.setStageWidth(this.primaryStage.getWidth() - deltaX)) {
this.primaryStage.setX(this.primaryStage.getX() + deltaX);
}
this.setStageHeight(this.primaryStage.getHeight() + deltaY); } else if (cursor == Cursor.W_RESIZE) {
resizeStage(stageInitWidth - dx, -1);
primaryStage.setX(stageInitX + stageInitWidth - primaryStage.getWidth());
mouseEvent.consume(); mouseEvent.consume();
} else if (Cursor.NW_RESIZE == cursor) {
if (this.setStageWidth(this.primaryStage.getWidth() - deltaX)) {
this.primaryStage.setX(this.primaryStage.getX() + deltaX);
}
if (this.setStageHeight(this.primaryStage.getHeight() - deltaY)) { } else if (cursor == Cursor.N_RESIZE) {
this.primaryStage.setY(this.primaryStage.getY() + deltaY); resizeStage(-1, stageInitHeight - dy);
} primaryStage.setY(stageInitY + stageInitHeight - primaryStage.getHeight());
mouseEvent.consume();
} else if (cursor == Cursor.SE_RESIZE) {
resizeStage(stageInitWidth + dx, stageInitHeight + dy);
mouseEvent.consume(); mouseEvent.consume();
} else if (Cursor.N_RESIZE == cursor) {
if (this.setStageHeight(this.primaryStage.getHeight() - deltaY)) {
this.primaryStage.setY(this.primaryStage.getY() + deltaY);
}
} else if (cursor == Cursor.SW_RESIZE) {
resizeStage(stageInitWidth - dx, stageInitHeight + dy);
primaryStage.setX(stageInitX + stageInitWidth - primaryStage.getWidth());
mouseEvent.consume(); mouseEvent.consume();
} else if (getSkinnable().isAllowMove()) {
this.primaryStage.setX(mouseEvent.getScreenX() - this.xOffset); } else if (cursor == Cursor.NW_RESIZE) {
this.primaryStage.setY(mouseEvent.getScreenY() - this.yOffset); resizeStage(stageInitWidth - dx, stageInitHeight - dy);
primaryStage.setX(stageInitX + stageInitWidth - primaryStage.getWidth());
primaryStage.setY(stageInitY + stageInitHeight - primaryStage.getHeight());
mouseEvent.consume();
} else if (cursor == Cursor.NE_RESIZE) {
resizeStage(stageInitWidth + dx, stageInitHeight - dy);
primaryStage.setY(stageInitY + stageInitHeight - primaryStage.getHeight());
mouseEvent.consume(); mouseEvent.consume();
}
} }
} }
} }