From 84576bc0b7c5bd9b7554ec02f01786228efdbe07 Mon Sep 17 00:00:00 2001
From: Sven Gothel
+ * The returned {@link MonitorMode} is element of the lists {@link #getSupportedModes()} and {@link Screen#getMonitorModes()}.
+ *
+ * Use w/ care, it's not a copy!
+ *
- * If {@link MonitorMode}s are not supported for this
- * native type {@link com.jogamp.newt.Display#getType()}, it returns one with the current screen size.
- * If {@link MonitorMode}s are not supported for this - * native type {@link com.jogamp.newt.Display#getType()}, it returns one with the current screen size.
- * - * @return current {@link MonitorMode} which is element of the list {@link #getSupportedModes()} and {@link Screen#getMonitorModes()}. + * The returned {@link MonitorMode} is element of the lists {@link #getSupportedModes()} and {@link Screen#getMonitorModes()}. + * */ public abstract MonitorMode queryCurrentMode(); diff --git a/src/newt/classes/com/jogamp/newt/MonitorMode.java b/src/newt/classes/com/jogamp/newt/MonitorMode.java index e5b329d47..914aa880f 100644 --- a/src/newt/classes/com/jogamp/newt/MonitorMode.java +++ b/src/newt/classes/com/jogamp/newt/MonitorMode.java @@ -29,79 +29,84 @@ package com.jogamp.newt; import javax.media.nativewindow.util.DimensionImmutable; +import javax.media.nativewindow.util.RectangleImmutable; import javax.media.nativewindow.util.SurfaceSize; +import com.jogamp.newt.util.MonitorModeUtil; -/** Immutable MonitorMode Class, consisting of it's read only components:rotation
, measured counter clockwise (CCW)- // determine target refresh rate - ScreenMode orig = screen.getOriginalScreenMode(); - int freq = orig.getOutputMode().getRefreshRate(); + // Pick the monitor: + // Either the one used by a window .. + MonitorDevice monitor = window.getMainMonitor(); + + // Or arbitrary from the list .. + List- * - * X11 / AMD just worksallMonitor = getMonitorDevices(); + MonitorDevice monitor = allMonitor.get(0); - // target resolution + // Current and original modes .. + MonitorMode mmCurrent = monitor.queryCurrentMode(); + MonitorMode mmOrig = monitor.getOriginalMode(); + + // Target resolution Dimension res = new Dimension(800, 600); - // target rotation - int rot = 0; - - // filter available ScreenModes - List screenModes = screen.getScreenModes(); - screenModes = ScreenModeUtil.filterByRate(screenModes, freq); // get the nearest ones - screenModes = ScreenModeUtil.filterByRotation(screenModes, rot); - screenModes = ScreenModeUtil.filterByResolution(screenModes, res); // get the nearest ones - screenModes = ScreenModeUtil.getHighestAvailableBpp(screenModes); - - // pick 1st one .. - screen.setCurrentScreenMode((ScreenMode) screenModes.get(0)); - *
- NVidia RANDR RefreshRate Bug - If NVidia's 'DynamicTwinView' is enabled, all refresh rates are - unique, ie consequent numbers starting with the default refresh, ie 50, 51, .. - The only way to workaround it is to disable 'DynamicTwinView'. - Read: http://us.download.nvidia.com/XFree86/Linux-x86/260.19.12/README/configtwinview.html + // Target refresh rate shall be similar to current one .. + float freq = mmCurrent.getRefreshRate(); - Check to see if 'DynamicTwinView' is enable: - nvidia-settings -q :0/DynamicTwinview + // Target rotation shall be similar to current one + int rot = mmCurrent.getRotation(); - To disable it (workaround), add the following option to your xorg.conf device section: - Option "DynamicTwinView" "False" + // Filter criterias sequential out of all available MonitorMode of the chosen MonitorDevice + List- * */ public class MonitorMode { /** @@ -113,8 +118,11 @@ public class MonitorMode { * */ public static class SizeAndRRate { + /** Non rotated surface size */ public final SurfaceSize surfaceSize; + /** Vertical refresh rate */ public final float refreshRate; + /** Mode bitfield flags, i.e. {@link #FLAG_DOUBLESCAN}, {@link #FLAG_INTERLACE}, .. */ public final int flags; public final int hashCode; @@ -262,6 +270,7 @@ public class MonitorMode { return sizeAndRRate.surfaceSize; } + /** Returns the vertical refresh rate. */ public final float getRefreshRate() { return sizeAndRRate.refreshRate; } diff --git a/src/newt/classes/com/jogamp/newt/Screen.java b/src/newt/classes/com/jogamp/newt/Screen.java index 81a62d898..f56aff964 100644 --- a/src/newt/classes/com/jogamp/newt/Screen.java +++ b/src/newt/classes/com/jogamp/newt/Screen.java @@ -163,18 +163,12 @@ public abstract class Screen { public abstract String getFQName(); /** - * Return a list of all available {@link MonitorMode}s for all {@link MonitorDevice}s. - *monitorModes = monitor.getSupportedModes(); + monitorModes = MonitorModeUtil.filterByFlags(monitorModes, 0); // no interlace, double-scan etc + monitorModes = MonitorModeUtil.filterByRotation(monitorModes, rot); + monitorModes = MonitorModeUtil.filterByResolution(monitorModes, res); + monitorModes = MonitorModeUtil.filterByRate(monitorModes, freq); + monitorModes = MonitorModeUtil.getHighestAvailableBpp(monitorModes); - NVidia RANDR Rotation: - To enable it, add the following option to your xorg.conf device section: - Option "RandRRotation" "on" + // pick 1st one and set to current .. + MonitorMode mm = monitorModes.get(0); + monitor.setCurrentMode(mm); *
- * If {@link com.jogamp.newt.MonitorMode ScreenMode}s are not supported for this - * native type {@link com.jogamp.newt.Display#getType()}, it returns a list of size one with the current screen size.
+ * Return a list of all {@link MonitorMode}s for all {@link MonitorDevice}s. */ public abstract List- * If {@link com.jogamp.newt.MonitorMode ScreenMode}s are not supported for this - * native type {@link com.jogamp.newt.Display#getType()}, it returns a list of size one with the current screen size.
+ * Return a list of available {@link MonitorDevice}s. */ public abstract List- * This method is called after the ScreenMode has been set or changed, + * This method is called after the MonitorMode has been set or changed, * hence you may utilize it. *
*
@@ -393,7 +393,7 @@ public abstract class ScreenImpl extends Screen implements MonitorModeListener {
final String key = this.getFQName();
final ScreenMonitorState res = ScreenMonitorState.getScreenMonitorState(key);
if(null == res & throwException) {
- throw new InternalError("ScreenMonitorStatus.getScreenModeStatus("+key+") == null");
+ throw new InternalError("ScreenMonitorStatus.getMonitorModeStatus("+key+") == null");
}
return res;
}
@@ -403,8 +403,8 @@ public abstract class ScreenImpl extends Screen implements MonitorModeListener {
if(DEBUG) {
System.err.println("monitorModeChangeNotify: "+me);
}
- for(int i=0; i
* No lock is hold when invoked.
*
* @return true is paused, otherwise false. If true {@link #resumeRenderingAction()} shall be issued.
@@ -264,7 +264,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
boolean pauseRenderingAction();
/**
- * Invoked for expensive modifications, ie while reparenting and ScreenMode change.
+ * Invoked for expensive modifications, ie while reparenting and MonitorMode change.
* No lock is hold when invoked.
*
* @see #pauseRenderingAction()
@@ -311,7 +311,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
}
final long t0 = System.currentTimeMillis();
createNativeImpl();
- screen.addMonitorModeListener(screenModeListenerImpl);
+ screen.addMonitorModeListener(monitorModeListenerImpl);
setTitleImpl(title);
setPointerVisibleImpl(pointerVisible);
confinePointerImpl(pointerConfined);
@@ -937,7 +937,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
}
if( isNativeValid() ) {
- screen.removeMonitorModeListener(screenModeListenerImpl);
+ screen.removeMonitorModeListener(monitorModeListenerImpl);
closeNativeImpl();
final AbstractGraphicsDevice cfgADevice = config.getScreen().getDevice();
if( cfgADevice != screen.getDisplay().getGraphicsDevice() ) { // don't pull display's device
@@ -1962,12 +1962,12 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
}
}
- private class ScreenModeListenerImpl implements MonitorModeListener {
+ private class MonitorModeListenerImpl implements MonitorModeListener {
boolean animatorPaused = false;
public void monitorModeChangeNotify(MonitorEvent me) {
if(DEBUG_IMPLEMENTATION) {
- System.err.println("Window.screenModeChangeNotify: "+me);
+ System.err.println("Window.monitorModeChangeNotify: "+me);
}
if(null!=lifecycleHook) {
@@ -1977,7 +1977,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
public void monitorModeChanged(MonitorEvent me, boolean success) {
if(DEBUG_IMPLEMENTATION) {
- System.err.println("Window.screenModeChanged: "+me+", success: "+success);
+ System.err.println("Window.monitorModeChanged: "+me+", success: "+success);
}
if(success) {
@@ -2007,7 +2007,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer
sendWindowEvent(WindowEvent.EVENT_WINDOW_RESIZED); // trigger a resize/relayout and repaint to listener
}
}
- private final ScreenModeListenerImpl screenModeListenerImpl = new ScreenModeListenerImpl();
+ private final MonitorModeListenerImpl monitorModeListenerImpl = new MonitorModeListenerImpl();
diff --git a/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java
index 803c7e1de..653cbf945 100644
--- a/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/android/WindowDriver.java
@@ -562,7 +562,7 @@ public class WindowDriver extends jogamp.newt.WindowImpl implements Callback2 {
surface=null;
}
if(getScreen().isNativeValid()) {
- // if ScreenMode changed .. trigger ScreenMode event
+ // if MonitorMode changed .. trigger MonitorMode event
final MonitorDevice mainMonitor = getMainMonitor();
mainMonitor.queryCurrentMode();
}
diff --git a/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java
index ba22a6ce4..f2836f190 100644
--- a/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java
@@ -188,7 +188,7 @@ public class ScreenDriver extends ScreenImpl {
}).booleanValue();
if(DEBUG || !done) {
- System.err.println("X11Screen.setCurrentScreenModeImpl: TO ("+SCREEN_MODE_CHANGE_TIMEOUT+") reached: "+
+ System.err.println("X11Screen.setCurrentMonitorModeImpl: TO ("+SCREEN_MODE_CHANGE_TIMEOUT+") reached: "+
(System.currentTimeMillis()-t0)+"ms; "+monitor.getCurrentMode()+" -> "+mode);
}
return done;
diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestScreenMode01aNEWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestScreenMode01aNEWT.java
index 96ada3c96..c638058f4 100644
--- a/src/test/com/jogamp/opengl/test/junit/newt/TestScreenMode01aNEWT.java
+++ b/src/test/com/jogamp/opengl/test/junit/newt/TestScreenMode01aNEWT.java
@@ -155,13 +155,13 @@ public class TestScreenMode01aNEWT extends UITestCase {
Assert.assertNotNull(monitorModes);
Assert.assertTrue(monitorModes.size()>0);
- MonitorMode sm = (MonitorMode) monitorModes.get(0);
- System.err.println("[0] set current: "+sm);
- Assert.assertTrue(monitor.setCurrentMode(sm));
+ MonitorMode mm = monitorModes.get(0);
+ System.err.println("[0] set current: "+mm);
+ Assert.assertTrue(monitor.setCurrentMode(mm));
Assert.assertTrue(monitor.isModeChangedByUs());
- Assert.assertEquals(sm, monitor.getCurrentMode());
+ Assert.assertEquals(mm, monitor.getCurrentMode());
Assert.assertNotSame(mmOrig, monitor.getCurrentMode());
- Assert.assertEquals(sm, monitor.queryCurrentMode());
+ Assert.assertEquals(mm, monitor.queryCurrentMode());
Thread.sleep(waitTimeShort);
@@ -176,7 +176,7 @@ public class TestScreenMode01aNEWT extends UITestCase {
Assert.assertTrue(monitor.setCurrentMode(mmOrig));
Assert.assertFalse(monitor.isModeChangedByUs());
Assert.assertEquals(mmOrig, monitor.getCurrentMode());
- Assert.assertNotSame(sm, monitor.getCurrentMode());
+ Assert.assertNotSame(mm, monitor.getCurrentMode());
Assert.assertEquals(mmOrig, monitor.queryCurrentMode());
destroyWindow(window0);
--
cgit v1.2.3