Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
This http://code.google.com/p/xmonad/issues/detail?id=177 xmonad bug report is probably relevant. Preventing XSetInputFocus to be called on windows with WM_TAKE_FOCUS set seems to fix the issue for me (ion3plus, sun-java-6) I will run with the change for a while and see if it breaks other apps. (and possible test other java versions) On Thu, 15 Jan 2009 10:35:49 +0100, Daniel Clemente wrote: Hi, sorry if this message comes twice (I posted yesterday via NNTP without being subscribed to the list). ion3 is stealing keyboard focus to Swing applications. This happens for instance with Netbeans 6.5: 1. Open netbeans and some other programs in tabs next to it. 2. Select netbeans and open an editor with some code; the cursor is inside the editor 3. Select another tab (either clicking teh tab or with keyboard). 4. Select netbeans again (either clicking the tab or with keyboard). 5. Try to continue typing, but you can't. The cursor is nowhere, and *no key* works (space, cursors, A-S-o, ... all gone). You must click again in the editor and then you can type again. In fact any Swing application has this problem. You can use this one to test: --- TypeInSwing.java import javax.swing.JFrame; import javax.swing.JTextField; public class TypeInSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JTextField field = new JTextField("type here"); frame.getContentPane().add(field); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } -- It happens with latest version 20090110 (with 20080207 too). I am using: $ java -version java version "1.6.0_06" Java(TM) SE Runtime Environment (build 1.6.0_06-b02) Java HotSpot(TM) Server VM (build 10.0-b22, mixed mode) Why is it so? Daniel -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/ java-focus.patch Description: Binary data
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
Sorry for the long wait; I had other compilation problems (I inform briefly about that). > You could, again, try reversing the order of the > finalise_focus and > sendmsg in the TAKE_FOCUS branch of the clientwin focus > function. > That didn't work; with JDK 1.7 it still fails. It must be due to something new of JDK 1.7 since earlier versions work now. Your patch fixed the focus loss in Java 1.6 but makes Java 1.7 applications not receive focus; it is a bug for a bug but I think Java 1.6 apps are more important right now; so I will start using it. -- Daniel
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
On 2009-02-09, Daniel Clemente wrote: > Well, it improved lots of things. It works perfectly with gtk, qt, tk, > keyboard, mouse, ⦠The example code now works when I use Java > 1.6.0_12-b04. But if I compile and run it with the unreleased > 1.7.0-ea-b43, the focus is still buggy: You could, again, try reversing the order of the finalise_focus and sendmsg in the TAKE_FOCUS branch of the clientwin focus function. -- Stop Gnomes and other pests! Purchase Windows today!
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
> > Try the attached patch. (Disclaimer: I haven't particularly tried it; > just quickly threw it together.) Well, it improved lots of things. It works perfectly with gtk, qt, tk, keyboard, mouse, … The example code now works when I use Java 1.6.0_12-b04. But if I compile and run it with the unreleased 1.7.0-ea-b43, the focus is still buggy: not only the text field misses focus after going to that window, but also I can't restore the focus to the text field even if I click into it many times. Even with JDK 1.7, this doesn't happen in other window managers (I tried wmaker).
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
On 2009-02-08 21:52 +0100, Daniel Clemente wrote: > > Hi; thanks for the helpful explanations. > > I tried doing that change and it stayed the same. I also tried doing a > sleep(2) before sending the WM_TAKE_FOCUS (with the +2s timestamp), but > without success. > > What did work is this: Try the attached patch. (Disclaimer: I haven't particularly tried it; just quickly threw it together.) -- Stop Gnomes and other pests! Purchase Windows today! diff -rN -u old-ion-3/ioncore/clientwin.c new-ion-3/ioncore/clientwin.c --- old-ion-3/ioncore/clientwin.c 2009-02-09 00:35:07.380883290 +0200 +++ new-ion-3/ioncore/clientwin.c 2009-02-09 00:35:07.488878930 +0200 @@ -1015,10 +1015,11 @@ { if(cwin->flags&CLIENTWIN_P_WM_TAKE_FOCUS){ Time stmp=ioncore_get_timestamp(); +region_finalise_focusing((WRegion*)cwin, cwin->win, warp, stmp); send_clientmsg(cwin->win, ioncore_g.atom_wm_take_focus, stmp); +}else{ +region_finalise_focusing((WRegion*)cwin, cwin->win, warp, CurrentTime); } - -region_finalise_focusing((WRegion*)cwin, cwin->win, warp); XSync(ioncore_g.dpy, 0); } diff -rN -u old-ion-3/ioncore/focus.c new-ion-3/ioncore/focus.c --- old-ion-3/ioncore/focus.c 2009-02-09 00:35:07.368883774 +0200 +++ new-ion-3/ioncore/focus.c 2009-02-09 00:35:07.484879092 +0200 @@ -347,7 +347,7 @@ /*Time ioncore_focus_time=CurrentTime;*/ -void region_finalise_focusing(WRegion* reg, Window win, bool warp) +void region_finalise_focusing(WRegion* reg, Window win, bool warp, Time time) { if(warp) region_do_warp(reg); @@ -356,10 +356,7 @@ return; region_set_await_focus(reg); -/*xwindow_do_set_focus(win);*/ -XSetInputFocus(ioncore_g.dpy, win, RevertToParent, - CurrentTime/*ioncore_focus_time*/); -/*ioncore_focus_time=CurrentTime;*/ +XSetInputFocus(ioncore_g.dpy, win, RevertToParent, time); } diff -rN -u old-ion-3/ioncore/focus.h new-ion-3/ioncore/focus.h --- old-ion-3/ioncore/focus.h 2009-02-09 00:35:07.368883774 +0200 +++ new-ion-3/ioncore/focus.h 2009-02-09 00:35:07.484879092 +0200 @@ -23,7 +23,7 @@ extern void region_warp(WRegion *reg); /* maybewarp TRUE */ extern void region_set_focus(WRegion *reg); /* maybewarp FALSE */ -extern void region_finalise_focusing(WRegion* reg, Window win, bool warp); +extern void region_finalise_focusing(WRegion* reg, Window win, bool warp, Time time); DYNFUN void region_do_set_focus(WRegion *reg, bool warp); extern void region_do_warp(WRegion *reg); diff -rN -u old-ion-3/ioncore/group.c new-ion-3/ioncore/group.c --- old-ion-3/ioncore/group.c 2009-02-09 00:35:07.272887653 +0200 +++ new-ion-3/ioncore/group.c 2009-02-09 00:35:07.460880061 +0200 @@ -241,7 +241,7 @@ if(st!=NULL && st->reg!=NULL) region_do_set_focus(st->reg, warp); else -region_finalise_focusing((WRegion*)ws, ws->dummywin, warp); +region_finalise_focusing((WRegion*)ws, ws->dummywin, warp, CurrentTime); } diff -rN -u old-ion-3/ioncore/window.c new-ion-3/ioncore/window.c --- old-ion-3/ioncore/window.c 2009-02-09 00:35:07.332885230 +0200 +++ new-ion-3/ioncore/window.c 2009-02-09 00:35:07.480879252 +0200 @@ -182,7 +182,7 @@ void window_do_set_focus(WWindow *wwin, bool warp) { -region_finalise_focusing((WRegion*)wwin, wwin->win, warp); +region_finalise_focusing((WRegion*)wwin, wwin->win, warp, CurrentTime); } diff -rN -u old-ion-3/mod_tiling/tiling.c new-ion-3/mod_tiling/tiling.c --- old-ion-3/mod_tiling/tiling.c 2009-02-09 00:35:07.124893627 +0200 +++ new-ion-3/mod_tiling/tiling.c 2009-02-09 00:35:07.416881837 +0200 @@ -158,7 +158,7 @@ void tiling_fallback_focus(WTiling *ws, bool warp) { -region_finalise_focusing((WRegion*)ws, ws->dummywin, warp); +region_finalise_focusing((WRegion*)ws, ws->dummywin, warp, CurrentTime); }
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
Hi; thanks for the helpful explanations. I tried doing that change and it stayed the same. I also tried doing a sleep(2) before sending the WM_TAKE_FOCUS (with the +2s timestamp), but without success. What did work is this: static void clientwin_do_set_focus(WClientWin *cwin, bool warp) { if(cwin->flags&CLIENTWIN_P_WM_TAKE_FOCUS){ Time stmp=ioncore_get_timestamp(); send_clientmsg(cwin->win, ioncore_g.atom_wm_take_focus, stmp); } else { region_finalise_focusing((WRegion*)cwin, cwin->win, warp); } XSync(ioncore_g.dpy, 0); } I just added the „else“ keyword so that region_finalise_focusing is not called if the WM_TAKE_FOCUS is sent. I don't know the meaning of this, but only that it solves all problems with Netbeans and my example Swing application. Focus is set to the last active widget. This, however, makes Konqueror 4 stop receiving focus. This makes me think: - Konqueror has flag CLIENTWIN_P_WM_TAKE_FOCUS and apparently needs both the WM_TAKE_FOCUS call and the region_finalise_focusing - Netbeans/Swing also has flag CLIENTWIN_P_WM_TAKE_FOCUS, but if you run the region_finalise_focusing code on it, it loses focus Maybe region_finalise_focusing should sometimes be doing nothing in windows like Netbeans. Or maybe Swing should be correctly handling the XSetInputFocus(ioncore_g.dpy, win, RevertToParent, CurrentTime) in region_finalise_focusing. It is exactly at that XSetInputFocus where the text field at the Swing application loses the keyboard focus (I tested it inserting sleeps between calls). I filed this bug to Sun but I don't know whether they think the bug is in JDK. The bug report is at http://bugs.sun.com/view_bug.do?bug_id=6798064 Greetings, Daniel
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
On 2009-01-21, Daniel Clemente wrote: > So the focus problem seems to be a regression introduced in version 1.6 > of Java and still not corrected... Or maybe it is indeed a bug in ion3; > since other window managers (ex: icewm) do work with Java 1.6. It seems that at most it could be related to different interpretations of the ICCCM that's a bit vague at this point, race conditions, etc. One possible problem is the handling of the WM_TAKE_FOCUS call, although most "modern" toolkits just seem to ignore X focus for any widgets, and do their own complicated buggy focus tracking, (cause of the legendary firefox/gtk focus bug that took years to fix, and only by an Ion user, not the gtk lamers) so WM_TAKE_FOCUS should pretty much be ignored. Try moving the region_finalise_focusing call to the beginning of clientwin_do_set_focus. This could help -- and seems to be the more logical order of the calls -- but it will probably break some other applications. The ICCCM doesn't seem to specify in which order the WM should set the focus to the application top level window, and send the WM_TAKE_FOCUS message that tells the client to give the focus to a more specific widget. Also, since there's no (simple) way to coordinate the timestamp of the actual focus change call with Xlib, and the timestamp for the client message has to be obtained by a hack, this could cause problems. Probably it won't help, and will break other things, but it seems worth a try. -- Be an early adopter! Beat the herd! Choose Windows today!
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
Daniel Clemente writes: > > I will check it again in other systems. Hi, I tried it with Sun's Java 1.6.0_10 on Debian (another machine). The bug is still present. However, on the same machine, Sun's Java 1.5.0_16-b02 makes my example work as expected (focus is not lost). And with libgcj... well, the example didn't work correctly and I didn't see the text field. My version: java version "1.5.0" gij (GNU libgcj) version 4.3.3 20090110 (prerelease) With OpenJDK 1.6.0_0-b11, the bug shows up. With the unreleased Java 1.7.0-ea-b43, the same (bug present). So the focus problem seems to be a regression introduced in version 1.6 of Java and still not corrected... Or maybe it is indeed a bug in ion3; since other window managers (ex: icewm) do work with Java 1.6. In any case, I sent this bug to Java (sorry, it's not public yet). I will report progress here. -- Daniel
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
On 2009-01-16, Daniel Clemente wrote: > I was using Ubuntu GNU/Linux 8.04.1 with these packages: > > ii sun-java6-bin 6-06-0ubuntu1 Sun Java(TM) > Runtime Environment (JRE) 6 (architecture dependent fil Etch, sun-java5-bin. Also, just now whatever they've got on this FC4. ( $ java --version java version "1.4.2" gij (GNU libgcj) version 4.0.2 20051125 (Red Hat 4.0.2-8) ) -- "[Fashion] is usually a form of ugliness so intolerable that we have to alter it every six months." -- Oscar Wilde "The computer industry is the only industry that is more fashion-driven than women's fashion." -- RMS
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
Tuomo Valkonen writes: > On 2009-01-15, Daniel Clemente wrote: >> In fact any Swing application has this problem. > > Tried; works for me. I was using Ubuntu GNU/Linux 8.04.1 with these packages: ii linux-image-generic2.6.24.21.23 Generic Linux kernel image ii sun-java6-bin 6-06-0ubuntu1 Sun Java(TM) Runtime Environment (JRE) 6 (architecture dependent fil ii xorg 1:7.3+10ubuntu10.2 X.Org X Window System I will check it again in other systems.
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
On 2009-01-15, Daniel Clemente wrote: > In fact any Swing application has this problem. Tried; works for me. -- Be an early adopter! Beat the herd! Choose Windows today!
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
> Java on Linux is pain But the MacOS JVM sucks, the Windows ecosystem makes Java not portable, the "exotic platforms" Java Editions lacks the libraries (not portable again), and Java for the web was stillborn, dead, resurrected and will keep being a zombie. "Java is pain" is enough. -- Sylvain Abélard "J'ai décidé d'être heureux, c'est meilleur pour la santé." -Voltaire
Re: Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
On 2009-01-15, Daniel Clemente wrote: > In fact any Swing application has this problem. You can use this one to test: CBA going through all the trouble of installing java compilers and whatever dependencies there may be. Java on Linux is pain; already been too much trouble installing the VM back in the day. > Why is it so? Probably because Swing is crap and sets the focus somewhere where it shouldn't be -- in violation of the ICCCM. X doesn't forward focus changes to the WM is requests, but rather obeys each and every one (unless the target window is hidden, etc.), so the WM should have to start fighting agianst them. -- In 1995, Linux was almost a bicycle; an alternative way of live to the Windows petrol beasts that had to be taken to the dealer for service. By 2008, Linux has bloated into a gas-guzzler, and the cycle paths have been replaced with polluted motorways.
Keyboard focus lost in Swing applications (ex: Netbeans) after changing to window
Hi, sorry if this message comes twice (I posted yesterday via NNTP without being subscribed to the list). ion3 is stealing keyboard focus to Swing applications. This happens for instance with Netbeans 6.5: 1. Open netbeans and some other programs in tabs next to it. 2. Select netbeans and open an editor with some code; the cursor is inside the editor 3. Select another tab (either clicking teh tab or with keyboard). 4. Select netbeans again (either clicking the tab or with keyboard). 5. Try to continue typing, but you can't. The cursor is nowhere, and *no key* works (space, cursors, A-S-o, ... all gone). You must click again in the editor and then you can type again. In fact any Swing application has this problem. You can use this one to test: --- TypeInSwing.java import javax.swing.JFrame; import javax.swing.JTextField; public class TypeInSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JTextField field = new JTextField("type here"); frame.getContentPane().add(field); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } -- It happens with latest version 20090110 (with 20080207 too). I am using: $ java -version java version "1.6.0_06" Java(TM) SE Runtime Environment (build 1.6.0_06-b02) Java HotSpot(TM) Server VM (build 10.0-b22, mixed mode) Why is it so? Daniel