Bug 403729 - Proper BiDi support
Summary: Proper BiDi support
Status: RESOLVED FIXED
Alias: None
Product: konsole
Classification: Applications
Component: emulation (show other bugs)
Version: unspecified
Platform: Other Linux
: NOR wishlist
Target Milestone: ---
Assignee: Konsole Developer
URL:
Keywords: rtl
Depends on:
Blocks:
 
Reported: 2019-01-29 11:27 UTC by Egmont Koblinger
Modified: 2022-08-27 01:10 UTC (History)
2 users (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Egmont Koblinger 2019-01-29 11:27:34 UTC
Konsole's BiDi suffers from several problems. (Apparently all it does is passes continuous runs of identical attributes to some BiDi-aware font rendering. There's much more to BiDi than this.)

Here's some of the problems (the list is not complete):

- It unconditionally applies the BiDi algorithm on the contents. This makes it literally, mathematically provably impossible to have proper BiDi-aware text viewers/editors on top of such a platform. (You can disable BiDi in the settings, but having to do so every time one enters or leaves a text editor is an unacceptable user experience.)

- It applies BiDi on lines of text, rather than paragraphs as the BiDi algorithm specifies.

- Upon every change of text attributes, it starts over the BiDi algorithm. That is, e.g. the output of a "grep" which colors the match doesn't show up properly.

- Also a side effect of the latter: text highlighting experience is terrible, the characters move around as you highlight with the mouse.

- There's no support for overall right alignment (bug 401185).

I've spent a couple of months studying the topic, and came up with a first draft proposal for the desired behavior, available at https://terminal-wg.pages.freedesktop.org/bidi/ .

I'm inviting you to join the discussion of the proposal if you have any comments, and asking you to implement BiDi according to that proposal.
Comment 1 Bug Janitor Service 2022-08-06 18:51:38 UTC
A possibly relevant merge request was started @ https://invent.kde.org/utilities/konsole/-/merge_requests/722
Comment 2 Kurt Hindenburg 2022-08-27 01:10:07 UTC
Git commit 76f879cd70fb494ab2334d2660b34679546f3d9d by Kurt Hindenburg, on behalf of Matan Ziv-Av.
Committed on 26/08/2022 at 19:24.
Pushed by hindenburg into branch 'master'.

Draw characters in exact positions

QT can't be made to draw monospaced text (if the font does not cooperate),
so avoid combining characters, using a QPainter::drawText() call for each
character.

For bidi text support this change requires konsole to reorder and reshape
the characters. This is done using the ICU library (which QT also uses).

This change allows for some improvements related to text rendering:

- More precise bidi reordering, which is no longer changed by characters'
  attributes and selection.
- underlines drawn separately from the text, allowing for differing
  underline modes (double, curly, dashed, dotted, colored).
- Overriding font for emoji characters.

This commit fixes a few bugs and addresses a lot more:

Feature requests: More standard conforming RTL and various underlines:
Related: bug 387811, bug 416508, bug 452087, bug 425973, bug 430822, bug 442742, bug 441037, bug 430822, bug 440070, bug 450017, bug 445846, bug 453086, bug 381593, bug 451716

Using non-monospace font:



Emoji:

Regression: devanagari rendering

M  +2    -0    CMakeLists.txt
M  +1    -0    src/CMakeLists.txt
M  +47   -25   src/FontDialog.cpp
M  +2    -1    src/FontDialog.h
M  +127  -23   src/Screen.cpp
M  +18   -5    src/Screen.h
M  +28   -13   src/Vt102Emulation.cpp
M  +0    -29   src/autotests/CharacterTest.cpp
M  +0    -1    src/autotests/CharacterTest.h
M  +1    -1    src/autotests/TerminalCharacterDecoderTest.cpp
M  +119  -29   src/characters/Character.h
M  +1    -1    src/characters/Hangul.cpp
M  +5    -4    src/decoders/HTMLDecoder.cpp
M  +1    -1    src/decoders/PlainTextDecoder.cpp
M  +3    -0    src/profile/Profile.cpp
M  +29   -0    src/profile/Profile.h
M  +101  -6    src/terminalDisplay/TerminalDisplay.cpp
M  +7    -0    src/terminalDisplay/TerminalDisplay.h
M  +42   -0    src/terminalDisplay/TerminalFonts.cpp
M  +12   -0    src/terminalDisplay/TerminalFonts.h
M  +542  -269  src/terminalDisplay/TerminalPainter.cpp
M  +40   -13   src/terminalDisplay/TerminalPainter.h
M  +2    -0    src/widgets/EditProfileAdvancedPage.ui
M  +113  -3    src/widgets/EditProfileAppearancePage.ui
M  +61   -3    src/widgets/EditProfileDialog.cpp
M  +6    -1    src/widgets/EditProfileDialog.h

https://invent.kde.org/utilities/konsole/commit/76f879cd70fb494ab2334d2660b34679546f3d9d