<div dir="ltr">Thank you Phil for your response and consideration!<div><br></div><div>In case anyone else is running into this same issue, I will share some results from my investigation into the issue I shared. I was able to do some hacking in the Scintilla source code to fix it. It seems like Scintilla is getting its positions array from QScintilla and that array isn't in the correct order in some cases where right-to-left text is involved. The hack below solved the issue for my product (and it works for the example application as well). I'm still seeing other right to left text weirdness though so more work is required to get things fully working.</div><div><br></div><div>Of course without full support for right-to-left text, all I can do is write hacks like these to make my users a bit happier. It's unlikely that I will be able to fix everything. And I will need to re-apply each hack every time I upgrade my QScintilla version.</div><div><br></div><div>Thanks!</div><div>Caleb</div><div><br></div><div>diff --git a/scintilla/src/EditView.cpp b/scintilla/src/EditView.cpp<br>index 4a9dc1f..0b20028 100644<br>--- a/scintilla/src/EditView.cpp<br>+++ b/scintilla/src/EditView.cpp<br>@@ -1661,11 +1661,43 @@ void EditView::DrawForeground(Surface *surface, const EditModel &model, const Vi<br>         const Sci::Position iDoc = i + posLineStart;<br> <br>         PRectangle rcSegment = rcLine;<br>-        rcSegment.left = ll->positions[ts.start] + xStart - static_cast<XYPOSITION>(subLineStart);<br>-        rcSegment.right = ll->positions[ts.end()] + xStart - static_cast<XYPOSITION>(subLineStart);<br>-        // Only try to draw if really visible - enhances performance by not calling environment to<br>+<br>+        // This patch prevents a bug where<br>+        // lines containing only right-to-left text would not be drawn<br>+        // so user would see a blank line for them.<br>+<br>+        // For right-to-left text, I've seen ll->positions be out-of-order,<br>+        // inside the SurfaceImpl::MeasureWidth function<br>+        // so in order to get left and right correct, we must loop through<br>+        // the whole array.<br>+        int start = ts.start;<br>+        int end = ts.end();<br>+        XYPOSITION minimum = ll->positions[start];<br>+        XYPOSITION maximum = ll->positions[start];<br>+        for (int i = start; i <= end; i++) {<br>+            XYPOSITION current = ll->positions[i];<br>+            if (current > maximum) {<br>+                maximum = current;<br>+            }<br>+            if (current < minimum) {<br>+                minimum = current;<br>+            }<br>+        }<br>+        rcSegment.left = minimum + xStart - static_cast<XYPOSITION>(subLineStart);<br>+        rcSegment.right = maximum + xStart - static_cast<XYPOSITION>(subLineStart);<br>+        // Only try to draw if visible - enhances performance by not calling environment to<br>         // draw strings that are completely past the right side of the window.<br>-        if (rcSegment.Intersects(rcLine)) {<br>+        // Also draw if left == right because this could mean that there is nothing to draw<br>+        // so it shouldn't impact performance much or it could mean that we are hitting an<br>+        // issue where<br>+        // text_line.cursorToX(i_char + code_units) in SurfaceImpl::MeasureWidth in PlatQt.cpp<br>+        // is returning 0.0 for a line containing a single hebrew or other right-to-left<br>+        // character instead of a positive<br>+        // number like it does for a single english character.<br>+        bool emptyOrRightToLeftText = rcSegment.right == rcSegment.left;<br>+        if (rcSegment.Intersects(rcLine) || emptyOrRightToLeftText) {<br>+<br>             const int styleMain = ll->styles[i];<br>             ColourDesired textFore = vsDraw.styles[styleMain].fore;<br>             FontAlias textFont = vsDraw.styles[styleMain].font;<br>-- <br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jun 14, 2023 at 2:37 AM Phil Thompson <<a href="mailto:phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 14/06/2023 05:45, Caleb Rouleau wrote:<br>
> Hi,<br>
> <br>
> I really appreciate QScintilla. Thanks for writing it and maintaining <br>
> it!<br>
> <br>
> I was wondering what the state of support for right-to-left languages <br>
> like<br>
> Arabic and Hebrew should be in QScintilla. (I don't see any mention of<br>
> support in the documentation but I may be missing it!) I'm also <br>
> wondering<br>
> whether you plan to work to improve this support in the future. I see <br>
> on<br>
> the Scintilla website (1) that Scintilla has "limited experimental" <br>
> support<br>
> for these languages on Windows. I read this thread on GitHub (2) that <br>
> shows<br>
> that this support might be desirable for other projects than just mine.<br>
> <br>
> Here's an issue that I'm having with right-to-left languages:<br>
> 1. On a Windows 10 machine, install Hebrew or Arabic language support.<br>
> 2. Build the example application that comes with QScintilla against Qt <br>
> 5.15<br>
> and QScintilla 2.14.0 and run it.<br>
> 3. Use Windows UI to switch your keyboard to Hebrew or Arabic.<br>
> 4. Type "asdf" on your keyboard into the example application. Since <br>
> your<br>
> keyboard is in Arabic or Hebrew mode, this should type "شسيب" or <br>
> "שדגכ".<br>
> However, no text is visible.<br>
> 5. Switch your keyboard back to English.<br>
> 6. Type "asdf". Suddenly the Arabic or Hebrew text appears and you <br>
> should<br>
> see something like "שדגכasdf"<br>
> <br>
> Is there something that I can do differently to make the right-to-left <br>
> text<br>
> appear immediately instead of only showing when there is also <br>
> left-to-right<br>
> text in the same box?<br>
> <br>
> It seems likely that this issue happens on other versions of Qt and<br>
> versions of Windows as well, but I haven't tested it yet.<br>
<br>
At the moment this just isn't supported.  It has to be fully supported <br>
in the underlying Scintilla code.<br>
<br>
QScintilla is based on a relatively old version of Scintilla - I haven't <br>
kept up to date because, IMHO, newer versions haven't added much that is <br>
generally useful. If the support was added to Scintilla then I'd <br>
consider updating to it.<br>
<br>
Phil<br>
</blockquote></div>