added new XRandR stuff

fixed credits doc a bit
This commit is contained in:
Brian Matzon 2010-03-08 21:29:32 +00:00
parent c447ec66a6
commit 0eed407ef8
3 changed files with 275 additions and 10 deletions

View File

@ -1,11 +1,8 @@
The following people have helped to make this project what it is today:
active developers:
- Caspian Rychlik-Prince <cprince@shavenpuppy.com>
- Brian Matzon <brian@matzon.dk>
- Elias Naur <elias.naur@gmail.com>
- Ioannis Tsakpinis <spasi@users.sourceforge.net>
contributors:
- Niels Jørgensen <nj@niemo.com>
- Tristan Campbell <tristan@happypedestrian.com>
- Gregory Pierce <gregorypierce@yahoo.com>
@ -16,6 +13,8 @@ contributors:
- Kevin Glass <kevin@cokeandcode.com>
- Atsuya Takagi
- kappaOne
- Simon Felix
- Ryan McNally
additional credits goes to:
- Joseph I. Valenzuela [OpenAL stuff]
@ -26,6 +25,7 @@ The LWJGL project includes files from or depends on the following projects:
- OpenAL, Creative Labs - http://openal.org/
- jinput, Sun - https://jinput.dev.java.net/
- lzma, p7zip - http://p7zip.sourceforge.net/
- JOGL, Sun - http://kenai.com/projects/jogl/pages/Home
Please see the /doc/3rdparty/ directory for licenses.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002-2008 LWJGL Project
* Copyright (c) 2002-2010 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -38,17 +38,15 @@ package org.lwjgl.opengl;
* @author elias_naur
*/
import java.awt.Canvas;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.awt.Canvas;
import java.awt.event.FocusListener;
import java.awt.event.FocusEvent;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.LWJGLUtil;
import org.lwjgl.opengl.XRandR.Screen;
final class LinuxDisplay implements DisplayImplementation {
/* X11 constants */
@ -113,6 +111,8 @@ final class LinuxDisplay implements DisplayImplementation {
/** Saved mode to restore with */
private DisplayMode saved_mode;
private DisplayMode current_mode;
private Screen[] savedXrandrConfig;
private boolean keyboard_grabbed;
private boolean pointer_grabbed;
@ -522,7 +522,14 @@ final class LinuxDisplay implements DisplayImplementation {
public void resetDisplayMode() {
lockAWT();
try {
switchDisplayMode(saved_mode);
if( current_displaymode_extension == XRANDR && savedXrandrConfig.length > 0 )
{
XRandR.setConfiguration( savedXrandrConfig );
}
else
{
switchDisplayMode(saved_mode);
}
if (isXF86VidModeSupported())
doSetGamma(saved_gamma);
} catch (LWJGLException e) {
@ -608,6 +615,7 @@ final class LinuxDisplay implements DisplayImplementation {
throw new LWJGLException("No modes available");
switch (current_displaymode_extension) {
case XRANDR:
savedXrandrConfig = XRandR.getConfiguration();
saved_mode = getCurrentXRandrMode();
break;
case XF86VIDMODE:
@ -880,7 +888,14 @@ final class LinuxDisplay implements DisplayImplementation {
if (current_window_mode == FULLSCREEN_NETWM) {
nIconifyWindow(getDisplay(), getWindow(), getDefaultScreen());
try {
switchDisplayModeOnTmpDisplay(saved_mode);
if( current_displaymode_extension == XRANDR && savedXrandrConfig.length > 0 )
{
XRandR.setConfiguration( savedXrandrConfig );
}
else
{
switchDisplayModeOnTmpDisplay(saved_mode);
}
setGammaRampOnTmpDisplay(saved_gamma);
} catch (LWJGLException e) {
LWJGLUtil.log("Failed to restore saved mode: " + e.getMessage());

View File

@ -0,0 +1,250 @@
/*
* Copyright (c) 2002-2010 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opengl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* Utility for working with the xrandr commmand-line utility. Assumes
* xrandr v1.2 or higher.
*
* @author ryanm
*/
public class XRandR {
private static Screen[] current;
private static Map /* <String, Screen[]> */screens;
private static void populate() {
if (screens == null) {
screens = new HashMap/* <String, Screen[]> */();
// ProcessBuilder pb = new ProcessBuilder( "xrandr", "-q" );
// pb.redirectErrorStream();
try {
// Process p= pb.start();
Process p = Runtime.getRuntime().exec(new String[] { "xrandr", "-q"});
List/* <Screen> */currentList = new ArrayList/* <Screen> */();
List/* <Screen> */possibles = new ArrayList/* <Screen> */();
String name = null;
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
line = line.trim();
String[] sa = line.split("\\s+");
if (sa[1].equals("connected")) {
// found a new screen block
if (name != null) {
screens.put(name, possibles.toArray(new Screen[possibles.size()]));
possibles.clear();
}
name = sa[0];
// record the current config
currentList.add(new Screen(name, sa[2]));
} else if (Pattern.matches("\\d*x\\d*", sa[0])) {
// found a new mode line
possibles.add(new Screen(name, sa[0]));
}
}
screens.put(name, possibles.toArray(new Screen[possibles.size()]));
current = (Screen[]) currentList.toArray(new Screen[currentList.size()]);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @return The current screen configuration, or an empty array if
* xrandr is not supported
*/
public static Screen[] getConfiguration() {
populate();
return (Screen[]) current.clone();
}
/**
* @param screens
* The desired screen set, may not be <code>null</code>
*/
public static void setConfiguration(Screen[]/* ... */screens) {
if (screens.length == 0) {
throw new IllegalArgumentException("Must specify at least one screen");
}
List/* <String> */cmd = new ArrayList/* <String> */();
cmd.add("xrandr");
// switch off those in the current set not in the new set
for (int i = 0; i < current.length; i++) {
boolean found = false;
for (int j = 0; j < screens.length; j++) {
if (screens[j].name.equals(current[i].name)) {
found = true;
break;
}
}
if (!found) {
cmd.add("--output");
cmd.add(current[i].name);
cmd.add("--off");
}
}
// set up new set
for (int i = 0; i < screens.length; i++) {
screens[i].getArgs(cmd);
}
try {
// ProcessBuilder pb = new ProcessBuilder( cmd );
// pb.redirectErrorStream();
// Process p = pb.start();
Process p = Runtime.getRuntime().exec((String[]) cmd.toArray(new String[cmd.size()]));
// no output is expected, but check anyway
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
current = screens;
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @return the name of connected screens, or an empty array if
* xrandr is not supported
*/
public static String[] getScreenNames() {
populate();
return (String[]) screens.keySet().toArray(new String[screens.size()]);
}
/**
* @param name
* @return the possible resolutions of the named screen, or
* <code>null</code> if there is no such screen
*/
public static Screen[] getResolutions(String name) {
populate();
// clone the array to prevent held copies being altered
return (Screen[]) ((Screen[]) screens.get(name)).clone();
}
/**
* Encapsulates the configuration of a monitor. Resolution is
* fixed, position is mutable
*
* @author ryanm
*/
public static class Screen implements Cloneable {
/**
* Name for this output
*/
public final String name;
/**
* Width in pixels
*/
public final int width;
/**
* Height in pixels
*/
public final int height;
/**
* Position on the x-axis, in pixels
*/
public int xPos = 0;
/**
* Position on the y-axis, in pixels
*/
public int yPos = 0;
/**
* @param name
* name of the screen
* @param conf
* config string, format either widthxheight or
* widthxheight+xPos+yPos
*/
private Screen(String name, String conf) {
this.name = name;
String[] sa = conf.split("\\D");
width = Integer.parseInt(sa[0]);
height = Integer.parseInt(sa[1]);
if (sa.length > 2) {
xPos = Integer.parseInt(sa[2]);
yPos = Integer.parseInt(sa[3]);
}
}
private void getArgs(List/* <String> */argList) {
argList.add("--output");
argList.add(name);
argList.add("--mode");
argList.add(width + "x" + height);
argList.add("--pos");
argList.add(xPos + "x" + yPos);
}
// @Override
public String toString() {
return name + " " + width + "x" + height + " @ " + xPos + "x" + yPos;
}
}
}