aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os/tty.c
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-12-30 23:54:23 +0100
committerGitHub <noreply@github.com>2018-12-30 23:54:23 +0100
commit725da1feeb9a1e2c76533ef2df5e86b1b972c78b (patch)
tree3e4420a8a3f90c05f80c0e3dd7b42c773c0b63c1 /src/nvim/os/tty.c
parent92806827a9f22828cdfd3573f6cf2c827808e641 (diff)
parent5749ecaf228f4a963a4e96ada831f902c73a1e80 (diff)
downloadrneovim-725da1feeb9a1e2c76533ef2df5e86b1b972c78b.tar.gz
rneovim-725da1feeb9a1e2c76533ef2df5e86b1b972c78b.tar.bz2
rneovim-725da1feeb9a1e2c76533ef2df5e86b1b972c78b.zip
Merge #9401 from justinmk/pr-win-erw7
Diffstat (limited to 'src/nvim/os/tty.c')
-rw-r--r--src/nvim/os/tty.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/nvim/os/tty.c b/src/nvim/os/tty.c
new file mode 100644
index 0000000000..bd5b9b4506
--- /dev/null
+++ b/src/nvim/os/tty.c
@@ -0,0 +1,60 @@
+// This is an open source non-commercial project. Dear PVS-Studio, please check
+// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+
+//
+// Terminal/console utils
+//
+
+#include "nvim/os/os.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/tty.c.generated.h"
+#endif
+
+#ifdef WIN32
+# if !defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+# define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
+# endif
+/// Guesses the terminal-type. Calls SetConsoleMode() and uv_set_vterm_state()
+/// if appropriate.
+///
+/// @param[in,out] term Name of the guessed terminal, statically-allocated
+/// @param out_fd stdout file descriptor
+void os_tty_guess_term(const char **term, int out_fd)
+{
+ bool winpty = (os_getenv("NVIM") != NULL);
+
+ if (winpty) {
+ // Force TERM=win32con when running in winpty.
+ *term = "win32con";
+ uv_set_vterm_state(UV_UNSUPPORTED);
+ return;
+ }
+
+ bool conemu_ansi = strequal(os_getenv("ConEmuANSI"), "ON");
+ bool vtp = false;
+
+ HANDLE handle = (HANDLE)_get_osfhandle(out_fd);
+ DWORD dwMode;
+ if (handle != INVALID_HANDLE_VALUE && GetConsoleMode(handle, &dwMode)) {
+ dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+ if (SetConsoleMode(handle, dwMode)) {
+ vtp = true;
+ }
+ }
+
+ if (*term == NULL) {
+ if (vtp) {
+ *term = "vtpcon";
+ } else if (conemu_ansi) {
+ *term = "conemu";
+ } else {
+ *term = "win32con";
+ }
+ }
+
+ if (conemu_ansi) {
+ uv_set_vterm_state(UV_SUPPORTED);
+ }
+}
+#endif