From 218ea6ce4798dc02f75a62cab676dd862ba53165 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 21 Aug 2022 17:24:50 +0200 Subject: [PATCH] Linux: fixed double-click on title bar to maximize/restore (issue #482) --- .../com/formdev/flatlaf/ui/FlatTitlePane.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java index d07079715..01ed07f94 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java @@ -32,6 +32,7 @@ import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; @@ -1167,6 +1168,7 @@ public void windowStateChanged( WindowEvent e ) { private Point dragOffset; private boolean nativeMove; + private long lastSingleClickWhen; @Override public void mouseClicked( MouseEvent e ) { @@ -1209,22 +1211,33 @@ public void mousePressed( MouseEvent e ) { // on Linux, move or maximize/restore window if( SystemInfo.isLinux && FlatNativeLinuxLibrary.isWMUtilsSupported( window ) ) { - switch( e.getClickCount() ) { + // double-click is not always recognized in Java when using _NET_WM_MOVERESIZE message + int clickCount = e.getClickCount(); + if( clickCount == 1 && (e.getWhen() - lastSingleClickWhen) <= getMultiClickInterval() ) + clickCount = 2; + + switch( clickCount ) { case 1: - // move window via _NET_WM_MOVERESIZE event + // move window via _NET_WM_MOVERESIZE message e.consume(); nativeMove = FlatNativeLinuxLibrary.moveOrResizeWindow( window, e, FlatNativeLinuxLibrary.MOVE ); + lastSingleClickWhen = e.getWhen(); break; case 2: // maximize/restore on double-click - // also done here because no mouse clicked event is sent when using _NET_WM_MOVERESIZE event + // also done here because no mouse clicked event is sent when using _NET_WM_MOVERESIZE message maximizeOrRestore(); break; } } } + private int getMultiClickInterval() { + Object value = Toolkit.getDefaultToolkit().getDesktopProperty( "awt.multiClickInterval" ); + return (value instanceof Integer) ? (Integer) value : 200; + } + @Override public void mouseReleased( MouseEvent e ) {} @Override public void mouseEntered( MouseEvent e ) {} @Override public void mouseExited( MouseEvent e ) {}