summaryrefslogtreecommitdiffstats
path: root/src/newt
diff options
context:
space:
mode:
authorSven Gothel <sgothel@jausoft.com>2011-08-24 01:57:16 +0200
committerSven Gothel <sgothel@jausoft.com>2011-08-24 01:57:16 +0200
commit5047b00127d976281098c39bee2d211fdbda5123 (patch)
tree7f7c0472dfcbeab9b957de249e8ff59c86656556 /src/newt
parent006f0ffdc63c35b0aed229b626db00c358c9399f (diff)
NEWT/ScreenMode: Fix Bug 456 - Reset to orig ScreenMode when exit (normal or ctrl-c) ; Generics Coding
Diffstat (limited to 'src/newt')
-rw-r--r--src/newt/classes/jogamp/newt/ScreenImpl.java83
-rw-r--r--src/newt/classes/jogamp/newt/ScreenModeStatus.java34
2 files changed, 83 insertions, 34 deletions
diff --git a/src/newt/classes/jogamp/newt/ScreenImpl.java b/src/newt/classes/jogamp/newt/ScreenImpl.java
index cc0d03e01..59d46a662 100644
--- a/src/newt/classes/jogamp/newt/ScreenImpl.java
+++ b/src/newt/classes/jogamp/newt/ScreenImpl.java
@@ -41,9 +41,12 @@ import com.jogamp.newt.NewtFactory;
import com.jogamp.newt.Screen;
import com.jogamp.newt.ScreenMode;
import com.jogamp.newt.event.ScreenModeListener;
+import com.jogamp.newt.util.MonitorMode;
import com.jogamp.newt.util.ScreenModeUtil;
import javax.media.nativewindow.*;
+import javax.media.nativewindow.util.DimensionImmutable;
+import javax.media.nativewindow.util.SurfaceSize;
import java.security.*;
import java.util.ArrayList;
@@ -61,13 +64,21 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
protected int width=-1, height=-1; // detected values: set using setScreenSize
protected static int usrWidth=-1, usrHeight=-1; // property values: newt.ws.swidth and newt.ws.sheight
private static AccessControlContext localACC = AccessController.getContext();
- private List/*<ScreenModeListener>*/ referencedScreenModeListener = new ArrayList();
+ private ArrayList<ScreenModeListener> referencedScreenModeListener = new ArrayList<ScreenModeListener>();
long t0; // creationTime
- private static Class getScreenClass(String type)
- throws ClassNotFoundException
+ static {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ registerShutdownHook();
+ return null;
+ }
+ });
+ }
+
+ private static Class<? extends Screen> getScreenClass(String type) throws ClassNotFoundException
{
- Class screenClass = NewtFactory.getCustomClass(type, "Screen");
+ Class<?> screenClass = NewtFactory.getCustomClass(type, "Screen");
if(null==screenClass) {
if (NativeWindowFactory.TYPE_ANDROID.equals(type)) {
screenClass = Class.forName("jogamp.newt.driver.android.AndroidScreen");
@@ -85,7 +96,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
throw new RuntimeException("Unknown window type \"" + type + "\"");
}
}
- return screenClass;
+ return (Class<? extends Screen>)screenClass;
}
public static Screen create(Display display, final int idx) {
@@ -111,7 +122,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
return screen0;
}
}
- Class screenClass = getScreenClass(display.getType());
+ Class<? extends Screen> screenClass = getScreenClass(display.getType());
ScreenImpl screen = (ScreenImpl) screenClass.newInstance();
screen.display = (DisplayImpl) display;
screen.screen_idx = idx;
@@ -278,8 +289,8 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
return "NEWT-Screen["+getFQName()+", idx "+screen_idx+", refCount "+refCount+", "+getWidth()+"x"+getHeight()+", "+aScreen+", "+display+"]";
}
- public final List/*<ScreenMode>*/ getScreenModes() {
- ArrayHashSet screenModes = getScreenModesOrig();
+ public final List<ScreenMode> getScreenModes() {
+ ArrayHashSet<ScreenMode> screenModes = getScreenModesOrig();
if(null != screenModes && 0 < screenModes.size()) {
return screenModes.toArrayList();
}
@@ -375,7 +386,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
}
/** ScreenModeStatus bridge to native implementation */
- protected final ArrayHashSet getScreenModesOrig() {
+ protected final ArrayHashSet<ScreenMode> getScreenModesOrig() {
ScreenModeStatus sms = ScreenModeStatus.getScreenModeStatus(this.getFQName());
if(null!=sms) {
return sms.getScreenModes();
@@ -437,6 +448,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
}
private void initScreenModeStatus() {
+ // JAU: FIXME: Add return ..
ScreenModeStatus sms;
ScreenModeStatus.lockScreenModeStatus();
try {
@@ -444,7 +456,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
if(null==sms) {
IntIntHashMap screenModesIdx2NativeIdx = new IntIntHashMap();
- ArrayHashSet screenModes = collectNativeScreenModes(screenModesIdx2NativeIdx);
+ ArrayHashSet<ScreenMode> screenModes = collectNativeScreenModes(screenModesIdx2NativeIdx);
if(screenModes.size()==0) {
ScreenMode sm0 = ( DEBUG_TEST_SCREENMODE_DISABLED ) ? null : getCurrentScreenModeImpl();
if(null != sm0) {
@@ -476,14 +488,12 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
}
/** ignores bpp < 15 */
- private ArrayHashSet collectNativeScreenModes(IntIntHashMap screenModesIdx2NativeId) {
- ArrayHashSet resolutionPool = new ArrayHashSet();
- ArrayHashSet surfaceSizePool = new ArrayHashSet();
- ArrayHashSet screenSizeMMPool = new ArrayHashSet();
- ArrayHashSet monitorModePool = new ArrayHashSet();
- ArrayHashSet screenModePool = null;
-
- screenModePool = new ArrayHashSet();
+ private ArrayHashSet<ScreenMode> collectNativeScreenModes(IntIntHashMap screenModesIdx2NativeId) {
+ ArrayHashSet<DimensionImmutable> resolutionPool = new ArrayHashSet<DimensionImmutable>();
+ ArrayHashSet<SurfaceSize> surfaceSizePool = new ArrayHashSet<SurfaceSize>();
+ ArrayHashSet<DimensionImmutable> screenSizeMMPool = new ArrayHashSet<DimensionImmutable>();
+ ArrayHashSet<MonitorMode> monitorModePool = new ArrayHashSet<MonitorMode>();
+ ArrayHashSet<ScreenMode> screenModePool = new ArrayHashSet<ScreenMode>();
int[] smProps = null;
int num = 0;
@@ -526,7 +536,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
ScreenModeStatus sms;
ScreenModeStatus.lockScreenModeStatus();
try {
- sms = ScreenModeStatus.getScreenModeStatus(this.getFQName());
+ sms = ScreenModeStatus.getScreenModeStatus(getFQName());
if(null != sms) {
sms.lock();
try {
@@ -534,7 +544,7 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
if(!sms.isOriginalMode()) {
setCurrentScreenMode(sms.getOriginalScreenMode());
}
- ScreenModeStatus.unmapScreenModeStatus(this.getFQName());
+ ScreenModeStatus.unmapScreenModeStatus(getFQName());
}
} finally {
sms.unlock();
@@ -544,5 +554,38 @@ public abstract class ScreenImpl extends Screen implements ScreenModeListener {
ScreenModeStatus.unlockScreenModeStatus();
}
}
+
+ private final void shutdown() {
+ ScreenModeStatus sms = ScreenModeStatus.getScreenModeStatusUnlocked(getFQName());
+ if(null != sms) {
+ if(!sms.isOriginalMode()) {
+ try {
+ setCurrentScreenModeImpl(sms.getOriginalScreenMode());
+ } catch (Throwable t) {
+ // be quiet .. shutdown
+ }
+ }
+ ScreenModeStatus.unmapScreenModeStatusUnlocked(getFQName());
+ }
+ }
+ private static final void shutdownAll() {
+ for(int i=0; i < screenList.size(); i++) {
+ ((ScreenImpl)screenList.get(i)).shutdown();
+ }
+ }
+
+ private static synchronized void registerShutdownHook() {
+ final Thread shutdownHook = new Thread(new Runnable() {
+ public void run() {
+ ScreenImpl.shutdownAll();
+ }
+ });
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ Runtime.getRuntime().addShutdownHook(shutdownHook);
+ return null;
+ }
+ });
+ }
}
diff --git a/src/newt/classes/jogamp/newt/ScreenModeStatus.java b/src/newt/classes/jogamp/newt/ScreenModeStatus.java
index 4d8b8b5f6..dfd4e99a6 100644
--- a/src/newt/classes/jogamp/newt/ScreenModeStatus.java
+++ b/src/newt/classes/jogamp/newt/ScreenModeStatus.java
@@ -34,6 +34,7 @@ import com.jogamp.common.util.locks.RecursiveLock;
import com.jogamp.newt.Screen;
import com.jogamp.newt.ScreenMode;
import com.jogamp.newt.event.ScreenModeListener;
+
import java.util.ArrayList;
import java.util.HashMap;
@@ -41,19 +42,19 @@ public class ScreenModeStatus {
private static boolean DEBUG = Screen.DEBUG;
private RecursiveLock lock = new RecursiveLock();
- private ArrayHashSet/*<ScreenMode>*/ screenModes;
+ private ArrayHashSet<ScreenMode> screenModes;
private IntIntHashMap screenModesIdx2NativeIdx;
private ScreenMode currentScreenMode;
private ScreenMode originalScreenMode;
- private ArrayList/*<ScreenModeChangeListener>*/ listener = new ArrayList();
+ private ArrayList<ScreenModeListener> listener = new ArrayList<ScreenModeListener>();
- private static HashMap screenFQN2ScreenModeStatus = new HashMap();
+ private static HashMap<String, ScreenModeStatus> screenFQN2ScreenModeStatus = new HashMap<String, ScreenModeStatus>();
private static RecursiveLock screen2ScreenModeStatusLock = new RecursiveLock();
protected static void mapScreenModeStatus(String screenFQN, ScreenModeStatus sms) {
screen2ScreenModeStatusLock.lock();
try {
- ScreenModeStatus _sms = (ScreenModeStatus) screenFQN2ScreenModeStatus.get(screenFQN);
+ ScreenModeStatus _sms = screenFQN2ScreenModeStatus.get(screenFQN);
if( null != _sms ) {
throw new RuntimeException("ScreenModeStatus "+_sms+" already mapped to "+screenFQN);
}
@@ -73,23 +74,29 @@ public class ScreenModeStatus {
protected static void unmapScreenModeStatus(String screenFQN) {
screen2ScreenModeStatusLock.lock();
try {
- ScreenModeStatus sms = (ScreenModeStatus) screenFQN2ScreenModeStatus.remove(screenFQN);
- if(DEBUG) {
- System.err.println("ScreenModeStatus.unmap "+screenFQN+" -> "+sms);
- }
+ unmapScreenModeStatusUnlocked(screenFQN);
} finally {
screen2ScreenModeStatusLock.unlock();
}
}
+ protected static void unmapScreenModeStatusUnlocked(String screenFQN) {
+ ScreenModeStatus sms = screenFQN2ScreenModeStatus.remove(screenFQN);
+ if(DEBUG) {
+ System.err.println("ScreenModeStatus.unmap "+screenFQN+" -> "+sms);
+ }
+ }
protected static ScreenModeStatus getScreenModeStatus(String screenFQN) {
screen2ScreenModeStatusLock.lock();
try {
- return (ScreenModeStatus) screenFQN2ScreenModeStatus.get(screenFQN);
+ return getScreenModeStatusUnlocked(screenFQN);
} finally {
screen2ScreenModeStatusLock.unlock();
}
}
+ protected static ScreenModeStatus getScreenModeStatusUnlocked(String screenFQN) {
+ return screenFQN2ScreenModeStatus.get(screenFQN);
+ }
protected static void lockScreenModeStatus() {
screen2ScreenModeStatusLock.lock();
@@ -99,7 +106,7 @@ public class ScreenModeStatus {
screen2ScreenModeStatusLock.unlock();
}
- public ScreenModeStatus(ArrayHashSet/*<ScreenMode>*/ screenModes,
+ public ScreenModeStatus(ArrayHashSet<ScreenMode> screenModes,
IntIntHashMap screenModesIdx2NativeIdx) {
this.screenModes = screenModes;
this.screenModesIdx2NativeIdx = screenModesIdx2NativeIdx;
@@ -135,7 +142,7 @@ public class ScreenModeStatus {
}
}
- protected final ArrayHashSet/*<ScreenMode>*/ getScreenModes() {
+ protected final ArrayHashSet<ScreenMode> getScreenModes() {
return screenModes;
}
@@ -175,7 +182,7 @@ public class ScreenModeStatus {
lock();
try {
for(int i=0; i<listener.size(); i++) {
- ((ScreenModeListener)listener.get(i)).screenModeChangeNotify(desiredScreenMode);
+ listener.get(i).screenModeChangeNotify(desiredScreenMode);
}
} finally {
unlock();
@@ -189,7 +196,7 @@ public class ScreenModeStatus {
this.currentScreenMode = currentScreenMode;
}
for(int i=0; i<listener.size(); i++) {
- ((ScreenModeListener)listener.get(i)).screenModeChanged(currentScreenMode, success);
+ listener.get(i).screenModeChanged(currentScreenMode, success);
}
} finally {
unlock();
@@ -203,5 +210,4 @@ public class ScreenModeStatus {
protected final void unlock() throws RuntimeException {
lock.unlock();
}
-
}