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

Print this page

        

*** 70,79 **** --- 70,82 ---- 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;
*** 892,902 **** } private synchronized void lazilyInitWProps() { if (wprops == null) { wprops = new WDesktopProperties(this); ! updateProperties(); } } /* * Called from lazilyLoadDesktopProperty because Windows doesn't --- 895,905 ---- } private synchronized void lazilyInitWProps() { if (wprops == null) { wprops = new WDesktopProperties(this); ! updateProperties(wprops.getProperties()); } } /* * Called from lazilyLoadDesktopProperty because Windows doesn't
*** 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; --- 930,977 ---- * 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(); + updateXPStyleEnabled(props.get(XPSTYLE_THEME_ACTIVE)); + EventQueue.invokeLater(new Runnable() { @Override public void run() { ! updateProperties(props); } }); } ! private synchronized void updateProperties(final Map<String, Object> props) { ! if (null == props) { return; } ! updateXPStyleEnabled(props.get(XPSTYLE_THEME_ACTIVE)); ! 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 Map<String, Object> getWProps() { + return (wprops != null) ? wprops.getProperties() : null; + } + + private void updateXPStyleEnabled(final Object dskProp) { + ThemeReader.xpStyleEnabled = Boolean.TRUE.equals(dskProp); + } + @Override public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) { if (name == null) { // See JavaDoc for the Toolkit.addPropertyChangeListener() method return;