diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Screen.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Screen.java index 5480ad5e7f4..6dd051196df 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Screen.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Screen.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -26,7 +26,9 @@ import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; public final class Screen { @@ -370,7 +372,7 @@ public static void setEventHandler(EventHandler eh) { */ public static void notifySettingsChanged() { // Save the old screens in order to dispose them later - List oldScreens = screens; + Set oldScreens = new HashSet<>(); // Get the new screens initScreens(); @@ -389,16 +391,15 @@ public static void notifySettingsChanged() { for (Screen newScreen : screens) { if (oldScreen.getNativeScreen() == newScreen.getNativeScreen()) { w.setScreen(newScreen); + oldScreens.add(oldScreen); break; } } } - // Dispose the old screens - if (oldScreens != null) { - for (Screen screen : oldScreens) { - screen.dispose(); - } + // Dispose the old screens, if any + for (Screen screen : oldScreens) { + screen.dispose(); } } 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 d2215f526b7..c8e02807958 100644 --- a/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.cpp +++ b/modules/javafx.graphics/src/main/native-glass/win/GlassWindow.cpp @@ -212,6 +212,10 @@ LRESULT CALLBACK GlassWindow::CBTFilter(int nCode, WPARAM wParam, LPARAM lParam) return ::CallNextHookEx(GlassWindow::sm_hCBTFilter, nCode, wParam, lParam); } +#ifndef USER_DEFAULT_SCREEN_DPI +#define USER_DEFAULT_SCREEN_DPI 96 +#endif + #ifndef WM_DPICHANGED #define WM_DPICHANGED 0x02E0 #endif @@ -365,6 +369,10 @@ LRESULT GlassWindow::WindowProc(UINT msg, WPARAM wParam, LPARAM lParam) } HandleViewSizeEvent(GetHWND(), msg, wParam, lParam); break; + case WM_DPICHANGED: + HandleDPIEvent(wParam, lParam); + GlassScreen::HandleDisplayChange(); + break; case WM_MOVING: m_winChangingReason = WasMoved; break; @@ -810,6 +818,15 @@ void GlassWindow::HandleSizeEvent(int type, RECT *pRect) CheckAndClearException(env); } +void GlassWindow::HandleDPIEvent(WPARAM wParam, LPARAM lParam) +{ + JNIEnv* env = GetEnv(); + float scale = (float) LOWORD(wParam) / USER_DEFAULT_SCREEN_DPI; + + env->CallVoidMethod(m_grefThis, midNotifyScaleChanged, scale, scale, scale, scale); + CheckAndClearException(env); +} + void GlassWindow::HandleActivateEvent(jint event) { const bool active = event != com_sun_glass_events_WindowEvent_FOCUS_LOST;