Commit Graph

30 Commits

Author SHA1 Message Date
oni-link
b165145084 rbuffer: Fix for problems with escape input sequences.
If at least two escape sequences were read, the beginning of the
second sequence would be off by one and the sequence would be
misinterpreted.

An escape sequence could be split in two parts and be
misinterpreted, when saved in a ring buffer with wrap around.

Fixes #2936
2015-07-07 16:58:10 +02:00
Thiago de Arruda
0ef80b9c2b rbuffer: Reimplement as a ring buffer and decouple from rstream
Extract the RBuffer class from rstream.c and reimplement it as a ring buffer,
a more efficient version that doesn't need to relocate memory.

The old rbuffer_read/rbuffer_write interfaces are kept for simple
reading/writing, and the RBUFFER_UNTIL_{FULL,EMPTY} macros are introduced to
hide wrapping logic when more control is required(such as passing the buffer
pointer to a library function that writes directly to the pointer)

Also add a basic infrastructure for writing helper C files that are only
compiled in the unit test library, and use this to write unit tests for RBuffer
which contains some macros that can't be accessed directly by luajit.

Helped-by: oni-link <knil.ino@gmail.com>
Reviewed-by: oni-link <knil.ino@gmail.com>
Reviewed-by: Scott Prager <splinterofchaos@gmail.com>
Reviewed-by: Justin M. Keyes <justinkz@gmail.com>
Reviewed-by: Michael Reed <m.reed@mykolab.com>
2015-07-01 05:40:53 -03:00
Björn Linse
80d61fb87b tui: make termkey use utf-8 mode when &encoding=utf-8 #2469 2015-06-13 19:49:25 +02:00
Scott Prager
412d246be7 getenv: return NULL if empty #2574
Making an environment variable empty can be a way of unsetting it for
platforms that don't support unsetenv(). In most cases, we treat empty
variables as having been unset. For all others, use os_env_exists().
2015-05-29 13:12:12 -04:00
Scott Prager
2c9dfddab1 tui: don't pass NULL to termkey #2747
Closes #2745
2015-05-27 10:24:50 -04:00
Daniel Hahler
297973ab00 tui: defer resize event #2738
When maximizing the window, often only lines would be detected properly
with the `try_resize` handler being called immediately.

Fixes https://github.com/neovim/neovim/issues/2322.
2015-05-25 14:42:12 -04:00
Thiago de Arruda
34c48aaf12 memory: Add free wrapper and refactor project to use it
We already use wrappers for allocation, the new `xfree` function is the
equivalent for deallocation and provides a way to fully replace the malloc
implementation used by Neovim.
2015-04-13 08:22:44 -03:00
Marco Hinz
9a7b071e64 Job control: reset mouse support after foregrounding
Reset mouse support to whatever was used before the process was suspended.

References #2335.
2015-04-06 20:26:21 +02:00
Thiago de Arruda
41b05a0a3c tui: Fix reading when stdin is not a tty
Instead of selecting stderr on startup if stdin is not a tty, first try reading
from it and only switch to stderr when reading fails. With this behavior we
support commands like:

```
echo q | nvim -es
```

and

```
ls *.md | xargs nvim
```

Fixed small bugs in rstream.c to make this happen.
2015-03-26 22:06:57 -03:00
Thiago de Arruda
8dd415e887 tui: Add support for true color terminals
This is enabled by setting the `$NVIM_TUI_ENABLE_TRUE_COLOR` environment
variable, eg:

```
$ NVIM_TUI_ENABLE_TRUE_COLOR=1 nvim
```
2015-03-20 13:20:21 -03:00
Thiago de Arruda
8b7b71f474 ui: Refactor so that busy state won't be the default
Even though assuming nvim is busy most times is simpler, it has a problem: A lot
of unnecessary busy_start/busy_stop notifications are sent to the UI. That's
because in the majority of scenarios almost no time is spent between
`event_poll` calls.

This restores the normal behavior which is to call busy_start only when nvim is
going to perform some task that can take a significant amount of time. Also
improve the usage of buffering in the TUI when changing the cursor state.
2015-03-18 14:16:23 -03:00
oni-link
a0f2961b4f tui.c: Send fewer cursor-hide commands to the terminal.
Since #2158 all connected UIs are informed about the busy state of nvim.
This can be used to decide whether to hide or show the cursor (in one
place).

In the TUI, this is tui_flush(). To prevent cursor flashing, the
terminal is always redrawn with an invisible cursor. After that the
cursor is shown if necessary. In the current implementation
a cursor-hide command will always be the first command in the next
redraw, to prevent flashing. This is not necessary.

Instead we start the TUI with a hidden cursor and only need to hide the
cursor in the next redraw, if the cursor was shown in the last redraw.
Otherwise the cursor is still hidden.

So instead of sending every redraw the cursor-hide command, we only need
to send the command while not busy(a state in nvim with low frequency).
2015-03-18 07:10:11 -03:00
Thiago de Arruda
c546875daf ui: Replace cursor_{on,off} by busy_{stop,start}
Switching cursor off is only necessary in two occasions:

- When redrawing to avoid terminal flickering
- When the editor is busy

The first can now be handled by the TUI, so most calls to ui_cursor_off can be
removed from the core.

So, before this commit it was only necessary to switch the cursor off to notify
the user that nvim was running some long operation. Now the cursor_{on,off}
functions have been replaced by busy_{stop,start} which can be handled in a
UI-specific way(turning the cursor off or showing a busy indicator, for
example).

To make things even more simpler, nvim is always busy except when waiting for
user input or other asynchronous events: It automatically switches to a non-busy
state when the event loop is about to be entered for more than 100 milliseconds.

`ui_busy_start` can be called when its not desired to change the busy state in
the event loop (As its now done by functions that perform blocking shell
invocations).
2015-03-15 10:30:59 -03:00
Anton Ovchinnikov
9925b3a047 Remove redundant casts 2015-03-09 00:40:50 +01:00
Chase Geigle
da457a176b tui: fall back to underline for undercurl. #2099
closes #2098
2015-03-07 21:10:24 -05:00
Thiago de Arruda
97f8251472 tui: Also use xterm-256color when TERM=screen and COLORTERM != NULL
When COLORTERM != null force xterm-256color capabilities when TERM equals xterm
or screen.
2015-02-21 22:28:38 -03:00
Thiago de Arruda
6293b5513c tui: Use unibi_format instead of unibi_run
The current will segfault for large chunks of output because the output buffer
will be overrun.

Using unibi_format is simple because we can simply flush the buffer when its
full.
2015-02-21 05:09:02 -03:00
Thiago de Arruda
eb8f6bec86 tui: Remove option cache 2015-02-21 05:09:02 -03:00
Thiago de Arruda
c58907dac1 tui: Set setaf/setab capabilities for TERM=xterm
Many common terminals that set TERM=xterm and $COLORTERM support 256 colors. If
this is detected, use force the hardcoded xterm's setaf/setab capabilities.
2015-02-21 05:09:02 -03:00
Thiago de Arruda
9894720a05 tui: Don't use 'timeout' for determining esc timeout 2015-02-20 09:43:13 -03:00
Thiago de Arruda
c65f18f686 tui: Set default color attributes when scrolling
This is necessary for some terminals, or else they will clear/insert lines with
wrong background color
2015-02-20 09:27:34 -03:00
Thiago de Arruda
1ed7ae6260 tui: Fix terminfo extension indexes
For unibilium extension indexes, use signed integer type initialized with -1 to
distinguish from the first extension string which will always have index 0.
2015-02-20 09:27:34 -03:00
Thiago de Arruda
bbcddc55ee tui: Replace uv_tty_t by uv_pipe_t
It seems uv_tty_t doesn't work properly on OSX(it is set to blocking mode,
which causes UV_RUN_NOWAIT to misbehave).
2015-02-20 09:27:34 -03:00
Thiago de Arruda
20f52f4235 tui: Only send the pastetoggle key if necessary 2015-02-20 09:27:34 -03:00
Thiago de Arruda
25ceadab37 tui: Remove support for overriding escape sequences with nvim options
- Add xterm/iterm sequences for changing cursor shape(with tmux wrapping).
  Enabled by setting the NVIM_TUI_ENABLE_CURSOR_SHAPE environment variable.
- Remove nvim_override parameter from unibi_out. In the future another way of
  overriding the terminal strings will be added.
2015-02-18 10:46:20 -03:00
Thiago de Arruda
761ccba86f tui: Fix use after free(reported by clang static analyzer) 2015-02-18 10:31:36 -03:00
Thiago de Arruda
59fb8f8172 tui: Add support bracketed paste
Inspired by the vim-bracketed-paste plugin but adapted for the new TUI. Also
initialize some variables of type `Error` that were uninitialized
2015-02-18 09:07:16 -03:00
Thiago de Arruda
26371f4ccc tui: Fix to_status_line terminfo sequence for xterm
Moving the cursor to the status line(to set the title) requires a different
sequence for xterm than the one used by urxvt.
2015-02-17 23:09:36 -03:00
Thiago de Arruda
7ea91de054 tui: Fix background clear for some terminals
Some terminals will perform clearing functions using the current attributes.
Ensure the default attributes are set before clearing.
2015-02-17 23:09:36 -03:00
Thiago de Arruda
9a2dd7c498 ui: Rewrite the builtin terminal UI
Now all terminal-handling code was moved to src/nvim/tui, which implements a
new terminal UI based on libtermkey and unibilium
2015-02-16 23:17:39 -03:00