diff --git a/glass/glass/src/com/sun/glass/ui/Screen.java b/glass/glass/src/com/sun/glass/ui/Screen.java --- a/glass/glass/src/com/sun/glass/ui/Screen.java +++ b/glass/glass/src/com/sun/glass/ui/Screen.java @@ -241,14 +241,34 @@ * Called from native when the Screen definitions change. */ private static void notifySettingsChanged() { - if (screens != null) { - for (Screen screen : screens) { + // Save the old screens in order to dispose them later + List oldScreens = screens; + + // Get the new screens + initScreens(); + + // Update the screen for each window to match the new instance. + // Note that if a window has moved to another screen, the window + // will be notified separately of that from native code and the + // new screen will be updated there + List windows = Window.getWindows(); + for (Window w : windows) { + Screen oldScreen = w.getScreen(); + for (Screen newScreen : screens) { + if (oldScreen.getNativeScreen() == newScreen.getNativeScreen()) { + w.setScreen(newScreen); + break; + } + } + } + + // Dispose the old screens + if (oldScreens != null) { + for (Screen screen : oldScreens) { screen.dispose(); } } - initScreens(); - if (eventHandler != null) { eventHandler.handleSettingsChanged(); } diff --git a/glass/glass/src/com/sun/glass/ui/Window.java b/glass/glass/src/com/sun/glass/ui/Window.java --- a/glass/glass/src/com/sun/glass/ui/Window.java +++ b/glass/glass/src/com/sun/glass/ui/Window.java @@ -366,6 +366,11 @@ Application.checkEventThread(); return this.screen; } + + void setScreen(Screen screen) { + Application.checkEventThread(); + this.screen = screen; + } public int getStyleMask() { Application.checkEventThread(); diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java @@ -27,6 +27,7 @@ import com.sun.glass.events.WindowEvent; import com.sun.glass.ui.Application; +import com.sun.glass.ui.Screen; import com.sun.glass.ui.Window; import com.sun.javafx.tk.FocusCause; @@ -128,4 +129,18 @@ AccessControlContext acc = stage.getAccessControlContext(); AccessController.doPrivileged(this, acc); } + + @Override + public void handleScreenChangedEvent(Window window, long time, Screen oldScreen, Screen newScreen) { + GlassScene scene = stage.getScene(); + if (scene != null) { + AbstractPainter.renderLock.lock(); + try { + scene.entireSceneNeedsRepaint(); + scene.updateSceneState(); + } finally { + AbstractPainter.renderLock.unlock(); + } + } + } }