From 8fa90944e889cc720680ef7c52472797f426985b Mon Sep 17 00:00:00 2001 From: mstr2 <43553916+mstr2@users.noreply.github.com> Date: Sun, 13 Jul 2025 06:29:35 +0200 Subject: [PATCH] Window decorations adapt to color scheme --- buildSrc/win.gradle | 4 +- .../main/java/com/sun/glass/ui/Window.java | 7 ++ .../java/com/sun/glass/ui/mac/MacWindow.java | 7 ++ .../java/com/sun/glass/ui/win/WinWindow.java | 7 ++ .../java/com/sun/javafx/tk/DummyToolkit.java | 5 +- .../main/java/com/sun/javafx/tk/TKStage.java | 2 + .../main/java/com/sun/javafx/tk/Toolkit.java | 3 +- .../com/sun/javafx/tk/quantum/GlassStage.java | 3 + .../sun/javafx/tk/quantum/QuantumToolkit.java | 7 +- .../sun/javafx/tk/quantum/WindowStage.java | 19 ++++- .../src/main/java/javafx/stage/Stage.java | 7 +- .../src/main/java/javafx/stage/Window.java | 14 ++++ .../src/main/native-glass/mac/GlassWindow.m | 27 +++++++ .../src/main/native-glass/win/GlassWindow.cpp | 75 +++++++++++++++++++ .../src/main/native-glass/win/GlassWindow.h | 1 + .../test/com/sun/javafx/pgstub/StubStage.java | 4 + .../com/sun/javafx/pgstub/StubToolkit.java | 3 +- 17 files changed, 183 insertions(+), 12 deletions(-) diff --git a/buildSrc/win.gradle b/buildSrc/win.gradle index f3b0ed8fc15..78c6239ce3a 100644 --- a/buildSrc/win.gradle +++ b/buildSrc/win.gradle @@ -326,9 +326,9 @@ WIN.glass.rcFlags = [ WIN.glass.ccFlags = [ccFlags].flatten() WIN.glass.linker = linker WIN.glass.linkFlags = (IS_STATIC_BUILD ? [linkFlags] : [linkFlags, "delayimp.lib", "gdi32.lib", "urlmon.lib", "Comdlg32.lib", - "winmm.lib", "imm32.lib", "shell32.lib", "Uiautomationcore.lib", "dwmapi.lib", + "winmm.lib", "imm32.lib", "shell32.lib", "Uiautomationcore.lib", "dwmapi.lib", "version.lib", "/DELAYLOAD:user32.dll", "/DELAYLOAD:urlmon.dll", "/DELAYLOAD:winmm.dll", "/DELAYLOAD:shell32.dll", - "/DELAYLOAD:Uiautomationcore.dll", "/DELAYLOAD:dwmapi.dll"]).flatten() + "/DELAYLOAD:Uiautomationcore.dll", "/DELAYLOAD:dwmapi.dll", "/DELAYLOAD:version.dll"]).flatten() WIN.glass.lib = "glass" WIN.decora = [:] diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Window.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Window.java index 4a9df6eb404..8d41d5c0ca2 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Window.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Window.java @@ -173,6 +173,11 @@ static protected void remove(Window window) { */ @Native public static final int MODAL = 1 << 10; + /** + * Indicates that the window should use a dark window frame. + */ + @Native public static final int DARK_FRAME = 1 << 11; + final static public class State { @Native public static final int NORMAL = 1; @Native public static final int MINIMIZED = 2; @@ -987,6 +992,8 @@ public boolean setBackground(final float r, final float g, final float b) { return _setBackground(this.ptr, r, g, b); } + public void setDarkFrame(boolean value) {} + public boolean isEnabled() { Application.checkEventThread(); return this.disableCount == 0; diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacWindow.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacWindow.java index 49adc4c0f61..ad739508425 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacWindow.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacWindow.java @@ -113,6 +113,13 @@ protected MacWindow(Window owner, Screen screen, int styleMask) { private native void _setIcon(long ptr, Object iconBuffer, int width, int height); + @Override + public void setDarkFrame(boolean value) { + _setDarkFrame(getRawHandle(), value); + } + + private native void _setDarkFrame(long ptr, boolean value); + @Override native protected void _toFront(long ptr); @Override native protected void _toBack(long ptr); @Override native protected void _enterModal(long ptr); diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinWindow.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinWindow.java index 7a48e6e82c1..939f04e90a9 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinWindow.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinWindow.java @@ -265,6 +265,13 @@ protected boolean _setBackground(long ptr, float r, float g, float b) { return true; } + private native void _setDarkFrame(long ptr, boolean value); + + @Override + public void setDarkFrame(boolean value) { + _setDarkFrame(getRawHandle(), value); + } + native private long _getInsets(long ptr); native private long _getAnchor(long ptr); native private void _showSystemMenu(long ptr, int x, int y); diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/DummyToolkit.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/DummyToolkit.java index 0d214e91a31..00fbbc88213 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/DummyToolkit.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/DummyToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,7 +101,8 @@ public void exitAllNestedEventLoops() { } @Override - public TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, Modality modality, TKStage owner, boolean rtl) { + public TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, + Modality modality, TKStage owner, boolean rtl, boolean darkFrame) { throw new UnsupportedOperationException("Not supported yet."); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/TKStage.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/TKStage.java index 44ebf3cff76..359fa621fb5 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/TKStage.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/TKStage.java @@ -124,6 +124,8 @@ public void setBounds(float x, float y, boolean xSet, boolean ySet, public void setPrefHeaderButtonHeight(double height); + public void setDarkFrame(boolean value); + // ================================================================================================================= // Functions diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/Toolkit.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/Toolkit.java index 2873c65de16..907222cb9f6 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/Toolkit.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/Toolkit.java @@ -360,7 +360,8 @@ protected Toolkit() { public abstract boolean isNestedLoopRunning(); - public abstract TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, Modality modality, TKStage owner, boolean rtl); + public abstract TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, + Modality modality, TKStage owner, boolean rtl, boolean darkFrame); public abstract TKStage createTKPopupStage(Window peerWindow, StageStyle popupStyle, TKStage owner); public abstract TKStage createTKEmbeddedStage(HostInterface host); diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/GlassStage.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/GlassStage.java index 105595bbbbd..726722e3b3c 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/GlassStage.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/GlassStage.java @@ -77,6 +77,9 @@ protected GlassStage() { @Override public void setPrefHeaderButtonHeight(double height) {} + @Override + public void setDarkFrame(boolean value) {} + protected final GlassScene getScene() { return scene; } diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/QuantumToolkit.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/QuantumToolkit.java index 4481b6b3ce9..df6c6abd796 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/QuantumToolkit.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/QuantumToolkit.java @@ -608,9 +608,10 @@ void vsyncHint() { } } - @Override public TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, Modality modality, TKStage owner, boolean rtl) { + @Override public TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, + Modality modality, TKStage owner, boolean rtl, boolean darkFrame) { assertToolkitRunning(); - WindowStage stage = new WindowStage(peerWindow, stageStyle, modality, owner); + WindowStage stage = new WindowStage(peerWindow, stageStyle, modality, owner, darkFrame); if (primary) { stage.setIsPrimary(); } @@ -693,7 +694,7 @@ private boolean maxNestedEventLoopsHit() { @Override public TKStage createTKPopupStage(Window peerWindow, StageStyle popupStyle, TKStage owner) { assertToolkitRunning(); - WindowStage stage = new WindowStage(peerWindow, popupStyle, null, owner); + WindowStage stage = new WindowStage(peerWindow, popupStyle, null, owner, false); stage.setIsPopup(); stage.init(systemMenu); return stage; diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java index 2fd0651a487..6519753b190 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java @@ -65,6 +65,7 @@ public class WindowStage extends GlassStage { private OverlayWarning warning = null; private boolean rtl = false; private boolean transparent = false; + private boolean darkFrame = false; private boolean isPrimaryStage = false; private boolean isPopupStage = false; private boolean isInFullScreen = false; @@ -84,11 +85,12 @@ public class WindowStage extends GlassStage { ResourceBundle.getBundle(WindowStage.class.getPackage().getName() + ".QuantumMessagesBundle", LOCALE); - - public WindowStage(javafx.stage.Window peerWindow, final StageStyle stageStyle, Modality modality, TKStage owner) { + public WindowStage(javafx.stage.Window peerWindow, final StageStyle stageStyle, Modality modality, + TKStage owner, boolean darkFrame) { this.style = stageStyle; this.owner = (GlassStage)owner; this.modality = modality; + this.darkFrame = darkFrame; if (peerWindow instanceof javafx.stage.Stage) { fxStage = (Stage)peerWindow; @@ -176,6 +178,10 @@ private void initPlatformWindow() { windowMask |= Window.MODAL; } + if (darkFrame) { + windowMask |= Window.DARK_FRAME; + } + platformWindow = app.createWindow(ownerWindow, Screen.getMainScreen(), windowMask); platformWindow.setResizable(resizable); platformWindow.setFocusable(focusable); @@ -901,4 +907,13 @@ public void setPrefHeaderButtonHeight(double height) { platformWindow.setPrefHeaderButtonHeight(height); } } + + @Override + public void setDarkFrame(boolean value) { + darkFrame = value; + + if (platformWindow != null) { + platformWindow.setDarkFrame(value); + } + } } diff --git a/modules/javafx.graphics/src/main/java/javafx/stage/Stage.java b/modules/javafx.graphics/src/main/java/javafx/stage/Stage.java index 3731503e31c..269f262444e 100644 --- a/modules/javafx.graphics/src/main/java/javafx/stage/Stage.java +++ b/modules/javafx.graphics/src/main/java/javafx/stage/Stage.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import javafx.application.ColorScheme; import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; @@ -43,6 +44,7 @@ import com.sun.glass.ui.HeaderButtonMetrics; import com.sun.javafx.PreviewFeature; +import com.sun.javafx.application.PlatformImpl; import com.sun.javafx.collections.VetoableListDecorator; import com.sun.javafx.collections.TrackableObservableList; import com.sun.javafx.scene.SceneHelper; @@ -1111,10 +1113,13 @@ private void doVisibleChanging(boolean value) { TKStage tkStage = (window == null ? null : window.getPeer()); Scene scene = getScene(); boolean rtl = scene != null && scene.getEffectiveNodeOrientation() == NodeOrientation.RIGHT_TO_LEFT; + ColorScheme colorScheme = scene != null + ? scene.getPreferences().getColorScheme() + : PlatformImpl.getPlatformPreferences().getColorScheme(); StageStyle stageStyle = getStyle(); setPeer(toolkit.createTKStage(this, stageStyle, isPrimary(), - getModality(), tkStage, rtl)); + getModality(), tkStage, rtl, colorScheme == ColorScheme.DARK)); getPeer().setMinimumSize((int) Math.ceil(getMinWidth()), (int) Math.ceil(getMinHeight())); getPeer().setMaximumSize((int) Math.floor(getMaxWidth()), diff --git a/modules/javafx.graphics/src/main/java/javafx/stage/Window.java b/modules/javafx.graphics/src/main/java/javafx/stage/Window.java index 447fd21c1ee..9f518cfe7ff 100644 --- a/modules/javafx.graphics/src/main/java/javafx/stage/Window.java +++ b/modules/javafx.graphics/src/main/java/javafx/stage/Window.java @@ -27,7 +27,9 @@ import java.util.HashMap; +import javafx.application.ColorScheme; import javafx.application.Platform; +import javafx.beans.Observable; import javafx.beans.property.DoubleProperty; import javafx.beans.property.DoublePropertyBase; import javafx.beans.property.ObjectProperty; @@ -40,6 +42,7 @@ import javafx.beans.property.ReadOnlyDoubleWrapper; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.ObservableMap; @@ -821,6 +824,7 @@ public Object getUserData() { public final ReadOnlyObjectProperty sceneProperty() { return scene.getReadOnlyProperty(); } private final class SceneModel extends ReadOnlyObjectWrapper { + private final ChangeListener colorSchemeListener = this::updateDarkFrame; private Scene oldScene; @Override protected void invalidated() { @@ -835,6 +839,7 @@ private final class SceneModel extends ReadOnlyObjectWrapper { updatePeerScene(null); // Second, dispose scene peer if (oldScene != null) { + oldScene.getPreferences().colorSchemeProperty().removeListener(colorSchemeListener); SceneHelper.setWindow(oldScene, null); StyleManager.getInstance().forget(oldScene); } @@ -864,6 +869,8 @@ private final class SceneModel extends ReadOnlyObjectWrapper { adjustSize(true); } } + + newScene.getPreferences().colorSchemeProperty().addListener(colorSchemeListener); } oldScene = newScene; @@ -885,6 +892,13 @@ private void updatePeerScene(final TKScene tkScene) { peer.setScene(tkScene); } } + + private void updateDarkFrame(Observable observable, ColorScheme oldValue, ColorScheme newValue) { + if (peer != null) { + Toolkit.getToolkit().checkFxUserThread(); + peer.setDarkFrame(newValue == ColorScheme.DARK); + } + } } /** diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassWindow.m b/modules/javafx.graphics/src/main/native-glass/mac/GlassWindow.m index e52b653dbee..392466dbbe9 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassWindow.m +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassWindow.m @@ -382,6 +382,7 @@ static jlong _createWindowCommonDo(JNIEnv *env, jobject jWindow, jlong jOwnerPtr bool isPopup = (jStyleMask & com_sun_glass_ui_Window_POPUP) != 0; bool isUnified = (jStyleMask & com_sun_glass_ui_Window_UNIFIED) != 0; bool isExtended = (jStyleMask & com_sun_glass_ui_Window_EXTENDED) != 0; + bool isDarkFrame = (jStyleMask & com_sun_glass_ui_Window_DARK_FRAME) != 0; NSUInteger styleMask = NSWindowStyleMaskBorderless; // only titled windows get title @@ -506,6 +507,9 @@ static jlong _createWindowCommonDo(JNIEnv *env, jobject jWindow, jlong jOwnerPtr window->isSizeAssigned = NO; window->isLocationAssigned = NO; + [window->nsWindow setAppearance:isDarkFrame + ? [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua] + : [NSAppearance appearanceNamed:NSAppearanceNameAqua]]; } [pool drain]; @@ -1362,6 +1366,29 @@ static jlong _createWindowCommonDo(JNIEnv *env, jobject jWindow, jlong jOwnerPtr GLASS_CHECK_EXCEPTION(env); } +/* + * Class: com_sun_glass_ui_mac_MacWindow + * Method: _setDarkFrame + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacWindow__1setDarkFrame +(JNIEnv *env, jobject jWindow, jlong jPtr, jboolean dark) +{ + LOG("Java_com_sun_glass_ui_mac_MacWindow__1setDarkFrame"); + if (!jPtr) return; + + GLASS_ASSERT_MAIN_JAVA_THREAD(env); + GLASS_POOL_ENTER; + { + GlassWindow *window = getGlassWindow(env, jPtr); + [window->nsWindow setAppearance:dark + ? [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua] + : [NSAppearance appearanceNamed:NSAppearanceNameAqua]]; + } + GLASS_POOL_EXIT; + GLASS_CHECK_EXCEPTION(env); +} + /* * Class: com_sun_glass_ui_mac_MacWindow * Method: _toFront diff --git a/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.cpp b/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.cpp index 74216836442..1ed273c17f7 100644 --- a/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.cpp +++ b/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.cpp @@ -1258,6 +1258,55 @@ void GlassWindow::SetIcon(HICON hIcon) m_hIcon = hIcon; } +void GlassWindow::SetDarkFrame(bool dark) +{ + // The value of the DWMWA_USE_IMMERSIVE_DARK_MODE constant may be different depending on the OS version. + // We are going to query the file version of dwmapi.dll to make sure we use the right constant, or the + // value 0 to indicate that we don't support this feature. + // See: https://github.com/MicrosoftDocs/sdk-api/commit/c19f1c8a148b930444dce998d3c717c8fb7751e1 + static const DWORD DWMWA_USE_IMMERSIVE_DARK_MODE = []() { + DWORD ignored; + DWORD infoSize = GetFileVersionInfoSizeEx(FILE_VER_GET_NEUTRAL, L"dwmapi.dll", &ignored); + if (infoSize <= 0) { + return 0; + } + + std::vector buffer(infoSize); + if (!GetFileVersionInfoEx(FILE_VER_GET_NEUTRAL, L"dwmapi.dll", ignored, + static_cast(buffer.size()), &buffer[0])) { + return 0; + } + + UINT size = 0; + VS_FIXEDFILEINFO* fileInfo = nullptr; + if (!VerQueryValue(buffer.data(), L"\\", reinterpret_cast(&fileInfo), &size)) { + return 0; + } + + WORD major = HIWORD(fileInfo->dwFileVersionMS); + WORD minor = LOWORD(fileInfo->dwFileVersionMS); + WORD build = HIWORD(fileInfo->dwFileVersionLS); + + // Windows 10 before build 10.0.17763: not supported + if (major < 10 || (major == 10 && minor == 0 && build < 17763)) { + return 0; + } + + // Windows 10 build 10.0.17763 until 10.0.18985 + if (major == 10 && minor == 0 && build >= 17763 && build < 18985) { + return 19; + } + + // Windows 10 build 10.0.18985 or later + return 20; + }(); + + if (DWMWA_USE_IMMERSIVE_DARK_MODE) { + BOOL darkMode = dark; + DwmSetWindowAttribute(GetHWND(), DWMWA_USE_IMMERSIVE_DARK_MODE, &darkMode, sizeof(darkMode)); + } +} + void GlassWindow::ShowSystemMenu(int x, int y) { WINDOWPLACEMENT placement; @@ -1454,6 +1503,10 @@ JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_win_WinWindow__1createWindow MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } } + + if (mask & com_sun_glass_ui_Window_DARK_FRAME) { + pWindow->SetDarkFrame(true); + } } return (jlong)hWnd; @@ -1694,6 +1747,28 @@ JNIEXPORT jboolean JNICALL Java_com_sun_glass_ui_win_WinWindow__1setBackground2 return JNI_TRUE; } +/* + * Class: com_sun_glass_ui_win_WinWindow + * Method: _setDarkFrame + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinWindow__1setDarkFrame + (JNIEnv *env, jobject jThis, jlong ptr, jboolean dark) +{ + ENTER_MAIN_THREAD() + { + GlassWindow *pWindow = GlassWindow::FromHandle(hWnd); + if (pWindow) { + pWindow->SetDarkFrame(dark); + } + } + jboolean dark; + LEAVE_MAIN_THREAD_WITH_hWnd; + + ARG(dark) = dark; + PERFORM(); +} + /* * Class: com_sun_glass_ui_win_WinWindow * Method: _getAnchor diff --git a/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.h b/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.h index f88dbdd29dd..8716aa820f4 100644 --- a/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.h +++ b/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.h @@ -102,6 +102,7 @@ class GlassWindow : public BaseWnd, public ViewContainer { virtual void ExitFullScreenMode(BOOL animate); void SetIcon(HICON hIcon); + void SetDarkFrame(bool); void HandleWindowPosChangedEvent(); void ShowSystemMenu(int x, int y); diff --git a/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubStage.java b/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubStage.java index f33e0262421..789aaba857f 100644 --- a/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubStage.java +++ b/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubStage.java @@ -223,6 +223,10 @@ public void setFullScreen(boolean fullScreen) { public void setPrefHeaderButtonHeight(double height) { } + @Override + public void setDarkFrame(boolean value) { + } + @Override public void requestFocus() { notificationSender.changedFocused(true, FocusCause.ACTIVATED); diff --git a/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubToolkit.java b/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubToolkit.java index b7842c82374..f9b00210018 100644 --- a/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubToolkit.java +++ b/modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubToolkit.java @@ -145,7 +145,8 @@ public boolean init() { } @Override - public TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, Modality modality, TKStage owner, boolean rtl) { + public TKStage createTKStage(Window peerWindow, StageStyle stageStyle, boolean primary, + Modality modality, TKStage owner, boolean rtl, boolean darkFrame) { return new StubStage(); }