annotate src/terminal.c @ 11698:4f59d2a66bf7 v8.0.0732

patch 8.0.0732: when updating a buffer modeless selection is lost commit https://github.com/vim/vim/commit/80dd3f9d41ce2ff6ab3544cdb266627bbdfc34a6 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jul 19 12:51:52 2017 +0200 patch 8.0.0732: when updating a buffer modeless selection is lost Problem: When updating a buffer for a callback the modeless selection is lost. Solution: Do not insert or delete screen lines when redrawing for a callback and there is a modeless selection.
author Christian Brabandt <cb@256bit.org>
date Wed, 19 Jul 2017 13:00:03 +0200
parents 8f5840a59b31
children dac96f8800be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
2 *
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
4 *
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
8 */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
9
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
10 /*
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
11 * Terminal window support, see ":help :terminal".
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
12 *
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
13 * There are three parts:
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
14 * 1. Generic code for all systems.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
15 * 2. The MS-Windows implementation.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
16 * Uses a hidden console for the terminal emulator.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
17 * 3. The Unix-like implementation.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
18 * Uses libvterm for the terminal emulator.
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
19 *
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
20 * When a terminal window is opened, a job is started that will be connected to
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
21 * the terminal emulator.
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
22 *
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
23 * If the terminal window has keyboard focus, typed keys are converted to the
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
24 * terminal encoding and writting to the job over a channel.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
25 *
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
26 * If the job produces output, it is written to the terminal emulator. The
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
27 * terminal emulator invokes callbacks when its screen content changes. The
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
28 * line range is stored in tl_dirty_row_start and tl_dirty_row_end. Once in a
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
29 * while, if the terminal window is visible, the screen contents is drawn.
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
30 *
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
31 * TODO:
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
32 * - pressing Enter sends two CR and/or NL characters to "bash -i"?
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
33 * Passing Enter as NL seems to work.
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
34 * - set buffer options to be scratch, hidden, nomodifiable, etc.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
35 * - set buffer name to command, add (1) to avoid duplicates.
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
36 * - If [command] is not given the 'shell' option is used.
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
37 * - Add a scrollback buffer (contains lines to scroll off the top).
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
38 * Can use the buf_T lines, store attributes somewhere else?
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
39 * - When the job ends:
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
40 * - Write "-- JOB ENDED --" in the terminal.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
41 * - Put the terminal contents in the scrollback buffer.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
42 * - Free the terminal emulator.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
43 * - Display the scrollback buffer (but with attributes).
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
44 * Make the buffer not modifiable, drop attributes when making changes.
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
45 * - when closing window and job has not ended, make terminal hidden?
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
46 * - Use a pty for I/O with the job.
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
47 * - Windows implementation:
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
48 * (WiP): https://github.com/mattn/vim/tree/terminal
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
49 * src/os_win32.c mch_open_terminal()
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
50 * Using winpty ?
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
51 * - use win_del_lines() to make scroll-up efficient.
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
52 * - command line completion for :terminal
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
53 * - support fixed size when 'termsize' is "rowsXcols".
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
54 * - support minimal size when 'termsize' is "rows*cols".
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
55 * - support minimal size when 'termsize' is empty.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
56 * - implement ":buf {term-buf-name}"
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
57 * - implement term_list() list of buffers with a terminal
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
58 * - implement term_getsize(buf)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
59 * - implement term_setsize(buf)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
60 * - implement term_sendkeys(buf, keys) send keystrokes to a terminal
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
61 * - implement term_wait(buf) wait for screen to be updated
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
62 * - implement term_scrape(buf, row) inspect terminal screen
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
63 * - implement term_open(command, options) open terminal window
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
64 * - implement term_getjob(buf)
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
65 * - implement 'termkey'
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
66 */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
67
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
68 #include "vim.h"
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
69
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
70 #ifdef FEAT_TERMINAL
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
71
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
72 #ifdef WIN3264
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
73 /* MS-Windows: use a native console. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
74 #else
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
75 /* Unix-like: use libvterm. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
76 # include "libvterm/include/vterm.h"
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
77 #endif
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
78
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
79 /* typedef term_T in structs.h */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
80 struct terminal_S {
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
81 term_T *tl_next;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
82
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
83 #ifdef WIN3264
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
84 /* console handle? */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
85 #else
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
86 VTerm *tl_vterm;
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
87 #endif
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
88 job_T *tl_job;
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
89 buf_T *tl_buffer;
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
90
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
91 /* Range of screen rows to update. Zero based. */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
92 int tl_dirty_row_start; /* -1 if nothing dirty */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
93 int tl_dirty_row_end; /* row below last one to update */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
94
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
95 pos_T tl_cursor;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
96 };
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
97
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
98 #define MAX_ROW 999999 /* used for tl_dirty_row_end to update all rows */
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
99 #define KEY_BUF_LEN 200
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
100
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
101 /* Functions implemented for MS-Windows and Unix-like systems. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
102 static int term_init(term_T *term, int rows, int cols);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
103 static void term_free(term_T *term);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
104 static void term_write_job_output(term_T *term, char_u *msg, size_t len);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
105 static int term_convert_key(int c, char *buf);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
106 static void term_update_lines(win_T *wp);
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
107
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
108 /*
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
109 * List of all active terminals.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
110 */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
111 static term_T *first_term = NULL;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
112
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
113 /**************************************
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
114 * 1. Generic code for all systems.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
115 */
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
116
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
117 /*
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
118 * ":terminal": open a terminal window and execute a job in it.
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
119 */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
120 void
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
121 ex_terminal(exarg_T *eap)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
122 {
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
123 int rows;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
124 int cols;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
125 exarg_T split_ea;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
126 win_T *old_curwin = curwin;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
127 typval_T argvars[2];
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
128 term_T *term;
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
129 jobopt_T opt;
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
130
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
131 if (check_restricted() || check_secure())
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
132 return;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
133
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
134 term = (term_T *)alloc_clear(sizeof(term_T));
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
135 if (term == NULL)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
136 return;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
137 term->tl_dirty_row_end = MAX_ROW;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
138
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
139 /* Open a new window or tab. */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
140 vim_memset(&split_ea, 0, sizeof(split_ea));
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
141 split_ea.cmdidx = CMD_new;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
142 split_ea.cmd = (char_u *)"new";
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
143 split_ea.arg = (char_u *)"";
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
144 ex_splitview(&split_ea);
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
145 if (curwin == old_curwin)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
146 {
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
147 /* split failed */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
148 vim_free(term);
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
149 return;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
150 }
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
151 term->tl_buffer = curbuf;
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
152
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
153 curbuf->b_term = term;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
154 term->tl_next = first_term;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
155 first_term = term;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
156
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
157 /* TODO: set buffer type, hidden, etc. */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
158
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
159 if (*curwin->w_p_tms != NUL)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
160 {
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
161 char_u *p = vim_strchr(curwin->w_p_tms, 'x') + 1;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
162
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
163 rows = atoi((char *)curwin->w_p_tms);
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
164 cols = atoi((char *)p);
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
165 /* TODO: resize window if possible. */
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
166 }
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
167 else
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
168 {
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
169 rows = curwin->w_height;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
170 cols = curwin->w_width;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
171 }
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
172
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
173 if (term_init(term, rows, cols) == OK)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
174 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
175 argvars[0].v_type = VAR_STRING;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
176 argvars[0].vval.v_string = eap->arg;
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
177
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
178 clear_job_options(&opt);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
179 opt.jo_mode = MODE_RAW;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
180 opt.jo_out_mode = MODE_RAW;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
181 opt.jo_err_mode = MODE_RAW;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
182 opt.jo_set = JO_MODE | JO_OUT_MODE | JO_ERR_MODE;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
183 opt.jo_io[PART_OUT] = JIO_BUFFER;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
184 opt.jo_io[PART_ERR] = JIO_BUFFER;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
185 opt.jo_set |= JO_OUT_IO + (JO_OUT_IO << (PART_ERR - PART_OUT));
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
186 opt.jo_io_buf[PART_OUT] = curbuf->b_fnum;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
187 opt.jo_io_buf[PART_ERR] = curbuf->b_fnum;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
188 opt.jo_set |= JO_OUT_BUF + (JO_OUT_BUF << (PART_ERR - PART_OUT));
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
189
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
190 term->tl_job = job_start(argvars, &opt);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
191 }
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
192
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
193 if (term->tl_job == NULL)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
194 /* Wiping out the buffer will also close the window. */
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
195 do_buffer(DOBUF_WIPE, DOBUF_CURRENT, FORWARD, 0, TRUE);
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
196
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
197 /* TODO: Setup pty, see mch_call_shell(). */
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
198 }
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
199
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
200 /*
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
201 * Free a terminal and everything it refers to.
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
202 * Kills the job if there is one.
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
203 * Called when wiping out a buffer.
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
204 */
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
205 void
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
206 free_terminal(term_T *term)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
207 {
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
208 term_T *tp;
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
209
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
210 if (term == NULL)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
211 return;
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
212 if (first_term == term)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
213 first_term = term->tl_next;
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
214 else
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
215 for (tp = first_term; tp->tl_next != NULL; tp = tp->tl_next)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
216 if (tp->tl_next == term)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
217 {
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
218 tp->tl_next = term->tl_next;
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
219 break;
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
220 }
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
221
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
222 if (term->tl_job != NULL)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
223 {
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
224 if (term->tl_job->jv_status != JOB_ENDED)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
225 job_stop(term->tl_job, NULL, "kill");
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
226 job_unref(term->tl_job);
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
227 }
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
228
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
229 term_free(term);
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
230 vim_free(term);
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
231 }
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
232
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11684
diff changeset
233 /*
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
234 * Invoked when "msg" output from a job was received. Write it to the terminal
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
235 * of "buffer".
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
236 */
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
237 void
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
238 write_to_term(buf_T *buffer, char_u *msg, channel_T *channel)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
239 {
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
240 size_t len = STRLEN(msg);
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
241 term_T *term = buffer->b_term;
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
242
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
243 ch_logn(channel, "writing %d bytes to terminal", (int)len);
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
244 term_write_job_output(term, msg, len);
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
245
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
246 /* TODO: only update once in a while. */
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
247 update_screen(0);
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
248 setcursor();
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
249 out_flush();
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
250 }
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
251
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
252 /*
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
253 * Wait for input and send it to the job.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
254 * Return when a CTRL-W command is typed that moves to another window.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
255 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
256 void
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
257 terminal_loop(void)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
258 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
259 char buf[KEY_BUF_LEN];
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
260 int c;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
261 size_t len;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
262
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
263 for (;;)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
264 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
265 /* TODO: skip screen update when handling a sequence of keys. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
266 update_screen(0);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
267 setcursor();
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
268 out_flush();
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
269 c = vgetc();
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
270
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
271 if (c == Ctrl_W)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
272 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
273 stuffcharReadbuff(Ctrl_W);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
274 return;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
275 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
276
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
277 /* Convert the typed key to a sequence of bytes for the job. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
278 len = term_convert_key(c, buf);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
279 if (len > 0)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
280 /* TODO: if FAIL is returned, stop? */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
281 channel_send(curbuf->b_term->tl_job->jv_channel, PART_IN,
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
282 (char_u *)buf, len, NULL);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
283 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
284 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
285
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
286 /*
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
287 * Called to update the window that contains the terminal.
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
288 */
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
289 void
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
290 term_update_window(win_T *wp)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
291 {
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
292 term_update_lines(wp);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
293 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
294
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
295 #ifdef WIN3264
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
296
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
297 /**************************************
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
298 * 2. MS-Windows implementation.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
299 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
300
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
301 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
302 * Create a new terminal of "rows" by "cols" cells.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
303 * Store a reference in "term".
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
304 * Return OK or FAIL.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
305 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
306 static int
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
307 term_init(term_T *term, int rows, int cols)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
308 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
309 /* TODO: Create a hidden console */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
310 return FAIL;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
311 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
312
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
313 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
314 * Free the terminal emulator part of "term".
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
315 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
316 static void
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
317 term_free(term_T *term)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
318 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
319 /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
320 }
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
321
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
322 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
323 * Write job output "msg[len]" to the terminal.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
324 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
325 static void
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
326 term_write_job_output(term_T *term, char_u *msg, size_t len)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
327 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
328 /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
329 }
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
330
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
331 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
332 * Convert typed key "c" into bytes to send to the job.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
333 * Return the number of bytes in "buf".
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
334 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
335 static int
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
336 term_convert_key(int c, char *buf)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
337 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
338 /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
339 return 0;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
340 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
341
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
342 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
343 * Called to update the window that contains the terminal.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
344 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
345 static void
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
346 term_update_lines(win_T *wp)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
347 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
348 /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
349 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
350
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
351 #else
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
352
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
353 /**************************************
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
354 * 3. Unix-like implementation.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
355 *
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
356 * For a terminal one VTerm is constructed. This uses libvterm. A copy of
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
357 * that library is in the libvterm directory.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
358 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
359
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
360 static int handle_damage(VTermRect rect, void *user);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
361 static int handle_moverect(VTermRect dest, VTermRect src, void *user);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
362 static int handle_movecursor(VTermPos pos, VTermPos oldpos, int visible, void *user);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
363 static int handle_resize(int rows, int cols, void *user);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
364
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
365 static VTermScreenCallbacks screen_callbacks = {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
366 handle_damage, /* damage */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
367 handle_moverect, /* moverect */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
368 handle_movecursor, /* movecursor */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
369 NULL, /* settermprop */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
370 NULL, /* bell */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
371 handle_resize, /* resize */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
372 NULL, /* sb_pushline */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
373 NULL /* sb_popline */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
374 };
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
375
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
376 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
377 * Create a new terminal of "rows" by "cols" cells.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
378 * Store a reference in "term".
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
379 * Return OK or FAIL.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
380 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
381 static int
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
382 term_init(term_T *term, int rows, int cols)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
383 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
384 VTerm *vterm = vterm_new(rows, cols);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
385 VTermScreen *screen;
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
386
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
387 term->tl_vterm = vterm;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
388 screen = vterm_obtain_screen(vterm);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
389 vterm_screen_set_callbacks(screen, &screen_callbacks, term);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
390 /* TODO: depends on 'encoding'. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
391 vterm_set_utf8(vterm, 1);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
392 /* Required to initialize most things. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
393 vterm_screen_reset(screen, 1 /* hard */);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
394
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
395 /* By default NL means CR-NL. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
396 vterm_input_write(vterm, "\x1b[20h", 5);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
397
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
398 return OK;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
399 }
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
400
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
401 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
402 * Free the terminal emulator part of "term".
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
403 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
404 static void
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
405 term_free(term_T *term)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
406 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
407 vterm_free(term->tl_vterm);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
408 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
409
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
410 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
411 * Write job output "msg[len]" to the terminal.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
412 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
413 static void
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
414 term_write_job_output(term_T *term, char_u *msg, size_t len)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
415 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
416 VTerm *vterm = term->tl_vterm;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
417
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
418 vterm_input_write(vterm, (char *)msg, len);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
419 vterm_screen_flush_damage(vterm_obtain_screen(vterm));
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
420 }
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
421
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
422 static int
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
423 handle_damage(VTermRect rect, void *user)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
424 {
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
425 term_T *term = (term_T *)user;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
426
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
427 term->tl_dirty_row_start = MIN(term->tl_dirty_row_start, rect.start_row);
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
428 term->tl_dirty_row_end = MAX(term->tl_dirty_row_end, rect.end_row);
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
429 redraw_buf_later(term->tl_buffer, NOT_VALID);
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
430 return 1;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
431 }
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
432
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
433 static int
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
434 handle_moverect(VTermRect dest, VTermRect src, void *user)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
435 {
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
436 term_T *term = (term_T *)user;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
437
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
438 /* TODO */
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
439 redraw_buf_later(term->tl_buffer, NOT_VALID);
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
440 return 1;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
441 }
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
442
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
443 static int
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
444 handle_movecursor(VTermPos pos, VTermPos oldpos, int visible, void *user)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
445 {
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
446 term_T *term = (term_T *)user;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
447 win_T *wp;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
448 int is_current = FALSE;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
449
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
450 FOR_ALL_WINDOWS(wp)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
451 {
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
452 if (wp->w_buffer == term->tl_buffer)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
453 {
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
454 /* TODO: limit to window size? */
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
455 wp->w_wrow = pos.row;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
456 wp->w_wcol = pos.col;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
457 if (wp == curwin)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
458 is_current = TRUE;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
459 }
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
460 }
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
461
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
462 if (is_current)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
463 {
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
464 setcursor();
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
465 out_flush();
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
466 }
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
467
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
468 return 1;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
469 }
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
470
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
471 static int
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
472 handle_resize(int rows, int cols, void *user)
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
473 {
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
474 term_T *term = (term_T *)user;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
475
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
476 /* TODO: handle terminal resize. */
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11668
diff changeset
477 redraw_buf_later(term->tl_buffer, NOT_VALID);
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
478 return 1;
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
479 }
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
480
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
481 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
482 * Convert typed key "c" into bytes to send to the job.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
483 * Return the number of bytes in "buf".
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
484 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
485 static int
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
486 term_convert_key(int c, char *buf)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
487 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
488 VTerm *vterm = curbuf->b_term->tl_vterm;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
489 VTermKey key = VTERM_KEY_NONE;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
490 VTermModifier mod = VTERM_MOD_NONE;
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
491
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
492 switch (c)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
493 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
494 /* TODO: which of these two should be used? */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
495 #if 0
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
496 case CAR: key = VTERM_KEY_ENTER; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
497 #else
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
498 case CAR: c = NL; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
499 #endif
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
500 case ESC: key = VTERM_KEY_ESCAPE; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
501 case K_BS: key = VTERM_KEY_BACKSPACE; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
502 case K_DEL: key = VTERM_KEY_DEL; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
503 case K_DOWN: key = VTERM_KEY_DOWN; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
504 case K_END: key = VTERM_KEY_END; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
505 case K_F10: key = VTERM_KEY_FUNCTION(10); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
506 case K_F11: key = VTERM_KEY_FUNCTION(11); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
507 case K_F12: key = VTERM_KEY_FUNCTION(12); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
508 case K_F1: key = VTERM_KEY_FUNCTION(1); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
509 case K_F2: key = VTERM_KEY_FUNCTION(2); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
510 case K_F3: key = VTERM_KEY_FUNCTION(3); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
511 case K_F4: key = VTERM_KEY_FUNCTION(4); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
512 case K_F5: key = VTERM_KEY_FUNCTION(5); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
513 case K_F6: key = VTERM_KEY_FUNCTION(6); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
514 case K_F7: key = VTERM_KEY_FUNCTION(7); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
515 case K_F8: key = VTERM_KEY_FUNCTION(8); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
516 case K_F9: key = VTERM_KEY_FUNCTION(9); break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
517 case K_HOME: key = VTERM_KEY_HOME; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
518 case K_INS: key = VTERM_KEY_INS; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
519 case K_K0: key = VTERM_KEY_KP_0; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
520 case K_K1: key = VTERM_KEY_KP_1; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
521 case K_K2: key = VTERM_KEY_KP_2; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
522 case K_K3: key = VTERM_KEY_KP_3; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
523 case K_K4: key = VTERM_KEY_KP_4; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
524 case K_K5: key = VTERM_KEY_KP_5; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
525 case K_K6: key = VTERM_KEY_KP_6; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
526 case K_K7: key = VTERM_KEY_KP_7; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
527 case K_K8: key = VTERM_KEY_KP_8; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
528 case K_K9: key = VTERM_KEY_KP_9; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
529 case K_KDEL: key = VTERM_KEY_DEL; break; /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
530 case K_KDIVIDE: key = VTERM_KEY_KP_DIVIDE; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
531 case K_KEND: key = VTERM_KEY_KP_1; break; /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
532 case K_KENTER: key = VTERM_KEY_KP_ENTER; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
533 case K_KHOME: key = VTERM_KEY_KP_7; break; /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
534 case K_KINS: key = VTERM_KEY_KP_0; break; /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
535 case K_KMINUS: key = VTERM_KEY_KP_MINUS; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
536 case K_KMULTIPLY: key = VTERM_KEY_KP_MULT; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
537 case K_KPAGEDOWN: key = VTERM_KEY_KP_3; break; /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
538 case K_KPAGEUP: key = VTERM_KEY_KP_9; break; /* TODO */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
539 case K_KPLUS: key = VTERM_KEY_KP_PLUS; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
540 case K_KPOINT: key = VTERM_KEY_KP_PERIOD; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
541 case K_LEFT: key = VTERM_KEY_LEFT; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
542 case K_PAGEDOWN: key = VTERM_KEY_PAGEDOWN; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
543 case K_PAGEUP: key = VTERM_KEY_PAGEUP; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
544 case K_RIGHT: key = VTERM_KEY_RIGHT; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
545 case K_UP: key = VTERM_KEY_UP; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
546 case TAB: key = VTERM_KEY_TAB; break;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
547 }
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
548
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
549 /*
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
550 * Convert special keys to vterm keys:
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
551 * - Write keys to vterm: vterm_keyboard_key()
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
552 * - Write output to channel.
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
553 */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
554 if (key != VTERM_KEY_NONE)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
555 /* Special key, let vterm convert it. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
556 vterm_keyboard_key(vterm, key, mod);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
557 else
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
558 /* Normal character, let vterm convert it. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
559 vterm_keyboard_unichar(vterm, c, mod);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
560
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
561 /* Read back the converted escape sequence. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
562 return vterm_output_read(vterm, buf, KEY_BUF_LEN);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
563 }
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
564
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
565 /*
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
566 * Called to update the window that contains the terminal.
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
567 */
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
568 static void
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
569 term_update_lines(win_T *wp)
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
570 {
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
571 int vterm_rows;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
572 int vterm_cols;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
573 VTerm *vterm = wp->w_buffer->b_term->tl_vterm;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
574 VTermScreen *screen = vterm_obtain_screen(vterm);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
575 VTermPos pos;
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
576
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
577 vterm_get_size(vterm, &vterm_rows, &vterm_cols);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
578
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
579 /* TODO: Only redraw what changed. */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
580 for (pos.row = 0; pos.row < wp->w_height; ++pos.row)
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
581 {
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
582 int off = screen_get_current_line_off();
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
583
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
584 if (pos.row < vterm_rows)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
585 for (pos.col = 0; pos.col < wp->w_width && pos.col < vterm_cols;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
586 ++pos.col)
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
587 {
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
588 VTermScreenCell cell;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
589 int c;
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
590
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
591 vterm_screen_get_cell(screen, pos, &cell);
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
592 /* TODO: use cell.attrs and colors */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
593 /* TODO: use cell.width */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
594 /* TODO: multi-byte chars */
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
595 c = cell.chars[0];
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
596 ScreenLines[off] = c == NUL ? ' ' : c;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
597 ScreenAttrs[off] = 0;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
598 ++off;
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
599 }
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
600
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
601 screen_line(wp->w_winrow + pos.row, wp->w_wincol, pos.col, wp->w_width,
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
602 FALSE);
11684
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
603 }
1ce1376fbbf8 patch 8.0.0725: a terminal window does not handle keyboard input
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
604 }
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
605
11694
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
606 #endif
8f5840a59b31 patch 8.0.0730: terminal feature only supports Unix-like systems
Christian Brabandt <cb@256bit.org>
parents: 11690
diff changeset
607
11621
b8299e742f41 patch 8.0.0693: no terminal emulator support
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
608 #endif /* FEAT_TERMINAL */