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. |