Native window decorations: show (system) tooltips for minimize/maximize/close buttons on Windows 10 and for minimize/close buttons on Windows 11 (issues #397 and #407)

This commit is contained in:
Karl Tauber
2021-11-09 18:21:17 +01:00
parent 54e6cefa67
commit fb37be5734
6 changed files with 117 additions and 48 deletions

View File

@@ -235,7 +235,8 @@ public class FlatNativeWindowBorder
} }
static void setTitleBarHeightAndHitTestSpots( Window window, int titleBarHeight, static void setTitleBarHeightAndHitTestSpots( Window window, int titleBarHeight,
List<Rectangle> hitTestSpots, Rectangle appIconBounds, Rectangle maximizeButtonBounds ) List<Rectangle> hitTestSpots, Rectangle appIconBounds, Rectangle minimizeButtonBounds,
Rectangle maximizeButtonBounds, Rectangle closeButtonBounds )
{ {
if( canUseJBRCustomDecorations ) { if( canUseJBRCustomDecorations ) {
JBRCustomDecorations.setTitleBarHeightAndHitTestSpots( window, titleBarHeight, hitTestSpots ); JBRCustomDecorations.setTitleBarHeightAndHitTestSpots( window, titleBarHeight, hitTestSpots );
@@ -245,7 +246,8 @@ public class FlatNativeWindowBorder
if( !isSupported() ) if( !isSupported() )
return; return;
nativeProvider.updateTitleBarInfo( window, titleBarHeight, hitTestSpots, appIconBounds, maximizeButtonBounds ); nativeProvider.updateTitleBarInfo( window, titleBarHeight, hitTestSpots,
appIconBounds, minimizeButtonBounds, maximizeButtonBounds, closeButtonBounds );
} }
static boolean showWindow( Window window, int cmd ) { static boolean showWindow( Window window, int cmd ) {
@@ -266,7 +268,7 @@ public class FlatNativeWindowBorder
try { try {
/* /*
Class<?> cls = Class.forName( "com.formdev.flatlaf.natives.jna.windows.FlatWindowsNativeWindowBorder" ); Class<?> cls = Class.forName( "com.formdev.flatlaf.natives.jna.windows.FlatWindowsNativeWindowBorder" );
Method m = cls.getMethod( "getInstance" ); java.lang.reflect.Method m = cls.getMethod( "getInstance" );
setNativeProvider( (Provider) m.invoke( null ) ); setNativeProvider( (Provider) m.invoke( null ) );
*/ */
setNativeProvider( FlatWindowsNativeWindowBorder.getInstance() ); setNativeProvider( FlatWindowsNativeWindowBorder.getInstance() );
@@ -291,7 +293,8 @@ public class FlatNativeWindowBorder
boolean hasCustomDecoration( Window window ); boolean hasCustomDecoration( Window window );
void setHasCustomDecoration( Window window, boolean hasCustomDecoration ); void setHasCustomDecoration( Window window, boolean hasCustomDecoration );
void updateTitleBarInfo( Window window, int titleBarHeight, List<Rectangle> hitTestSpots, void updateTitleBarInfo( Window window, int titleBarHeight, List<Rectangle> hitTestSpots,
Rectangle appIconBounds, Rectangle maximizeButtonBounds ); Rectangle appIconBounds, Rectangle minimizeButtonBounds, Rectangle maximizeButtonBounds,
Rectangle closeButtonBounds );
// commands for showWindow(); values must match Win32 API // commands for showWindow(); values must match Win32 API
// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow

View File

@@ -521,24 +521,24 @@ public class FlatTitlePane
g.drawLine( 0, debugTitleBarHeight, getWidth(), debugTitleBarHeight ); g.drawLine( 0, debugTitleBarHeight, getWidth(), debugTitleBarHeight );
} }
if( debugHitTestSpots != null ) { if( debugHitTestSpots != null ) {
g.setColor( Color.red );
Point offset = SwingUtilities.convertPoint( this, 0, 0, window );
for( Rectangle r : debugHitTestSpots ) for( Rectangle r : debugHitTestSpots )
g.drawRect( r.x - offset.x, r.y - offset.y, r.width - 1, r.height - 1 ); paintRect( g, Color.red, r );
} }
if( debugAppIconBounds != null ) { paintRect( g, Color.cyan, debugCloseButtonBounds );
g.setColor( Color.blue ); paintRect( g, Color.blue, debugAppIconBounds );
paintRect( g, Color.magenta, debugMinimizeButtonBounds );
paintRect( g, Color.blue, debugMaximizeButtonBounds );
paintRect( g, Color.cyan, debugCloseButtonBounds );
}
private void paintRect( Graphics g, Color color, Rectangle r ) {
if( r == null )
return;
g.setColor( color );
Point offset = SwingUtilities.convertPoint( this, 0, 0, window ); Point offset = SwingUtilities.convertPoint( this, 0, 0, window );
Rectangle r = debugAppIconBounds;
g.drawRect( r.x - offset.x, r.y - offset.y, r.width - 1, r.height - 1 ); g.drawRect( r.x - offset.x, r.y - offset.y, r.width - 1, r.height - 1 );
} }
if( debugMaximizeButtonBounds != null ) {
g.setColor( Color.blue );
Point offset = SwingUtilities.convertPoint( this, 0, 0, window );
Rectangle r = debugMaximizeButtonBounds;
g.drawRect( r.x - offset.x, r.y - offset.y, r.width - 1, r.height - 1 );
}
}
debug*/ debug*/
@Override @Override
@@ -760,13 +760,6 @@ debug*/
appIconBounds = iconBounds; appIconBounds = iconBounds;
} }
JButton maxButton = maximizeButton.isVisible()
? maximizeButton
: (restoreButton.isVisible() ? restoreButton : null);
Rectangle maximizeButtonBounds = (maxButton != null)
? SwingUtilities.convertRectangle( maxButton.getParent(), maxButton.getBounds(), window )
: null;
Rectangle r = getNativeHitTestSpot( buttonPanel ); Rectangle r = getNativeHitTestSpot( buttonPanel );
if( r != null ) if( r != null )
hitTestSpots.add( r ); hitTestSpots.add( r );
@@ -801,18 +794,30 @@ debug*/
} }
} }
Rectangle minimizeButtonBounds = boundsInWindow( iconifyButton );
Rectangle maximizeButtonBounds = boundsInWindow( maximizeButton.isVisible() ? maximizeButton : restoreButton );
Rectangle closeButtonBounds = boundsInWindow( closeButton );
FlatNativeWindowBorder.setTitleBarHeightAndHitTestSpots( window, titleBarHeight, FlatNativeWindowBorder.setTitleBarHeightAndHitTestSpots( window, titleBarHeight,
hitTestSpots, appIconBounds, maximizeButtonBounds ); hitTestSpots, appIconBounds, minimizeButtonBounds, maximizeButtonBounds, closeButtonBounds );
/*debug /*debug
debugTitleBarHeight = titleBarHeight; debugTitleBarHeight = titleBarHeight;
debugHitTestSpots = hitTestSpots; debugHitTestSpots = hitTestSpots;
debugAppIconBounds = appIconBounds; debugAppIconBounds = appIconBounds;
debugMinimizeButtonBounds = minimizeButtonBounds;
debugMaximizeButtonBounds = maximizeButtonBounds; debugMaximizeButtonBounds = maximizeButtonBounds;
debugCloseButtonBounds = closeButtonBounds;
repaint(); repaint();
debug*/ debug*/
} }
private Rectangle boundsInWindow( JComponent c ) {
return c.isVisible()
? SwingUtilities.convertRectangle( c.getParent(), c.getBounds(), window )
: null;
}
protected Rectangle getNativeHitTestSpot( JComponent c ) { protected Rectangle getNativeHitTestSpot( JComponent c ) {
Dimension size = c.getSize(); Dimension size = c.getSize();
if( size.width <= 0 || size.height <= 0 ) if( size.width <= 0 || size.height <= 0 )
@@ -831,7 +836,9 @@ debug*/
private int debugTitleBarHeight; private int debugTitleBarHeight;
private List<Rectangle> debugHitTestSpots; private List<Rectangle> debugHitTestSpots;
private Rectangle debugAppIconBounds; private Rectangle debugAppIconBounds;
private Rectangle debugMinimizeButtonBounds;
private Rectangle debugMaximizeButtonBounds; private Rectangle debugMaximizeButtonBounds;
private Rectangle debugCloseButtonBounds;
debug*/ debug*/
//---- class FlatTitlePaneBorder ------------------------------------------ //---- class FlatTitlePaneBorder ------------------------------------------

View File

@@ -182,7 +182,8 @@ class FlatWindowsNativeWindowBorder
@Override @Override
public void updateTitleBarInfo( Window window, int titleBarHeight, List<Rectangle> hitTestSpots, public void updateTitleBarInfo( Window window, int titleBarHeight, List<Rectangle> hitTestSpots,
Rectangle appIconBounds, Rectangle maximizeButtonBounds ) Rectangle appIconBounds, Rectangle minimizeButtonBounds, Rectangle maximizeButtonBounds,
Rectangle closeButtonBounds )
{ {
WndProc wndProc = windowsMap.get( window ); WndProc wndProc = windowsMap.get( window );
if( wndProc == null ) if( wndProc == null )
@@ -190,8 +191,14 @@ class FlatWindowsNativeWindowBorder
wndProc.titleBarHeight = titleBarHeight; wndProc.titleBarHeight = titleBarHeight;
wndProc.hitTestSpots = hitTestSpots.toArray( new Rectangle[hitTestSpots.size()] ); wndProc.hitTestSpots = hitTestSpots.toArray( new Rectangle[hitTestSpots.size()] );
wndProc.appIconBounds = (appIconBounds != null) ? new Rectangle( appIconBounds ) : null; wndProc.appIconBounds = cloneRectange( appIconBounds );
wndProc.maximizeButtonBounds = (maximizeButtonBounds != null) ? new Rectangle( maximizeButtonBounds ) : null; wndProc.minimizeButtonBounds = cloneRectange( minimizeButtonBounds );
wndProc.maximizeButtonBounds = cloneRectange( maximizeButtonBounds );
wndProc.closeButtonBounds = cloneRectange( closeButtonBounds );
}
private static Rectangle cloneRectange( Rectangle rect ) {
return (rect != null) ? new Rectangle( rect ) : null;
} }
@Override @Override
@@ -294,8 +301,10 @@ class FlatWindowsNativeWindowBorder
HTCLIENT = 1, HTCLIENT = 1,
HTCAPTION = 2, HTCAPTION = 2,
HTSYSMENU = 3, HTSYSMENU = 3,
HTMINBUTTON = 8,
HTMAXBUTTON = 9, HTMAXBUTTON = 9,
HTTOP = 12; HTTOP = 12,
HTCLOSE = 20;
private Window window; private Window window;
private final long hwnd; private final long hwnd;
@@ -304,7 +313,9 @@ class FlatWindowsNativeWindowBorder
private int titleBarHeight; private int titleBarHeight;
private Rectangle[] hitTestSpots; private Rectangle[] hitTestSpots;
private Rectangle appIconBounds; private Rectangle appIconBounds;
private Rectangle minimizeButtonBounds;
private Rectangle maximizeButtonBounds; private Rectangle maximizeButtonBounds;
private Rectangle closeButtonBounds;
WndProc( Window window ) { WndProc( Window window ) {
this.window = window; this.window = window;
@@ -357,15 +368,26 @@ class FlatWindowsNativeWindowBorder
// return HTSYSMENU if mouse is over application icon // return HTSYSMENU if mouse is over application icon
// - left-click on HTSYSMENU area shows system menu // - left-click on HTSYSMENU area shows system menu
// - double-left-click sends WM_CLOSE // - double-left-click sends WM_CLOSE
if( appIconBounds != null && appIconBounds.contains( sx, sy ) ) if( contains( appIconBounds, sx, sy ) )
return HTSYSMENU; return HTSYSMENU;
// return HTMINBUTTON if mouse is over minimize button
// - hovering mouse over HTMINBUTTON area shows tooltip on Windows 10/11
if( contains( minimizeButtonBounds, sx, sy ) )
return HTMINBUTTON;
// return HTMAXBUTTON if mouse is over maximize/restore button // return HTMAXBUTTON if mouse is over maximize/restore button
// - hovering mouse over HTMAXBUTTON area shows tooltip on Windows 10
// - hovering mouse over HTMAXBUTTON area shows snap layouts menu on Windows 11 // - hovering mouse over HTMAXBUTTON area shows snap layouts menu on Windows 11
// https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/apply-snap-layout-menu // https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/apply-snap-layout-menu
if( maximizeButtonBounds != null && maximizeButtonBounds.contains( sx, sy ) ) if( contains( maximizeButtonBounds, sx, sy ) )
return HTMAXBUTTON; return HTMAXBUTTON;
// return HTCLOSE if mouse is over close button
// - hovering mouse over HTCLOSE area shows tooltip on Windows 10/11
if( contains( closeButtonBounds, sx, sy ) )
return HTCLOSE;
boolean isOnTitleBar = (sy < titleBarHeight); boolean isOnTitleBar = (sy < titleBarHeight);
if( isOnTitleBar ) { if( isOnTitleBar ) {
@@ -382,6 +404,10 @@ class FlatWindowsNativeWindowBorder
return isOnResizeBorder ? HTTOP : HTCLIENT; return isOnResizeBorder ? HTTOP : HTCLIENT;
} }
private boolean contains( Rectangle rect, int x, int y ) {
return (rect != null && rect.contains( x, y ) );
}
/** /**
* Scales down in the same way as AWT. * Scales down in the same way as AWT.
* See AwtWin32GraphicsDevice::ScaleDownX() and ::ScaleDownY() * See AwtWin32GraphicsDevice::ScaleDownX() and ::ScaleDownY()

View File

@@ -165,7 +165,8 @@ public class FlatWindowsNativeWindowBorder
@Override @Override
public void updateTitleBarInfo( Window window, int titleBarHeight, List<Rectangle> hitTestSpots, public void updateTitleBarInfo( Window window, int titleBarHeight, List<Rectangle> hitTestSpots,
Rectangle appIconBounds, Rectangle maximizeButtonBounds ) Rectangle appIconBounds, Rectangle minimizeButtonBounds, Rectangle maximizeButtonBounds,
Rectangle closeButtonBounds )
{ {
WndProc wndProc = windowsMap.get( window ); WndProc wndProc = windowsMap.get( window );
if( wndProc == null ) if( wndProc == null )
@@ -173,8 +174,14 @@ public class FlatWindowsNativeWindowBorder
wndProc.titleBarHeight = titleBarHeight; wndProc.titleBarHeight = titleBarHeight;
wndProc.hitTestSpots = hitTestSpots.toArray( new Rectangle[hitTestSpots.size()] ); wndProc.hitTestSpots = hitTestSpots.toArray( new Rectangle[hitTestSpots.size()] );
wndProc.appIconBounds = (appIconBounds != null) ? new Rectangle( appIconBounds ) : null; wndProc.appIconBounds = cloneRectange( appIconBounds );
wndProc.maximizeButtonBounds = (maximizeButtonBounds != null) ? new Rectangle( maximizeButtonBounds ) : null; wndProc.minimizeButtonBounds = cloneRectange( minimizeButtonBounds );
wndProc.maximizeButtonBounds = cloneRectange( maximizeButtonBounds );
wndProc.closeButtonBounds = cloneRectange( closeButtonBounds );
}
private static Rectangle cloneRectange( Rectangle rect ) {
return (rect != null) ? new Rectangle( rect ) : null;
} }
@Override @Override
@@ -306,8 +313,10 @@ public class FlatWindowsNativeWindowBorder
HTCLIENT = 1, HTCLIENT = 1,
HTCAPTION = 2, HTCAPTION = 2,
HTSYSMENU = 3, HTSYSMENU = 3,
HTMINBUTTON = 8,
HTMAXBUTTON = 9, HTMAXBUTTON = 9,
HTTOP = 12; HTTOP = 12,
HTCLOSE = 20;
private static final int ABS_AUTOHIDE = 0x0000001; private static final int ABS_AUTOHIDE = 0x0000001;
private static final int ABM_GETAUTOHIDEBAREX = 0x0000000b; private static final int ABM_GETAUTOHIDEBAREX = 0x0000000b;
@@ -337,7 +346,9 @@ public class FlatWindowsNativeWindowBorder
private int titleBarHeight; private int titleBarHeight;
private Rectangle[] hitTestSpots; private Rectangle[] hitTestSpots;
private Rectangle appIconBounds; private Rectangle appIconBounds;
private Rectangle minimizeButtonBounds;
private Rectangle maximizeButtonBounds; private Rectangle maximizeButtonBounds;
private Rectangle closeButtonBounds;
WndProc( Window window ) { WndProc( Window window ) {
this.window = window; this.window = window;
@@ -423,6 +434,7 @@ public class FlatWindowsNativeWindowBorder
*/ */
@Override @Override
public LRESULT callback( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam ) { public LRESULT callback( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam ) {
long wparam = wParam.longValue();
switch( uMsg ) { switch( uMsg ) {
case WM_NCCALCSIZE: case WM_NCCALCSIZE:
return WmNcCalcSize( hwnd, uMsg, wParam, lParam ); return WmNcCalcSize( hwnd, uMsg, wParam, lParam );
@@ -434,16 +446,17 @@ public class FlatWindowsNativeWindowBorder
// if mouse is moved over some non-client areas, // if mouse is moved over some non-client areas,
// send it also to the client area to allow Swing to process it // send it also to the client area to allow Swing to process it
// (required for Windows 11 maximize button) // (required for Windows 11 maximize button)
if( wParam.longValue() == HTMAXBUTTON || wParam.longValue() == HTCAPTION || wParam.longValue() == HTSYSMENU ) if( wparam == HTMINBUTTON || wparam == HTMAXBUTTON || wparam == HTCLOSE ||
wparam == HTCAPTION || wparam == HTSYSMENU )
sendMessageToClientArea( hwnd, WM_MOUSEMOVE, lParam ); sendMessageToClientArea( hwnd, WM_MOUSEMOVE, lParam );
break; break;
case WM_NCLBUTTONDOWN: case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP: case WM_NCLBUTTONUP:
// if left mouse was pressed/released over maximize button, // if left mouse was pressed/released over minimize/maximize/close button,
// send it also to the client area to allow Swing to process it // send it also to the client area to allow Swing to process it
// (required for Windows 11 maximize button) // (required for Windows 11 maximize button)
if( wParam.shortValue() == HTMAXBUTTON ) { if( wparam == HTMINBUTTON || wparam == HTMAXBUTTON || wparam == HTCLOSE ) {
int uClientMsg = (uMsg == WM_NCLBUTTONDOWN) ? WM_LBUTTONDOWN : WM_LBUTTONUP; int uClientMsg = (uMsg == WM_NCLBUTTONDOWN) ? WM_LBUTTONDOWN : WM_LBUTTONUP;
sendMessageToClientArea( hwnd, uClientMsg, lParam ); sendMessageToClientArea( hwnd, uClientMsg, lParam );
return new LRESULT( 0 ); return new LRESULT( 0 );
@@ -451,7 +464,7 @@ public class FlatWindowsNativeWindowBorder
break; break;
case WM_NCRBUTTONUP: case WM_NCRBUTTONUP:
if( wParam.longValue() == HTCAPTION || wParam.longValue() == HTSYSMENU ) if( wparam == HTCAPTION || wparam == HTSYSMENU )
openSystemMenu( hwnd, GET_X_LPARAM( lParam ), GET_Y_LPARAM( lParam ) ); openSystemMenu( hwnd, GET_X_LPARAM( lParam ), GET_Y_LPARAM( lParam ) );
break; break;
@@ -610,15 +623,26 @@ public class FlatWindowsNativeWindowBorder
// return HTSYSMENU if mouse is over application icon // return HTSYSMENU if mouse is over application icon
// - left-click on HTSYSMENU area shows system menu // - left-click on HTSYSMENU area shows system menu
// - double-left-click sends WM_CLOSE // - double-left-click sends WM_CLOSE
if( appIconBounds != null && appIconBounds.contains( sx, sy ) ) if( contains( appIconBounds, sx, sy ) )
return new LRESULT( HTSYSMENU ); return new LRESULT( HTSYSMENU );
// return HTMINBUTTON if mouse is over minimize button
// - hovering mouse over HTMINBUTTON area shows tooltip on Windows 10/11
if( contains( minimizeButtonBounds, sx, sy ) )
return new LRESULT( HTMINBUTTON );
// return HTMAXBUTTON if mouse is over maximize/restore button // return HTMAXBUTTON if mouse is over maximize/restore button
// - hovering mouse over HTMAXBUTTON area shows tooltip on Windows 10
// - hovering mouse over HTMAXBUTTON area shows snap layouts menu on Windows 11 // - hovering mouse over HTMAXBUTTON area shows snap layouts menu on Windows 11
// https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/apply-snap-layout-menu // https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/apply-snap-layout-menu
if( maximizeButtonBounds != null && maximizeButtonBounds.contains( sx, sy ) ) if( contains( maximizeButtonBounds, sx, sy ) )
return new LRESULT( HTMAXBUTTON ); return new LRESULT( HTMAXBUTTON );
// return HTCLOSE if mouse is over close button
// - hovering mouse over HTCLOSE area shows tooltip on Windows 10/11
if( contains( closeButtonBounds, sx, sy ) )
return new LRESULT( HTCLOSE );
int resizeBorderHeight = getResizeHandleHeight(); int resizeBorderHeight = getResizeHandleHeight();
boolean isOnResizeBorder = (y < resizeBorderHeight) && boolean isOnResizeBorder = (y < resizeBorderHeight) &&
(User32.INSTANCE.GetWindowLong( hwnd, GWL_STYLE ) & WS_THICKFRAME) != 0; (User32.INSTANCE.GetWindowLong( hwnd, GWL_STYLE ) & WS_THICKFRAME) != 0;
@@ -638,6 +662,10 @@ public class FlatWindowsNativeWindowBorder
return new LRESULT( isOnResizeBorder ? HTTOP : HTCLIENT ); return new LRESULT( isOnResizeBorder ? HTTOP : HTCLIENT );
} }
private boolean contains( Rectangle rect, int x, int y ) {
return (rect != null && rect.contains( x, y ) );
}
/** /**
* Converts screen coordinates to window coordinates. * Converts screen coordinates to window coordinates.
*/ */

View File

@@ -219,16 +219,17 @@ LRESULT CALLBACK FlatWndProc::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, L
// if mouse is moved over some non-client areas, // if mouse is moved over some non-client areas,
// send it also to the client area to allow Swing to process it // send it also to the client area to allow Swing to process it
// (required for Windows 11 maximize button) // (required for Windows 11 maximize button)
if( wParam == HTMAXBUTTON || wParam == HTCAPTION || wParam == HTSYSMENU ) if( wParam == HTMINBUTTON || wParam == HTMAXBUTTON || wParam == HTCLOSE ||
wParam == HTCAPTION || wParam == HTSYSMENU )
sendMessageToClientArea( hwnd, WM_MOUSEMOVE, lParam ); sendMessageToClientArea( hwnd, WM_MOUSEMOVE, lParam );
break; break;
case WM_NCLBUTTONDOWN: case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP: case WM_NCLBUTTONUP:
// if left mouse was pressed/released over maximize button, // if left mouse was pressed/released over minimize/maximize/close button,
// send it also to the client area to allow Swing to process it // send it also to the client area to allow Swing to process it
// (required for Windows 11 maximize button) // (required for Windows 11 maximize button)
if( wParam == HTMAXBUTTON ) { if( wParam == HTMINBUTTON || wParam == HTMAXBUTTON || wParam == HTCLOSE ) {
int uClientMsg = (uMsg == WM_NCLBUTTONDOWN) ? WM_LBUTTONDOWN : WM_LBUTTONUP; int uClientMsg = (uMsg == WM_NCLBUTTONDOWN) ? WM_LBUTTONDOWN : WM_LBUTTONUP;
sendMessageToClientArea( hwnd, uClientMsg, lParam ); sendMessageToClientArea( hwnd, uClientMsg, lParam );
return 0; return 0;

View File

@@ -13,10 +13,14 @@ extern "C" {
#define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTCAPTION 2L #define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTCAPTION 2L
#undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTSYSMENU #undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTSYSMENU
#define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTSYSMENU 3L #define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTSYSMENU 3L
#undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTMINBUTTON
#define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTMINBUTTON 8L
#undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTMAXBUTTON #undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTMAXBUTTON
#define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTMAXBUTTON 9L #define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTMAXBUTTON 9L
#undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTTOP #undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTTOP
#define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTTOP 12L #define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTTOP 12L
#undef com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTCLOSE
#define com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc_HTCLOSE 20L
/* /*
* Class: com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc * Class: com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc
* Method: installImpl * Method: installImpl