Commit graph

54 commits

Author SHA1 Message Date
Thomas Linford
f93308f211
feat(ui): initial mouse support (#448)
* Initial mouse support

* enable mouse support (termion MouseTerminal)
* handle scroll up and down events

* Allow enabling/disabling of mouse reporting

Store the mouse terminal on OsInputOutput

* WIP: switch pane focus with mouse

* testing to get mouse character selection

* wip mouse selection

* wip: mouse selection

- initial handling of mouse events for
  text selection within a pane
- wide characters currently problematic
- selection is not highlighted

* highlight currently selected text

* improve get currently selected text from TerminalPane

* copy selection to clipboard (wayland only for now)

* Add missing set_should_render on selection update

* Improve text selection

- Strip whitespace from end of lines
- Insert newlines when selection spans multiple lines

* Simplify selection logic

- Remove Range struct
- Selection is not an Option anymore, it's empty when start == end

* copy selection to clipboard with OSC-52 sequence

* Improve text selection with multiple panes

- Constrain mouse hold and release events to currently active pane
- Fix calculation of columns with side by side panes

* fix for PositionAndSize changes

* Fix mouse selection with full screen pane.

- Transform mouse event positions to relative when passing to pane.

* Move selection to grid, rework highlighting.

- Mark selected lines for update in grid output buffer, for now in the
  simplest way possible, but can be made more efficient by calculating
  changed lines only.
- Clear selection on pane resize.
- Re-add logic to forward mouse hold and release events only to
  currently active pane.

* Tidy up selection

- add method to get selection line range
- add method to sort the current selection

* Grid: move current selection up/down when scrolling

- Make the selection work with lines in lines_above and lines_below
- Todo: update selection end when scrolling with mouse button being held
- Todo: figure out how to move selection when new characters are added.

* Grid: move selection when new lines are added

* Keep track of selection being active

- Handle the selection growing/shrinking when scrolling with mouse
  button held down but not yet released.

* Improve selection end with multiple panes

* Tidying up

- remove logging statements, unused code

* Add some unit tests for selection, move position to zellij-utils

* Change Position::new to take i32 for line

* Grid: add unit tests for copy from selection

* add basic integration test for mouse pane focus

* Add basic integration test for mouse scroll

* Use color from palette for selection rendering

* Improve performance of selection render

- Try to minimize lines to update on selection start/update/end

* fixes for updated start method

* fix lines not in viewport being marked for rendering

- the previous optimization to grid selection rendering was always
adding the lines at the extremes of previous selection, causing problems
when scrolling up or down
- make sure to only add lines in viewport

* Disable mouse mode on exit

* use saturating_sub for usize subtractions

* copy selection to clipboard on mouse release

* disable mouse on exit after error

* remove left-over comments

* remove copy keybinding

* add default impl for selection methods in Pane

- remove the useless methods from Impl Pane in PluginPane

* move line diff between selections to selection

* add option to disable mouse mode

* Allow scrolling with mouse while selecting.

* move action repeater to os_input_output, change timeout to 10ms

- change repeater to take an action instead of a position with hardcoded
action

* replace mouse mode integration tests with e2e tests

* cleanup

* cleanup

* check if mouse mode is disabled from merged options

* fix missing changes in tests, cleanup
2021-07-02 16:40:50 +02:00
a-kenji
5c3759e155
Merge pull request #596 from a-kenji/run-command-action
Add running commands to an action
2021-07-02 14:06:36 +02:00
a-kenji
0bf78100dd Add running commands to an action
Add the ability to bind running commands to
an action.

Eg:
```
- action: [Run: {command: "htop",},]
  key: [F: 6,]
``

Optionally the direction and arguments can be
specified:

```
- action: [Run: {command: "htop", args: ["-C",]},]
  key: [F: 7,]
```
The directional splits are analogous to the `[NewPane]` splits.
```
- action: [Run: {command: "htop", args: ["-C",], direction: "Up"},]
  key: [F: 8,]
```
2021-07-02 13:39:02 +02:00
a-kenji
06e19516f4 Improve loading of default shell slightly 2021-07-01 21:48:24 +02:00
a-kenji
6f1c103e02 Add option to specify default-shell
* Adds an option to specify a default shell
  either by specifying `default_shell: [PATH]`
  in the config, or running zellij with
  `zellij options --default-shell [PATH]`
2021-07-01 20:02:08 +02:00
a-kenji
8086765e50 fixup! Fix merged tests 2021-06-30 19:45:15 +02:00
a-kenji
242e41d67f Merge branch 'main' of https://github.com/zellij-org/zellij into modularize-spawn-terminal 2021-06-30 18:59:55 +02:00
a-kenji
f9e01c04e1 Modularize spawn_terminal_function
* Breaks the spawn_terminal_function up
  in order to prepare for more functionality.
2021-06-30 11:46:43 +02:00
Aram Drevekenin
ed4fd2a8e7
chore(tests): move all integration tests to be either unit or e2e tests - remove old testing infra (#589)
* tests(integration): move basic integration tests to be unit tests

* fix(tests): silently fail threadbus for tests

* tests(unit): move compatibility tests to become unit tests for grid

* tests(unit): move close_pane tests to become unit tests for grid

* tests(e2e): move basic layout test to e2e

* tests(unit): move move_focus tests to be unit tests

* tests(unit): move resize_down tests to be unit tests

* tests(unit): move resize_left tests to be unit tests

* tests(unit): move resize_right tests to be unit tests

* tests(unit): move resize_up tests to be unit tests

* tests(infra): remove unused infra

* style(fmt): make rustfmt happy

* debug

* debug

* debug

* debug

* chore(test): shift volume mounting around because github actions is a special child
2021-06-30 11:27:35 +02:00
a-kenji
b3b9175081 chore(clippy): needless_borrow 2021-06-29 23:02:51 +02:00
a-kenji
4743b7e7ab Merge branch 'main' of https://github.com/zellij-org/zellij into layout-error 2021-06-14 22:05:25 +02:00
a-kenji
cafcca0c57 Move layout.rs from server to utils
* give feedback on most errors in the layout-file
2021-06-14 21:55:17 +02:00
Aram Drevekenin
056f20ff1f style(comments): remove leftovers 2021-06-04 18:57:26 +02:00
Brooks J Rady
dc44a00699 chore(release): bump development version 2021-06-04 10:28:03 +01:00
Brooks Rady
c65987a285
feat(ui): laying the groundwork for a new resize algorithm 2021-06-03 13:15:56 +01:00
Brooks J Rady
a9ce13c1d2 feat(ui): added feature for an experimental resize
The `parametric_resize_beta` feature has been added that enables the new
resize system. This change also introduces some background tweaks that
start laying the groundwork for future resize work without breaking
functionality.
2021-06-03 13:05:52 +01:00
Aram Drevekenin
0bab7c1245
fix(performance): output buffer (#567)
* work

* work

* fix(performance): output buffer

* style(import): remove extraneous

* style(fmt): make rustfmt happy

* fix(performance): minor adjustments to padding and truncating

* style(fmt): make rustfmt happy

* style(clippy): make clippy happy
2021-06-03 14:03:05 +02:00
Brooks J Rady
5164bd99b7 Fixed a build warning and renamed a struct field 2021-06-03 12:38:23 +01:00
Brooks J Rady
98c29832e1 Merge branch 'main' into resize-overhaul 2021-06-01 18:05:32 +01:00
AdaShoelace
b9677589a0 Omit '(unnamed)' from tab name 2021-06-01 09:41:16 +02:00
AdaShoelace
16a47cdd06 Initial names outside return struct 2021-05-31 22:06:08 +02:00
AdaShoelace
b3e9dda726 Set tab name on creation instead of on render 2021-05-31 17:00:14 +02:00
a-kenji
0be151fa28 Merge branch 'main' of https://github.com/zellij-org/zellij into theme-config 2021-05-30 15:17:55 +02:00
a-kenji
ce73b6cca0 Add color theme config
* add option `theme` that allows for setting of a theme,
the default is `default`

* under `themes` the themes can be described as follows:

either:
```
themes:
  default:
    fg: [0,0,0]
    bg: [0,0,0]
    black: [0,0,0]
    red: [0,0,0]
    green: [0,0,0]
    yellow: [0,0,0]
    blue: [0,0,0]
    magenta: [0,0,0]
    cyan: [0,0,0]
    white: [0,0,0]
    orange: [0,0,0]
```
or
```
themes:
  default:
    fg: 0
    bg: 0
    black: 0
    red: 0
    green: 0
    yellow: 0
    blue: 0
    magenta: 0
    cyan: 0
    white: 0
    orange: 0
```

If the key is different from default, it needs to either be specified on
start with `options --theme [THEME]`, or in the configuration file under
theme: [THEME].

closes #390
2021-05-30 15:07:21 +02:00
Brooks J Rady
f2c5ee44f7 Getting back to where we started... (Buggy Resizing) 2021-05-29 23:12:11 +01:00
a-kenji
70d9d2cf4f Add default_mode to attach
* Attaching a new session now also respects the
  default_mode setting of the client
2021-05-29 19:08:36 +02:00
a-kenji
4c079ca25d
Merge pull request #513 from a-kenji/default-mode-368
Default mode 368
2021-05-29 18:18:30 +02:00
Thomas Zander
f91f446823 Fix cargo fmt diff. 2021-05-29 15:31:04 +02:00
Thomas Zander
09d12f8cbd
Fix build on platforms with TIOCGWINSZ / ioctl() integer type mismatch. 2021-05-29 14:19:40 +02:00
Kunal Mohan
0bd05cbcb4 Make session-name option in attach command
If only one session is running, attach to it.
Otherwise list the active sessions (if any)
2021-05-29 00:32:06 +05:30
Aram Drevekenin
12709e3e48
fix(compatibility): do not crash when padding before wide char (#540)
* fix(compatibility): do not crash when padding before wide char

* style(clippy): make less clear because clippy
2021-05-28 17:30:23 +02:00
KOVACS Tamas
8ccf3d61a0 fix: use bounded queue between pty and screen
Pty reads a command's output and feeds it to Screen using an unbounded
queue.

However, if the command produces output faster than what `Screen` can
render, `Pty` still pushes it on the queue, causing it to grow
indefinitely, resulting in high memory usage and latency.

This patch fixes this by using a bounded queue between Pty and Screen,
so if Screen can't keep up with Pty, the queue will fill up, exerting
back pressure on Pty, making it read the command's output only as fast
as Screen renders it.

The unbounded queue is kept between Screen and producers other than Pty
to avoid a deadlock such as this scenario:
* pty thread filling up screen queue as soon as screen thread pops
  something from it
* wasm thread is processing a Render instruction, blocking on the screen
  queue
* screen thread is trying to render a plugin pane. It attempts to send a
  Render insturction to the blocked wasm thread running the plugin.

This patch also adds a generous amount of sleeps to the integration
tests as having backpressure changes the timing of how instructions are
processed.

Fixes #525.
2021-05-27 23:42:15 +02:00
kxt
0c0355dbc6
refactors for #525 (#534)
* refactor(fakes): clean up add_terminal_input

* refactor(fakes): append whole buf to output_buffer in FakeStdoutWriter::write

* refactor(fakes): append whole buf to output_buffer in FakeInputOutput::write_to_tty_stdin

* fix(fakes): allow partial reads in read_from_tty_stdout

This patch fixes two bugs in read_from_tty_stdout:
* if there was a partial read (ie. `bytes.read_position` is not 0 but
less than `bytes.content.len()`), subsequent calls to would fill `buf`
starting at index `bytes.read_position` instead of 0, leaving range
0..`bytes.read_position` untouched.
* if `buf` was smaller than `bytes.content.len()`, a panic would occur.

* refactor(channels): use crossbeam instead of mpsc

This patch replaces mpsc with crossbeam channels because crossbeam
supports selecting on multiple channels which will be necessary in a
subsequent patch.

* refactor(threadbus): allow multiple receivers in Bus

This patch changes Bus to use multiple receivers. Method `recv` returns
data from all of them. This will be used in a subsequent patch for
receiving from bounded and unbounded queues at the same time.

* refactor(channels): remove SenderType enum

This enum has only one variant, so the entire enum can be replaced with
the innards of said variant.

* refactor(channels): remove Send+Sync trait implementations

The implementation of these traits is not necessary, as
SenderWithContext is automatically Send and Sync for every T and
ErrorContext that's Send and Sync.
2021-05-27 16:28:28 +02:00
a-kenji
81b026df24 Merge branch 'main' of https://github.com/zellij-org/zellij into default-mode-368
* If starting in the locked mode after the merge,
the locked mode seems to need 2 actions to go to
the normal mode - after that everything works
as expected.

- This is not intended.
2021-05-27 15:49:50 +02:00
Aram Drevekenin
9bdb40b4c6 chore(version): bump development version 2021-05-27 14:41:33 +02:00
Kunal Mohan
cb3072066d hotfix(publish): Move install module and asset_map to main zellij package. publish should hopefully work now. 2021-05-27 15:30:14 +05:30
Aram Drevekenin
44d67de187
fix(compatibility): support wide characters (#535)
* fix(compatibility): support wide characters

* style(fmt): rustfmt

* style(fmt): make clippy happy
2021-05-26 18:05:43 +02:00
Kunal Mohan
2bca7e007a
Merge pull request #531 from zellij-org/detach-sessions
Feature: Detachable/Persistent sessions
2021-05-25 17:30:40 +05:30
Kunal Mohan
151deb3235 remove shortened_text mode from status-bar 2021-05-25 13:20:30 +05:30
Kunal Mohan
c60abe6ad6 CHange keybind for Session mode and add comments for clarity 2021-05-25 13:11:37 +05:30
kxt
2168793dc7
fix(pty): use async io to avoid polling (#523)
This patch fixes #509 by using async read instead of polling a
non-blocking fd. This reduces CPU usage when the ptys are idle.
2021-05-24 15:00:49 +02:00
Kunal Mohan
62a2d9cff2 join router threads on exit 2021-05-22 22:19:50 +05:30
Kunal Mohan
dbc446ab55 fix regression and tests 2021-05-22 22:19:50 +05:30
Kunal Mohan
fa0a7e05c3 Add ability to attach to sessions 2021-05-22 22:19:50 +05:30
Kunal Mohan
b8acf19071 Use Action enum for Quit and detach instead of separate messages under ClientToServerMsg 2021-05-22 22:19:50 +05:30
Kunal Mohan
61aa104576 Add ability to detach a session 2021-05-22 22:19:50 +05:30
Kunal Mohan
b20ac47d68
Merge pull request #522 from zellij-org/re-export-dependencies
Re-export common dependencies from zellij-utils
2021-05-19 11:21:33 +05:30
Kunal Mohan
040d10df0f Re-export common dependencies from zellij-utils 2021-05-19 01:35:53 +05:30
kxt
68445af63f
refactor(IO): random fixes (#521)
* refactor(os_input_output): use Pid for child process

* fix(debug): change debug_to_file to write &[u8]

This patch changes debug_to_file to write entire slices in one call, to
avoid the overhead of opening and closing files for each byte written.

* refactor(ServerOsApi): remove unnecessary muts from methods

Co-authored-by: KOVACS Tamas <ktamas@fastmail.fm>
2021-05-18 17:39:36 +02:00
a-kenji
bcbde9fbb5 Merge branch 'main' of https://github.com/zellij-org/zellij into layout-path-506 2021-05-18 10:05:15 +02:00