From: <ka...@us...> - 2009-03-11 21:05:32
|
Revision: 3177 http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3177&view=rev Author: kappa1 Date: 2009-03-11 21:05:05 +0000 (Wed, 11 Mar 2009) Log Message: ----------- Improved focus handling for Display.setParent() on linux. Focus is now released from Display when X fires a focus change event. 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 2009-03-10 15:34:38 UTC (rev 3176) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2009-03-11 21:05:05 UTC (rev 3177) @@ -125,8 +125,6 @@ private long current_cursor; private long blank_cursor; private Canvas parent; - private long parent_focus_window; - private boolean parent_focus_window_valid; private long parent_window; private boolean xembedded; private boolean parent_focused; @@ -432,7 +430,6 @@ mapRaised(getDisplay(), current_window); xembedded = parent != null && isAncestorXEmbedded(parent_window); blank_cursor = createBlankCursor(); - parent_focus_window_valid = false; current_cursor = None; focused = false; input_released = false; @@ -858,22 +855,14 @@ private void checkInput() { if (parent == null || !parent_focus_changed) return; - if (focused) { - if (xembedded && !parent_focused && parent_focus_window_valid) { - if (nGetInputFocus(getDisplay()) != current_window) { - setInputFocusUnsafe(parent_focus_window); - parent_focus_changed = false; - } + + if (!focused && parent_focused) { + if (xembedded) { + // disable parent from taking focus back from Display when it is clicked + parent.setFocusable(false); } - } else { - if (parent_focused) { - if (xembedded) { - parent_focus_window = nGetInputFocus(getDisplay()); - parent_focus_window_valid = true; - } - setInputFocusUnsafe(getWindow()); - parent_focus_changed = false; - } + setInputFocusUnsafe(getWindow()); + parent_focus_changed = false; } } @@ -881,10 +870,21 @@ if (focused == got_focus || focus_detail == NotifyDetailNone || focus_detail == NotifyPointer || focus_detail == NotifyPointerRoot) return; focused = got_focus; + + if (parent != null && xembedded && focused != parent.hasFocus()) { + return; + } + if (focused) { acquireInput(); } else { releaseInput(); + + if (parent != null && xembedded) { + setInputFocusUnsafe(0); + // re-enable parent focus to detect click on window + parent.setFocusable(true); + } } } static native long nGetInputFocus(long display); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |