提交 442c804d 编写于 作者: S serb

8009012: [macosx] DisplayChangedListener is not implemented in LWWindowPeer/CGraphicsEnvironment

Reviewed-by: anthony, bae
上级 8b04346f
...@@ -35,10 +35,18 @@ import java.util.Objects; ...@@ -35,10 +35,18 @@ import java.util.Objects;
import sun.java2d.opengl.CGLGraphicsConfig; import sun.java2d.opengl.CGLGraphicsConfig;
public final class CGraphicsDevice extends GraphicsDevice { public final class CGraphicsDevice extends GraphicsDevice
implements DisplayChangedListener {
// CoreGraphics display ID /**
private final int displayID; * CoreGraphics display ID. This identifier can become non-valid at any time
* therefore methods, which is using this id should be ready to it.
*/
private volatile int displayID;
private volatile Insets screenInsets;
private volatile double xResolution;
private volatile double yResolution;
private volatile int scale;
// Array of all GraphicsConfig instances for this device // Array of all GraphicsConfig instances for this device
private final GraphicsConfiguration[] configs; private final GraphicsConfiguration[] configs;
...@@ -51,7 +59,7 @@ public final class CGraphicsDevice extends GraphicsDevice { ...@@ -51,7 +59,7 @@ public final class CGraphicsDevice extends GraphicsDevice {
// Save/restore DisplayMode for the Full Screen mode // Save/restore DisplayMode for the Full Screen mode
private DisplayMode originalMode; private DisplayMode originalMode;
public CGraphicsDevice(int displayID) { public CGraphicsDevice(final int displayID) {
this.displayID = displayID; this.displayID = displayID;
configs = new GraphicsConfiguration[] { configs = new GraphicsConfiguration[] {
CGLGraphicsConfig.getConfig(this, 0) CGLGraphicsConfig.getConfig(this, 0)
...@@ -89,7 +97,7 @@ public final class CGraphicsDevice extends GraphicsDevice { ...@@ -89,7 +97,7 @@ public final class CGraphicsDevice extends GraphicsDevice {
*/ */
@Override @Override
public String getIDstring() { public String getIDstring() {
return "Display " + this.displayID; return "Display " + displayID;
} }
/** /**
...@@ -104,15 +112,37 @@ public final class CGraphicsDevice extends GraphicsDevice { ...@@ -104,15 +112,37 @@ public final class CGraphicsDevice extends GraphicsDevice {
} }
public double getXResolution() { public double getXResolution() {
return nativeGetXResolution(displayID); return xResolution;
} }
public double getYResolution() { public double getYResolution() {
return nativeGetYResolution(displayID); return yResolution;
} }
public Insets getScreenInsets() { public Insets getScreenInsets() {
return nativeGetScreenInsets(displayID); return screenInsets;
}
public int getScaleFactor() {
return scale;
}
public void invalidate(final int defaultDisplayID) {
displayID = defaultDisplayID;
}
@Override
public void displayChanged() {
xResolution = nativeGetXResolution(displayID);
yResolution = nativeGetYResolution(displayID);
screenInsets = nativeGetScreenInsets(displayID);
scale = (int) nativeGetScaleFactor(displayID);
//TODO configs/fullscreenWindow/modes?
}
@Override
public void paletteChanged() {
// devices do not need to react to this event.
} }
/** /**
...@@ -219,10 +249,6 @@ public final class CGraphicsDevice extends GraphicsDevice { ...@@ -219,10 +249,6 @@ public final class CGraphicsDevice extends GraphicsDevice {
return nativeGetDisplayModes(displayID); return nativeGetDisplayModes(displayID);
} }
public int getScaleFactor() {
return (int) nativeGetScaleFactor(displayID);
}
private static native double nativeGetScaleFactor(int displayID); private static native double nativeGetScaleFactor(int displayID);
private static native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate); private static native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate);
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,19 +26,20 @@ ...@@ -26,19 +26,20 @@
package sun.awt; package sun.awt;
import java.awt.*; import java.awt.*;
import java.awt.print.*;
import java.util.*; import java.util.*;
import sun.java2d.*; import sun.java2d.*;
/** /**
* This is an implementation of a GraphicsEnvironment object for the default local GraphicsEnvironment used by the Java * This is an implementation of a GraphicsEnvironment object for the default
* Runtime Environment for Mac OS X GUI environments. * local GraphicsEnvironment used by the Java Runtime Environment for Mac OS X
* GUI environments.
* *
* @see GraphicsDevice * @see GraphicsDevice
* @see GraphicsConfiguration * @see GraphicsConfiguration
*/ */
public class CGraphicsEnvironment extends SunGraphicsEnvironment { public final class CGraphicsEnvironment extends SunGraphicsEnvironment {
// Global initialization of the Cocoa runtime. // Global initialization of the Cocoa runtime.
private static native void initCocoa(); private static native void initCocoa();
...@@ -53,7 +54,8 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { ...@@ -53,7 +54,8 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment {
private static native int getMainDisplayID(); private static native int getMainDisplayID();
/** /**
* Noop function that just acts as an entry point for someone to force a static initialization of this class. * Noop function that just acts as an entry point for someone to force a
* static initialization of this class.
*/ */
public static void init() { } public static void init() { }
...@@ -78,8 +80,9 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { ...@@ -78,8 +80,9 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment {
} }
/** /**
* Register the instance with CGDisplayRegisterReconfigurationCallback() * Register the instance with CGDisplayRegisterReconfigurationCallback().
* The registration uses a weak global reference -- if our instance is garbage collected, the reference will be dropped. * The registration uses a weak global reference -- if our instance is
* garbage collected, the reference will be dropped.
* *
* @return Return the registration context (a pointer). * @return Return the registration context (a pointer).
*/ */
...@@ -91,7 +94,7 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { ...@@ -91,7 +94,7 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment {
private native void deregisterDisplayReconfiguration(long context); private native void deregisterDisplayReconfiguration(long context);
/** Available CoreGraphics displays. */ /** Available CoreGraphics displays. */
private final Map<Integer, CGraphicsDevice> devices = new HashMap<Integer, CGraphicsDevice>(); private final Map<Integer, CGraphicsDevice> devices = new HashMap<>(5);
/** Reference to the display reconfiguration callback context. */ /** Reference to the display reconfiguration callback context. */
private final long displayReconfigContext; private final long displayReconfigContext;
...@@ -118,11 +121,18 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { ...@@ -118,11 +121,18 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment {
/** /**
* Called by the CoreGraphics Display Reconfiguration Callback. * Called by the CoreGraphics Display Reconfiguration Callback.
* *
* @param displayId * @param displayId CoreGraphics displayId
* CoreGraphics displayId * @param removed true if displayId was removed, false otherwise.
*/ */
void _displayReconfiguration(long displayId) { void _displayReconfiguration(final int displayId, final boolean removed) {
displayChanged(); synchronized (this) {
if (removed && devices.containsKey(displayId)) {
final CGraphicsDevice gd = devices.remove(displayId);
gd.invalidate(getMainDisplayID());
gd.displayChanged();
}
}
initDevices();
} }
@Override @Override
...@@ -135,31 +145,30 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { ...@@ -135,31 +145,30 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment {
} }
/** /**
* (Re)create all CGraphicsDevices * (Re)create all CGraphicsDevices, reuses a devices if it is possible.
*
* @return
*/ */
private synchronized void initDevices() { private void initDevices() {
devices.clear(); synchronized (this) {
final Map<Integer, CGraphicsDevice> old = new HashMap<>(devices);
int mainID = getMainDisplayID(); devices.clear();
// initialization of the graphics device may change int mainID = getMainDisplayID();
// list of displays on hybrid systems via an activation
// of discrete video. // initialization of the graphics device may change
// So, we initialize the main display first, and then // list of displays on hybrid systems via an activation
// retrieve actual list of displays. // of discrete video.
CGraphicsDevice mainDevice = new CGraphicsDevice(mainID); // So, we initialize the main display first, and then
// retrieve actual list of displays.
final int[] displayIDs = getDisplayIDs(); if (!old.containsKey(mainID)) {
old.put(mainID, new CGraphicsDevice(mainID));
}
for (int displayID : displayIDs) { for (final int id : getDisplayIDs()) {
if (displayID != mainID) { devices.put(id, old.containsKey(id) ? old.get(id)
devices.put(displayID, new CGraphicsDevice(displayID)); : new CGraphicsDevice(id));
} else {
devices.put(mainID, mainDevice);
} }
} }
displayChanged();
} }
@Override @Override
...@@ -167,7 +176,7 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { ...@@ -167,7 +176,7 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment {
final int mainDisplayID = getMainDisplayID(); final int mainDisplayID = getMainDisplayID();
CGraphicsDevice d = devices.get(mainDisplayID); CGraphicsDevice d = devices.get(mainDisplayID);
if (d == null) { if (d == null) {
// we do not exepct that this may happen, the only responce // we do not expect that this may happen, the only response
// is to re-initialize the list of devices // is to re-initialize the list of devices
initDevices(); initDevices();
......
...@@ -41,7 +41,7 @@ import sun.util.logging.PlatformLogger; ...@@ -41,7 +41,7 @@ import sun.util.logging.PlatformLogger;
public class LWWindowPeer public class LWWindowPeer
extends LWContainerPeer<Window, JComponent> extends LWContainerPeer<Window, JComponent>
implements WindowPeer, FramePeer, DialogPeer, FullScreenCapable implements FramePeer, DialogPeer, FullScreenCapable, DisplayChangedListener
{ {
public static enum PeerType { public static enum PeerType {
SIMPLEWINDOW, SIMPLEWINDOW,
...@@ -189,6 +189,7 @@ public class LWWindowPeer ...@@ -189,6 +189,7 @@ public class LWWindowPeer
if (getSurfaceData() == null) { if (getSurfaceData() == null) {
replaceSurfaceData(false); replaceSurfaceData(false);
} }
activateDisplayListener();
} }
// Just a helper method // Just a helper method
...@@ -205,6 +206,7 @@ public class LWWindowPeer ...@@ -205,6 +206,7 @@ public class LWWindowPeer
@Override @Override
protected void disposeImpl() { protected void disposeImpl() {
deactivateDisplayListener();
SurfaceData oldData = getSurfaceData(); SurfaceData oldData = getSurfaceData();
synchronized (surfaceDataLock){ synchronized (surfaceDataLock){
surfaceData = null; surfaceData = null;
...@@ -875,6 +877,18 @@ public class LWWindowPeer ...@@ -875,6 +877,18 @@ public class LWWindowPeer
// ---- UTILITY METHODS ---- // // ---- UTILITY METHODS ---- //
private void activateDisplayListener() {
final GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
((SunGraphicsEnvironment) ge).addDisplayChangedListener(this);
}
private void deactivateDisplayListener() {
final GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
((SunGraphicsEnvironment) ge).removeDisplayChangedListener(this);
}
private void postWindowStateChangedEvent(int newWindowState) { private void postWindowStateChangedEvent(int newWindowState) {
if (getTarget() instanceof Frame) { if (getTarget() instanceof Frame) {
AWTAccessor.getFrameAccessor().setExtendedState( AWTAccessor.getFrameAccessor().setExtendedState(
...@@ -936,7 +950,6 @@ public class LWWindowPeer ...@@ -936,7 +950,6 @@ public class LWWindowPeer
graphicsDevice = newGraphicsDevice; graphicsDevice = newGraphicsDevice;
} }
// TODO: DisplayChangedListener stuff
final GraphicsConfiguration newGC = newGraphicsDevice.getDefaultConfiguration(); final GraphicsConfiguration newGC = newGraphicsDevice.getDefaultConfiguration();
if (!setGraphicsConfig(newGC)) return false; if (!setGraphicsConfig(newGC)) return false;
...@@ -949,6 +962,20 @@ public class LWWindowPeer ...@@ -949,6 +962,20 @@ public class LWWindowPeer
return true; return true;
} }
@Override
public final void displayChanged() {
updateGraphicsDevice();
// Replace surface unconditionally, because internal state of the
// GraphicsDevice could be changed.
replaceSurfaceData();
repaintPeer();
}
@Override
public final void paletteChanged() {
// components do not need to react to this event.
}
/* /*
* May be called by delegate to provide SD to Java2D code. * May be called by delegate to provide SD to Java2D code.
*/ */
......
...@@ -32,6 +32,7 @@ import java.awt.peer.WindowPeer; ...@@ -32,6 +32,7 @@ import java.awt.peer.WindowPeer;
import java.beans.*; import java.beans.*;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.List; import java.util.List;
import java.util.Objects;
import javax.swing.*; import javax.swing.*;
...@@ -916,9 +917,12 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -916,9 +917,12 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
final Rectangle oldB = nativeBounds; final Rectangle oldB = nativeBounds;
nativeBounds = new Rectangle(x, y, width, height); nativeBounds = new Rectangle(x, y, width, height);
final GraphicsConfiguration oldGC = peer.getGraphicsConfiguration();
peer.notifyReshape(x, y, width, height); peer.notifyReshape(x, y, width, height);
final GraphicsConfiguration newGC = peer.getGraphicsConfiguration();
// System-dependent appearance optimization.
if ((byUser && !oldB.getSize().equals(nativeBounds.getSize())) if ((byUser && !oldB.getSize().equals(nativeBounds.getSize()))
|| isFullScreenAnimationOn) { || isFullScreenAnimationOn || !Objects.equals(newGC, oldGC)) {
flushBuffers(); flushBuffers();
} }
} }
......
...@@ -124,10 +124,11 @@ static void displaycb_handle ...@@ -124,10 +124,11 @@ static void displaycb_handle
jobject graphicsEnv = [wrapper jObjectWithEnv:env]; jobject graphicsEnv = [wrapper jObjectWithEnv:env];
if (graphicsEnv == NULL) return; // ref already GC'd if (graphicsEnv == NULL) return; // ref already GC'd
static JNF_CLASS_CACHE(jc_CGraphicsEnvironment, "sun/awt/CGraphicsEnvironment"); static JNF_CLASS_CACHE(jc_CGraphicsEnvironment, "sun/awt/CGraphicsEnvironment");
static JNF_MEMBER_CACHE(jm_displayReconfiguration, jc_CGraphicsEnvironment, "_displayReconfiguration", "(J)V"); static JNF_MEMBER_CACHE(jm_displayReconfiguration, jc_CGraphicsEnvironment, "_displayReconfiguration", "(IZ)V");
JNFCallVoidMethod(env, graphicsEnv, jm_displayReconfiguration); JNFCallVoidMethod(env, graphicsEnv, jm_displayReconfiguration,
(jint) display,
(jboolean) flags & kCGDisplayRemoveFlag);
}); });
} }
......
...@@ -216,7 +216,11 @@ Java_sun_java2d_opengl_CGLLayer_nativeSetScale ...@@ -216,7 +216,11 @@ Java_sun_java2d_opengl_CGLLayer_nativeSetScale
{ {
JNF_COCOA_ENTER(env); JNF_COCOA_ENTER(env);
CGLLayer *layer = jlong_to_ptr(layerPtr); CGLLayer *layer = jlong_to_ptr(layerPtr);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){ // We always call all setXX methods asynchronously, exception is only in
// this method where we need to change native texture size and layer's scale
// in one call on appkit, otherwise we'll get window's contents blinking,
// during screen-2-screen moving.
[ThreadUtilities performOnMainThreadWaiting:[NSThread isMainThread] block:^(){
layer.contentsScale = scale; layer.contentsScale = scale;
}]; }];
JNF_COCOA_EXIT(env); JNF_COCOA_EXIT(env);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册