summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-04-28 19:46:49 +0200
committerBram Moolenaar <Bram@vim.org>2019-04-28 19:46:49 +0200
commitafde13b62b8fa25dac4635d5caee8d088b937ee0 (patch)
tree6a8b58aa58e180e55b2948e5d0bfdbc3d4692a49
parentab4cece6053b0bfd604e15065227b94af873608b (diff)
patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exev8.1.1230
Problem: A lot of code is shared between vim.exe and gvim.exe. Solution: Optionally put the shared code in vim.dll. (Ken Takata, closes #4287)
-rw-r--r--.gitignore2
-rw-r--r--Filelist1
-rw-r--r--nsis/gvim.nsi3
-rw-r--r--runtime/doc/gui_w32.txt13
-rw-r--r--src/Make_cyg_ming.mak160
-rw-r--r--src/Make_mvc.mak164
-rw-r--r--src/channel.c2
-rw-r--r--src/evalfunc.c8
-rw-r--r--src/ex_cmds.c49
-rw-r--r--src/ex_docmd.c19
-rw-r--r--src/feature.h12
-rw-r--r--src/fileio.c5
-rw-r--r--src/getchar.c54
-rw-r--r--src/globals.h3
-rw-r--r--src/gui.c41
-rw-r--r--src/gui.h13
-rw-r--r--src/gui_gtk_x11.c69
-rw-r--r--src/gui_w32.c180
-rw-r--r--src/if_mzsch.c4
-rw-r--r--src/main.c49
-rw-r--r--src/mbyte.c2
-rw-r--r--src/memline.c2
-rw-r--r--src/message.c112
-rw-r--r--src/misc2.c77
-rw-r--r--src/normal.c7
-rw-r--r--src/option.c23
-rw-r--r--src/os_mswin.c169
-rw-r--r--src/os_w32dll.c27
-rw-r--r--src/os_w32exe.c11
-rw-r--r--src/os_win32.c256
-rw-r--r--src/os_win32.h2
-rw-r--r--src/proto/gui.pro2
-rw-r--r--src/proto/gui_w32.pro1
-rw-r--r--src/proto/misc2.pro1
-rw-r--r--src/proto/os_mswin.pro2
-rw-r--r--src/proto/os_win32.pro1
-rw-r--r--src/syntax.c9
-rw-r--r--src/term.c45
-rw-r--r--src/terminal.c30
-rw-r--r--src/ui.c2
-rw-r--r--src/version.c14
-rw-r--r--src/vim.rc20
42 files changed, 1200 insertions, 466 deletions
diff --git a/.gitignore b/.gitignore
index 5691e22d00..6aa298b40f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,6 +33,8 @@ src/auto/pathdef.c
*.suo
*.res
*.RES
+vim*.dll
+vim*.lib
src/if_perl.c
src/pathdef.c
src/Obj*/pathdef.c
diff --git a/Filelist b/Filelist
index a6cc76c9f1..71892782f8 100644
--- a/Filelist
+++ b/Filelist
@@ -454,6 +454,7 @@ SRC_DOS = \
src/iscygpty.h \
src/iid_ole.c \
src/os_dos.h \
+ src/os_w32dll.c \
src/os_w32exe.c \
src/os_win32.c \
src/os_mswin.c \
diff --git a/nsis/gvim.nsi b/nsis/gvim.nsi
index 2e990b8a05..5416a0f886 100644
--- a/nsis/gvim.nsi
+++ b/nsis/gvim.nsi
@@ -322,6 +322,9 @@ Section "$(str_section_exe)" id_section_exe
SetOutPath $0
File /oname=gvim.exe ${VIMSRC}\gvim_ole.exe
+!if /FileExists "${VIMSRC}\vim${BIT}.dll"
+ File ${VIMSRC}\vim${BIT}.dll
+!endif
File /oname=install.exe ${VIMSRC}\installw32.exe
File /oname=uninstal.exe ${VIMSRC}\uninstalw32.exe
File ${VIMSRC}\vimrun.exe
diff --git a/runtime/doc/gui_w32.txt b/runtime/doc/gui_w32.txt
index 15dd275a03..5ce3dc8c46 100644
--- a/runtime/doc/gui_w32.txt
+++ b/runtime/doc/gui_w32.txt
@@ -1,4 +1,4 @@
-*gui_w32.txt* For Vim version 8.1. Last change: 2017 Oct 27
+*gui_w32.txt* For Vim version 8.1. Last change: 2019 Apr 28
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -31,6 +31,17 @@ The GUI will always run in the Windows subsystem. Mostly shells automatically
return with a command prompt after starting gvim. If not, you should use the
"start" command: >
start gvim [options] file ..
+< *E988*
+The console version with the |-g| option may also start the GUI by executing
+gvim.exe: >
+ vim -g [options] file ..
+To make this work, gvim.exe must exist in the same directory as the vim.exe,
+and this feature must be enabled at compile time.
+
+One may also use `:gui` from the console version. However, this is an
+experimental feature and this feature must be enabled at compile time.
+It uses a session file to recreate the current state of the console Vim in the
+GUI Vim.
Note: All fonts (bold, italic) must be of the same size!!! If you don't do
this, text will disappear or mess up the display. Vim does not check the font
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 599b9eeb4c..a2ff64af20 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -36,7 +36,7 @@ FEATURES=HUGE
DEBUG=no
# set to yes to create a mapfile
-# MAP=yes
+#MAP=yes
# set to SIZE for size, SPEED for speed, MAXSPEED for maximum optimization
OPTIMIZE=MAXSPEED
@@ -44,6 +44,11 @@ OPTIMIZE=MAXSPEED
# set to yes to make gvim, no for vim
GUI=yes
+# set to yes to enable the DLL support (EXPERIMENTAL).
+# Creates vim{32,64}.dll, and stub gvim.exe and vim.exe.
+# "GUI" should be also set to "yes".
+#VIMDLL=yes
+
# set to no if you do not want to use DirectWrite (DirectX)
# MinGW-w64 is needed, and ARCH should be set to i686 or x86-64.
DIRECTX=yes
@@ -687,7 +692,7 @@ else # SPEED
CFLAGS += -O2
endif
endif
-CFLAGS += -s
+LFLAGS += -s
endif
LIB = -lkernel32 -luser32 -lgdi32 -ladvapi32 -lcomdlg32 -lcomctl32 -lnetapi32 -lversion
@@ -739,7 +744,6 @@ OBJ = \
$(OUTDIR)/ops.o \
$(OUTDIR)/option.o \
$(OUTDIR)/os_mswin.o \
- $(OUTDIR)/os_w32exe.o \
$(OUTDIR)/os_win32.o \
$(OUTDIR)/pathdef.o \
$(OUTDIR)/popupmnu.o \
@@ -760,10 +764,17 @@ OBJ = \
$(OUTDIR)/usercmd.o \
$(OUTDIR)/userfunc.o \
$(OUTDIR)/version.o \
- $(OUTDIR)/vimrc.o \
$(OUTDIR)/winclip.o \
$(OUTDIR)/window.o
+ifeq ($(VIMDLL),yes)
+OBJ += $(OUTDIR)/os_w32dll.o $(OUTDIR)/vimrcd.o
+EXEOBJC = $(OUTDIR)/os_w32exec.o $(OUTDIR)/vimrcc.o
+EXEOBJG = $(OUTDIR)/os_w32exeg.o $(OUTDIR)/vimrcg.o
+else
+OBJ += $(OUTDIR)/os_w32exe.o $(OUTDIR)/vimrc.o
+endif
+
ifdef PERL
OBJ += $(OUTDIR)/if_perl.o
endif
@@ -870,16 +881,36 @@ endif
LFLAGS += -municode
-ifeq ($(GUI),yes)
+ifeq ($(VIMDLL),yes)
+VIMEXE := vim$(DEBUG_SUFFIX).exe
+GVIMEXE := gvim$(DEBUG_SUFFIX).exe
+ ifeq ($(ARCH),x86-64)
+VIMDLLBASE := vim64$(DEBUG_SUFFIX)
+ else
+VIMDLLBASE := vim32$(DEBUG_SUFFIX)
+ endif
+TARGET = $(VIMDLLBASE).dll
+LFLAGS += -shared
+EXELFLAGS += -municode
+ ifneq ($(DEBUG),yes)
+EXELFLAGS += -s
+ endif
+DEFINES += $(DEF_GUI) -DVIMDLL
+OBJ += $(GUIOBJ) $(CUIOBJ)
+OUTDIR = dobj$(DEBUG_SUFFIX)$(MZSCHEME_SUFFIX)$(ARCH)
+MAIN_TARGET = $(GVIMEXE) $(VIMEXE) $(VIMDLLBASE).dll
+else ifeq ($(GUI),yes)
TARGET := gvim$(DEBUG_SUFFIX).exe
DEFINES += $(DEF_GUI)
OBJ += $(GUIOBJ)
LFLAGS += -mwindows
OUTDIR = gobj$(DEBUG_SUFFIX)$(MZSCHEME_SUFFIX)$(ARCH)
+MAIN_TARGET = $(TARGET)
else
OBJ += $(CUIOBJ)
TARGET := vim$(DEBUG_SUFFIX).exe
OUTDIR = obj$(DEBUG_SUFFIX)$(MZSCHEME_SUFFIX)$(ARCH)
+MAIN_TARGET = $(TARGET)
endif
ifdef GETTEXT
@@ -955,7 +986,7 @@ ifeq (yes, $(MAP))
LFLAGS += -Wl,-Map=$(TARGET).map
endif
-all: $(TARGET) vimrun.exe xxd/xxd.exe tee/tee.exe install.exe uninstal.exe GvimExt/gvimext.dll
+all: $(MAIN_TARGET) vimrun.exe xxd/xxd.exe tee/tee.exe install.exe uninstal.exe GvimExt/gvimext.dll
vimrun.exe: vimrun.c
$(CC) $(CFLAGS) -o vimrun.exe vimrun.c $(LIB)
@@ -966,8 +997,19 @@ install.exe: dosinst.c
uninstal.exe: uninstal.c
$(CC) $(CFLAGS) -o uninstal.exe uninstal.c $(LIB)
+ifeq ($(VIMDLL),yes)
+$(TARGET): $(OUTDIR) $(OBJ)
+ $(LINK) $(CFLAGS) $(LFLAGS) -o $@ $(OBJ) $(LIB) -lole32 -luuid -lgdi32 $(LUA_LIB) $(MZSCHEME_LIBDIR) $(MZSCHEME_LIB) $(PYTHONLIB) $(PYTHON3LIB) $(RUBYLIB)
+
+$(GVIMEXE): $(OUTDIR) $(EXEOBJG) $(VIMDLLBASE).dll
+ $(CC) -L. $(EXELFLAGS) -mwindows -o $@ $(EXEOBJG) -l$(VIMDLLBASE)
+
+$(VIMEXE): $(OUTDIR) $(EXEOBJC) $(VIMDLLBASE).dll
+ $(CC) -L. $(EXELFLAGS) -o $@ $(EXEOBJC) -l$(VIMDLLBASE)
+else
$(TARGET): $(OUTDIR) $(OBJ)
$(LINK) $(CFLAGS) $(LFLAGS) -o $@ $(OBJ) $(LIB) -lole32 -luuid $(LUA_LIB) $(MZSCHEME_LIBDIR) $(MZSCHEME_LIB) $(PYTHONLIB) $(PYTHON3LIB) $(RUBYLIB)
+endif
upx: exes
upx gvim.exe
@@ -996,7 +1038,7 @@ clean:
-$(DEL) $(OUTDIR)$(DIRSLASH)*.o
-$(DEL) $(OUTDIR)$(DIRSLASH)*.res
-rmdir $(OUTDIR)
- -$(DEL) $(TARGET) vimrun.exe install.exe uninstal.exe
+ -$(DEL) $(MAIN_TARGET) vimrun.exe install.exe uninstal.exe
-$(DEL) pathdef.c
ifdef PERL
-$(DEL) if_perl.c
@@ -1025,74 +1067,95 @@ $(OUTDIR)/if_python3.o: if_python3.c if_py_both.h $(INCL)
$(OUTDIR)/%.o : %.c $(INCL)
$(CC) -c $(CFLAGS) $< -o $@
-$(OUTDIR)/vimrc.o: vim.rc version.h gui_w32_rc.h
+ifeq ($(VIMDLL),yes)
+$(OUTDIR)/vimrcc.o: vim.rc gvim.exe.mnf version.h gui_w32_rc.h vim.ico
+ $(WINDRES) $(WINDRES_FLAGS) $(DEFINES) -UFEAT_GUI_MSWIN \
+ --input-format=rc --output-format=coff -i vim.rc -o $@
+
+$(OUTDIR)/vimrcg.o: vim.rc gvim.exe.mnf version.h gui_w32_rc.h vim.ico
+ $(WINDRES) $(WINDRES_FLAGS) $(DEFINES) \
+ --input-format=rc --output-format=coff -i vim.rc -o $@
+
+$(OUTDIR)/vimrcd.o: vim.rc version.h gui_w32_rc.h \
+ tools.bmp tearoff.bmp vim.ico vim_error.ico \
+ vim_alert.ico vim_info.ico vim_quest.ico
+ $(WINDRES) $(WINDRES_FLAGS) $(DEFINES) -DRCDLL -DVIMDLLBASE=\\\"$(VIMDLLBASE)\\\" \
+ --input-format=rc --output-format=coff -i vim.rc -o $@
+else
+$(OUTDIR)/vimrc.o: vim.rc gvim.exe.mnf version.h gui_w32_rc.h \
+ tools.bmp tearoff.bmp vim.ico vim_error.ico \
+ vim_alert.ico vim_info.ico vim_quest.ico
$(WINDRES) $(WINDRES_FLAGS) $(DEFINES) \
--input-format=rc --output-format=coff -i vim.rc -o $@
+endif
$(OUTDIR):
$(MKDIR) $(OUTDIR)
$(OUTDIR)/gui_dwrite.o: gui_dwrite.cpp $(INCL) gui_dwrite.h
- $(CC) -c $(CFLAGS) $(CXXFLAGS) gui_dwrite.cpp -o $(OUTDIR)/gui_dwrite.o
+ $(CC) -c $(CFLAGS) $(CXXFLAGS) gui_dwrite.cpp -o $@
$(OUTDIR)/gui.o: gui.c $(INCL) $(GUI_INCL)
- $(CC) -c $(CFLAGS) gui.c -o $(OUTDIR)/gui.o
+ $(CC) -c $(CFLAGS) gui.c -o $@
$(OUTDIR)/beval.o: beval.c $(INCL) $(GUI_INCL)
- $(CC) -c $(CFLAGS) beval.c -o $(OUTDIR)/beval.o
+ $(CC) -c $(CFLAGS) beval.c -o $@
$(OUTDIR)/gui_beval.o: gui_beval.c $(INCL) $(GUI_INCL)
- $(CC) -c $(CFLAGS) gui_beval.c -o $(OUTDIR)/gui_beval.o
+ $(CC) -c $(CFLAGS) gui_beval.c -o $@
$(OUTDIR)/gui_w32.o: gui_w32.c $(INCL) $(GUI_INCL)
- $(CC) -c $(CFLAGS) gui_w32.c -o $(OUTDIR)/gui_w32.o
+ $(CC) -c $(CFLAGS) gui_w32.c -o $@
$(OUTDIR)/if_cscope.o: if_cscope.c $(INCL) if_cscope.h
- $(CC) -c $(CFLAGS) if_cscope.c -o $(OUTDIR)/if_cscope.o
+ $(CC) -c $(CFLAGS) if_cscope.c -o $@
$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) $(MZSCHEME_INCL) $(MZ_EXTRA_DEP)
- $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o
+ $(CC) -c $(CFLAGS) if_mzsch.c -o $@
mzscheme_base.c:
$(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base
# Remove -D__IID_DEFINED__ for newer versions of the w32api
$(OUTDIR)/if_ole.o: if_ole.cpp $(INCL) if_ole.h
- $(CC) $(CFLAGS) $(CXXFLAGS) -c -o $(OUTDIR)/if_ole.o if_ole.cpp
+ $(CC) -c $(CFLAGS) $(CXXFLAGS) if_ole.cpp -o $@
auto/if_perl.c: if_perl.xs typemap
$(XSUBPP) -prototypes -typemap \
$(PERLTYPEMAP) if_perl.xs -output $@
$(OUTDIR)/if_perl.o: auto/if_perl.c $(INCL)
- $(CC) -c $(CFLAGS) auto/if_perl.c -o $(OUTDIR)/if_perl.o
+ $(CC) -c $(CFLAGS) auto/if_perl.c -o $@
$(OUTDIR)/if_ruby.o: if_ruby.c $(INCL)
ifeq (16, $(RUBY))
- $(CC) $(CFLAGS) -U_WIN32 -c -o $(OUTDIR)/if_ruby.o if_ruby.c
+ $(CC) $(CFLAGS) -U_WIN32 -c -o $@ if_ruby.c
endif
$(OUTDIR)/iscygpty.o: iscygpty.c $(CUI_INCL)
$(CC) -c $(CFLAGS) iscygpty.c -o $(OUTDIR)/iscygpty.o -U_WIN32_WINNT -D_WIN32_WINNT=0x0600 -DUSE_DYNFILEID -DENABLE_STUB_IMPL
$(OUTDIR)/main.o: main.c $(INCL) $(CUI_INCL)
- $(CC) -c $(CFLAGS) main.c -o $(OUTDIR)/main.o
+ $(CC) -c $(CFLAGS) main.c -o $@
$(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_INCL) $(NBDEBUG_SRC)
- $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o
+ $(CC) -c $(CFLAGS) netbeans.c -o $@
+
+$(OUTDIR)/os_w32exec.o: os_w32exe.c $(INCL)
+ $(CC) -c $(CFLAGS) -UFEAT_GUI_MSWIN os_w32exe.c -o $@
+
+$(OUTDIR)/os_w32exeg.o: os_w32exe.c $(INCL)
+ $(CC) -c $(CFLAGS) os_w32exe.c -o $@
$(OUTDIR)/os_win32.o: os_win32.c $(INCL) $(MZSCHEME_INCL)
- $(CC) -c $(CFLAGS) os_win32.c -o $(OUTDIR)/os_win32.o
+ $(CC) -c $(CFLAGS) os_win32.c -o $@
$(OUTDIR)/regexp.o: regexp.c regexp_nfa.c $(INCL)
- $(CC) -c $(CFLAGS) regexp.c -o $(OUTDIR)/regexp.o
+ $(CC) -c $(CFLAGS) regexp.c -o $@
$(OUTDIR)/terminal.o: terminal.c $(INCL) $(TERM_DEPS)
- $(CC) -c $(CFLAGS) terminal.c -o $(OUTDIR)/terminal.o
-
-$(OUTDIR)/textprop.o: textprop.c $(INCL)
- $(CC) -c $(CFLAGS) textprop.c -o $(OUTDIR)/textprop.o
+ $(CC) -c $(CFLAGS) terminal.c -o $@
CCCTERM = $(CC) -c $(CFLAGS) -Ilibvterm/include -DINLINE="" \
@@ -1100,50 +1163,13 @@ CCCTERM = $(CC) -c $(CFLAGS) -Ilibvterm/include -DINLINE="" \
-DIS_COMBINING_FUNCTION=utf_iscomposing_uint \
-DWCWIDTH_FUNCTION=utf_uint2cells
-$(OUTDIR)/encoding.o: libvterm/src/encoding.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/encoding.c -o $@
-
-$(OUTDIR)/keyboard.o: libvterm/src/keyboard.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/keyboard.c -o $@
-
-$(OUTDIR)/mouse.o: libvterm/src/mouse.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/mouse.c -o $@
-
-$(OUTDIR)/parser.o: libvterm/src/parser.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/parser.c -o $@
-
-$(OUTDIR)/pen.o: libvterm/src/pen.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/pen.c -o $@
+$(OUTDIR)/%.o : libvterm/src/%.c $(TERM_DEPS)
+ $(CCCTERM) $< -o $@
-$(OUTDIR)/termscreen.o: libvterm/src/termscreen.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/termscreen.c -o $@
-$(OUTDIR)/state.o: libvterm/src/state.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/state.c -o $@
-
-$(OUTDIR)/unicode.o: libvterm/src/unicode.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/unicode.c -o $@
-
-$(OUTDIR)/vterm.o: libvterm/src/vterm.c $(TERM_DEPS)
- $(CCCTERM) libvterm/src/vterm.c -o $@
-
-$(OUTDIR)/xdiffi.o: xdiff/xdiffi.c $(XDIFF_DEPS)
- $(CC) -c $(CFLAGS) xdiff/xdiffi.c -o $(OUTDIR)/xdiffi.o
-
-$(OUTDIR)/xemit.o: xdiff/xemit.c $(XDIFF_DEPS)
- $(CC) -c $(CFLAGS) xdiff/xemit.c -o $(OUTDIR)/xemit.o
-
-$(OUTDIR)/xprepare.o: xdiff/xprepare.c $(XDIFF_DEPS)
- $(CC) -c $(CFLAGS) xdiff/xprepare.c -o $(OUTDIR)/xprepare.o
-
-$(OUTDIR)/xutils.o: xdiff/xutils.c $(XDIFF_DEPS)
- $(CC) -c $(CFLAGS) xdiff/xutils.c -o $(OUTDIR)/xutils.o
-
-$(OUTDIR)/xhistogram.o: xdiff/xhistogram.c $(XDIFF_DEPS)
- $(CC) -c $(CFLAGS) xdiff/xhistogram.c -o $(OUTDIR)/xhistogram.o
+$(OUTDIR)/%.o : xdiff/%.c $(XDIFF_DEPS)
+ $(CC) -c $(CFLAGS) $< -o $@
-$(OUTDIR)/xpatience.o: xdiff/xpatience.c $(XDIFF_DEPS)
- $(CC) -c $(CFLAGS) xdiff/xpatience.c -o $(OUTDIR)/xpatience.o
pathdef.c: $(INCL)
ifneq (sh.exe, $(SHELL))
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index ef2b7f3f9d..07ebb75592 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -40,6 +40,12 @@
#
# Terminal support: TERMINAL=yes (default is yes)
#
+# DLL support (EXPERIMENTAL): VIMDLL=yes (default is no)
+# Creates vim{32,64}.dll, and stub gvim.exe and vim.exe.
+# The shared codes between the GUI and the console are built into
+# the DLL. This reduces the total file size and memory usage.
+# Also supports `vim -g` and the `:gui` command.
+#
# Lua interface:
# LUA=[Path to Lua directory]
# DYNAMIC_LUA=yes (to load the Lua DLL dynamically)
@@ -178,6 +184,10 @@
TARGETOS = WINNT
+!if "$(VIMDLL)" == "yes"
+GUI = yes
+!endif
+
!ifndef DIRECTX
DIRECTX = $(GUI)
!endif
@@ -185,7 +195,9 @@ DIRECTX = $(GUI)
# Select one of eight object code directories, depends on GUI, OLE, DEBUG and
# interfaces.
# If you change something else, do "make clean" first!
-!if "$(GUI)" == "yes"
+!if "$(VIMDLL)" == "yes"
+OBJDIR = .\ObjD
+!elseif "$(GUI)" == "yes"
OBJDIR = .\ObjG
!else
OBJDIR = .\ObjC
@@ -410,7 +422,7 @@ CHANNEL = $(GUI)
!endif
!endif
-# GUI sepcific features.
+# GUI specific features.
!if "$(GUI)" == "yes"
# Only allow NETBEANS for a GUI build and CHANNEL.
!if "$(NETBEANS)" == "yes" && "$(CHANNEL)" == "yes"
@@ -461,7 +473,7 @@ XPM = no
XPM_OBJ = $(OBJDIR)/xpm_w32.obj
XPM_DEFS = -DFEAT_XPM_W32
!if $(MSVC_MAJOR) >= 14
-# VC14 cannot use a library built by VC12 or eariler, because VC14 uses
+# VC14 cannot use a library built by VC12 or earlier, because VC14 uses
# Universal CRT.
XPM_LIB = $(XPM)\lib-vc14\libXpm.lib
!else
@@ -566,7 +578,7 @@ CPUARG =
# VC<11 generates fp87 code by default
! if $(MSVC_MAJOR) < 11
CPUARG =
-# VC>=11 needs explicit insturctions to generate fp87 code
+# VC>=11 needs explicit instructions to generate fp87 code
! else
CPUARG = /arch:IA32
! endif
@@ -612,6 +624,17 @@ CPUARG = /arch:AVX2
# Pass CPUARG to GvimExt, to avoid using version-dependent defaults
MAKEFLAGS_GVIMEXT = $(MAKEFLAGS_GVIMEXT) CPUARG="$(CPUARG)"
+!if "$(VIMDLL)" == "yes"
+VIMDLLBASE = vim
+! if "$(ASSEMBLY_ARCHITECTURE)" == "i386"
+VIMDLLBASE = $(VIMDLLBASE)32
+! else
+VIMDLLBASE = $(VIMDLLBASE)64
+! endif
+! if "$(DEBUG)" == "yes"
+VIMDLLBASE = $(VIMDLLBASE)d
+! endif
+!endif
LIBC =
DEBUGINFO = /Zi
@@ -747,7 +770,6 @@ OBJ = \
$(OUTDIR)\ops.obj \
$(OUTDIR)\option.obj \
$(OUTDIR)\os_mswin.obj \
- $(OUTDIR)\os_w32exe.obj \
$(OUTDIR)\os_win32.obj \
$(OUTDIR)\pathdef.obj \
$(OUTDIR)\popupmnu.obj \
@@ -769,7 +791,15 @@ OBJ = \
$(OUTDIR)\userfunc.obj \
$(OUTDIR)\winclip.obj \
$(OUTDIR)\window.obj \
- $(OUTDIR)\vim.res
+
+!if "$(VIMDLL)" == "yes"
+OBJ = $(OBJ) $(OUTDIR)\os_w32dll.obj $(OUTDIR)\vimd.res
+EXEOBJC = $(OUTDIR)\os_w32exec.obj $(OUTDIR)\vimc.res
+EXEOBJG = $(OUTDIR)\os_w32exeg.obj $(OUTDIR)\vimg.res
+CFLAGS = $(CFLAGS) -DVIMDLL
+!else
+OBJ = $(OBJ) $(OUTDIR)\os_w32exe.obj $(OUTDIR)\vim.res
+!endif
!if "$(OLE)" == "yes"
CFLAGS = $(CFLAGS) -DFEAT_OLE
@@ -800,7 +830,15 @@ OBJ = $(OBJ) $(OUTDIR)\dimm_i.obj $(OUTDIR)\glbl_ime.obj
SUBSYSTEM = windows
CFLAGS = $(CFLAGS) -DFEAT_GUI_MSWIN
RCFLAGS = $(RCFLAGS) -DFEAT_GUI_MSWIN
+! if "$(VIMDLL)" == "yes"
+SUBSYSTEM_CON = console
+GVIM = g$(VIM)
+CUI_INCL = iscygpty.h
+CUI_OBJ = $(OUTDIR)\iscygpty.obj
+RCFLAGS = $(RCFLAGS) -DVIMDLL
+! else
VIM = g$(VIM)
+! endif
GUI_INCL = \
gui.h
GUI_OBJ = \
@@ -839,6 +877,9 @@ XDIFF_DEPS = \
!if "$(SUBSYSTEM_VER)" != ""
SUBSYSTEM = $(SUBSYSTEM),$(SUBSYSTEM_VER)
SUBSYSTEM_TOOLS = $(SUBSYSTEM_TOOLS),$(SUBSYSTEM_VER)
+! if "$(VIMDLL)" != "yes"
+SUBSYSTEM_CON = $(SUBSYSTEM_CON),$(SUBSYSTEM_VER)
+! endif
# Pass SUBSYSTEM_VER to GvimExt and other tools
MAKEFLAGS_GVIMEXT = $(MAKEFLAGS_GVIMEXT) SUBSYSTEM_VER=$(SUBSYSTEM_VER)
MAKEFLAGS_TOOLS = $(MAKEFLAGS_TOOLS) SUBSYSTEM_VER=$(SUBSYSTEM_VER)
@@ -1174,7 +1215,11 @@ CFLAGS = $(CFLAGS) -DFEAT_$(FEATURES)
# debug more conveniently (able to look at variables which are in registers)
#
CFLAGS = $(CFLAGS) /Fd$(OUTDIR)/ $(DEBUGINFO)
+!if "$(VIMDLL)" == "yes"
+LINK_PDB = /PDB:$(VIMDLLBASE).pdb -debug
+!else
LINK_PDB = /PDB:$(VIM).pdb -debug
+!endif
#
# End extra feature include
@@ -1186,7 +1231,7 @@ CFLAGS_OUTDIR=$(CFLAGS) /Fo$(OUTDIR)/
# Add /opt:ref to remove unreferenced functions and data even when /DEBUG is
# added.
-conflags = /nologo /subsystem:$(SUBSYSTEM) /opt:ref
+conflags = /nologo /opt:ref
PATHDEF_SRC = $(OUTDIR)\pathdef.c
@@ -1219,7 +1264,13 @@ LINKARGS1 = $(LINKARGS1) /LTCG:STATUS
LINKARGS1 = $(LINKARGS1) /HIGHENTROPYVA:NO
!endif
-all: $(VIM).exe \
+!if "$(VIMDLL)" == "yes"
+MAIN_TARGET = $(GVIM).exe $(VIM).exe $(VIMDLLBASE).dll
+!else
+MAIN_TARGET = $(VIM).exe
+!endif
+
+all: $(MAIN_TARGET) \
vimrun.exe \
install.exe \
uninstal.exe \
@@ -1227,17 +1278,41 @@ all: $(VIM).exe \
tee/tee.exe \
GvimExt/gvimext.dll
+!if "$(VIMDLL)" == "yes"
+
+$(VIMDLLBASE).dll: $(OUTDIR) $(OBJ) $(XDIFF_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) $(TERM_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) \
+ version.c version.h
+ $(CC) $(CFLAGS_OUTDIR) version.c
+ $(link) $(LINKARGS1) /dll -out:$(VIMDLLBASE).dll $(OBJ) $(XDIFF_OBJ) $(GUI_OBJ) $(CUI_OBJ) $(OLE_OBJ) \
+ $(LUA_OBJ) $(MZSCHEME_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(PYTHON3_OBJ) $(RUBY_OBJ) \
+ $(TCL_OBJ) $(CSCOPE_OBJ) $(TERM_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) \
+ $(XPM_OBJ) $(OUTDIR)\version.obj $(LINKARGS2)
+
+$(GVIM).exe: $(OUTDIR) $(EXEOBJG) $(VIMDLLBASE).dll
+ $(link) $(LINKARGS1) /subsystem:$(SUBSYSTEM) -out:$(GVIM).exe $(EXEOBJG) $(VIMDLLBASE).lib $(LIBC)
+ if exist $(GVIM).exe.manifest mt.exe -nologo -manifest $(GVIM).exe.manifest -updateresource:$(GVIM).exe;1
+
+$(VIM).exe: $(OUTDIR) $(EXEOBJC) $(VIMDLLBASE).dll
+ $(link) $(LINKARGS1) /subsystem:$(SUBSYSTEM_CON) -out:$(VIM).exe $(EXEOBJC) $(VIMDLLBASE).lib $(LIBC)
+ if exist $(VIM).exe.manifest mt.exe -nologo -manifest $(VIM).exe.manifest -updateresource:$(VIM).exe;1
+
+!else
+
$(VIM).exe: $(OUTDIR) $(OBJ) $(XDIFF_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) $(TERM_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) \
version.c version.h
$(CC) $(CFLAGS_OUTDIR) version.c
- $(link) $(LINKARGS1) -out:$(VIM).exe $(OBJ) $(XDIFF_OBJ) $(GUI_OBJ) $(CUI_OBJ) $(OLE_OBJ) \
+ $(link) $(LINKARGS1) /subsystem:$(SUBSYSTEM) -out:$(VIM).exe $(OBJ) $(XDIFF_OBJ) $(GUI_OBJ) $(CUI_OBJ) $(OLE_OBJ) \
$(LUA_OBJ) $(MZSCHEME_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(PYTHON3_OBJ) $(RUBY_OBJ) \
$(TCL_OBJ) $(CSCOPE_OBJ) $(TERM_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) \
$(XPM_OBJ) $(OUTDIR)\version.obj $(LINKARGS2)
if exist $(VIM).exe.manifest mt.exe -nologo -manifest $(VIM).exe.manifest -updateresource:$(VIM).exe;1
+!endif
+
$(VIM): $(VIM).exe
$(OUTDIR):
@@ -1287,6 +1362,15 @@ clean:
- if exist $(VIM).pdb del $(VIM).pdb
- if exist $(VIM).map del $(VIM).map
- if exist $(VIM).ncb del $(VIM).ncb
+!if "$(VIMDLL)" == "yes"
+ - if exist $(GVIM).exe del $(GVIM).exe
+ - if exist $(GVIM).map del $(GVIM).map
+ - if exist $(VIMDLLBASE).dll del $(VIMDLLBASE).dll
+ - if exist $(VIMDLLBASE).lib del $(VIMDLLBASE).lib
+ - if exist $(VIMDLLBASE).exp del $(VIMDLLBASE).exp
+ - if exist $(VIMDLLBASE).pdb del $(VIMDLLBASE).pdb
+ - if exist $(VIMDLLBASE).map del $(VIMDLLBASE).map
+!endif
- if exist vimrun.exe del vimrun.exe
- if exist install.exe del install.exe
- if exist uninstal.exe del uninstal.exe
@@ -1334,21 +1418,15 @@ $(NEW_TESTS):
###########################################################################
# Create a default rule for transforming .c files to .obj files in $(OUTDIR)
-# Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later)
-!IF "$(_NMAKE_VER)" == ""
-.c{$(OUTDIR)/}.obj:
-!ELSE
.c{$(OUTDIR)/}.obj::
-!ENDIF
+ $(CC) $(CFLAGS_OUTDIR) $<
+
+# Create a default rule for xdiff.
+{xdiff/}.c{$(OUTDIR)/}.obj::
$(CC) $(CFLAGS_OUTDIR) $<
# Create a default rule for transforming .cpp files to .obj files in $(OUTDIR)
-# Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later)
-!IF "$(_NMAKE_VER)" == ""
-.cpp{$(OUTDIR)/}.obj:
-!ELSE
.cpp{$(OUTDIR)/}.obj::
-!ENDIF
$(CC) $(CFLAGS_OUTDIR) $<
$(OUTDIR)/arabic.obj: $(OUTDIR) arabic.c $(INCL)
@@ -1376,22 +1454,16 @@ $(OUTDIR)/dict.obj: $(OUTDIR) dict.c $(INCL)
$(OUTDIR)/diff.obj: $(OUTDIR) diff.c $(INCL)
$(OUTDIR)/xdiffi.obj: $(OUTDIR) xdiff/xdiffi.c $(XDIFF_DEPS)
- $(CC) $(CFLAGS_OUTDIR) xdiff/xdiffi.c
$(OUTDIR)/xemit.obj: $(OUTDIR) xdiff/xemit.c $(XDIFF_DEPS)
- $(CC) $(CFLAGS_OUTDIR) xdiff/xemit.c
$(OUTDIR)/xprepare.obj: $(OUTDIR) xdiff/xprepare.c $(XDIFF_DEPS)
- $(CC) $(CFLAGS_OUTDIR) xdiff/xprepare.c
$(OUTDIR)/xutils.obj: $(OUTDIR) xdiff/xutils.c $(XDIFF_DEPS)
- $(CC) $(CFLAGS_OUTDIR) xdiff/xutils.c
$(OUTDIR)/xhistogram.obj: $(OUTDIR) xdiff/xhistogram.c $(XDIFF_DEPS)
- $(CC) $(CFLAGS_OUTDIR) xdiff/xhistogram.c
$(OUTDIR)/xpatience.obj: $(OUTDIR) xdiff/xpatience.c $(XDIFF_DEPS)
- $(CC) $(CFLAGS_OUTDIR) xdiff/xpatience.c
$(OUTDIR)/digraph.obj: $(OUTDIR) digraph.c $(INCL)
@@ -1516,8 +1588,16 @@ $(OUTDIR)/winclip.obj: $(OUTDIR) winclip.c $(INCL)
$(OUTDIR)/os_win32.obj: $(OUTDIR) os_win32.c $(INCL) $(MZSCHEME_INCL)
+$(OUTDIR)/os_w32dll.obj: $(OUTDIR) os_w32dll.c
+
$(OUTDIR)/os_w32exe.obj: $(OUTDIR) os_w32exe.c $(INCL)
+$(OUTDIR)/os_w32exec.obj: $(OUTDIR) os_w32exe.c $(INCL)
+ $(CC) $(CFLAGS:-DFEAT_GUI_MSWIN=) /Fo$@ os_w32exe.c
+
+$(OUTDIR)/os_w32exeg.obj: $(OUTDIR) os_w32exe.c $(INCL)
+ $(CC) $(CFLAGS) /Fo$@ os_w32exe.c
+
$(OUTDIR)/pathdef.obj: $(OUTDIR) $(PATHDEF_SRC) $(INCL)
$(CC) $(CFLAGS_OUTDIR) $(PATHDEF_SRC)
@@ -1560,10 +1640,25 @@ $(OUTDIR)/window.obj: $(OUTDIR) window.c $(INCL)
$(OUTDIR)/xpm_w32.obj: $(OUTDIR) xpm_w32.c
$(CC) $(CFLAGS_OUTDIR) $(XPM_INC) xpm_w32.c
-$(OUTDIR)/vim.res: $(OUTDIR) vim.rc gvim.exe.mnf version.h tools.bmp \
- tearoff.bmp vim.ico vim_error.ico \
+!if "$(VIMDLL)" == "yes"
+$(OUTDIR)/vimc.res: $(OUTDIR) vim.rc gvim.exe.mnf version.h gui_w32_rc.h \
+ vim.ico
+ $(RC) /nologo /l 0x409 /Fo$@ $(RCFLAGS:-DFEAT_GUI_MSWIN=) vim.rc
+
+$(OUTDIR)/vimg.res: $(OUTDIR) vim.rc gvim.exe.mnf version.h gui_w32_rc.h \
+ vim.ico
+ $(RC) /nologo /l 0x409 /Fo$@ $(RCFLAGS) vim.rc
+
+$(OUTDIR)/vimd.res: $(OUTDIR) vim.rc version.h gui_w32_rc.h \
+ tools.bmp tearoff.bmp vim.ico vim_error.ico \
+ vim_alert.ico vim_info.ico vim_quest.ico
+ $(RC) /nologo /l 0x409 /Fo$@ $(RCFLAGS) -DRCDLL -DVIMDLLBASE=\"$(VIMDLLBASE)\" vim.rc
+!else
+$(OUTDIR)/vim.res: $(OUTDIR) vim.rc gvim.exe.mnf version.h gui_w32_rc.h \
+ tools.bmp tearoff.bmp vim.ico vim_error.ico \
vim_alert.ico vim_info.ico vim_quest.ico
- $(RC) /nologo /l 0x409 /Fo$(OUTDIR)/vim.res $(RCFLAGS) vim.rc
+ $(RC) /nologo /l 0x409 /Fo$@ $(RCFLAGS) vim.rc
+!endif
iid_ole.c if_ole.h vim.tlb: if_ole.idl
midl /nologo /error none /proxy nul /iid iid_ole.c /tlb vim.tlb \
@@ -1583,32 +1678,27 @@ CCCTERM = $(CC) $(CFLAGS) -Ilibvterm/include -DINLINE="" \
-DWCWIDTH_FUNCTION=utf_uint2cells \
-D_CRT_SECURE_NO_WARNINGS
+# Create a default rule for libvterm.
+{libvterm/src/}.c{$(OUTDIR)/}.obj::
+ $(CCCTERM) -Fo$(OUTDIR)/ $<
+
$(OUTDIR)/encoding.obj: $(OUTDIR) libvterm/src/encoding.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/encoding.c
$(OUTDIR)/keyboard.obj: $(OUTDIR) libvterm/src/keyboard.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/keyboard.c
$(OUTDIR)/mouse.obj: $(OUTDIR) libvterm/src/mouse.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/mouse.c
$(OUTDIR)/parser.obj: $(OUTDIR) libvterm/src/parser.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/parser.c
$(OUTDIR)/pen.obj: $(OUTDIR) libvterm/src/pen.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/pen.c
$(OUTDIR)/termscreen.obj: $(OUTDIR) libvterm/src/termscreen.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/termscreen.c
$(OUTDIR)/state.obj: $(OUTDIR) libvterm/src/state.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/state.c
$(OUTDIR)/unicode.obj: $(OUTDIR) libvterm/src/unicode.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/unicode.c
$(OUTDIR)/vterm.obj: $(OUTDIR) libvterm/src/vterm.c $(TERM_DEPS)
- $(CCCTERM) -Fo$@ libvterm/src/vterm.c
# $CFLAGS may contain backslashes and double quotes, escape them both.
diff --git a/src/channel.c b/src/channel.c
index ca8310258e..aac8656cf1 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -5319,7 +5319,7 @@ job_still_useful(job_T *job)
return job_need_end_check(job) || job_channel_still_useful(job);
}
-#if defined(GUI_MAY_FORK) || defined(PROTO)
+#if defined(GUI_MAY_FORK) || defined(GUI_MAY_SPAWN) || defined(PROTO)
/*
* Return TRUE when there is any running job that we care about.
*/
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 509a31f0e6..e65ab94e38 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4201,11 +4201,13 @@ f_foreground(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
{
#ifdef FEAT_GUI
if (gui.in_use)
+ {
gui_mch_set_foreground();
-#else
-# ifdef MSWIN
+ return;
+ }
+#endif
+#if defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL))
win32_set_foreground();
-# endif
#endif
}
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 0ab5df6c0f..8766c66707 100644
--- a/