<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:"Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"Iosevka Fixed SS16";
panose-1:2 0 5 9 3 0 0 0 0 4;}
@font-face
{font-family:"Times New Roman \(Body CS\)";
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:"\@Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
{font-family:Optima-Regular;
panose-1:2 0 5 3 6 0 0 2 0 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:10.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
span.apple-converted-space
{mso-style-name:apple-converted-space;}
span.EmailStyle21
{mso-style-type:personal-reply;
font-family:"Iosevka Fixed SS16";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word;overflow-wrap: break-word;-webkit-nbsp-mode: space;line-break:after-white-space">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">Martin:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">Right, the user-specific mappings are simply not possible in the current version of FX.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">Speaking of the platform nuances – this might be relevant to the ongoing platform API discussion. Right now FX picks up nothing from the preferences set by the user within
the OS. You are right, macOS allows the user to change key modifiers (for example, switch control and command keys, Settings -> Keyboard -> Keyboard Shortcuts -> Modifier Keys) and FX remains oblivious to this change.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">Should FX pick up this user setting? Should it propagate to FX and Swing shortcut keys? Should FX pick up custom colors? And so on...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">Getting back to the input map proposal, it followed a JEP format convention, but one thing it isn’t is the requirements document. I wouldn’t mind creating one or adding a
section to the proposal, but I wanted to hear the community feedback first (and got plenty, thanks!). Let’s see what else we could find.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">Thank you<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">-andy<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Martin Fox <martin@martinfox.com><br>
<b>Date: </b>Wednesday, October 11, 2023 at 14:53<br>
<b>To: </b>Andy Goryachev <andy.goryachev@oracle.com><br>
<b>Cc: </b>John Hendrikx <john.hendrikx@gmail.com>, openjfx-dev@openjdk.org <openjfx-dev@openjdk.org><br>
<b>Subject: </b>[External] : Re: [Request for Comments] Behavior / InputMap<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt">Andy,<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">This might be just a matter of style but IMHO the limitations of the current design aren’t listed in the Summary. For example, I have to get down to the description section before I see this requirement:<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">ensure that user-defined mappings overwrite default ones and survive a skin change<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">There’s nothing indicating that this is currently not working (or why it’s not working). But perhaps this is something I should already know since I do spend most of my time down in the platform code.<o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><br>
<br>
<o:p></o:p></span></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16"">Perhaps you could start a new thread listing some (all?) examples? I don’t think we have any existing documentation of the key bindings, so here we go:</span><span style="font-size:11.0pt"><o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""><a href="https://urldefense.com/v3/__https:/github.com/andy-goryachev-oracle/jfx/tree/8314906.behavior.test/doc-files/behavior__;!!ACWV5N9M2RV99hQ!J5aVk_bfhcHHNKk1DgQJKJIqb6A81qaEorABC9Gw_eN2gt37o7mnyHlXxI31z_KzDh_mBZGjJNTGqlC7LBjYTg$">https://github.com/andy-goryachev-oracle/jfx/tree/8314906.behavior.test/doc-files/behavior</a></span><o:p></o:p></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt">That’s a long list with several platform-specific nuances. You’ll need to re-implement a big chunk of them for the table and tree view controls. In your proposal you give an example of a RichTextArea and it
will also need to re-implement all of these.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">In macOS 10.14 Apple created the <a href="https://urldefense.com/v3/__https:/developer.apple.com/documentation/appkit/nsstandardkeybindingresponding?language=objc__;!!ACWV5N9M2RV99hQ!J5aVk_bfhcHHNKk1DgQJKJIqb6A81qaEorABC9Gw_eN2gt37o7mnyHlXxI31z_KzDh_mBZGjJNTGqlCp23BvQA$">NSStandardKeyBindingResponding</a> protocol
to encapsulate some of the potential binding targets. It’s overkill and doesn’t cover a bunch of common bindings like Shortcut+C for Copy. BTW, there’s a way for power-users to alter these bindings but it relies on them being global.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">I’ll dig into the proposal a bit more but probably not before next week.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Martin<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
</div>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0in 0in 0in;border-color:currentcolor currentcolor;border-image: none">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt">From:<span class="apple-converted-space"> </span></span></b><span style="font-size:12.0pt">openjfx-dev <openjfx-dev-retn@openjdk.org> on behalf of Martin Fox <martin@martinfox.com><br>
<b>Date:<span class="apple-converted-space"> </span></b>Wednesday, October 11, 2023 at 10:27<br>
<b>To:<span class="apple-converted-space"> </span></b>John Hendrikx <john.hendrikx@gmail.com><br>
<b>Cc:<span class="apple-converted-space"> </span></b>openjfx-dev@openjdk.org <openjfx-dev@openjdk.org><br>
<b>Subject:<span class="apple-converted-space"> </span></b>Re: [Request for Comments] Behavior / InputMap</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
<div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">On Oct 11, 2023, at 1:03 AM, John Hendrikx <john.hendrikx@gmail.com> wrote:</span><o:p></o:p></p>
</div>
</div>
</blockquote>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">After reading John's message I realize that the InputMap proposal doesn’t list the limitations of the current design. It seems to be addressing some of the sequencing issues John mentions but doesn’t state
outright that it’s doing so or why. I would set aside the proposal and focus on writing a problem statement document first.</span><o:p></o:p></p>
</div>
</div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p style="caret-color: rgb(0, 0, 0);font-variant-caps: normal;text-align:start;-webkit-text-stroke-width: 0px;word-spacing:0px">
<span style="font-size:10.5pt;font-family:Optima-Regular">A system to remap keys can then be left squarely in the realm of user space, and much nicer solutions can be build by users than whatever JavaFX will provide out of the box.<o:p></o:p></span></p>
</blockquote>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Seconded. Whatever Eclipse is doing to implement their key binding interface is deep and complex and there’s no way JavaFX could craft a solution Eclipse would use. I think that will be true for most apps
that allow user customizable key bindings. And I’m pretty sure that when the user customizes a key binding Eclipse is not tracking down all of the affected controls and updating their per-instance key binding maps. Those maps have to be centralized and shared
in some manner.</span><o:p></o:p></p>
</div>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p style="caret-color: rgb(0, 0, 0);font-variant-caps: normal;text-align:start;-webkit-text-stroke-width: 0px;word-spacing:0px">
<span style="font-size:10.5pt;font-family:Optima-Regular">So in short, what I think this should be about is:<o:p></o:p></span></p>
<p style="caret-color: rgb(0, 0, 0);font-variant-caps: normal;text-align:start;-webkit-text-stroke-width: 0px;word-spacing:0px">
<span style="font-size:10.5pt;font-family:Optima-Regular">- Ensure user event handlers have priority over behavior/inputmap added ones<br>
- Ensure all behavior actions are available as methods on controls<o:p></o:p></span></p>
</blockquote>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">I have another recommendation (which may be more of a feature request). There should be a centralized way of mapping common keys to actions to ensure a consistent vocabulary across the user interface. As an
example, on many controls Shift + up arrow should map to something like “moveUpAndExtendTheSelection”. There are a lot of these standardized bindings, some of them are platform specific, and it’s a really tall order to expect all of the individual control
classes to get this right.</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">On macOS there are two primary means of mapping a key event to an action and both are global. This means most of these mappings happen outside the individual controls and that the mappings are consistent across
controls. This also addresses part of what John mentioned above; to make this work controls have to make their actions visible through callable methods.</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Phrased as problem statement: currently individual control classes need to separately implement a large set of standardized keyboard bindings. This is a maintenance and testing issue.</span><o:p></o:p></p>
</div>
</div>
</div>
<div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p><span style="font-size:10.5pt;font-family:Optima-Regular">- Ensure that if a key is handled by the control, that it is ONLY consumed when it actually triggers an action (navigation keys get consumed regardless, even if no focus change results, that's wrong).<o:p></o:p></span></p>
</blockquote>
<div>
<p><span style="font-size:10.5pt;font-family:Optima-Regular">As I recall this is an issue with the traversal engine which is a maybe a separate topic (?) Was a bug ever entered on this?<o:p></o:p></span></p>
<p><span style="font-size:10.5pt;font-family:Optima-Regular">Martin<o:p></o:p></span></p>
</div>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p style="caret-color: rgb(0, 0, 0);font-variant-caps: normal;text-align:start;-webkit-text-stroke-width: 0px;word-spacing:0px">
<span style="font-size:10.5pt;font-family:Optima-Regular">On 10/10/2023 19:54, Andy Goryachev wrote:<o:p></o:p></span></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt;font-variant-caps: normal;text-align:start;-webkit-text-stroke-width: 0px;word-spacing:0px">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Re-sending with a smaller image (256kb limit, really?).</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0in 0in 0in;border-color:currentcolor;border-image: none">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt">From:<span class="apple-converted-space"> </span></span></b><span style="font-size:12.0pt">Andy Goryachev<span class="apple-converted-space"> </span><a href="mailto:andy.goryachev@oracle.com"><andy.goryachev@oracle.com></a><br>
<b>Date:<span class="apple-converted-space"> </span></b>Tuesday, October 10, 2023 at 10:49<br>
<b>To:<span class="apple-converted-space"> </span></b>Michael Strauß<span class="apple-converted-space"> </span><a href="mailto:michaelstrau2@gmail.com"><michaelstrau2@gmail.com></a><br>
<b>Cc:<span class="apple-converted-space"> </span></b><a href="mailto:openjfx-dev@openjdk.org">openjfx-dev@openjdk.org</a><span class="apple-converted-space"> </span><a href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
<b>Subject:<span class="apple-converted-space"> </span></b>Re: [Request for Comments] Behavior / InputMap</span><o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Dear Michael:</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Here is a use case for (re-)mapping by the user at runtime:</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><image002.jpg><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">(key mappings UI in Eclipse).</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">I can think of several other cases (mentioned in the proposal, I think) so I think we can put the concept of immutable or global InputMap to rest.</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Whether the InputMap contains the reference to its control or not is a minor implementation detail, I think.</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">-andy</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
</div>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0in 0in 0in;border-color:currentcolor;border-image: none">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt">From:<span class="apple-converted-space"> </span></span></b><span style="font-size:12.0pt">openjfx-dev<span class="apple-converted-space"> </span><a href="mailto:openjfx-dev-retn@openjdk.org"><openjfx-dev-retn@openjdk.org></a><span class="apple-converted-space"> </span>on
behalf of Michael Strauß<span class="apple-converted-space"> </span><a href="mailto:michaelstrau2@gmail.com"><michaelstrau2@gmail.com></a><br>
<b>Date:<span class="apple-converted-space"> </span></b>Tuesday, October 10, 2023 at 10:36<br>
<b>To:<span class="apple-converted-space"> </span></b><br>
<b>Cc:<span class="apple-converted-space"> </span></b><a href="mailto:openjfx-dev@openjdk.org">openjfx-dev@openjdk.org</a><span class="apple-converted-space"> </span><a href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
<b>Subject:<span class="apple-converted-space"> </span></b>Re: [Request for Comments] Behavior / InputMap</span><o:p></o:p></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">> Yes, one of the features the new design provides is ability to modify key mappings by the user at runtime. So yes, not only it needs to be mutable, but it also adds some APIs for exactly that.<br>
><br>
<br>
I struggle to see a use case for this feature. I can imagine that<br>
there might be some use cases that call for customized input mappings,<br>
but why would this translate to a _mutable_ input map? That's quite a<br>
departure from the way other parts of JavaFX work.<br>
<br>
For example, skins are also immutable. If you want to have a different<br>
skin for a control, you don't somehow modify the existing skin<br>
instance; instead, you'd create a new skin class (or -- somehow --<br>
extend an existing skin class), and then install that new skin on your<br>
control.<br>
<br>
An input map shouldn't bind input events directly to instance methods<br>
of a particular control instance. It should define the mapping of<br>
events to methods symbolically:<br>
<br>
Instead of mapping Event => instance.method(), it should map Event =><br>
Control::method. The input map could then be stateless and immutable,<br>
and can be set on any control instance. If you want to change the<br>
mappings, just set a different input map instance. There's no need<br>
that an input map would retain a reference to any particular control,<br>
since the control reference can be passed into the input map just as<br>
easily.</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
</div>
</div>
</div>
</body>
</html>