mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-07 22:40:53 +03:00
Window decorations: fixed black line sometimes painted on top of (native) window border on Windows 11 (issue #852)
Windows binaries built and signed locally in clean workspace
This commit is contained in:
@@ -31,6 +31,8 @@ FlatLaf Change Log
|
|||||||
updated when table width changed and was painted on wrong side in
|
updated when table width changed and was painted on wrong side in
|
||||||
right-to-left component orientation).
|
right-to-left component orientation).
|
||||||
- Theme Editor: Fixed occasional empty window on startup on macOS.
|
- Theme Editor: Fixed occasional empty window on startup on macOS.
|
||||||
|
- FlatLaf window decorations: Fixed black line sometimes painted on top of
|
||||||
|
(native) window border on Windows 11. (issue #852)
|
||||||
|
|
||||||
#### Incompatibilities
|
#### Incompatibilities
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -60,8 +60,11 @@ import com.sun.jna.platform.win32.WinDef.LRESULT;
|
|||||||
import com.sun.jna.platform.win32.WinDef.RECT;
|
import com.sun.jna.platform.win32.WinDef.RECT;
|
||||||
import com.sun.jna.platform.win32.WinDef.UINT_PTR;
|
import com.sun.jna.platform.win32.WinDef.UINT_PTR;
|
||||||
import com.sun.jna.platform.win32.WinDef.WPARAM;
|
import com.sun.jna.platform.win32.WinDef.WPARAM;
|
||||||
|
import com.sun.jna.platform.win32.WinError;
|
||||||
import com.sun.jna.platform.win32.WinUser.HMONITOR;
|
import com.sun.jna.platform.win32.WinUser.HMONITOR;
|
||||||
import com.sun.jna.platform.win32.WinUser.WindowProc;
|
import com.sun.jna.platform.win32.WinUser.WindowProc;
|
||||||
|
import com.sun.jna.ptr.IntByReference;
|
||||||
|
import com.sun.jna.win32.StdCallLibrary;
|
||||||
import com.sun.jna.win32.W32APIOptions;
|
import com.sun.jna.win32.W32APIOptions;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -615,6 +618,14 @@ public class FlatWindowsNativeWindowBorder
|
|||||||
if( hasAutohideTaskbar( ABE_RIGHT, monitorInfo.rcMonitor ) )
|
if( hasAutohideTaskbar( ABE_RIGHT, monitorInfo.rcMonitor ) )
|
||||||
params.rgrc[0].right--;
|
params.rgrc[0].right--;
|
||||||
}
|
}
|
||||||
|
} else if( SystemInfo.isWindows_11_orLater ) {
|
||||||
|
// For Windows 11, add border thickness to top, which is necessary to make the whole Java area visible.
|
||||||
|
// This also avoids that a black line is sometimes painted on top window border.
|
||||||
|
// Note: Do not increase top on Windows 10 because this would not hide Windows title bar.
|
||||||
|
IntByReference borderThickness = new IntByReference();
|
||||||
|
if( DWMApi.INSTANCE.DwmGetWindowAttribute( hwnd, DWMApi.DWMWA_VISIBLE_FRAME_BORDER_THICKNESS,
|
||||||
|
borderThickness.getPointer(), 4 ) == WinError.S_OK.intValue() )
|
||||||
|
params.rgrc[0].top += borderThickness.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
// write changed params back to native memory
|
// write changed params back to native memory
|
||||||
@@ -898,6 +909,18 @@ public class FlatWindowsNativeWindowBorder
|
|||||||
HBRUSH CreateSolidBrush( DWORD color );
|
HBRUSH CreateSolidBrush( DWORD color );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---- interface DWMApi ---------------------------------------------------
|
||||||
|
|
||||||
|
private interface DWMApi
|
||||||
|
extends StdCallLibrary
|
||||||
|
{
|
||||||
|
DWMApi INSTANCE = Native.load( "dwmapi", DWMApi.class, W32APIOptions.DEFAULT_OPTIONS );
|
||||||
|
|
||||||
|
int DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37;
|
||||||
|
|
||||||
|
int DwmGetWindowAttribute( HWND hwnd, int dwAttribute, Pointer pvAttribute, int cbAttribute );
|
||||||
|
}
|
||||||
|
|
||||||
//---- class NCCALCSIZE_PARAMS --------------------------------------------
|
//---- class NCCALCSIZE_PARAMS --------------------------------------------
|
||||||
|
|
||||||
@FieldOrder( { "rgrc" } )
|
@FieldOrder( { "rgrc" } )
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
#include <dwmapi.h>
|
||||||
#include <jawt.h>
|
#include <jawt.h>
|
||||||
#include <jawt_md.h>
|
#include <jawt_md.h>
|
||||||
#include "FlatWndProc.h"
|
#include "FlatWndProc.h"
|
||||||
@@ -76,6 +77,7 @@ jmethodID FlatWndProc::isFullscreenMID;
|
|||||||
jmethodID FlatWndProc::fireStateChangedLaterOnceMID;
|
jmethodID FlatWndProc::fireStateChangedLaterOnceMID;
|
||||||
|
|
||||||
HWNDMap* FlatWndProc::hwndMap;
|
HWNDMap* FlatWndProc::hwndMap;
|
||||||
|
DWORD FlatWndProc::osBuildNumber = 0;
|
||||||
|
|
||||||
#define java_awt_Frame_ICONIFIED 1
|
#define java_awt_Frame_ICONIFIED 1
|
||||||
#define java_awt_Frame_MAXIMIZED_BOTH (4 | 2)
|
#define java_awt_Frame_MAXIMIZED_BOTH (4 | 2)
|
||||||
@@ -107,6 +109,14 @@ HWND FlatWndProc::install( JNIEnv *env, jobject obj, jobject window ) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get OS build number
|
||||||
|
if( osBuildNumber == 0 ) {
|
||||||
|
OSVERSIONINFO info;
|
||||||
|
info.dwOSVersionInfoSize = sizeof( info );
|
||||||
|
if( ::GetVersionEx( &info ) )
|
||||||
|
osBuildNumber = info.dwBuildNumber;
|
||||||
|
}
|
||||||
|
|
||||||
// get window handle
|
// get window handle
|
||||||
HWND hwnd = getWindowHandle( env, window );
|
HWND hwnd = getWindowHandle( env, window );
|
||||||
if( hwnd == NULL || hwndMap->get( hwnd ) != NULL )
|
if( hwnd == NULL || hwndMap->get( hwnd ) != NULL )
|
||||||
@@ -391,6 +401,13 @@ LRESULT FlatWndProc::WmNcCalcSize( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lP
|
|||||||
if( hasAutohideTaskbar( ABE_RIGHT, monitorInfo.rcMonitor ) )
|
if( hasAutohideTaskbar( ABE_RIGHT, monitorInfo.rcMonitor ) )
|
||||||
params->rgrc[0].right--;
|
params->rgrc[0].right--;
|
||||||
}
|
}
|
||||||
|
} else if( osBuildNumber >= 22000 ) {
|
||||||
|
// For Windows 11, add border thickness to top, which is necessary to make the whole Java area visible.
|
||||||
|
// This also avoids that a black line is sometimes painted on top window border.
|
||||||
|
// Note: Do not increase top on Windows 10 because this would not hide Windows title bar.
|
||||||
|
UINT borderThickness = 0;
|
||||||
|
if( ::DwmGetWindowAttribute( hwnd, DWMWA_VISIBLE_FRAME_BORDER_THICKNESS, &borderThickness, sizeof( borderThickness ) ) == S_OK )
|
||||||
|
params->rgrc[0].top += borderThickness;
|
||||||
}
|
}
|
||||||
|
|
||||||
return lResult;
|
return lResult;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ private:
|
|||||||
static jmethodID fireStateChangedLaterOnceMID;
|
static jmethodID fireStateChangedLaterOnceMID;
|
||||||
|
|
||||||
static HWNDMap* hwndMap;
|
static HWNDMap* hwndMap;
|
||||||
|
static DWORD osBuildNumber;
|
||||||
|
|
||||||
JavaVM* jvm;
|
JavaVM* jvm;
|
||||||
JNIEnv* env; // attached to AWT-Windows/Win32 thread
|
JNIEnv* env; // attached to AWT-Windows/Win32 thread
|
||||||
|
|||||||
Reference in New Issue
Block a user