<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    The split caret is usually rendered in one color for the strong
    direction and another for the weak.<br>
    Color is just one way of distinguishing. Other renderings are
    possible - oh I see the ATSUI<br>
    docs use a high half caret and a low half caret. That's a new one
    but as I said .. <br>
    I agree a user needs to know the current direction to know
    everything that will happen but it<br>
    at least tells them "here, or there" as opposed to "here, or
    somewhere else".<br>
    So the combination as Andy indicates might help.<br>
    I think the rendering should be a "pennant" rather than rectangular
    "flag" so that it looks a bit like an arrow ..<br>
    That's what Swing's rendering looks like.<br>
    <br>
    -phil.<br>
    <br>
    <div class="moz-cite-prefix">On 10/19/23 11:39 AM, Andy Goryachev
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:DM5PR1001MB21727763E11932A9DE368346E5D4A@DM5PR1001MB2172.namprd10.prod.outlook.com">
      
      <meta name="Generator" content="Microsoft Word 15 (filtered medium)">
      <!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]-->
      <style>@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;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}span.EmailStyle19
        {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;}div.WordSection1
        {page:WordSection1;}ol
        {margin-bottom:0in;}ul
        {margin-bottom:0in;}</style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
      <div class="WordSection1">
        <p class="MsoNormal"><span style="font-family:"Iosevka Fixed SS16"">Maybe,
            just maybe, we should implement the dual carets with
            directionality indicators (highlighted here for illustration
            purposes only, the actual indicator might look like a flag
            or a “
          </span><span style="font-family:"Iosevka Fixed SS16"" lang="RU">г</span><span style="font-family:"Iosevka Fixed SS16"" lang="RU">
          </span><span style="font-family:"Iosevka Fixed SS16"">”):<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-family:"Iosevka Fixed SS16""><img style="width:5.2916in;height:.6145in" id="Picture_x0020_2" src="cid:part1.exWorwFX.nCAqGjR7@oracle.com" class="" width="508" height="59"></span><span style="font-family:"Iosevka Fixed SS16""><o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-family:"Iosevka Fixed SS16"">What do
            you think?<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-family:"Iosevka Fixed SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-family:"Iosevka Fixed SS16"">-andy <o:p></o:p></span></p>
        <p class="MsoNormal"><span style="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">Nir
                  Lisker <a class="moz-txt-link-rfc2396E" href="mailto:nlisker@gmail.com"><nlisker@gmail.com></a><br>
                  <b>Date: </b>Thursday, October 19, 2023 at 00:28<br>
                  <b>To: </b>Philip Race <a class="moz-txt-link-rfc2396E" href="mailto:philip.race@oracle.com"><philip.race@oracle.com></a><br>
                  <b>Cc: </b>Andy Goryachev
                  <a class="moz-txt-link-rfc2396E" href="mailto:andy.goryachev@oracle.com"><andy.goryachev@oracle.com></a>,
                  <a class="moz-txt-link-abbreviated" href="mailto:openjfx-dev@openjdk.org">openjfx-dev@openjdk.org</a>
                  <a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
                  <b>Subject: </b>Re: [External] : Re: Question: bidi
                  navigation<o:p></o:p></span></p>
            </div>
            <div>
              <p class="MsoNormal">Thanks Andy, the new link works. I
                read pages 33-36. Page 35 details the two approaches:
                the dual caret you have described (which I had never
                seen before in my life), and the single "jumping" caret,
                which is what I advised to do. The document doesn't
                show, however, a direction indicator for the caret based
                on the selected language, and I think that that's
                something that should be shown.<o:p></o:p></p>
              <div>
                <p class="MsoNormal"><o:p> </o:p></p>
              </div>
              <div>
                <p class="MsoNormal">Phil, I'm not sure how the split
                  caret can tell a user on its own where the text will
                  appear. The user will have to look at which language
                  is currently selected to know which of the carets is
                  the real indicator. That is, unless I misunderstand
                  how the split caret works.<o:p></o:p></p>
              </div>
              <div>
                <p class="MsoNormal">The "why did it appear over there?"
                  question is common in UI's that don't handle the caret
                  indication properly, for example when there is no
                  visual difference between the RTL and LTR carets (the
                  direction indicator). A jumping caret with a
                  visual direction indicator solves 100% of the
                  ambiguity and the surprise factor without needing to
                  look outside of the text control to check which
                  language is selected.<o:p></o:p></p>
              </div>
              <div>
                <p class="MsoNormal"><o:p> </o:p></p>
              </div>
              <div>
                <p class="MsoNormal">- Nir<o:p></o:p></p>
              </div>
            </div>
            <p class="MsoNormal"><o:p> </o:p></p>
            <div>
              <div>
                <p class="MsoNormal">On Wed, Oct 18, 2023 at 10:31 PM
                  Philip Race <<a href="mailto:philip.race@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">philip.race@oracle.com</a>>
                  wrote:<o:p></o:p></p>
              </div>
              <blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
                <div>
                  <p class="MsoNormal" style="margin-bottom:12.0pt">So
                    it seems Swing never calls Java2D's
                    TextLayout.getCaretShapes() API which is what would
                    provide the split carets.<br>
                    <br>
                    Swing's caret is an instance of
                    javax.swing.text.DefaultCaret which has support for
                    rendering a "flag" that indicates<br>
                    the direction of the caret bias.<br>
                    <br>
                    Split caret is however useful to tell a user where
                    the text of the other direction would appear.<br>
                    Otherwise even to someone familiar with editing
                    bi-di text I except some cases of "oh, why did what
                    I typed appear way over there"?<br>
                    They might still wonder, but at least they'd know
                    where it was going to be rendered ahead of time.<br>
                    <br>
                    -phil<o:p></o:p></p>
                  <div>
                    <p class="MsoNormal">On 10/18/23 10:47 AM, Andy
                      Goryachev wrote:<o:p></o:p></p>
                  </div>
                  <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
                    <div>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Thank you, Nir.</span><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Try this link:</span><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""><a href="https://web.archive.org/web/20120802192035/http:/developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/ATSUI_Concepts/atsui.pdf" target="_blank" moz-do-not-send="true">https://web.archive.org/web/20120802192035/http://developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/ATSUI_Concepts/atsui.pdf</a></span><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Curiously, the dual
                          (split) caret capability
                          <b>is</b> present in java2d, but apparently it
                          is not used in Swing as far as I can tell:</span><o:p></o:p></p>
                      <p><a href="https://docs.oracle.com/javase/tutorial/2d/text/textlayoutbidirectionaltext.html#moving_carets" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://docs.oracle.com/javase/tutorial/2d/text/textlayoutbidirectionaltext.html#moving_carets</a><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">-andy</span><o:p></o:p></p>
                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                      <div id="m_-593130407378862926m_-17357387878996620mail-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="mso-margin-top-alt:auto;margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
                                </span></b><span style="font-size:12.0pt;color:black">Nir
                                Lisker <a href="mailto:nlisker@gmail.com" target="_blank" moz-do-not-send="true">
                                  <nlisker@gmail.com></a><br>
                                <b>Date: </b>Wednesday, October 18,
                                2023 at 09:15<br>
                                <b>To: </b>Andy Goryachev <a href="mailto:andy.goryachev@oracle.com" target="_blank" moz-do-not-send="true">
                                  <andy.goryachev@oracle.com></a><br>
                                <b>Cc: </b><a href="mailto:openjfx-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>
                                <a href="mailto:openjfx-dev@openjdk.org" target="_blank" moz-do-not-send="true"><openjfx-dev@openjdk.org></a><br>
                                <b>Subject: </b>Re: [External] : Re:
                                Question: bidi navigation</span><o:p></o:p></p>
                          </div>
                          <div>
                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I've never
                              seen this dual caret system. The link you
                              gave leads to a 404 error.<o:p></o:p></p>
                            <div>
                              <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I can't
                                comment as to the plan without knowing
                                what Prism was designed to do, but it's
                                rather unusual. The logical navigation
                                choice seems correct regardless.<o:p></o:p></p>
                            </div>
                          </div>
                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                          <div>
                            <div>
                              <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">On Tue, Oct
                                17, 2023 at 7:13 PM Andy Goryachev <<a href="mailto:andy.goryachev@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">andy.goryachev@oracle.com</a>>
                                wrote:<o:p></o:p></p>
                            </div>
                            <blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
                              <div>
                                <div>
                                  <div>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Dear Nir:</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Thank you so much for
                                        the information.  I spoke to
                                        several people none of whom,
                                        unfortunately, use an
                                        environment configured for RTL
                                        mode (but who have keyboard
                                        settings for RTL languages). 
                                        Based on the very small sample,
                                        it appears that logical
                                        navigation is a way to go -
                                        which means the FX behavior (or
                                        rather lack thereof due to
                                        <a href="https://bugs.openjdk.org/browse/JDK-8296266" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8296266</a>)
                                        needs to change relative to
                                        jfx8.</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Regarding the
                                        direction indicator - FX
                                        implements a dual caret the
                                        logic of which I am still trying
                                        to decipher:</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""><img style="width:3.75in;height:.7083in" id="m_-593130407378862926m_-17357387878996620m_7862524550394022718Picture_x0020_1" src="cid:part2.bFmiVp0w.9ddemaxk@oracle.com" class="" width="360" height="68" border="0"></span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">(<i>sliptCaret</i> in
                                        PrismTextLayout:354)</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">The closest
                                        description I was able to find
                                        is in Apple ATSUI Programming
                                        guide</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""><a href="https://urldefense.com/v3/__http:/developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/ATSUI_Concepts/atsui.pdf__;!!ACWV5N9M2RV99hQ!LM7co48XfI4StmMZQ9TBX3emuN_Y_WM2CEdQi3PZQQ7LfjCCzhZRd1m4jTSc2n4tv6lQD49_YAhItF5cU8ZH$" target="_blank" moz-do-not-send="true"><span lang="FR">http://developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/ATSUI_Concepts/atsui.pdf</span></a>
                                      </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">on page 35, though I
                                        am not sure FX works as
                                        described in that document.</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">The expectation is
                                        that the primary (high) caret is
                                        where the character having the
                                        same directionality as the
                                        “primary line direction” is
                                        inserted.  It is possible that
                                        the text layout determines the
                                        primary line direction based on
                                        the text as opposed to taking a
                                        hint from NodeOrientation.</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Since this behavior
                                        is baked into FX prism text
                                        layout, I think it’s unlikely to
                                        change.</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">To summarize, I think
                                        we should switch FX
                                        TextInputControl hierarchy to
                                        logical navigation.  What do you
                                        think?</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">-andy</span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span dir="RTL"></span><span dir="RTL"></span><span dir="RTL" lang="HE"><span dir="RTL"></span><span dir="RTL"></span> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                    <div id="m_-593130407378862926m_-17357387878996620m_7862524550394022718mail-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="mso-margin-top-alt:auto;margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
                                              </span></b><span style="font-size:12.0pt;color:black">Nir Lisker <<a href="mailto:nlisker@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">nlisker@gmail.com</a>><br>
                                              <b>Date: </b>Tuesday,
                                              October 17, 2023 at 03:44<br>
                                              <b>To: </b>Andy Goryachev
                                              <<a href="mailto:andy.goryachev@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">andy.goryachev@oracle.com</a>><br>
                                              <b>Cc: </b><a href="mailto:openjfx-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a> <<a href="mailto:openjfx-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>><br>
                                              <b>Subject: </b>Re:
                                              [External] : Re: Question:
                                              bidi navigation</span><o:p></o:p></p>
                                        </div>
                                        <div>
                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I have just
                                            tested on Win10: Notepad,
                                            Wordpad, MSWord 2021,
                                            Discord desktop, WhatsApp
                                            desktop, Opera, Eclipse,
                                            Gimp 2, Audacity 2.1.3, and
                                            MS VisualStudio 2022 all use
                                            logical. Edge uses logical
                                            in text areas and text
                                            fields, but visual in the
                                            address bar (seems like a
                                            bug, but you can't have
                                            spaces in web addresses
                                            anyway). I don't remember
                                            ever using a visual
                                            navigation application,
                                            maybe it was very long ago.
                                            If there ever was a decision
                                            there, it was made long ago,
                                            at least on Windows.<o:p></o:p></p>
                                          <div>
                                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                          </div>
                                          <div>
                                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">It's very
                                              important to show the
                                              cursor direction because
                                              it resolves ambiguities.
                                              It's available in most
                                              applications.<o:p></o:p></p>
                                          </div>
                                          <div>
                                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                          </div>
                                          <div>
                                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">My Windows UI
                                              is in standard English
                                              LTR. I just have an RTL
                                              language installed.<o:p></o:p></p>
                                          </div>
                                          <div>
                                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                          </div>
                                          <div>
                                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Logical
                                              navigation is a bit easier
                                              to work with I think. The
                                              behavior at the edge of a
                                              word that changes the
                                              direction can be
                                              surprising (see the
                                              ambiguities above), but
                                              that can be helped with
                                              the cursor direction
                                              indication. If we can do a
                                              custom implementation, I
                                              would go a step further
                                              and actually resolve the
                                              position ambiguities by
                                              positioning the cursor in
                                              accordance with the
                                              selected insertion method
                                              (RTL or LTR). This means
                                              that the cursor will jump
                                              when switching the
                                              language, but it will make
                                              life easier because you
                                              will easily know in
                                              which direction you're
                                              about to type.<o:p></o:p></p>
                                          </div>
                                        </div>
                                        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                        <div>
                                          <div>
                                            <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">On Mon, Oct
                                              16, 2023 at 6:16 PM Andy
                                              Goryachev <<a href="mailto:andy.goryachev@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">andy.goryachev@oracle.com</a>> wrote:<o:p></o:p></p>
                                          </div>
                                          <blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
                                            <div>
                                              <div>
                                                <div>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Nir, thank you for
                                                      responding!</span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">The behavior you
                                                      describe
                                                      (“logical”
                                                      navigation) is
                                                      what can be seen
                                                      in many, but not
                                                      all applications,
                                                      and that is what
                                                      puzzles me. 
                                                      What’s more
                                                      interesting, the
                                                      applications that
                                                      use a “visual”
                                                      kind of
                                                      navigation, that
                                                      is the RIGHT ARROW
                                                      key always moving
                                                      the cursor right
                                                      regardless of the
                                                      text, is used by
                                                      javafx8 (it’s
                                                      totally broken in
                                                      jfx17, but it
                                                      looks from the
                                                      code that it is
                                                      supposed to be the
                                                      same as in
                                                      javafx8), java
                                                      swing, MS Word
                                                      2007 on Windows
                                                      10, macOS Notes
                                                      app, macOS
                                                      TextEdit, and
                                                      Mozilla
                                                      Thunderbird. 
                                                      Also, this is the
                                                      kind of navigation
                                                      that some users
                                                      prefer (based on a
                                                      very, very limited
                                                      sample I was able
                                                      to contact).</span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">What puzzles me is
                                                      that there is no
                                                      apparent standard
                                                      even among the
                                                      modern
                                                      applications
                                                      (bundled macOS
                                                      apps), although
                                                      the transition
                                                      from visual to
                                                      logical navigation
                                                      in MS Word might
                                                      indicate that the
                                                      logical navigation
                                                      is winning.</span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">The appearance of
                                                      caret is another
                                                      aspect that seem
                                                      to have no
                                                      standard.  In many
                                                      apps the caret
                                                      does not change at
                                                      all, very rarely
                                                      we see a flag
                                                      indicating
                                                      direction (java
                                                      swing), and only
                                                      javafx8 and some
                                                      obsolete mac
                                                      Carbon reference
                                                      doc shows a split
                                                      caret.</span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">More questions for
                                                      you:
                                                    </span><o:p></o:p></p>
                                                  <ol type="1" start="1">
                                                    <li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
                                                      <span style="font-family:"Iosevka Fixed SS16"">it looks like you are
                                                        on Windows, and
                                                        are you using
                                                        (or have you
                                                        seen) a fully
                                                        localized
                                                        version of
                                                        Windows with all
                                                        the UI set to
                                                        RTL mode?</span><o:p></o:p></li>
                                                    <li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
                                                      <span style="font-family:"Iosevka Fixed SS16"">Have you seen any
                                                        native
                                                        applications
                                                        that use the
                                                        visual
                                                        navigation
                                                        model?</span><o:p></o:p></li>
                                                  </ol>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Getting back to the
                                                      problem at hand:
                                                      if we were to
                                                      retain the
                                                      backward
                                                      compatibility in
                                                      FX, we would need
                                                      to fix the
                                                      “visual”
                                                      navigation.  FX
                                                      uses the split
                                                      caret which some
                                                      users find
                                                      confusing but we
                                                      probably are stuck
                                                      with it.  If we
                                                      were to assume
                                                      that the “logical”
                                                      navigation is a
                                                      standard everyone
                                                      is slowly
                                                      converging to,
                                                      then my fix for
                                                      <a href="https://bugs.openjdk.org/browse/JDK-8296266" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8296266</a>
                                                      is the right one
                                                      and we should
                                                      declare a change
                                                      in behavior.</span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">What do you think?</span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">P.S. I wonder if the
                                                      logical navigation
                                                      was chosen because
                                                      of ease of
                                                      implementation, or
                                                      is there a deeper
                                                      reason?</span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                  <div id="m_-593130407378862926m_-17357387878996620m_7862524550394022718m_-1725203049216495700m_3229193245499694327mail-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="mso-margin-top-alt:auto;margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
                                                          </span></b><span style="font-size:12.0pt;color:black">Nir Lisker <<a href="mailto:nlisker@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">nlisker@gmail.com</a>><br>
                                                          <b>Date: </b>Monday,
                                                          October 16,
                                                          2023 at 04:52<br>
                                                          <b>To: </b>Andy
                                                          Goryachev <<a href="mailto:andy.goryachev@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">andy.goryachev@oracle.com</a>><br>
                                                          <b>Cc: </b><a href="mailto:openjfx-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>
                                                          <<a href="mailto:openjfx-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>><br>
                                                          <b>Subject: </b>[External]
                                                          : Re:
                                                          Question: bidi
                                                          navigation</span><o:p></o:p></p>
                                                      </div>
                                                      <div>
                                                        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">This is a
                                                          tricky one.
                                                          All
                                                          applications I
                                                          have seen, and
                                                          I think that's
                                                          what people
                                                          expect, is
                                                          that the
                                                          cursor changes
                                                          direction
                                                          during
                                                          traversal.<o:p></o:p></p>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">A key point
                                                          is where the
                                                          paragraph is
                                                          aligned to (in
                                                          Windows
                                                          adjusted with
                                                          left
                                                          CTRL+SHIFT and
                                                          right
                                                          CTRL+SHIFT).
                                                          This sets the
                                                          forward and
                                                          backward
                                                          direction: if
                                                          the paragraph
                                                          is
                                                          left-aligned,
                                                          pressing the
                                                          right
                                                          arrow moves
                                                          the cursor
                                                          forward, and
                                                          for a right
                                                          aligned, the
                                                          right arrow
                                                          moves the
                                                          cursor
                                                          backward. Then
                                                          the actual
                                                          movement of
                                                          the cursor is
                                                          relative to
                                                          the paragraph
                                                          alignment: in
                                                          RTL alignment,
                                                          traversing RTL
                                                          text moves the
cursor forward, while traversing LTR moves the cursor backward.<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Examples<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">In
                                                          a left-aligned
                                                          paragraph,
                                                          pressing the
                                                          right arrow
                                                          will move the
                                                          cursor (|)
                                                          like this:<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">|ab אבג cd<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">a|b אבג cd<o:p></o:p></p>
                                                          </div>
                                                        </div>
                                                        <div>
                                                          <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab| אבג cd<o:p></o:p></p>
                                                          </div>
                                                        </div>
                                                        <div>
                                                          <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab |אבג cd   
                                                            OR     ab
                                                          אבג| cd   
                                                          (there is
                                                          ambiguity
                                                          because the
                                                          space
                                                          character can
                                                          be both RTL or
                                                          LTR)<o:p></o:p></p>
                                                          </div>
                                                        </div>
                                                        <div>
                                                          <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab א|בג cd<o:p></o:p></p>
                                                          </div>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab אב|ג cd<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab אבג| cd   
                                                            OR     ab
                                                          |אבג cd<o:p></o:p></p>
                                                          </div>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab אבג |cd<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab אבג c|d<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">ab אבג cd|<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">To help with
                                                          navigation,
                                                          the cursor has
                                                          a line
                                                          attached to
                                                          its top
                                                          showing which
                                                          direction it's
                                                          facing.<o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                                        </div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Hope this
                                                          helps.<o:p></o:p></p>
                                                        </div>
                                                      </div>
                                                      <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                                                      <div>
                                                        <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">On Thu, Oct
                                                          12, 2023 at
                                                          3:42 AM Andy
                                                          Goryachev <<a href="mailto:andy.goryachev@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">andy.goryachev@oracle.com</a>>
                                                          wrote:<o:p></o:p></p>
                                                        </div>
                                                        <blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
                                                          <div>
                                                          <div>
                                                          <div>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Hi.</span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">I have a question for
                                                          people who
                                                          routinely use
                                                          right-to-left
                                                          RTL languages
                                                          (Arabic,
                                                          Hebrew, etc.):</span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b><span style="font-family:"Iosevka Fixed SS16"">What is your
                                                          expectation
                                                          for navigating
                                                          text using
                                                          left/right
                                                          arrow keys
                                                          when the text
                                                          contains a
                                                          mixture of RTL
                                                          and LTR?</span></b><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">It looks like there
                                                          is no standard
                                                          when it comes
                                                          to modern
                                                          applications –
                                                          see a small
                                                          sample:</span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""><a href="https://urldefense.com/v3/__https:/gist.github.com/andy-goryachev-oracle/4802f9380fb03ec2be7ac36bd98a2059__;!!ACWV5N9M2RV99hQ!P_TgGd02CrA1gNF2bW5yHBRJHFkdDqluPJmHDwIcAQ-DR_NWNd-JMkTn0x9d1m5azgCucompGMSgi7PqR7TS$" target="_blank" moz-do-not-send="true">https://gist.github.com/andy-goryachev-oracle/4802f9380fb03ec2be7ac36bd98a2059</a></span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">In javafx, the
                                                          navigation of
                                                          bidirectional
                                                          (bidi) text
                                                          might have
                                                          been broken
                                                          sometime after
                                                          jfx8, and even
                                                          jfx8 might
                                                          have issues,
                                                          see</span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""><a href="https://bugs.openjdk.org/browse/JDK-8296266" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8296266</a></span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">It looks like the
                                                          most modern
                                                          applications
                                                          use logical
                                                          navigation and
                                                          logical
                                                          selection
                                                          (that is, when
                                                          navigating
                                                          using
                                                          left/right
                                                          arrow keys,
                                                          the cursor
                                                          position
                                                          reflects
                                                          previous/next
                                                          insertion
                                                          indexes in the
                                                          text, rather
                                                          than visual
                                                          position). 
                                                          This causes
                                                          the cursor to
                                                          change the
                                                          direction of
                                                          movement when
                                                          it crosses the
                                                          bidi
                                                          boundary. 
                                                          Would you say
                                                          this is the
                                                          expected
                                                          behavior?</span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16""> </span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">Thank you</span><o:p></o:p></p>
                                                          <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:"Iosevka Fixed SS16"">-andy</span><o:p></o:p></p>
                                                          </div>
                                                          </div>
                                                          </div>
                                                        </blockquote>
                                                      </div>
                                                    </div>
                                                  </div>
                                                </div>
                                              </div>
                                            </div>
                                          </blockquote>
                                        </div>
                                      </div>
                                    </div>
                                  </div>
                                </div>
                              </div>
                            </blockquote>
                          </div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                  <p class="MsoNormal"><o:p> </o:p></p>
                </div>
              </blockquote>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>