|
From: <eli...@us...> - 2008-04-12 20:40:29
|
Revision: 3008
http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3008&view=rev
Author: elias_naur
Date: 2008-04-12 13:40:27 -0700 (Sat, 12 Apr 2008)
Log Message:
-----------
Linux: Added support for XFixesChangeSaveSet to increase robustness of parented mode
Modified Paths:
--------------
trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java
trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c
Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2008-04-12 20:07:23 UTC (rev 3007)
+++ trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2008-04-12 20:40:27 UTC (rev 3008)
@@ -68,6 +68,9 @@
private final static int NotifyPointerRoot = 6;
private final static int NotifyDetailNone = 7;
+ private final static int SetModeInsert = 0;
+ private final static int SaveSetRoot = 1;
+ private final static int SaveSetUnmap = 1;
/** Window mode enum */
private static final int FULLSCREEN_LEGACY = 1;
@@ -382,13 +385,21 @@
try {
incDisplay();
try {
+ if (parent != null && !hasXFixes(getDisplay(), 1))
+ throw new LWJGLException("No XFixes extension available");
ByteBuffer handle = peer_info.lockAndGetHandle();
try {
current_window_mode = getWindowMode(fullscreen);
boolean undecorated = Display.getPrivilegedBoolean("org.lwjgl.opengl.Window.undecorated") || current_window_mode != WINDOWED;
this.parent = parent;
- parent_window = parent != null ? getHandle(parent) : getRootWindow(getDisplay(), getDefaultScreen());
- current_window = nCreateWindow(getDisplay(), getDefaultScreen(), handle, mode, current_window_mode, x, y, undecorated, parent_window);
+ long root_window = getRootWindow(getDisplay(), getDefaultScreen());
+ current_window = nCreateWindow(getDisplay(), getDefaultScreen(), handle, mode, current_window_mode, x, y, undecorated, root_window);
+ if (parent != null) {
+ parent_window = getHandle(parent);
+ changeSaveSet(getDisplay(), current_window, SetModeInsert, SaveSetRoot, SaveSetUnmap);
+ reparentWindow(getDisplay(), current_window, parent_window, x, y);
+ }
+ mapRaised(getDisplay(), current_window);
xembedded = parent != null && isAncestorXEmbedded(parent_window);
blank_cursor = createBlankCursor();
parent_focus_window_valid = false;
@@ -416,6 +427,10 @@
private static native long getRootWindow(long display, int screen);
private static native boolean hasProperty(long display, long window, long property);
private static native long getParentWindow(long display, long window) throws LWJGLException;
+ private static native void mapRaised(long display, long window);
+ private static native boolean hasXFixes(long display, int major);
+ private static native void reparentWindow(long display, long window, long parent, int x, int y);
+ private static native void changeSaveSet(long display, long window, int mode, int target, int map);
private boolean isAncestorXEmbedded(long window) throws LWJGLException {
long xembed_atom = internAtom("_XEMBED_INFO", true);
Modified: trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c
===================================================================
--- trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c 2008-04-12 20:07:23 UTC (rev 3007)
+++ trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c 2008-04-12 20:40:27 UTC (rev 3008)
@@ -43,6 +43,7 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/xf86vmode.h>
+#include <X11/extensions/Xfixes.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
@@ -326,7 +327,6 @@
XChangeProperty(disp, win, XInternAtom(disp, "_NET_WM_STATE", False),
XInternAtom(disp, "ATOM", False), 32, PropModeReplace, (const unsigned char*)&fullscreen_atom, 1);
}
- XMapRaised(disp, win);
if (!checkXError(env, disp)) {
destroyWindow(env, disp, win);
return 0;
@@ -334,6 +334,36 @@
return win;
}
+JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_reparentWindow(JNIEnv *env, jclass unused, jlong display, jlong window_ptr, jlong parent_ptr, jint x, jint y) {
+ Display *disp = (Display *)(intptr_t)display;
+ Window window = (Window)window_ptr;
+ Window parent = (Window)parent_ptr;
+ XReparentWindow(disp, window, parent, x, y);
+}
+
+JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_hasXFixes(JNIEnv *env, jclass unused, jlong display, jint major_requested) {
+ Display *disp = (Display *)(intptr_t)display;
+ int event, error;
+ if (!XFixesQueryExtension(disp, &event, &error))
+ return JNI_FALSE;
+ int major, minor;
+ if (!XFixesQueryVersion(disp, &major, &minor))
+ return JNI_FALSE;
+ return major >= major_requested ? JNI_TRUE : JNI_FALSE;
+}
+
+JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_mapRaised(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) {
+ Display *disp = (Display *)(intptr_t)display;
+ Window window = (Window)window_ptr;
+ XMapRaised(disp, window);
+}
+
+JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_changeSaveSet(JNIEnv *env, jclass unused, jlong display, jlong window_ptr, jint mode, jint target, jint map) {
+ Display *disp = (Display *)(intptr_t)display;
+ Window window = (Window)window_ptr;
+ XFixesChangeSaveSet(disp, window, mode, target, map);
+}
+
JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getParentWindow(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) {
Display *disp = (Display *)(intptr_t)display;
Window window = (Window)window_ptr;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|