src/windows/classes/sun/awt/windows/WToolkit.java

Print this page

        

*** 70,79 **** --- 70,84 ---- public final class WToolkit extends SunToolkit implements Runnable { private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.windows.WToolkit"); + /** + * Desktop property which specifies whether XP visual styles are in effect. + */ + public static final String XPSTYLE_THEME_ACTIVE = "win.xpstyle.themeActive"; + static GraphicsConfiguration config; // System clipboard. WClipboard clipboard;
*** 927,960 **** * Called from native toolkit code when WM_SETTINGCHANGE message received * Also called from lazilyLoadDynamicLayoutSupportedProperty because * Windows doesn't always send WM_SETTINGCHANGE when it should. */ private void windowsSettingChange() { EventQueue.invokeLater(new Runnable() { @Override public void run() { ! updateProperties(); } }); } ! private synchronized void updateProperties() { ! if (null == wprops) { ! // wprops has not been initialized, so we have nothing to update return; } - Map<String, Object> props = wprops.getProperties(); for (String propName : props.keySet()) { Object val = props.get(propName); if (log.isLoggable(PlatformLogger.Level.FINER)) { log.finer("changed " + propName + " to " + val); } setDesktopProperty(propName, val); } } @Override public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) { if (name == null) { // See JavaDoc for the Toolkit.addPropertyChangeListener() method return; --- 932,983 ---- * Called from native toolkit code when WM_SETTINGCHANGE message received * Also called from lazilyLoadDynamicLayoutSupportedProperty because * Windows doesn't always send WM_SETTINGCHANGE when it should. */ private void windowsSettingChange() { + // JDK-8039383: Have to update the value of XPSTYLE_THEME_ACTIVE property + // as soon as possible to prevent NPE and other errors because theme data + // has become unavailable. + final Map<String, Object> props = getWProps(); + if (props != null) { + Object xpstyleOld = getDesktopProperty(XPSTYLE_THEME_ACTIVE); + Object xpstyleNew = props.get(XPSTYLE_THEME_ACTIVE); + if (xpstyleOld != null && !xpstyleOld.equals(xpstyleNew)) { + setDesktopProperty(XPSTYLE_THEME_ACTIVE, xpstyleNew); + } + EventQueue.invokeLater(new Runnable() { @Override public void run() { ! updateProperties(props); } }); } + } ! private synchronized void updateProperties(final Map<String, Object> props) { ! if (null == props) { return; } for (String propName : props.keySet()) { Object val = props.get(propName); if (log.isLoggable(PlatformLogger.Level.FINER)) { log.finer("changed " + propName + " to " + val); } setDesktopProperty(propName, val); } } + private synchronized void updateProperties() { + updateProperties(getWProps()); + } + + private synchronized Map<String, Object> getWProps() { + return wprops != null ? wprops.getProperties() : null; + } + @Override public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) { if (name == null) { // See JavaDoc for the Toolkit.addPropertyChangeListener() method return;