diff --git a/CHANGELOG.md b/CHANGELOG.md index e9f7302e..0f61fd80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,8 @@ FlatLaf Change Log in FlatLaf 1.x). (issue #454) - Native window decorations: Fixed blurry iconify/maximize/close button hover rectangles at 125%, 150% or 175% scaling. (issue #431) - +- Native window decorations: Updated maximize and restore icons for Windows 11 + style. (requires Java 8u321, 11.0.14, 17.0.2 or 18+) ## 2.0-rc1 diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java index f4bdc5ca..d20ef27d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java @@ -24,6 +24,7 @@ import java.awt.geom.Line2D; import java.awt.geom.Path2D; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.util.SystemInfo; /** * "close" icon for windows (frames and dialogs). @@ -54,7 +55,7 @@ public class FlatWindowCloseIcon int iy = y + ((height - iwh) / 2); int ix2 = ix + iwh - 1; int iy2 = iy + iwh - 1; - int thickness = (int) scaleFactor; + float thickness = SystemInfo.isWindows_11_orLater ? (float) scaleFactor : (int) scaleFactor; Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); path.append( new Line2D.Float( ix, iy, ix2, iy2 ), false ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowMaximizeIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowMaximizeIcon.java index 5035d43d..85016c18 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowMaximizeIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowMaximizeIcon.java @@ -18,6 +18,7 @@ package com.formdev.flatlaf.icons; import java.awt.Graphics2D; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.SystemInfo; /** * "maximize" icon for windows (frames and dialogs). @@ -35,8 +36,11 @@ public class FlatWindowMaximizeIcon int iwh = (int) (10 * scaleFactor); int ix = x + ((width - iwh) / 2); int iy = y + ((height - iwh) / 2); - int thickness = (int) scaleFactor; + float thickness = SystemInfo.isWindows_11_orLater ? (float) scaleFactor : (int) scaleFactor; + int arc = Math.max( (int) (1.5 * scaleFactor), 2 ); - g.fill( FlatUIUtils.createRectangle( ix, iy, iwh, iwh, thickness ) ); + g.fill( SystemInfo.isWindows_11_orLater + ? FlatUIUtils.createRoundRectangle( ix, iy, iwh, iwh, thickness, arc, arc, arc, arc ) + : FlatUIUtils.createRectangle( ix, iy, iwh, iwh, thickness ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowRestoreIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowRestoreIcon.java index b62087ef..c4407e90 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowRestoreIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowRestoreIcon.java @@ -21,6 +21,7 @@ import java.awt.geom.Area; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.SystemInfo; /** * "restore" icon for windows (frames and dialogs). @@ -38,18 +39,33 @@ public class FlatWindowRestoreIcon int iwh = (int) (10 * scaleFactor); int ix = x + ((width - iwh) / 2); int iy = y + ((height - iwh) / 2); - int thickness = (int) scaleFactor; + float thickness = SystemInfo.isWindows_11_orLater ? (float) scaleFactor : (int) scaleFactor; + int arc = Math.max( (int) (1.5 * scaleFactor), 2 ); + int arcOuter = (int) (arc + (1.5 * scaleFactor)); int rwh = (int) (8 * scaleFactor); int ro2 = iwh - rwh; - Path2D r1 = FlatUIUtils.createRectangle( ix + ro2, iy, rwh, rwh, thickness ); - Path2D r2 = FlatUIUtils.createRectangle( ix, iy + ro2, rwh, rwh, thickness ); + // upper-right rectangle + Path2D r1 = SystemInfo.isWindows_11_orLater + ? FlatUIUtils.createRoundRectangle( ix + ro2, iy, rwh, rwh, thickness, arc, arcOuter, arc, arc ) + : FlatUIUtils.createRectangle( ix + ro2, iy, rwh, rwh, thickness ); + // lower-left rectangle + Path2D r2 = SystemInfo.isWindows_11_orLater + ? FlatUIUtils.createRoundRectangle( ix, iy + ro2, rwh, rwh, thickness, arc, arc, arc, arc ) + : FlatUIUtils.createRectangle( ix, iy + ro2, rwh, rwh, thickness ); + + // paint upper-right rectangle Area area = new Area( r1 ); - area.subtract( new Area( new Rectangle2D.Float( ix, iy + ro2, rwh, rwh ) ) ); + if( SystemInfo.isWindows_11_orLater ) { + area.subtract( new Area( new Rectangle2D.Float( ix, (float) (iy + scaleFactor), rwh, rwh ) ) ); + area.subtract( new Area( new Rectangle2D.Float( (float) (ix + scaleFactor), iy + ro2, rwh, rwh ) ) ); + } else + area.subtract( new Area( new Rectangle2D.Float( ix, iy + ro2, rwh, rwh ) ) ); g.fill( area ); + // paint lower-left rectangle g.fill( r2 ); } } diff --git a/flatlaf-testing/Windows 11 decorations.png b/flatlaf-testing/Windows 11 decorations.png new file mode 100644 index 00000000..dbc6f878 Binary files /dev/null and b/flatlaf-testing/Windows 11 decorations.png differ