From: <eli...@us...> - 2008-04-12 21:45:11
|
Revision: 3010 http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3010&view=rev Author: elias_naur Date: 2008-04-12 14:45:04 -0700 (Sat, 12 Apr 2008) Log Message: ----------- Linux: More focus fixes for the applet (XEmbed) case Modified Paths: -------------- trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2008-04-12 20:45:43 UTC (rev 3009) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2008-04-12 21:45:04 UTC (rev 3010) @@ -43,6 +43,8 @@ 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; @@ -126,10 +128,27 @@ private boolean parent_focus_window_valid; private long parent_window; private boolean xembedded; + private boolean parent_focused; + private boolean parent_focus_changed; private LinuxKeyboard keyboard; private LinuxMouse mouse; + private final FocusListener focus_listener = new FocusListener() { + public final void focusGained(FocusEvent e) { + synchronized (GlobalLock.lock) { + parent_focused = true; + parent_focus_changed = true; + } + } + public final void focusLost(FocusEvent e) { + synchronized (GlobalLock.lock) { + parent_focused = false; + parent_focus_changed = true; + } + } + }; + private static ByteBuffer getCurrentGammaRamp() throws LWJGLException { lockAWT(); try { @@ -395,6 +414,9 @@ 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.addFocusListener(focus_listener); + parent_focused = parent.isFocusOwner(); + parent_focus_changed = true; parent_window = getHandle(parent); changeSaveSet(getDisplay(), current_window, SetModeInsert, SaveSetRoot, SaveSetUnmap); reparentWindow(getDisplay(), current_window, parent_window, x, y); @@ -464,6 +486,8 @@ public void destroyWindow() { lockAWT(); try { + if (parent != null) + parent.removeFocusListener(focus_listener); try { setNativeCursor(null); } catch (LWJGLException e) { @@ -819,21 +843,23 @@ unlockAWT(); } } - + private void checkInput() { - if (parent == null) + if (parent == null || !parent_focus_changed) return; if (focused) { - if (xembedded && !parent.isFocusOwner() && parent_focus_window_valid) { + if (xembedded && !parent_focused && parent_focus_window_valid) { setInputFocusUnsafe(parent_focus_window); + parent_focus_changed = false; } } else { - if (parent.isFocusOwner()) { + if (parent_focused) { if (xembedded) { parent_focus_window = nGetInputFocus(getDisplay()); parent_focus_window_valid = true; } setInputFocusUnsafe(getWindow()); + parent_focus_changed = false; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |