mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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'✌️true})`. Should we be more conservative for `jobstart({'pty'✌️true})` (e.g. pass NULL to forkpty() and let the OS defaults prevail)? - Note: `iutf8` would not be set in that case.
This commit is contained in:
parent
a97cdff14d
commit
9acd7bfe25
@ -73,6 +73,9 @@
|
|||||||
#include "nvim/api/private/helpers.h"
|
#include "nvim/api/private/helpers.h"
|
||||||
#include "nvim/api/private/handle.h"
|
#include "nvim/api/private/handle.h"
|
||||||
#include "nvim/api/private/dispatch.h"
|
#include "nvim/api/private/dispatch.h"
|
||||||
|
#ifndef WIN32
|
||||||
|
# include "nvim/os/pty_process_unix.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Maximum number of commands from + or -c arguments. */
|
/* Maximum number of commands from + or -c arguments. */
|
||||||
#define MAX_ARG_CMDS 10
|
#define MAX_ARG_CMDS 10
|
||||||
@ -1247,6 +1250,14 @@ static void check_and_set_isatty(mparm_T *paramp)
|
|||||||
stdout_isatty
|
stdout_isatty
|
||||||
= paramp->output_isatty = os_isatty(fileno(stdout));
|
= paramp->output_isatty = os_isatty(fileno(stdout));
|
||||||
paramp->err_isatty = os_isatty(fileno(stderr));
|
paramp->err_isatty = os_isatty(fileno(stderr));
|
||||||
|
int tty_fd = paramp->input_isatty
|
||||||
|
? OS_STDIN_FILENO
|
||||||
|
: (paramp->output_isatty
|
||||||
|
? OS_STDOUT_FILENO
|
||||||
|
: (paramp->err_isatty ? OS_STDERR_FILENO : -1));
|
||||||
|
#ifndef WIN32
|
||||||
|
pty_process_save_termios(tty_fd);
|
||||||
|
#endif
|
||||||
TIME_MSG("window checked");
|
TIME_MSG("window checked");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,13 +36,26 @@
|
|||||||
# include "os/pty_process_unix.c.generated.h"
|
# include "os/pty_process_unix.c.generated.h"
|
||||||
#endif
|
#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
|
/// @returns zero on success, or negative error code
|
||||||
int pty_process_spawn(PtyProcess *ptyproc)
|
int pty_process_spawn(PtyProcess *ptyproc)
|
||||||
FUNC_ATTR_NONNULL_ALL
|
FUNC_ATTR_NONNULL_ALL
|
||||||
{
|
{
|
||||||
static struct termios termios;
|
if (!termios_default.c_cflag) {
|
||||||
if (!termios.c_cflag) {
|
// TODO(jkeyes): We could pass NULL to forkpty() instead ...
|
||||||
init_termios(&termios);
|
init_termios(&termios_default);
|
||||||
}
|
}
|
||||||
|
|
||||||
int status = 0; // zero or negative error code (libuv convention)
|
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 };
|
ptyproc->winsize = (struct winsize){ ptyproc->height, ptyproc->width, 0, 0 };
|
||||||
uv_disable_stdio_inheritance();
|
uv_disable_stdio_inheritance();
|
||||||
int master;
|
int master;
|
||||||
int pid = forkpty(&master, NULL, &termios, &ptyproc->winsize);
|
int pid = forkpty(&master, NULL, &termios_default, &ptyproc->winsize);
|
||||||
|
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
status = -errno;
|
status = -errno;
|
||||||
|
Loading…
Reference in New Issue
Block a user