Any change to the session object was triggering this. But that now includes
an "unacked keystrokes" counter, which updates frequently, and we
definitely don't want to send resize notifications in that case.
xterm.js seems to have a bug where it doesn't register ctrl+uppercase
keypresses correctly. To work around this, we catch such keypresses
explicitly and handle them inline.
Modifies the terminal to support vt escape sequences (as emulated by the
Gnome Terminal app and others).
For now it recognizes the delete key - other sequences are ignored as
drum does not (yet) support them.
This also stops all vt escape sequences from emitting sigs.
Flashes areas of the screen that get redrawn by blits a bright pink.
Doesn't behave quite right in some scenarios (where the first blit isn't
a cursor movement, or there is a %nel at the end of the buffer), but
works sufficiently for the common cases.
%txt should be reserved for chunks of pasted text and other
non-keystroke text inputs. Perhaps at a later point in time we'll handle
paste events explicitly, letting this be more accurate.
- only resize when necessary (check the container's height)
- refactor CSS: use position relative / absolute to stack Buffers instead of display:none; this affects the calcuations used by fit()
- fix dark mode styles, tweak viewport height (100vh --> 99vh) to prevent overflow scroller
- debounced resize event listener
- new Buffer#onSelect: resize, focus, and pokes `herm` with updated rows / cols
- simplify container ref implementation (no need for a callback ref), remove isOpen hack
- add lodash for debounce
- Tab#onClick no longer handles focus (it's now handled by Buffer#onSelect)
When urbit exits, the host shell it was running in takes over, often
re-prints its own prompt.
Here, we move the cursor to the bottom of the screen right before
exiting, so that any subsequent output doesn't destroy whatever we had
on-screen when we closed.
Having the origin at the top left instead of the bottom left is more
conventional and ergonomic. The only thing this complicates is
prompt-specific logic, where we care about the coordinates of the
bottom-most line on the screen.
For that reason, the bulk of the changes here are in vere, where we
treat the bottom-most line specially, drawing the spinner onto it.
Webterm is likewise updated to account for the new coordinate system.
Drum now opts to accept clicks anywhere on the screen, and does its best
to move the cursor as close to the clicked location as possible (within
the confines of the prompt).
By accumulating %txt events until we reach a more complex event or reach
the end of the input buffer, we can significantly reduce the "overhead"
of pasting text into the terminal. Instead of an event for each
character, we now inject up to a buffer's worth of characters
(currently, 123 bytes) at a time. This makes pasting process much
faster.
Incidentally, the behavior for pasting text with syntax errors into the
dojo may be a little bit surprising: after every buffer boundary, the
dojo will complain about the syntax error, moving the cursor to its
location, and causing the remainder of the text to be inserted in that
position. This may result in garbled-looking input in some cases.
This ux problem should be resolved on dojo's end, perhaps by
highlighting syntax errors with color, instead of the cursor.
Alleviates most of the need for #5687.
Presumably due to how js non-objects work in closures, the selected prop
we were reading out whenever a blit came in was stale.
Also, it was possible that a bell was hiding inside a %mor blit, so we
add a small helper for checking properly.
%rez has always used "width & height". Certainly, "x & y" is more
standard than "row & column". As such, we settle on making %hop and %hit
respect the more natural ordering. This change is safe because these
interfaces haven't made it to livenet yet.
When adding a session, using this special syntax will create a new session for the indicated agent.
E.g., `book!my-session` opens a new session for the %book agent.
When creating a new session, validate that it meets the following conditions:
- must start with an alphabetical
- can be composed of alphanumerics with hyphens
- can be length 1 or longer
- cannot begin or end with a hyphen
Fully implements webterm support for multiple dill terminal sessions.
Remaining work includes styling, session creation safety (name-wise),
and general cleanup.
Co-authored-by: tomholford <tomholford@users.noreply.github.com>
Co-authored-by: liam-fitzgerald <liam@tlon.io>
If a generator has a named argument named "drum-session", and the caller
doesn't specify a value for it, dojo auto-fills it with the current drum
session identifier.
We update the sole protocol to more cleanly support multiple sessions.
Primarily, the "sole id" is updated to be a [@p @ta] instead of a @ta,
and it is now generated based off the connected dill session, rather
than statically.
This change ripples out to applications that support the sole protocol:
the subscription path becomes /sole/[ship]/[session] (as opposed to
/sole/[per-ship-constant]), and %sole-action pokes include the new id as
well.
For shoe agents, this means (at the very least) updating the function
signatures of the shoe arms.
/lib/sole has been updated to include helper functions for parsing a
sole-id from a subscription path, and turning a sole-id into its
corresponding path. It also has a function to aid in migrating old
sole-ids.
Existing sole agents are made to kick any known open sessions, forcing a
resubscribe by drum, so that they may use exclusively the new format
going forward. Third-party agents are recommended to do the same.
Note that some functionality, such as |link, still operates exclusively
on the default session. Improvements in this area to follow soon.