Skip to content

Commit

Permalink
patch 8.0.0769: build problems with terminal on MS-Windows
Browse files Browse the repository at this point in the history
Problem:    Build problems with terminal on MS-Windows using MSVC.
Solution:   Remove stdbool.h dependency. Only use ScreenLinesUC when it was
            allocated. Fix typos. (Ken Takata)
  • Loading branch information
brammool committed Jul 24, 2017
1 parent 2155441 commit 8a77306
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 42 deletions.
26 changes: 19 additions & 7 deletions runtime/doc/terminal.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
*terminal.txt* For Vim version 8.0. Last change: 2017 Jul 19
*terminal.txt* For Vim version 8.0. Last change: 2017 Jul 24


VIM REFERENCE MANUAL by Bram Moolenaar
Expand Down Expand Up @@ -47,8 +47,9 @@ See option 'termsize' for controlling the size of the terminal window.
(TODO: scrolling when the terminal is larger than the window)

Syntax ~
*:ter* *:terminal*
:terminal[!] [command] Open a new terminal window.

:ter[minal][!] [command] *:ter* *:terminal*
Open a new terminal window.

If [command] is provided run it as a job and connect
the input and output to the terminal.
Expand Down Expand Up @@ -79,7 +80,7 @@ The size of the terminal can be in one of three modes:
The minimal size is 2 screen lines with 10 cells.

2. The 'termsize' option is "rows*cols", where "rows" is the minimal number of
screen rows and "cols" is the minial number of cells.
screen rows and "cols" is the minimal number of cells.

3. The 'termsize' option is "rowsXcols" (where the x is upper or lower case).
The terminal size is fixed to the specified number of screen lines and
Expand All @@ -101,9 +102,20 @@ can even run Vim in the terminal! That's used for debugging, see below.

MS-Windows ~

On MS-Windows a hidden console is used to run the command in. This should
work well for all kind of commands. Obviously, they must be commands that run
in a terminal, not open their own window.
On MS-Windows winpty is used to make it possible to run all kind of commands.
Obviously, they must be commands that run in a terminal, not open their own
window.

You need the following two files from winpty:

winpty.dll
winpty-agent.exe

You can download them from the following page:

https://github.com/rprichard/winpty

Just put the files somewhere in your PATH.

==============================================================================
2. Remote testing *terminal-testing*
Expand Down
15 changes: 6 additions & 9 deletions src/INSTALLpc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -706,20 +706,17 @@ Or when using MinGW (as one line):
13. Building with Terminal support
==================================

Vim with Terminal support can be built with either MSVC, or MinGW or Cygwin.
Vim with Terminal support can be built with either MSVC, MinGW or Cygwin.
This uses the included libvterm and winpty. No extra header files or
libraries are needed for building.
libraries are needed for building. Just set TERMINAL to yes.

Running Vim with terminal support requires the following two winpty files:
E.g. When using MSVC:

winpty.dll
winpty-agent.dll
nmake -f Make_mvc.mak TERMINAL=yes

You can download them from the following page:

https://github.com/rprichard/winpty
Or when using MinGW (as one line):

Just put the DLL files somewhere in your PATH.
mingw32-make -f Make_mingw.mak TERMINAL=yes


14. Windows 3.1x
Expand Down
1 change: 1 addition & 0 deletions src/Make_cyg_ming.mak
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ CHANNEL=yes
else
CHANNEL=$(GUI)
endif
# Set to yes to enable terminal support.
TERMINAL=no


Expand Down
7 changes: 5 additions & 2 deletions src/Make_mvc.mak
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,9 @@ CSCOPE_DEFS = -DFEAT_CSCOPE
!if "$(TERMINAL)" == "yes"
TERMINAL_OBJ = $(OBJDIR)/terminal.obj
TERMINAL_DEFS = -DFEAT_TERMINAL
!if $(MSVC_MAJOR) <= 11
TERMINAL_DEFS = $(TERMINAL_DEFS) /I if_perl_msvc
!endif
TERMINAL_SRC = terminal.c
VTERM_LIB = libvterm/vterm.lib
!endif
Expand Down Expand Up @@ -1154,7 +1157,7 @@ all: $(VIM).exe \

$(VIM).exe: $(OUTDIR) $(OBJ) $(GUI_OBJ) $(CUI_OBJ) $(OLE_OBJ) $(OLE_IDL) $(MZSCHEME_OBJ) \
$(LUA_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(PYTHON3_OBJ) $(RUBY_OBJ) $(TCL_OBJ) \
$(CSCOPE_OBJ) $(TERMINAL_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) \
$(CSCOPE_OBJ) $(TERMINAL_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) $(VTERM_LIB) \
version.c version.h
$(CC) $(CFLAGS) version.c
$(link) $(LINKARGS1) -out:$(VIM).exe $(OBJ) $(GUI_OBJ) $(CUI_OBJ) $(OLE_OBJ) \
Expand Down Expand Up @@ -1549,7 +1552,7 @@ proto.h: \

libvterm/vterm.lib :
cd libvterm
$(MAKE) /NOLOGO -f Makefile.msc
$(MAKE) /NOLOGO -f Makefile.msc "MSVC_MAJOR=$(MSVC_MAJOR)"
cd ..

# vim: set noet sw=8 ts=8 sts=0 wm=0 tw=0:
7 changes: 6 additions & 1 deletion src/libvterm/Makefile.msc
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
CFLAGS = /DINLINE= /Iinclude

OBJS = \
src\encoding.c \
src\keyboard.c \
Expand All @@ -24,7 +26,10 @@ all : vterm.lib


.c.obj :
cl /DINLINE= /Iinclude /Fo$@ /c $<
cl $(CFLAGS) /Fo$@ /c $<

vterm.lib : $(OBJS)
lib /OUT:$@ $(OBJS)

clean:
del $(OBJS) vterm.lib
34 changes: 18 additions & 16 deletions src/libvterm/bin/vterm-ctrl.c
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#define _XOPEN_SOURCE 500 /* strdup */

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define streq(a,b) (strcmp(a,b)==0)
#define TRUE 1
#define FALSE 0

#include <termios.h>

Expand Down Expand Up @@ -60,13 +61,14 @@ static char *helptext[] = {
NULL
};

static bool seticanon(bool icanon, bool echo)
static int seticanon(int icanon, int echo)
{
struct termios termios;
int ret;

tcgetattr(0, &termios);

bool ret = (termios.c_lflag & ICANON);
ret = (termios.c_lflag & ICANON);

if(icanon) termios.c_lflag |= ICANON;
else termios.c_lflag &= ~ICANON;
Expand All @@ -84,16 +86,16 @@ static void await_c1(int c1)
int c;

/* await CSI - 8bit or 2byte 7bit form */
bool in_esc = false;
int in_esc = FALSE;
while((c = getchar())) {
if(c == c1)
break;
if(in_esc && c == (char)(c1 - 0x40))
break;
if(!in_esc && c == 0x1b)
in_esc = true;
in_esc = TRUE;
else
in_esc = false;
in_esc = FALSE;
}
}

Expand Down Expand Up @@ -121,7 +123,7 @@ static char *read_csi()
static char *read_dcs()
{
unsigned char dcs[32];
bool in_esc = false;
int in_esc = FALSE;
int i;

await_c1(0x90);
Expand All @@ -133,10 +135,10 @@ static char *read_dcs()
if(in_esc && c == 0x5c)
break;
if(!in_esc && c == 0x1b)
in_esc = true;
in_esc = TRUE;
else {
dcs[i++] = c;
in_esc = false;
in_esc = FALSE;
}
}
dcs[++i] = 0;
Expand All @@ -158,7 +160,7 @@ static void usage(int exitcode)
exit(exitcode);
}

static bool query_dec_mode(int mode)
static int query_dec_mode(int mode)
{
char *s = NULL;

Expand Down Expand Up @@ -189,12 +191,12 @@ static bool query_dec_mode(int mode)
free(s);

if(reply_value == 1 || reply_value == 3)
return true;
return TRUE;
if(reply_value == 2 || reply_value == 4)
return false;
return FALSE;

printf("Unrecognised reply to DECRQM: %d\n", reply_value);
return false;
return FALSE;
} while(1);
}

Expand Down Expand Up @@ -247,11 +249,11 @@ static int query_rqss_numeric(char *cmd)
} while(1);
}

bool wasicanon;
int wasicanon;

void restoreicanon(void)
{
seticanon(wasicanon, true);
seticanon(wasicanon, TRUE);
}

int main(int argc, char *argv[])
Expand All @@ -261,7 +263,7 @@ int main(int argc, char *argv[])
if(argc == 1)
usage(0);

wasicanon = seticanon(false, false);
wasicanon = seticanon(FALSE, FALSE);
atexit(restoreicanon);

while(argi < argc) {
Expand Down
21 changes: 14 additions & 7 deletions src/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
* the terminal emulator.
*
* If the terminal window has keyboard focus, typed keys are converted to the
* terminal encoding and writting to the job over a channel.
* terminal encoding and writing to the job over a channel.
*
* If the job produces output, it is written to the terminal emulator. The
* terminal emulator invokes callbacks when its screen content changes. The
Expand Down Expand Up @@ -731,7 +731,7 @@ color2index(VTermColor *color)
else if (red == 128)
{
if (green == 128 && blue == 128)
return 9; /* high intensity bladk */
return 9; /* high intensity black */
}
else if (red == 255)
{
Expand Down Expand Up @@ -894,7 +894,10 @@ term_update_window(win_T *wp)
if (c == NUL)
{
ScreenLines[off] = ' ';
ScreenLinesUC[off] = NUL;
#if defined(FEAT_MBYTE)
if (enc_utf8)
ScreenLinesUC[off] = NUL;
#endif
}
else
{
Expand All @@ -907,7 +910,8 @@ term_update_window(win_T *wp)
else
{
ScreenLines[off] = c;
ScreenLinesUC[off] = NUL;
if (enc_utf8)
ScreenLinesUC[off] = NUL;
}
#else
ScreenLines[off] = c;
Expand All @@ -920,7 +924,10 @@ term_update_window(win_T *wp)
if (cell.width == 2)
{
ScreenLines[off] = NUL;
ScreenLinesUC[off] = NUL;
#if defined(FEAT_MBYTE)
if (enc_utf8)
ScreenLinesUC[off] = NUL;
#endif
++pos.col;
++off;
}
Expand Down Expand Up @@ -1025,9 +1032,9 @@ term_get_status_text(term_T *term)
#define WINPTY_SPAWN_FLAG_AUTO_SHUTDOWN 1ul
#define WINPTY_SPAWN_FLAG_EXIT_AFTER_SHUTDOWN 2ull

void* (*winpty_config_new)(int, void*);
void* (*winpty_config_new)(UINT64, void*);
void* (*winpty_open)(void*, void*);
void* (*winpty_spawn_config_new)(int, void*, LPCWSTR, void*, void*, void*);
void* (*winpty_spawn_config_new)(UINT64, void*, LPCWSTR, void*, void*, void*);
BOOL (*winpty_spawn)(void*, void*, HANDLE*, HANDLE*, DWORD*, void*);
void (*winpty_config_set_initial_size)(void*, int, int);
LPCWSTR (*winpty_conin_name)(void*);
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
769,
/**/
768,
/**/
Expand Down

0 comments on commit 8a77306

Please sign in to comment.