KFMPeerImpl looks more reasonable for me too :) Oleg.
On Tue, Nov 15, 2011 at 12:10 PM, Anton Tarasov <[email protected]> wrote: > Hi Roman, > > The peer methods you mentioned contain the following comment: > > // TODO: consider moving it to KeyboardFocusManagerPeerImpl > > So, it would be fine to do it. > > Thanks, > Anton. > > On 11/15/2011 1:35 AM, Roman Kennke wrote: >> >> Hi there, >> >> One thing that's bugging me for a while is how the ComponentPeer's >> requestFocus() method is supposed to work. As far as I could figure out, >> it's basically always like this (I use KFMHelper to call the >> corresponding KeyboardFocusManager's private methods by reflection): >> >> public boolean requestFocus(Component lightweightChild, boolean >> temporary, >> boolean focusedWindowChangeAllowed, long time, Cause cause) >> { >> if (KFMHelper.processSynchronousLightweightTransfer(window, >> lightweightChild, temporary, focusedWindowChangeAllowed, >> time)) { >> return true; >> } >> >> int result = KFMHelper.shouldNativelyFocusHeavyweight(window, >> lightweightChild, temporary, focusedWindowChangeAllowed, >> time, >> cause); >> >> switch (result) { >> case KFMHelper.SNFH_FAILURE: >> return false; >> case KFMHelper.SNFH_SUCCESS_PROCEED: >> requestFocusImpl(window, lightweightChild, >> temporary, >> focusedWindowChangeAllowed, time, >> cause); >> case KFMHelper.SNFH_SUCCESS_HANDLED: >> // Either lightweight or excessive request - all events are >> // generated. >> return true; >> default: >> return false; >> } >> } >> >> The only thing that really differs between implementations would be the >> requestFocusImpl() method call in the SNFH_SUCCESS_PROCEED case. The >> rest seems to be the same in all implementations, except that in one >> case (Windows I believe) it is done in JNI while in others (X11) it's >> done by reflection. >> >> I think this can be consolidated by doing the above directly in the >> KeyboardFocusManager, before calling the peer requestFocus(), and have >> the peer's requestFocus() only do the requestFocusImpl() handling. This >> way we could avoid duplicate code and avoid reflection/JNI altogether. >> >> Maybe I am missing something? >> >> If not, I would work on a patch to move the above KeyboardFocusManager >> calls into the KFM and have the peer only bothers with the part that is >> requestFocusImpl() in the above example. Does that sound reasonable? It >> would certainly make some things simpler in OpenJDK as well as Cacio and >> the JavaFX SwingView that I am working on. >> >> Best regards, Roman >> >> > >
