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