--- old/src/java.desktop/windows/classes/sun/awt/windows/WWindowPeer.java 2017-02-02 17:31:20.931183500 +0300 +++ new/src/java.desktop/windows/classes/sun/awt/windows/WWindowPeer.java 2017-02-02 17:31:20.648775600 +0300 @@ -80,6 +80,8 @@ * WindowStateEvent is posted to the EventQueue. */ private WindowListener windowListener; + private float scaleX; + private float scaleY; /** * Initialize JNI field IDs @@ -190,7 +192,10 @@ // Express our interest in display changes GraphicsConfiguration gc = getGraphicsConfiguration(); - ((Win32GraphicsDevice)gc.getDevice()).addDisplayChangedListener(this); + Win32GraphicsDevice gd = (Win32GraphicsDevice) gc.getDevice(); + gd.addDisplayChangedListener(this); + scaleX = gd.getDefaultScaleX(); + scaleY = gd.getDefaultScaleY(); initActiveWindowsTracking((Window)target); @@ -539,6 +544,19 @@ AWTAccessor.getComponentAccessor(). setGraphicsConfiguration((Component)target, winGraphicsConfig); + + checkDPIChange(newDev); + } + + private void checkDPIChange(Win32GraphicsDevice newDev) { + float newScaleX = newDev.getDefaultScaleX(); + float newScaleY = newDev.getDefaultScaleY(); + + if (scaleX != newScaleX || scaleY != newScaleY) { + windowDPIChange(scaleX, scaleY, newScaleX, newScaleY); + scaleX = newScaleX; + scaleY = newScaleY; + } } /** @@ -781,6 +799,9 @@ } } + native void windowDPIChange(float prevScaleX, float prevScaleY, + float newScaleX, float newScaleY); + /* * The method maps the list of the active windows to the window's AppContext, * then the method registers ActiveWindowListener, GuiDisposedListener listeners;