Linux AWT: in case we're not on a SUN jdk, try to determine values instead of bombing out. This should help us compile and run on gcj
This commit is contained in:
parent
4a85362ccb
commit
aef35ae0ed
|
@ -34,6 +34,7 @@ package org.lwjgl.opengl;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
import org.lwjgl.LWJGLException;
|
import org.lwjgl.LWJGLException;
|
||||||
|
import org.lwjgl.LWJGLUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* $Id$
|
* $Id$
|
||||||
|
@ -50,7 +51,12 @@ final class LinuxAWTGLCanvasPeerInfo extends LinuxPeerInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void doLockAndInitHandle() throws LWJGLException {
|
protected void doLockAndInitHandle() throws LWJGLException {
|
||||||
int screen = LinuxCanvasImplementation.getScreenFromDevice(canvas.getGraphicsConfiguration().getDevice());
|
int screen = -1;
|
||||||
|
try {
|
||||||
|
screen = LinuxCanvasImplementation.getScreenFromDevice(canvas.getGraphicsConfiguration().getDevice());
|
||||||
|
} catch (LWJGLException e) {
|
||||||
|
LWJGLUtil.log("Got exception while trying to determine screen: " + e);
|
||||||
|
}
|
||||||
nInitHandle(screen, awt_surface.lockAndGetHandle(canvas), getHandle());
|
nInitHandle(screen, awt_surface.lockAndGetHandle(canvas), getHandle());
|
||||||
}
|
}
|
||||||
private static native void nInitHandle(int screen, ByteBuffer surface_buffer, ByteBuffer peer_info_handle) throws LWJGLException;
|
private static native void nInitHandle(int screen, ByteBuffer surface_buffer, ByteBuffer peer_info_handle) throws LWJGLException;
|
||||||
|
|
|
@ -36,6 +36,7 @@ import java.awt.GraphicsDevice;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import org.lwjgl.LWJGLException;
|
import org.lwjgl.LWJGLException;
|
||||||
|
import org.lwjgl.LWJGLUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* $Id$
|
* $Id$
|
||||||
|
@ -74,6 +75,7 @@ final class LinuxCanvasImplementation implements AWTCanvasImplementation {
|
||||||
* @return The GraphicsConfiguration corresponding to a visual that matches the pixel format.
|
* @return The GraphicsConfiguration corresponding to a visual that matches the pixel format.
|
||||||
*/
|
*/
|
||||||
public GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException {
|
public GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException {
|
||||||
|
try {
|
||||||
int screen = getScreenFromDevice(device);
|
int screen = getScreenFromDevice(device);
|
||||||
int visual_id_matching_format = findVisualIDFromFormat(screen, pixel_format);
|
int visual_id_matching_format = findVisualIDFromFormat(screen, pixel_format);
|
||||||
GraphicsConfiguration[] configurations = device.getConfigurations();
|
GraphicsConfiguration[] configurations = device.getConfigurations();
|
||||||
|
@ -82,7 +84,10 @@ final class LinuxCanvasImplementation implements AWTCanvasImplementation {
|
||||||
if (visual_id == visual_id_matching_format)
|
if (visual_id == visual_id_matching_format)
|
||||||
return configurations[i];
|
return configurations[i];
|
||||||
}
|
}
|
||||||
throw new LWJGLException("Could not find the matching GraphicsConfiguration to visual id");
|
} catch (LWJGLException e) {
|
||||||
|
LWJGLUtil.log("Got exception while trying to determine configuration: " + e);
|
||||||
|
}
|
||||||
|
return null; // In case we failed to locate the visual, or if we're not on a SUN JDK
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int findVisualIDFromFormat(int screen, PixelFormat pixel_format) throws LWJGLException {
|
private static int findVisualIDFromFormat(int screen, PixelFormat pixel_format) throws LWJGLException {
|
||||||
|
|
|
@ -58,7 +58,7 @@ final class Win32CanvasImplementation implements AWTCanvasImplementation {
|
||||||
*/
|
*/
|
||||||
public GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException {
|
public GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException {
|
||||||
/*
|
/*
|
||||||
* It seems like the best way is to simply return null and let
|
* It seems like the best way is to simply return null and
|
||||||
* use SetPixelFormat in JNI later.
|
* use SetPixelFormat in JNI later.
|
||||||
*/
|
*/
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -60,6 +60,22 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo_nInitHandl
|
||||||
// Get the platform-specific drawing info
|
// Get the platform-specific drawing info
|
||||||
JAWT_X11DrawingSurfaceInfo *dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)awt_lock->dsi->platformInfo;
|
JAWT_X11DrawingSurfaceInfo *dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)awt_lock->dsi->platformInfo;
|
||||||
|
|
||||||
|
// If we couldn't get a screen from java side, attempt to determine a sane screen
|
||||||
|
// from the information we do have, namely the visualid and the depth
|
||||||
|
if (screen == -1) {
|
||||||
|
XVisualInfo template;
|
||||||
|
int num_infos;
|
||||||
|
template.visualid = dsi_x11->visualID;
|
||||||
|
template.depth = dsi_x11->depth;
|
||||||
|
XVisualInfo *vis_info = XGetVisualInfo(peer_info->display, VisualIDMask | VisualDepthMask, &template, &num_infos);
|
||||||
|
if (vis_info == NULL) {
|
||||||
|
throwException(env, "Could not determine screen");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
screen = vis_info[0].screen;
|
||||||
|
XFree(vis_info);
|
||||||
|
}
|
||||||
|
|
||||||
peer_info->display = dsi_x11->display;
|
peer_info->display = dsi_x11->display;
|
||||||
peer_info->screen = screen;
|
peer_info->screen = screen;
|
||||||
peer_info->drawable = dsi_x11->drawable;
|
peer_info->drawable = dsi_x11->drawable;
|
||||||
|
|
Loading…
Reference in New Issue