parent
c447ec66a6
commit
0eed407ef8
|
@ -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.
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue