From 20b144fb6a2ece218822728addeeffacccd47c61 Mon Sep 17 00:00:00 2001 From: sami Date: Mon, 14 Apr 2025 10:14:56 +0200 Subject: [PATCH] Window decorations: added events to move or resize window --- .../ui/FlatWindowsNativeWindowBorder.java | 24 ++++++++++++++++--- .../src/main/cpp/FlatWndProc.cpp | 15 +++++++++++- .../src/main/cpp/FlatWndProc.h | 2 ++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java index a40140018..311450204 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java @@ -31,9 +31,7 @@ import java.util.IdentityHashMap; import java.util.Map; import java.util.function.Predicate; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.Timer; +import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; @@ -80,6 +78,7 @@ class FlatWindowsNativeWindowBorder private boolean colorizationColorAffectsBorders; private Color colorizationColor; private int colorizationColorBalance; + private boolean isMovingOrSizing; private static FlatWindowsNativeWindowBorder instance; @@ -223,6 +222,19 @@ private void updateColorization() { colorizationColorBalance = registryGetIntValue( subKey, "ColorizationColorBalance", -1 ); } + protected void updateIsMovingOrSizingValue( boolean isMovingOrSizing ) { + boolean oldValue = this.isMovingOrSizing; + this.isMovingOrSizing = isMovingOrSizing; + + if(oldValue != isMovingOrSizing){ + fireStateChanged(); + } + } + + public boolean isMovingOrSizing() { + return isMovingOrSizing; + } + private native static int registryGetIntValue( String key, String valueName, int defaultValue ); @Override @@ -435,5 +447,11 @@ private boolean isFullscreen() { private void fireStateChangedLaterOnce() { FlatWindowsNativeWindowBorder.this.fireStateChangedLaterOnce(); } + + private void setIsMovingOrSizing( boolean isMovingOrSizing ) { + EventQueue.invokeLater(() -> + FlatWindowsNativeWindowBorder.this.updateIsMovingOrSizingValue( isMovingOrSizing ) + ); + } } } diff --git a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp index d45f758a8..f738ac69d 100644 --- a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp +++ b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp @@ -75,6 +75,7 @@ int FlatWndProc::initialized = 0; jmethodID FlatWndProc::onNcHitTestMID; jmethodID FlatWndProc::isFullscreenMID; jmethodID FlatWndProc::fireStateChangedLaterOnceMID; +jmethodID FlatWndProc::setIsMovingOrSizingMID; HWNDMap* FlatWndProc::hwndMap; DWORD FlatWndProc::osBuildNumber = 0; @@ -175,11 +176,13 @@ void FlatWndProc::initIDs( JNIEnv *env, jobject obj ) { onNcHitTestMID = env->GetMethodID( cls, "onNcHitTest", "(IIZ)I" ); isFullscreenMID = env->GetMethodID( cls, "isFullscreen", "()Z" ); fireStateChangedLaterOnceMID = env->GetMethodID( cls, "fireStateChangedLaterOnce", "()V" ); + setIsMovingOrSizingMID = env->GetMethodID( cls, "setIsMovingOrSizing", "(Z)V" ); // check whether all IDs were found if( onNcHitTestMID != NULL && isFullscreenMID != NULL && - fireStateChangedLaterOnceMID != NULL ) + fireStateChangedLaterOnceMID != NULL && + setIsMovingOrSizingMID != NULL ) initialized = 1; } @@ -276,10 +279,12 @@ LRESULT CALLBACK FlatWndProc::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, L case WM_ENTERSIZEMOVE: isMovingOrSizing = true; + setIsMovingOrSizing ( true ); break; case WM_EXITSIZEMOVE: isMovingOrSizing = isMoving = false; + setIsMovingOrSizing ( false ); break; case WM_MOVE: @@ -522,6 +527,14 @@ void FlatWndProc::fireStateChangedLaterOnce() { env->CallVoidMethod( obj, fireStateChangedLaterOnceMID ); } +void FlatWndProc::setIsMovingOrSizing( boolean isMovingOrSizing ) { + JNIEnv* env = getEnv(); + if( env == NULL ) + return; + + env->CallIntMethod( obj, setIsMovingOrSizingMID, (jboolean) isMovingOrSizing ); +} + // similar to JNU_GetEnv() in jni_util.c JNIEnv* FlatWndProc::getEnv() { if( env != NULL ) diff --git a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h index a5870f94d..8e70218a9 100644 --- a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h +++ b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h @@ -33,6 +33,7 @@ class FlatWndProc static jmethodID onNcHitTestMID; static jmethodID isFullscreenMID; static jmethodID fireStateChangedLaterOnceMID; + static jmethodID setIsMovingOrSizingMID; static HWNDMap* hwndMap; static DWORD osBuildNumber; @@ -63,6 +64,7 @@ class FlatWndProc BOOL isFullscreen(); int onNcHitTest( int x, int y, boolean isOnResizeBorder ); void fireStateChangedLaterOnce(); + void setIsMovingOrSizing( boolean isMovingOrSizing ); JNIEnv* getEnv(); void sendMessageToClientArea( HWND hwnd, int uMsg, LPARAM lParam );