6804747: Ensure consistent graphicsConfig member across components hierarchy

Reviewed-by: art, dcherepanov
This commit is contained in:
Anthony Petrov 2009-02-20 17:34:16 +03:00
parent a1117d31b6
commit f9a987bf43
22 changed files with 181 additions and 295 deletions

View File

@ -25,6 +25,7 @@
package java.awt;
import java.awt.image.BufferStrategy;
import java.awt.peer.CanvasPeer;
import javax.accessibility.*;
/**
@ -65,7 +66,17 @@ public class Canvas extends Component implements Accessible {
*/
public Canvas(GraphicsConfiguration config) {
this();
graphicsConfig = config;
setGraphicsConfiguration(config);
}
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
CanvasPeer peer = (CanvasPeer)getPeer();
if (peer != null) {
gc = peer.getAppropriateGraphicsConfiguration(gc);
}
super.setGraphicsConfiguration(gc);
}
/**

View File

@ -300,7 +300,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see GraphicsConfiguration
* @see #getGraphicsConfiguration
*/
transient GraphicsConfiguration graphicsConfig = null;
private transient GraphicsConfiguration graphicsConfig = null;
/**
* A reference to a <code>BufferStrategy</code> object
@ -845,6 +845,12 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
}
}
public void setGraphicsConfiguration(Component comp,
GraphicsConfiguration gc)
{
comp.setGraphicsConfiguration(gc);
}
});
}
@ -1012,50 +1018,21 @@ public abstract class Component implements ImageObserver, MenuContainer,
*/
public GraphicsConfiguration getGraphicsConfiguration() {
synchronized(getTreeLock()) {
if (graphicsConfig != null) {
return graphicsConfig;
} else if (getParent() != null) {
return getParent().getGraphicsConfiguration();
} else {
return null;
}
return getGraphicsConfiguration_NoClientCode();
}
}
final GraphicsConfiguration getGraphicsConfiguration_NoClientCode() {
GraphicsConfiguration graphicsConfig = this.graphicsConfig;
Container parent = this.parent;
if (graphicsConfig != null) {
return graphicsConfig;
} else if (parent != null) {
return parent.getGraphicsConfiguration_NoClientCode();
} else {
return null;
}
return graphicsConfig;
}
/**
* Resets this <code>Component</code>'s
* <code>GraphicsConfiguration</code> back to a default
* value. For most componenets, this is <code>null</code>.
* Called from the Toolkit thread, so NO CLIENT CODE.
*/
void resetGC() {
void setGraphicsConfiguration(GraphicsConfiguration gc) {
synchronized(getTreeLock()) {
graphicsConfig = null;
}
}
graphicsConfig = gc;
/*
* Not called on Component, but needed for Canvas and Window
*/
void setGCFromPeer() {
synchronized(getTreeLock()) {
if (peer != null) { // can't imagine how this will be false,
// but just in case
graphicsConfig = peer.getGraphicsConfiguration();
} else {
graphicsConfig = null;
ComponentPeer peer = getPeer();
if (peer != null) {
peer.updateGraphicsData(gc);
}
}
}

View File

@ -506,6 +506,7 @@ public class Container extends Component {
adjustDescendants(-(comp.countHierarchyMembers()));
comp.parent = null;
comp.setGraphicsConfiguration(null);
component.remove(index);
invalidateIfValid();
@ -789,6 +790,7 @@ public class Container extends Component {
component.add(index, comp);
}
comp.parent = this;
comp.setGraphicsConfiguration(getGraphicsConfiguration());
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@ -1056,6 +1058,7 @@ public class Container extends Component {
component.add(index, comp);
}
comp.parent = this;
comp.setGraphicsConfiguration(thisGC);
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@ -1094,6 +1097,19 @@ public class Container extends Component {
}
}
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
synchronized (getTreeLock()) {
super.setGraphicsConfiguration(gc);
for (Component comp : component) {
if (comp != null) {
comp.setGraphicsConfiguration(gc);
}
}
}
}
/**
* Checks that all Components that this Container contains are on
* the same GraphicsDevice as this Container. If not, throws an
@ -1151,6 +1167,7 @@ public class Container extends Component {
comp.parent = null;
component.remove(index);
comp.setGraphicsConfiguration(null);
invalidateIfValid();
if (containerListener != null ||
@ -1227,6 +1244,7 @@ public class Container extends Component {
layoutMgr.removeLayoutComponent(comp);
}
comp.parent = null;
comp.setGraphicsConfiguration(null);
if (containerListener != null ||
(eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) {

View File

@ -394,6 +394,18 @@ public class Window extends Container implements Accessible {
}
}
private GraphicsConfiguration initGC(GraphicsConfiguration gc) {
GraphicsEnvironment.checkHeadless();
if (gc == null) {
gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
}
setGraphicsConfiguration(gc);
return gc;
}
private void init(GraphicsConfiguration gc) {
GraphicsEnvironment.checkHeadless();
@ -405,14 +417,10 @@ public class Window extends Container implements Accessible {
setWarningString();
this.cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
this.visible = false;
if (gc == null) {
this.graphicsConfig =
GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
} else {
this.graphicsConfig = gc;
}
if (graphicsConfig.getDevice().getType() !=
gc = initGC(gc);
if (gc.getDevice().getType() !=
GraphicsDevice.TYPE_RASTER_SCREEN) {
throw new IllegalArgumentException("not a screen device");
}
@ -420,8 +428,8 @@ public class Window extends Container implements Accessible {
/* offset the initial location with the original of the screen */
/* and any insets */
Rectangle screenBounds = graphicsConfig.getBounds();
Insets screenInsets = getToolkit().getScreenInsets(graphicsConfig);
Rectangle screenBounds = gc.getBounds();
Insets screenInsets = getToolkit().getScreenInsets(gc);
int x = getX() + screenBounds.x + screenInsets.left;
int y = getY() + screenBounds.y + screenInsets.top;
if (x != this.x || y != this.y) {
@ -2765,7 +2773,7 @@ public class Window extends Container implements Accessible {
sun.java2d.Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this));
addToWindowList();
initGC(null);
}
private void deserializeResources(ObjectInputStream s)
@ -2939,41 +2947,18 @@ public class Window extends Container implements Accessible {
} // inner class AccessibleAWTWindow
/**
* This method returns the GraphicsConfiguration used by this Window.
* @since 1.3
*/
public GraphicsConfiguration getGraphicsConfiguration() {
//NOTE: for multiscreen, this will need to take into account
//which screen the window is on/mostly on instead of returning the
//default or constructor argument config.
synchronized(getTreeLock()) {
if (graphicsConfig == null && !GraphicsEnvironment.isHeadless()) {
graphicsConfig =
GraphicsEnvironment. getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
}
return graphicsConfig;
}
}
/**
* Reset this Window's GraphicsConfiguration to match its peer.
*/
void resetGC() {
if (!GraphicsEnvironment.isHeadless()) {
// use the peer's GC
setGCFromPeer();
// if it's still null, use the default
if (graphicsConfig == null) {
graphicsConfig = GraphicsEnvironment.
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
if (gc == null) {
gc = GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
}
}
synchronized (getTreeLock()) {
super.setGraphicsConfiguration(gc);
if (log.isLoggable(Level.FINER)) {
log.finer("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this);
log.finer("+ Window.setGraphicsConfiguration(): new GC is \n+ " + getGraphicsConfiguration_NoClientCode() + "\n+ this is " + this);
}
}
}
@ -3033,7 +3018,7 @@ public class Window extends Container implements Accessible {
// target location
int dx = 0, dy = 0;
// target GC
GraphicsConfiguration gc = this.graphicsConfig;
GraphicsConfiguration gc = getGraphicsConfiguration_NoClientCode();
Rectangle gcBounds = gc.getBounds();
Dimension windowSize = getSize();

View File

@ -25,6 +25,7 @@
package java.awt.peer;
import java.awt.Canvas;
import java.awt.GraphicsConfiguration;
/**
* The peer interface for {@link Canvas}.
@ -36,4 +37,13 @@ import java.awt.Canvas;
* instances.
*/
public interface CanvasPeer extends ComponentPeer {
/**
* Requests a GC that best suits this Canvas. The returned GC may differ
* from the requested GC passed as the argument to this method. This method
* must return a non-null value (given the argument is non-null as well).
*
* @since 1.7
*/
GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc);
}

View File

@ -539,4 +539,10 @@ public interface ComponentPeer {
*/
void applyShape(Region shape);
/**
* Updates internal data structures related to the component's GC.
*
* @since 1.7
*/
void updateGraphicsData(GraphicsConfiguration gc);
}

View File

@ -78,6 +78,11 @@ public final class AWTAccessor {
* See 6797587, 6776743, 6768307, and 6768332 for details
*/
void setMixingCutoutShape(Component comp, Shape shape);
/**
* Sets GraphicsConfiguration value for the component.
*/
void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc);
}
/*

View File

@ -73,7 +73,6 @@ public class ComponentAccessor
private static Field fieldPacked;
private static Field fieldIgnoreRepaint;
private static Field fieldPeer;
private static Method methodResetGC;
private static Field fieldVisible;
private static Method methodIsEnabledImpl;
private static Method methodGetCursorNoClientCode;
@ -124,9 +123,6 @@ public class ComponentAccessor
fieldPeer = componentClass.getDeclaredField("peer");
fieldPeer.setAccessible(true);
methodResetGC = componentClass.getDeclaredMethod("resetGC", (Class[]) null);
methodResetGC.setAccessible(true);
fieldVisible = componentClass.getDeclaredField("visible");
fieldVisible.setAccessible(true);
@ -425,18 +421,6 @@ public class ComponentAccessor
return false;
}
public static void resetGC(Component c) {
try {
methodResetGC.invoke(c, (Object[]) null);
}
catch (IllegalAccessException e) {
log.log(Level.FINE, "Unable to access the Component object", e);
}
catch (InvocationTargetException e) {
log.log(Level.FINE, "Unable to invoke on the Component object", e);
}
}
public static boolean getVisible(Component c) {
try {
return fieldVisible.getBoolean(c);

View File

@ -305,4 +305,12 @@ public class NullComponentPeer implements LightweightPeer,
*/
public void applyShape(Region shape) {
}
public void updateGraphicsData(GraphicsConfiguration gc) {}
public GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc)
{
return gc;
}
}

View File

@ -27,7 +27,6 @@ package sun.awt.X11;
import java.awt.*;
import java.awt.peer.*;
import sun.awt.ComponentAccessor;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsConfig;
@ -54,60 +53,45 @@ class XCanvasPeer extends XComponentPeer implements CanvasPeer {
}
}
void resetTargetGC(Component target) {
ComponentAccessor.resetGC(target);
}
/*
* Called when the Window this
* Canvas is on is moved onto another Xinerama screen.
*
* Canvases can be created with a non-defulat GraphicsConfiguration. The
* GraphicsConfiguration needs to be changed to one on the new screen,
* preferably with the same visual ID.
*
* Up-called for other windows peer instances (XPanelPeer, XWindowPeer).
*
* Should only be called from the event thread.
*/
public void displayChanged(int screenNum) {
resetLocalGC(screenNum);
resetTargetGC(target);
}
/* Set graphicsConfig to a GraphicsConfig with the same visual on the new
/* Get a GraphicsConfig with the same visual on the new
* screen, which should be easy in Xinerama mode.
*
* Should only be called from displayChanged(), and therefore only from
* the event thread.
*/
void resetLocalGC(int screenNum) {
public GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc)
{
if (graphicsConfig == null || gc == null) {
return gc;
}
// Opt: Only need to do if we're not using the default GC
if (graphicsConfig != null) {
X11GraphicsConfig parentgc;
// save vis id of current gc
int visual = graphicsConfig.getVisual();
X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment.
getLocalGraphicsEnvironment().
getScreenDevices()[screenNum];
int screenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen();
for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) {
if (visual == newDev.getConfigVisualId(i, screenNum)) {
// use that
graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i];
break;
}
}
// just in case...
if (graphicsConfig == null) {
graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment.
getLocalGraphicsEnvironment().
getScreenDevices()[screenNum].
getDefaultConfiguration();
X11GraphicsConfig parentgc;
// save vis id of current gc
int visual = graphicsConfig.getVisual();
X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment.
getLocalGraphicsEnvironment().
getScreenDevices()[screenNum];
for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) {
if (visual == newDev.getConfigVisualId(i, screenNum)) {
// use that
graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i];
break;
}
}
// just in case...
if (graphicsConfig == null) {
graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment.
getLocalGraphicsEnvironment().
getScreenDevices()[screenNum].
getDefaultConfiguration();
}
return graphicsConfig;
}
protected boolean shouldFocusOnClick() {
// Canvas should always be able to be focused by mouse clicks.
return true;

View File

@ -35,6 +35,7 @@ import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
@ -1556,4 +1557,8 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
}
}
}
public void updateGraphicsData(GraphicsConfiguration gc) {
initGraphicsConfiguration();
}
}

View File

@ -379,4 +379,6 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{
public void applyShape(Region shape) {
}
public void updateGraphicsData(GraphicsConfiguration gc) {}
}

View File

@ -130,39 +130,6 @@ public class XPanelPeer extends XCanvasPeer implements PanelPeer {
return getInsets();
}
/*
* This method is called from XWindowPeer.displayChanged, when
* the window this Panel is on is moved to the new screen, or
* display mode is changed.
*
* The notification is propagated to the child Canvas components.
* Top-level windows and other Panels are notified too as their
* peers are subclasses of XCanvasPeer.
*/
public void displayChanged(int screenNum) {
super.displayChanged(screenNum);
displayChanged((Container)target, screenNum);
}
/*
* Recursively iterates through all the HW and LW children
* of the container and calls displayChanged() for HW peers.
* Iteration through children peers only is not enough as the
* displayChanged notification may not be propagated to HW
* components inside LW containers, see 4452373 for details.
*/
private static void displayChanged(Container target, int screenNum) {
Component children[] = ((Container)target).getComponents();
for (Component child : children) {
ComponentPeer cpeer = child.getPeer();
if (cpeer instanceof XCanvasPeer) {
((XCanvasPeer)cpeer).displayChanged(screenNum);
} else if (child instanceof Container) {
displayChanged((Container)child, screenNum);
}
}
}
public void dispose() {
if (embedder != null) {
embedder.deinstall();

View File

@ -47,6 +47,7 @@ import java.util.logging.Logger;
import sun.awt.AWTAccessor;
import sun.awt.ComponentAccessor;
import sun.awt.WindowAccessor;
import sun.awt.AWTAccessor;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsDevice;
@ -711,6 +712,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
int curScreenNum = ((X11GraphicsDevice)getGraphicsConfiguration().getDevice()).getScreen();
int newScreenNum = 0;
GraphicsDevice gds[] = XToolkit.localEnv.getScreenDevices();
GraphicsConfiguration newGC = null;
Rectangle screenBounds;
for (int i = 0; i < gds.length; i++) {
@ -726,11 +728,13 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
if (intAmt == area) {
// Completely on this screen - done!
newScreenNum = i;
newGC = gds[i].getDefaultConfiguration();
break;
}
if (intAmt > largestAmt) {
largestAmt = intAmt;
newScreenNum = i;
newGC = gds[i].getDefaultConfiguration();
}
}
}
@ -738,28 +742,20 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
if (log.isLoggable(Level.FINEST)) {
log.finest("XWindowPeer: Moved to a new screen");
}
draggedToNewScreen(newScreenNum);
executeDisplayChangedOnEDT(newGC);
}
}
/* Xinerama
* called to update our GC when dragged onto another screen
*/
public void draggedToNewScreen(int screenNum) {
executeDisplayChangedOnEDT(screenNum);
}
/**
* Helper method that executes the displayChanged(screen) method on
* the event dispatch thread. This method is used in the Xinerama case
* and after display mode change events.
*/
private void executeDisplayChangedOnEDT(final int screenNum) {
private void executeDisplayChangedOnEDT(final GraphicsConfiguration gc) {
Runnable dc = new Runnable() {
public void run() {
// Updates this window's GC and notifies all the children.
// See XPanelPeer/XCanvasPeer.displayChanged(int) for details.
displayChanged(screenNum);
AWTAccessor.getComponentAccessor().
setGraphicsConfiguration((Component)target, gc);
}
};
SunToolkit.executeOnEventHandlerThread((Component)target, dc);
@ -770,9 +766,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
* X11GraphicsDevice when the display mode has been changed.
*/
public void displayChanged() {
GraphicsConfiguration gc = getGraphicsConfiguration();
int curScreenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen();
executeDisplayChangedOnEDT(curScreenNum);
executeDisplayChangedOnEDT(getGraphicsConfiguration());
}
/**

View File

@ -41,7 +41,6 @@ struct ComponentIDs {
jfieldID appContext;
jmethodID getParent;
jmethodID getLocationOnScreen;
jmethodID resetGCMID;
};
/* field and method IDs for Container */
@ -65,7 +64,3 @@ struct MComponentPeerIDs {
extern void processTree(Widget from, Widget to, Boolean action);
#endif // HEADLESS
/* fieldIDs for Canvas fields that may be accessed from C */
struct CanvasIDs {
jmethodID setGCFromPeerMID;
};

View File

@ -28,7 +28,6 @@
/* fieldIDs for Window fields that may be accessed from C */
struct WindowIDs {
jfieldID warningString;
jmethodID resetGCMID;
jfieldID locationByPlatform;
jfieldID isAutoRequestFocus;
};

View File

@ -182,9 +182,6 @@ Java_java_awt_Component_initIDs
(*env)->GetMethodID(env, cls, "getLocationOnScreen_NoTreeLock",
"()Ljava/awt/Point;");
componentIDs.resetGCMID =
(*env)->GetMethodID(env, cls, "resetGC", "()V");
keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent");
DASSERT (keyclass != NULL);
@ -197,9 +194,6 @@ Java_java_awt_Component_initIDs
"Lsun/awt/AppContext;");
(*env)->DeleteLocalRef(env, keyclass);
DASSERT(componentIDs.resetGCMID);
}

View File

@ -380,7 +380,6 @@ public class Win32GraphicsDevice extends GraphicsDevice implements
// fix for 4868278
peer.updateGC();
peer.resetTargetGC();
}
}

View File

@ -38,44 +38,12 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer {
private boolean eraseBackground;
Method resetGCMethod;
// Toolkit & peer internals
WCanvasPeer(Component target) {
super(target);
}
/*
* From the DisplayChangedListener interface.
*
* Overrides WComponentPeer version because Canvases can be created with
* a non-defulat GraphicsConfiguration, which is no longer valid.
* Up-called for other windows peer instances (WPanelPeer, WWindowPeer).
*/
public void displayChanged() {
clearLocalGC();
resetTargetGC();
super.displayChanged();
}
/*
* Reset the graphicsConfiguration member of our target Component.
* Component.resetGC() is a package-private method, so we have to call it
* through reflection.
*/
public void resetTargetGC() {
ComponentAccessor.resetGC((Component)target);
}
/*
* Clears the peer's winGraphicsConfig member.
* Overridden by WWindowPeer, which shouldn't have a null winGraphicsConfig.
*/
void clearLocalGC() {
winGraphicsConfig = null;
}
native void create(WComponentPeer parent);
void initialize() {
@ -152,4 +120,10 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer {
*/
private native void setNativeBackgroundErase(boolean doErase,
boolean doEraseOnResize);
public GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc)
{
return gc;
}
}

View File

@ -59,7 +59,7 @@ import java.util.logging.*;
public abstract class WComponentPeer extends WObjectPeer
implements ComponentPeer, DropTargetPeer, DisplayChangedListener
implements ComponentPeer, DropTargetPeer
{
/**
* Handle to native window
@ -452,15 +452,8 @@ public abstract class WComponentPeer extends WObjectPeer
}
}
/**
* From the DisplayChangedListener interface.
*
* Called after a change in the display mode. This event
* triggers replacing the surfaceData object (since that object
* reflects the current display depth information, which has
* just changed).
*/
public void displayChanged() {
public void updateGraphicsData(GraphicsConfiguration gc) {
winGraphicsConfig = (Win32GraphicsConfig)gc;
try {
replaceSurfaceData();
} catch (InvalidPipeException e) {
@ -468,13 +461,6 @@ public abstract class WComponentPeer extends WObjectPeer
}
}
/**
* Part of the DisplayChangedListener interface: components
* do not need to react to this event
*/
public void paletteChanged() {
}
//This will return null for Components not yet added to a Container
public ColorModel getColorModel() {
GraphicsConfiguration gc = getGraphicsConfiguration();

View File

@ -100,34 +100,6 @@ class WPanelPeer extends WCanvasPeer implements PanelPeer {
return getInsets();
}
/*
* From the DisplayChangedListener interface. Often is
* up-called from a WWindowPeer instance.
*/
public void displayChanged() {
super.displayChanged();
displayChanged((Container)target);
}
/*
* Recursively iterates through all the HW and LW children
* of the container and calls displayChanged() for HW peers.
* Iteration through children peers only is not enough as the
* displayChanged notification may not be propagated to HW
* components inside LW containers, see 4452373 for details.
*/
private static void displayChanged(Container target) {
Component children[] = ((Container)target).getComponents();
for (Component child : children) {
ComponentPeer cpeer = child.getPeer();
if (cpeer instanceof WComponentPeer) {
((WComponentPeer)cpeer).displayChanged();
} else if (child instanceof Container) {
displayChanged((Container)child);
}
}
}
private native void pRestack(Object[] peers);
private void restack(Container cont, Vector peers) {
for (int i = 0; i < cont.getComponentCount(); i++) {

View File

@ -41,7 +41,9 @@ import sun.awt.*;
import sun.java2d.pipe.Region;
public class WWindowPeer extends WPanelPeer implements WindowPeer {
public class WWindowPeer extends WPanelPeer implements WindowPeer,
DisplayChangedListener
{
private static final Logger log = Logger.getLogger("sun.awt.windows.WWindowPeer");
private static final Logger screenLog = Logger.getLogger("sun.awt.windows.screen.WWindowPeer");
@ -198,7 +200,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer {
// super.displayChanged() in WWindowPeer.displayChanged() regardless of whether
// GraphicsDevice was really changed, or not. So we need to track it here.
updateGC();
resetTargetGC();
realShow();
updateMinimumSize();
@ -400,14 +401,6 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer {
});
}
/*
* Called from WCanvasPeer.displayChanged().
* Override to do nothing - Window and WWindowPeer GC must never be set to
* null!
*/
void clearLocalGC() {}
public void updateGC() {
int scrn = getScreenImOn();
if (screenLog.isLoggable(Level.FINER)) {
@ -446,18 +439,36 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer {
oldDev.removeDisplayChangedListener(this);
newDev.addDisplayChangedListener(this);
}
SunToolkit.executeOnEventHandlerThread((Component)target,
new Runnable() {
public void run() {
AWTAccessor.getComponentAccessor().
setGraphicsConfiguration((Component)target, winGraphicsConfig);
}
});
}
/*
* From the DisplayChangedListener interface
/**
* From the DisplayChangedListener interface.
*
* This method handles a display change - either when the display settings
* are changed, or when the window has been dragged onto a different
* display.
* Called after a change in the display mode. This event
* triggers replacing the surfaceData object (since that object
* reflects the current display depth information, which has
* just changed).
*/
public void displayChanged() {
updateGC();
super.displayChanged();
}
/**
* Part of the DisplayChangedListener interface: components
* do not need to react to this event
*/
public void paletteChanged() {
}
private native int getScreenImOn();