mirror of
https://github.com/wez/wezterm.git
synced 2024-11-24 07:46:59 +03:00
0324ff66f0
This commit is larger than it appears to due fanout from threading
through bidi parameters. The main changes are:
* When clustering cells, add an additional phase to resolve embedding
levels and further sub-divide a cluster based on the resolved bidi
runs; this is where we get the direction for a run and this needs
to be passed through to the shaper.
* When doing bidi, the forced cluster boundary hack that we use to
de-ligature when cursoring through text needs to be disabled,
otherwise the cursor appears to push/rotate the text in that
cluster when moving through it! We'll need to find a different
way to handle shading the cursor that eliminates the original
cursor/ligature/black issue.
* In the shaper, the logic for coalescing unresolved runs for font
fallback assumed LTR and needed to be adjusted to cluster RTL.
That meant also computing a little index of codepoint lengths.
* Added `experimental_bidi` boolean option that defaults to false.
When enabled, it activates the bidi processing phase in clustering
with a strong hint that the paragraph is LTR.
This implementation is incomplete and/or wrong for a number of cases:
* The config option should probably allow specifying the paragraph
direction hint to use by default.
* https://terminal-wg.pages.freedesktop.org/bidi/recommendation/paragraphs.html
recommends that bidi be applied to logical lines, not physical
lines (or really: ranges within physical lines) that we're doing
at the moment
* The paragraph direction hint should be overridden by cell attributes
and other escapes; see 85a6b178cf
and probably others.
However, as of this commit, if you `experimental_bidi=true` then
```
echo This is RTL -> عربي فارسی bidi
```
(that text was sourced from:
https://github.com/microsoft/terminal/issues/538#issuecomment-677017322)
then wezterm will display the text in the same order as the text
renders in Chrome for that github comment.
```
; ./target/debug/wezterm --config experimental_bidi=false ls-fonts --text "عربي فارسی ->"
LeftToRight
0 ع \u{639} x_adv=8 glyph=300 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
2 ر \u{631} x_adv=3.78125 glyph=273 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
4 ب \u{628} x_adv=4 glyph=244 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
6 ي \u{64a} x_adv=4 glyph=363 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
8 \u{20} x_adv=8 glyph=2 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
9 ف \u{641} x_adv=11 glyph=328 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
11 ا \u{627} x_adv=4 glyph=240 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
13 ر \u{631} x_adv=3.78125 glyph=273 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
15 س \u{633} x_adv=10 glyph=278 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
17 ی \u{6cc} x_adv=4 glyph=664 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
19 \u{20} x_adv=8 glyph=2 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
20 - \u{2d} x_adv=8 glyph=276 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
21 > \u{3e} x_adv=8 glyph=338 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
```
```
; ./target/debug/wezterm --config experimental_bidi=true ls-fonts --text "عربي فارسی ->"
RightToLeft
17 ی \u{6cc} x_adv=9 glyph=906 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
15 س \u{633} x_adv=10 glyph=277 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
13 ر \u{631} x_adv=4.78125 glyph=272 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
11 ا \u{627} x_adv=4 glyph=241 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
9 ف \u{641} x_adv=5 glyph=329 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
8 \u{20} x_adv=8 glyph=2 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
6 ي \u{64a} x_adv=9 glyph=904 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
4 ب \u{628} x_adv=4 glyph=243 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
2 ر \u{631} x_adv=5 glyph=273 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
0 ع \u{639} x_adv=6 glyph=301 wezterm.font(".Geeza Pro Interface", {weight="Regular", stretch="Normal", italic=false})
/System/Library/Fonts/GeezaPro.ttc index=2 variation=0, CoreText
LeftToRight
0 \u{20} x_adv=8 glyph=2 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
1 - \u{2d} x_adv=8 glyph=480 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
2 > \u{3e} x_adv=8 glyph=470 wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
/Users/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
;
```
refs: https://github.com/wez/wezterm/issues/784
102 lines
2.5 KiB
TOML
102 lines
2.5 KiB
TOML
[package]
|
|
name = "wezterm-gui"
|
|
version = "0.1.0"
|
|
authors = ["Wez Furlong <wez@wezfurlong.org>"]
|
|
edition = "2018"
|
|
build = "build.rs"
|
|
resolver = "2"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[features]
|
|
default = ["wayland"]
|
|
wayland = ["window/wayland"]
|
|
|
|
[build-dependencies]
|
|
anyhow = "1.0"
|
|
|
|
[target.'cfg(windows)'.build-dependencies]
|
|
embed-resource = "1.3"
|
|
cc = "1.0"
|
|
windows = "0.11"
|
|
|
|
[dependencies]
|
|
anyhow = "1.0"
|
|
bitflags = "1.3"
|
|
chrono = {version="0.4", features=["unstable-locales"]}
|
|
codec = { path = "../codec" }
|
|
colorgrad = "0.5"
|
|
config = { path = "../config" }
|
|
downcast-rs = "1.0"
|
|
dirs-next = "2.0"
|
|
env-bootstrap = { path = "../env-bootstrap" }
|
|
euclid = "0.22"
|
|
fastrand = "1.6"
|
|
filedescriptor = { version="0.8", path = "../filedescriptor" }
|
|
fuzzy-matcher = "0.3"
|
|
hdrhistogram = "7.1"
|
|
http_req = "0.8"
|
|
image = "0.23"
|
|
lazy_static = "1.4"
|
|
libc = "0.2"
|
|
log = "0.4"
|
|
lru = "0.7"
|
|
luahelper = { path = "../luahelper" }
|
|
metrics = { version="0.17", features=["std"]}
|
|
mlua = "0.7"
|
|
mux = { path = "../mux" }
|
|
open = "2.0"
|
|
ordered-float = "2.10"
|
|
palette = "0.5"
|
|
portable-pty = { path = "../pty", features = ["serde_support", "ssh"]}
|
|
promise = { path = "../promise" }
|
|
pulldown-cmark = "0.9"
|
|
rangeset = { path = "../rangeset" }
|
|
ratelim= { path = "../ratelim" }
|
|
regex = "1"
|
|
serde = {version="1.0", features = ["rc", "derive"]}
|
|
serde_json = "1.0"
|
|
serial = "0.4"
|
|
smol = "1.2"
|
|
structopt = "0.3"
|
|
tabout = { path = "../tabout" }
|
|
terminfo = "0.7"
|
|
termwiz = { path = "../termwiz" }
|
|
textwrap = "0.14"
|
|
thiserror = "1.0"
|
|
tiny-skia = "0.6"
|
|
umask = { path = "../umask" }
|
|
unicode-normalization = "0.1"
|
|
unicode-segmentation = "1.8"
|
|
unicode-width = "0.1"
|
|
url = "2"
|
|
walkdir = "2"
|
|
wezterm-bidi = { path = "../bidi" }
|
|
wezterm-client = { path = "../wezterm-client" }
|
|
wezterm-font = { path = "../wezterm-font" }
|
|
wezterm-gui-subcommands = { path = "../wezterm-gui-subcommands" }
|
|
wezterm-mux-server-impl = { path = "../wezterm-mux-server-impl" }
|
|
wezterm-ssh = { path = "../wezterm-ssh" }
|
|
wezterm-term = { path = "../term", features=["use_serde"] }
|
|
wezterm-toast-notification = { path = "../wezterm-toast-notification" }
|
|
window = { path = "../window" }
|
|
|
|
[target."cfg(windows)".dependencies]
|
|
shared_library = "0.1"
|
|
uds_windows = "1.0"
|
|
windows = "0.11"
|
|
winapi = { version = "0.3", features = [
|
|
"winuser",
|
|
"consoleapi",
|
|
"handleapi",
|
|
"fileapi",
|
|
"namedpipeapi",
|
|
"synchapi",
|
|
"winsock2",
|
|
]}
|
|
|
|
[dev-dependencies]
|
|
k9 = "0.11.0"
|
|
pretty_env_logger = "0.4"
|
|
benchmarking = "0.4"
|