diff options
| author | Justin M. Keyes <justinkz@gmail.com> | 2017-07-10 01:58:54 +0200 | 
|---|---|---|
| committer | Björn Linse <bjorn.linse@gmail.com> | 2017-11-25 09:37:00 +0100 | 
| commit | 9acd7bfe25b5ea2b31ffbbdbd201f5f09afc4237 (patch) | |
| tree | 10cc228ee599207a2298c437a48b582b66b93887 /src/nvim/os/pty_process_unix.c | |
| parent | a97cdff14df1bb788a4b659e0db94e2b2ba1f539 (diff) | |
| download | rneovim-9acd7bfe25b5ea2b31ffbbdbd201f5f09afc4237.tar.gz rneovim-9acd7bfe25b5ea2b31ffbbdbd201f5f09afc4237.tar.bz2 rneovim-9acd7bfe25b5ea2b31ffbbdbd201f5f09afc4237.zip | |
tui: job-control: use saved termios for pty jobs
On startup, if running in a terminal, save the termios properties.
Use the saved termios for `:terminal` and `jobstart()` pty jobs.
This won't affect nvim spawned outside of a terminal.
questions:
- This affects `:terminal` and `jobstart({'pty':v:true})`.
  Should we be more conservative for `jobstart({'pty':v:true})` (e.g.
  pass NULL to forkpty() and let the OS defaults prevail)?
  - Note: `iutf8` would not be set in that case.
Diffstat (limited to 'src/nvim/os/pty_process_unix.c')
| -rw-r--r-- | src/nvim/os/pty_process_unix.c | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/src/nvim/os/pty_process_unix.c b/src/nvim/os/pty_process_unix.c index e39f837c1a..53301e4b53 100644 --- a/src/nvim/os/pty_process_unix.c +++ b/src/nvim/os/pty_process_unix.c @@ -36,13 +36,26 @@  # include "os/pty_process_unix.c.generated.h"  #endif +/// termios saved at startup (for TUI) or initialized by pty_process_spawn(). +static struct termios termios_default; + +/// Saves the termios properties associated with `tty_fd`. +/// +/// @param tty_fd   TTY file descriptor, or -1 if not in a terminal. +void pty_process_save_termios(int tty_fd) +{ +  if (tty_fd == -1 || tcgetattr(tty_fd, &termios_default) != 0) { +    return; +  } +} +  /// @returns zero on success, or negative error code  int pty_process_spawn(PtyProcess *ptyproc)    FUNC_ATTR_NONNULL_ALL  { -  static struct termios termios; -  if (!termios.c_cflag) { -    init_termios(&termios); +  if (!termios_default.c_cflag) { +    // TODO(jkeyes): We could pass NULL to forkpty() instead ... +    init_termios(&termios_default);    }    int status = 0;  // zero or negative error code (libuv convention) @@ -52,7 +65,7 @@ int pty_process_spawn(PtyProcess *ptyproc)    ptyproc->winsize = (struct winsize){ ptyproc->height, ptyproc->width, 0, 0 };    uv_disable_stdio_inheritance();    int master; -  int pid = forkpty(&master, NULL, &termios, &ptyproc->winsize); +  int pid = forkpty(&master, NULL, &termios_default, &ptyproc->winsize);    if (pid < 0) {      status = -errno; | 
