While digging around in the bug database I ran across a bug that was already filed on this issue. I don’t recall it being mentioned during this discussion, my apologies if it was and I just forgot.
https://bugs.openjdk.org/browse/JDK-8231245 Controls' behavior must not depend on sequence of handler registration > On Oct 31, 2023, at 4:05 PM, Andy Goryachev <andy.goryac...@oracle.com> wrote: > > Dear John: > > I am not convinced. I think there is no need for an extra mechanism (I am > referring to waves), the scenario you are describing here > > that when I do `scene.addEventHandler(KeyEvent.KEY_PRESSED)` I won't see > navigation keys because they are all consumed by a focused control. > > should, in my opinion, be implemented via addEventFilter() on the container > or the scene. > > I think we're over thinking it. Such fine grained priorities are not needed. > There are two parties involved, the user and JavaFX, hence two priorities > should be enough. > > Hm. We need two priorities for skins, and if the application side wants to > add a handler that is guaranteed to be invoked first or last regardless of > skin change, we need at least two more. So two priorities are clearly not > enough. > > -andy > > > > > From: openjfx-dev <openjfx-dev-r...@openjdk.org> on behalf of John Hendrikx > <john.hendr...@gmail.com> > Date: Tuesday, October 31, 2023 at 15:10 > To: openjfx-dev@openjdk.org <openjfx-dev@openjdk.org> > Subject: Re: [External] : Re: Prioritized event handlers > > On 31/10/2023 21:03, Andy Goryachev wrote: > Dear Martin: > > > I understand John’s point: you want all the user installed filters and > handlers across all levels to be processed before switching to system level > processing. I also understand this prioritization proposal is designed to > push our existing set of system handlers to a separate phase. But is that all > we’re talking about here? I need some clarification. > > If I understand this correctly, this proposal advocates making drastic > changes to the event handling mechanism. Not only it introduces the > prioritization scheme (which I support), but it also alters the way events > are bubbled up, by introducing waves/phases. I am afraid I don’t see the use > case for doing that. In my opinion, the prioritization scheme should work on > handlers added to the same EventTarget. There should be no multiple waves - > if an event gets consumed by an event handler, the dispatching should stop > (that change I also support), if not - it bubbles up the hierarchy. > The waves (or calling of registered default handlers at the end) are needed > to also allow users to install handlers at ancestors that would take priority > over system handlers. System handlers really shouldn't touch events unless > they fully bubbled up, so the illusion that user event handlers are the sole > event handlers in existance is being maintained. > > The fact that event handler lists are being shared currently is incredibly > confusing, so that when I do `scene.addEventHandler(KeyEvent.KEY_PRESSED)` I > won't see navigation keys because they are all consumed by a focused control. > Instead, I should be seeing them, and if I choose not to act on them, only > then should those events be used for navigation. The current scheme is very > business orientated (why would you ever not want to have navigation keys > consumed?), while other use cases may simply want to disable keyboard control > altogether (games) or have other more important uses for the cursor keys > (like scrolling a map that does have clickable controls). > > Of course, this would need to be done in a backwards compatible way as it has > been this way for quite a while, so sure it you might see it as drastic, but > its compatible, fixes a real flaw in FX event handling (unpredictability), > allows several requested use cases (albeit at a low level), and its > flexiblity will open up new ways of solving problems we haven't even thought > of yet. > > > > Within a given control the order of event processing gets involved. If a > Control is subclassed the subclass should get first shot at the event. The > same is true for Behaviors and Skins. Beyond that I’m still not clear if the > behavior or skin should get the event first or if the skin should get it via > the behavior or the other way around. In any case, you’ve got the control, > the behavior, the skin, and all of their subclasses trying to sort out the > execution order. > > Hmmm. I am not sure I understand exactly what you are saying. > > The way I understand this prioritization proposal is that we introduce a > priority associated with the handler (and not the filter). The proposal > specifies 3 priority levels, I think there might be more, or perhaps we even > have an int priority (might be too much freedom, let’s discuss). > > Specifically, I think there might be 5 levels, from high to low (the names > are just for the purposes of discussion): > > { AppHigh, SkinHigh, AppMedium, SkinLow, AppLow } > > This way there is absolutely no ambiguity in deciding which handler gets > invoked first. I must note that SkinHigh, SkinLow should not be available to > the application code. At the same time, AppHigh,AppMedium,AppLow levels > should not be available to skins/behaviors. > > Side question: should filters also have priority? > I think we're over thinking it. Such fine grained priorities are not needed. > There are two parties involved, the user and JavaFX, hence two priorities > should be enough. FX can be responsible for ensuring its Skin/Behavior > handlers are installed in the right order (they already have to do that), and > users can be responsible for sorting out their own event handler order (they > are after all in full control of that). > > Alternatively, we can have no priorities and instead only have a mechanism > that allows event handlers to forego handling an event, but register an > interest in handling it if it is unconsumed (after dispatching completes for > filters, or after bubbling completes for handler if we're inclined to offer > both) -- I call these default handlers, similar to how there is a default > exception handler on each Thread, each Event can have a (list of) default > handlers. > > > > > > Based on this discussion (and I might be mistaken on this) it sounds like > you're trying to handle all this using this proposal, namely registering > event handlers with a prioritization scheme. > > Wait, I though that’s what you are proposing, based on the doc > https://gist.github.com/mstr2/4bde9c97dcf608a0501030ade1ae7dc1 > > Are you proposing something else, or is something missing from the doc? > > > Wouldn’t it be easier to just grab the event and pass it around using Java > method calls? Perhaps the call is handleEvent(). A control implements > handleEvent() by passing the event off to the behavior’s handleEvent() which > passes it off to the skin’s handleEvent(). The skin sends it up the > superclass chain by calling super.handleEvent(), etc. so on. > > Wouldn’t this be a drastic departure from the established event handling > method? Why call an empty method if we are not interested in the event? Or > maybe I misunderstood you here, what are you asking? > > > To summarize, I think the idea of explicit priority is a good idea as it > solves the current issue or exact ordering of handlers in the event of skin > change, to give one example. I think we might also benefit from a limited > set of priorities (5) that reflect the reality of fx having two sides - the > application side and the “system”, or skin/behavior, side. > > Personally, I find some other ideas problematic: I don’t see a good use case > for multiple waves in dispatching, as this represent a major departure from > the current mechanism, unless I am missing something. > > I don’t understand the paragraph about subclassing. Perhaps you mean that if > we have a situation where one class extends the other, they should coordinate > the event handling. For example, the base class would declare the handling > method, register it as a listener, for the child class to override and get > the events? Or the base class should not add any handlers, instead leaving > it up to the child class? But that’s implementation detail. > > What do you think? > > -andy > > > > > From: Martin Fox <mar...@martinfox.com> <mailto:mar...@martinfox.com> > Date: Tuesday, October 31, 2023 at 10:13 > To: Andy Goryachev <andy.goryac...@oracle.com> > <mailto:andy.goryac...@oracle.com> > Cc: Michael Strauß <michaelstr...@gmail.com> > <mailto:michaelstr...@gmail.com>, openjfx-dev <openjfx-dev@openjdk.org> > <mailto:openjfx-dev@openjdk.org> > Subject: [External] : Re: Prioritized event handlers > > I understand John’s point: you want all the user installed filters and > handlers across all levels to be processed before switching to system level > processing. I also understand this prioritization proposal is designed to > push our existing set of system handlers to a separate phase. But is that all > we’re talking about here? I need some clarification. > > Within a given control the order of event processing gets involved. If a > Control is subclassed the subclass should get first shot at the event. The > same is true for Behaviors and Skins. Beyond that I’m still not clear if the > behavior or skin should get the event first or if the skin should get it via > the behavior or the other way around. In any case, you’ve got the control, > the behavior, the skin, and all of their subclasses trying to sort out the > execution order. > > Based on this discussion (and I might be mistaken on this) it sounds like > you're trying to handle all this using this proposal, namely registering > event handlers with a prioritization scheme. Wouldn’t it be easier to just > grab the event and pass it around using Java method calls? Perhaps the call > is handleEvent(). A control implements handleEvent() by passing the event off > to the behavior’s handleEvent() which passes it off to the skin’s > handleEvent(). The skin sends it up the superclass chain by calling > super.handleEvent(), etc. so on. > > This would make for an easy sell to outside developers. We can tell them that > if they subclass a Control and implement handleEvent() they will get events > first during the system phase. The same is true if they subclass a behavior > or skin. They don’t need to buy into or even see a complicated event > prioritization scheme to get exactly what they expect, namely first access to > events. > > But, again, maybe I’m off base here. Let me know. > > Martin > > > > On Oct 30, 2023, at 12:53 PM, Andy Goryachev <andy.goryac...@oracle.com> > <mailto:andy.goryac...@oracle.com> wrote: > > Dear Michael: > > Thank you, this is very helpful. > > Questions/Comments: > > 1. Does this proposal changes the way events are dispatched with respect to > priority? In other words, does it first go through the list of all handlers > registred on the leaf Node (high priority first, then lower, then lowest), > then bubble up? Or do they propagate upwards looking for high priority > handlers first, then the process restarts for lower priorities, as I saw in > some previous emails? (I could be mistaken) > > 2. Do you propose to abort event dispatching immediately after the event is > consumed? This probably should be mentioned earlier in the Motivation (the > problem statement) section. > > 3. I wonder if three priority levels are sufficient. Let me explain. We > have two possible actors who can register an event listener: the application > code and the FX (or, rather more specifically, the skin and its behavior, > whatever that might be). > > Application code might want to add handlers at three possible priorities: > > App handler must always be called before any fx handler > App hander does not care > App handler must always be called after any fx handlers > > For fx/skin handlers we might have fewer levels: > > Skin handler does not care > Skin handler must be called after all other skin handlers > > This situation maps to 5 priorities and 4 effective levels (or 5). > > We should also mention the fact that when any actor adds two or more handlers > for the same event with the same priority, they get invoked in the order > added. > > Would you agree, or am I missing some critical aspect of the proposed > solution? > > Thank you > -andy > > > > > > From: openjfx-dev <openjfx-dev-r...@openjdk.org> > <mailto:openjfx-dev-r...@openjdk.org> on behalf of Michael Strauß > <michaelstr...@gmail.com> <mailto:michaelstr...@gmail.com> > Date: Friday, October 27, 2023 at 19:41 > To: openjfx-dev <openjfx-dev@openjdk.org> <mailto:openjfx-dev@openjdk.org> > Subject: Re: Prioritized event handlers > > Here is the proposal: > https://gist.github.com/mstr2/4bde9c97dcf608a0501030ade1ae7dc1 > <https://urldefense.com/v3/__https:/gist.github.com/mstr2/4bde9c97dcf608a0501030ade1ae7dc1__;!!ACWV5N9M2RV99hQ!NvO4B-fpHrjczoDGCoctorfNPX48w38MvW-LOf6ElCk0dBqFX_xPlETcr56POnEaBcwENrIOsX4OKDM0OGc07A$> > > Comments are welcome. > > > On Fri, Oct 27, 2023 at 8:21 PM Andy Goryachev > <andy.goryac...@oracle.com> <mailto:andy.goryac...@oracle.com> wrote: > > > > Would it be possible to create a proposal in the JEP format outlining the > > proposed public API? > > > > > > > > Thank you > > > > -andy