1
1
mirror of https://github.com/wez/wezterm.git synced 2024-12-18 10:52:16 +03:00
Commit Graph

6416 Commits

Author SHA1 Message Date
Wez Furlong
5d250bce36 invalidate shape cache when reverse video mode changes 2022-08-27 08:47:22 -07:00
Wez Furlong
28b4a0d16b Add some comments about new Pane methods and helpers 2022-08-27 08:07:26 -07:00
Wez Furlong
cb9fe1a676 flesh out some todos with new pane trait methods
Tidy some things up to avoid some dead code and redundant impls.
Make it easier to select whether you want to implement the new
methods in terms of the old, or the old methods in terms of
the new in a given pane impl.
2022-08-27 07:58:17 -07:00
Wez Furlong
d492eef700 implement new pane trait methods for copy and quickselect overlays 2022-08-27 06:19:12 -07:00
Wez Furlong
f03dc68f96 move shape & quad caching to hang off Line appdata
Remove the faulty cache key stuff and hang references to the cached
data directly off the underlying Line.  That makes the association
between the the Line and the data O(1) plus some basic cache
invalidation checks.

Adjust the shape cache portion of this to use the same ID for the
shape, so that things that invalidate just the quads (such as cursor
movement when not composing, and selection) only need to recompute
the quads without re-shaping.
2022-08-26 21:49:33 -07:00
Wez Furlong
b7b1e4020a revise Pane line related funcs
Adds Pane::for_each_logical_line_in_stable_range_mut and
Pane::with_lines_mut which allow iterating mutably over lines.

The idea is that this will allow the renderer to directly cache
data in the Line via its appdata without having to build cumbersome
external caching logic and managing cache keys.

This commit just swaps the implementation around for localpane
and sanity checks that the renderer functions.

Various overlays and the mux client don't properly implement these
yet and current warn at compile time and panic at runtime.

To follow is the logic to cache the data and make sure that it
works the way that I think before converting the other Pane
implementations.
2022-08-26 08:05:06 -07:00
Wez Furlong
66761ed014 termwiz: use interior mutability for Line::set_appdata 2022-08-25 06:19:56 -07:00
Wez Furlong
6962d6805a cargo fmt 2022-08-24 23:04:15 -07:00
Wez Furlong
c4ea703d4b disable some of the recent caching stuff
The cache key isn't quite right, leading to some artifacts
in some cases.

I have a cunning plan, but it will take me a bit to wrap
it up, so in the meantime, disable these caches.

refs: https://github.com/wez/wezterm/issues/2455
2022-08-24 22:57:57 -07:00
Wez Furlong
5e993c581a termwiz: remove reverse video attribute from Line
It didn't really belong there; it was added as a bit of a hack
to propagate screen reverse video mode.

Move that to the RenderableDims struct and remove the related
bits from Line
2022-08-24 22:43:47 -07:00
Wez Furlong
f59e1d5fff mux: remove stale portion of comment from Pane::get_lines
we haven't had dirty bits in a long while
2022-08-24 20:19:15 -07:00
Wez Furlong
4963187eaf termwiz: associate appdata with a Line
I plan to use this to hang cached shaper data with a line
and avoid expensive hashing to resolve it.
2022-08-24 20:11:27 -07:00
Wez Furlong
0fe8bba147 fix copymode and quickselect overlays
the new caching broke these because they play dirty tricks by
aliasing the delegated pane id.

Skip caching for those by reporting the pane_id as None
2022-08-24 08:07:16 -07:00
Wez Furlong
ad7199c1cc trim down lru cache sizes
refs: https://github.com/wez/wezterm/issues/2453
2022-08-23 22:34:26 -07:00
Wez Furlong
3b4e859956 allow cursor_fg = "none" to use text fg color
Similar to selection_fg, setting the cursor_fg to transparent ("none")
will use the foreground color of the text behind the cursor.

refs: https://github.com/wez/wezterm/issues/1835
2022-08-23 19:54:19 -07:00
Wez Furlong
0141d340f3 gui: cache get_lines_with_hyperlinks_applied
If the pane is unchanged and we're at the same viewport, cache
the values from the last call.
2022-08-23 17:39:56 -07:00
Wez Furlong
e05b3581b8 optimize Pane::get_lines_with_hyperlinks_applied for empty rules case
It's ~30x cheaper to just get the underlying lines when there
are no hyperlink rules defined (3us vs 112us)
2022-08-23 17:20:46 -07:00
Wez Furlong
03246fba23 gui: factor out background rect calc
avoid some copypasta
2022-08-23 17:16:04 -07:00
Wez Furlong
9029b3bca6 fix blinking text 2022-08-23 14:43:35 -07:00
Wez Furlong
65d350be36 fixup retro tab bar
I broke this with the performance changes I pushed earlier today.

Poke a hole in caching for it as well, as it doesn't use the seqno
to track changes like the rest of the Line based data.

cc: @DeadlySquad13
2022-08-23 12:30:45 -07:00
Wez Furlong
4edc9c5d9f macos: make us run again on Mojave
refs: https://github.com/wez/wezterm/issues/2451
2022-08-23 11:48:59 -07:00
Wez Furlong
f4fa87eca1 docs: mention CPU utilization improvements in changelog 2022-08-23 10:41:36 -07:00
Wez Furlong
53bc871147 ssh: correctly expand %h tokens in ssh config
refs: https://github.com/wez/wezterm/issues/2448
2022-08-23 10:32:07 -07:00
Wez Furlong
619b1ad292 scroll to bottom on mouse input when mouse is grabbed
refs: https://github.com/wez/wezterm/issues/2447
2022-08-23 10:15:39 -07:00
Wez Furlong
57b10ac094 Avoid full path canonicalization when resolving cwd
It can have some surprising effects, so leave it at the basic logical
composition of cwd + relative rather than physical.

refs: https://github.com/wez/wezterm/issues/2449
2022-08-23 09:55:45 -07:00
Wez Furlong
a8b1b6bd88 Add official dracula color scheme
refs: https://github.com/dracula/wezterm/issues/2
2022-08-23 09:45:12 -07:00
Wez Furlong
144d2a353e add focus state to cache key 2022-08-23 09:41:44 -07:00
Wez Furlong
64a10014cf treat Constant ease-in-and-out as equivalent to "1 fps" case
This doesn't mean that it renders at 1fps, just that it goes through
the simpler path of scheduling on the boundaries rather than at
animation_fps through the intermediate stages, where it would be
useless.
2022-08-23 08:29:57 -07:00
Wez Furlong
f582d35d8e improve blink easing scheduling
We weren't really respecting animation_fps very well. Account
for the last_render time when computing the next frame time.
2022-08-23 08:17:46 -07:00
Wez Furlong
00ddfbf9b8 perf: cache quads by line
Introduces a heap-based quad allocator that we cache on a per-line
basis, so if a line is unchanged we simply need to copy the previously
computed set of quads for it into the gpu quad buffer.

The results are encouraging wrt. constructing those quads; the
`quad_buffer_apply` is the cost of the copy operation, compare with
`render_screen_line_opengl` which is the cost of computing the quads;
it's 300x better at the p50 and >100x better at p95 for a full-screen
updating program:

full 2880x1800 screen top:

```
STAT                                             p50      p75      p95
Key(quad_buffer_apply)                           2.26µs   5.22µs   9.60µs
Key(render_screen_line_opengl)                   610.30µs 905.22µs 1.33ms
Key(gui.paint.opengl)                            35.39ms  37.75ms  45.88ms
```

However, the extra buffering does increase the latency of
`gui.paint.opengl` (the overall cost of painting a frame); contrast the
above with the latency in the same scenario with the current `main`
(rather than this branch):

```
Key(gui.paint.opengl)                            19.14ms  21.10ms  28.18ms
```

Note that for an idle screen this latency is ~1.5ms but that is also true
of `main`.

While the overall latency in the histogram isn't a slam dunk,
running `time cat bigfile` is ~10% faster on my mac.

I'm sure there's something that can be shaved off to get a more
convincing win.
2022-08-23 06:37:12 -07:00
Wez Furlong
9aaa4c4db6 Abstract quad and layer allocation
allows adding an alternative, cacheable, quad backing in a subsequent commit
2022-08-22 19:48:19 -07:00
Wez Furlong
d2b3d7ed94 add cheaper to cache shape info
Use essentially just a couple of very cheap integers as cache keys
for the shape info from a pane
2022-08-22 18:37:11 -07:00
Wez Furlong
5f64adb7f0 start building out box model based render of pane 2022-08-22 11:03:24 -07:00
Wez Furlong
8040a8ae81 revise how uniforms are passed to shader
This is really a proof of concept commit; I want to be able to pass
more structured data into the shader as uniforms and the basic
macros provided by glium make that a bit awkward.

What I came up with is a slightly more dynamic uniform builder
thingy.

I'm using this to pass in a copy of the various blinking easing
functions.

Those are incomplete and unused, but it shows that the technique works.
2022-08-22 10:22:00 -07:00
Wez Furlong
0702a7163e cargo update 2022-08-21 19:59:34 -07:00
Wez Furlong
35ed9ac197 conpty: work around mangled tmux title sequence
refs: https://github.com/wez/wezterm/issues/2442
2022-08-21 18:14:13 -07:00
Wez Furlong
3ae647048e Add Sequoia color schemes
refs: https://github.com/Hiroya-W/wezterm-sequoia-theme/issues/1
2022-08-21 16:50:34 -07:00
Wez Furlong
94e95fca33 docs: changelog for max_fps https://github.com/wez/wezterm/discussions/2419 2022-08-21 15:27:45 -07:00
Wez Furlong
7caaf136e4 compensate for flickery TUI programs by going slower(!)
It's not the first time that I've solved a problem by slowing things
down... in this situation, a couple of very inefficient TUI programs had
flickering outputs in wezterm because they were filling a buffer with a
bunch of spaces to erase a screen before sending the main body of their
updates in a subsequent buffer chunk. wezterm would render the
intervening partially blank frame and appear to flicker.

The resolution is to add a small delay (3ms by default) before sending
data to the terminal model. If the output is readable in that time
we'll accumulate it with the pending set of actions so that the
whole batch can be applied "more atomically".

Take care: `time cat bigfile` is sensitive to this, so we want to
keep the latency as small as possible, and we also want to avoid
accumulating actions and only flushing them at the end of the file.

We use the existing buffer size (~1MB) as a threshold: we bump
a count of the number of input bytes that resulted in the current
set of actions, and if that exceeds that buffer size we flush it.

refs: https://github.com/wez/wezterm/issues/2443
2022-08-21 14:40:06 -07:00
Wez Furlong
553f475280 add pane select screenshot to appstream data 2022-08-21 13:15:38 -07:00
Wez Furlong
a6ed7ef7ab docs: fix typo 2022-08-21 12:59:39 -07:00
Wez Furlong
9d6b4a3e17 docs: CopyMode assignments now have their own individual pages
refs: https://github.com/wez/wezterm/issues/2346
2022-08-21 11:05:56 -07:00
Wez Furlong
84df280b38 docs: changelog for https://github.com/wez/wezterm/issues/2350 2022-08-21 09:48:22 -07:00
Wez Furlong
f2f2b83899 respect close confirmation prompt when middle clicking a tab
refs: #2350
2022-08-21 09:34:24 -07:00
Wez Furlong
7be824db62 deps: update zbus 2022-08-21 09:18:32 -07:00
Wez Furlong
de89d650a3 cargo update 2022-08-21 08:51:16 -07:00
grant0417
f792a20f7a Add fig to shells for shell completion 2022-08-21 08:33:19 -07:00
Wez Furlong
f4b8028e5e macos: fixup CI build
weirdly, BOOL is considered bool when I compile locally,
but in the CI:

```
error[E0308]: mismatched types
   --> window/src/os/macos/connection.rs:170:22
    |
170 |     let max_fps = if has_max_fps {
    |                      ^^^^^^^^^^^ expected `bool`, found `i8`
```

I can't explain the difference in behavior (feels like a compiler
bug?) but let's try comparing explicitly against YES
2022-08-21 08:29:17 -07:00
Wez Furlong
99391e39d2 macos: NSScreen::maximumFramesPerSecond is newish
Gate calling it to avoid a runtime failure on eg: Big Sur.

refs: https://github.com/wez/wezterm/issues/2440
2022-08-21 07:21:12 -07:00
Wez Furlong
58eecab4f8 docs: changelog for https://github.com/wez/wezterm/issues/2399 2022-08-20 23:02:29 -07:00