summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0763
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0763')
-rw-r--r--data/vim/patches/8.1.07635153
1 files changed, 5153 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0763 b/data/vim/patches/8.1.0763
new file mode 100644
index 000000000..8c4c6109f
--- /dev/null
+++ b/data/vim/patches/8.1.0763
@@ -0,0 +1,5153 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0763
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0763
+Problem: Nobody is using the Sun Workshop support.
+Solution: Remove the Workshop support.
+Files: runtime/doc/workshop.txt, runtime/doc/help.txt,
+ runtime/doc/netbeans.txt, src/Makefile, src/auto/configure,
+ src/beval.c, src/buffer.c, src/config.h.in, src/config.mk.in,
+ src/configure.ac, src/evalfunc.c, src/ex_cmds.c, src/ex_cmds.h,
+ src/ex_docmd.c, src/feature.h, src/fileio.c, src/globals.h,
+ src/gui.c, src/gui_beval.c, src/gui_motif.c, src/gui_x11.c,
+ src/integration.c, src/integration.h, src/main.c, src/misc2.c,
+ src/nbdebug.c, src/netbeans.c, src/proto.h,
+ src/proto/workshop.pro, src/ui.c, src/version.c, src/vim.h,
+ src/workshop.c, src/workshop.h, src/wsdebug.c, src/wsdebug.h,
+ src/ex_cmdidxs.h
+
+
+*** ../vim-8.1.0762/runtime/doc/workshop.txt 2018-05-17 13:42:04.000000000 +0200
+--- runtime/doc/workshop.txt 2019-01-17 14:47:16.643795105 +0100
+***************
+*** 1,4 ****
+! *workshop.txt* For Vim version 8.1. Last change: 2013 Jul 06
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur
+--- 1,4 ----
+! *workshop.txt* For Vim version 8.1. Last change: 2019 Jan 17
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur
+***************
+*** 6,98 ****
+
+ Sun Visual WorkShop Features *workshop* *workshop-support*
+
+! 1. Introduction |workshop-intro|
+! 2. Commands |workshop-commands|
+! 3. Compiling vim/gvim for WorkShop |workshop-compiling|
+! 4. Configuring gvim for a WorkShop release tree |workshop-configure|
+! 5. Obtaining the latest version of the XPM library |workshop-xpm|
+!
+! {Vi does not have any of these features}
+! {only available when compiled with the |+sun_workshop| feature}
+!
+! ==============================================================================
+! 1. Introduction *workshop-intro*
+!
+! Sun Visual WorkShop has an "Editor of Choice" feature designed to let users
+! debug using their favorite editors. For the 6.0 release we have added support
+! for gvim. A workshop debug session will have a debugging window and an editor
+! window (possibly others as well). The user can do many debugging operations
+! from the editor window, minimizing the need to switch from window to window.
+!
+! The version of vim shipped with Sun Visual WorkShop 6 (also called Forte
+! Developer 6) is vim 5.3. The features in this release are much more reliable
+! than the vim/gvim shipped with Visual WorkShop. VWS users wishing to use vim
+! as their editor should compile these sources and install them in their
+! workshop release tree.
+!
+! ==============================================================================
+! 2. Commands *workshop-commands*
+!
+! *:ws* *:wsverb*
+! :ws[verb] verb Pass the verb to the verb executor
+!
+! Pass the verb to a workshop function which gathers some arguments and
+! sends the verb and data to workshop over an IPC connection.
+!
+! ==============================================================================
+! 3. Compiling vim/gvim for WorkShop *workshop-compiling*
+!
+! Compiling vim with FEAT_SUN_WORKSHOP turns on all compile time flags necessary
+! for building a vim to work with Visual WorkShop. The features required for VWS
+! have been built and tested using the Sun compilers from the VWS release. They
+! have not been built or tested using Gnu compilers. This does not mean the
+! features won't build and run if compiled with gcc, just that nothing is
+! guaranteed with gcc!
+!
+! ==============================================================================
+! 4. Configuring gvim for a WorkShop release tree *workshop-configure*
+!
+! There are several assumptions which must be met in order to compile a gvim for
+! use with Sun Visual WorkShop 6.
+!
+! o You should use the compiler in VWS rather than gcc. We have neither
+! built nor tested with gcc and cannot guarantee it will build properly.
+!
+! o You must supply your own XPM library. See |workshop-xpm| below for
+! details on obtaining the latest version of XPM.
+!
+! o Edit the Makefile in the src directory and uncomment the lines for Sun
+! Visual WorkShop. You can easily find these by searching for the string
+! FEAT_SUN_WORKSHOP
+!
+! o We also suggest you use Motif for your gui. This will provide gvim with
+! the same look-and-feel as the rest of Sun Visual WorkShop.
+!
+! The following configuration line can be used to configure vim to build for use
+! with Sun Visual WorkShop:
+!
+! $ CC=cc configure --enable-workshop --enable-gui=motif \
+! -prefix=<VWS-install-dir>/contrib/contrib6/<vim-version>
+!
+! The VWS-install-dir should be the base directory where your Sun Visual WorkShop
+! was installed. By default this is /opt/SUNWspro. It will normally require
+! root permissions to install the vim release. You will also need to change the
+! symlink <VWS-install-dir>/bin/gvim to point to the vim in your newly installed
+! directory. The <vim-version> should be a unique version string. I use "vim"
+! concatenated with the equivalent of version.h's VIM_VERSION_SHORT.
+!
+! ==============================================================================
+! 5. Obtaining the latest version of the XPM library *workshop-xpm*
+!
+! The XPM library is required to show images within Vim with Motif or Athena.
+! Without it the toolbar and signs will be disabled.
+!
+! The XPM library is provided by Arnaud Le Hors of the French National Institute
+! for Research in Computer Science and Control. It can be downloaded from
+! http://cgit.freedesktop.org/xorg/lib/libXpm. The current release, as of this
+! writing, is xpm-3.4k-solaris.tgz, which is a gzip'ed tar file. If you create
+! the directory /usr/local/xpm and untar the file there you can use the
+! uncommented lines in the Makefile without changing them. If you use another
+! xpm directory you will need to change the XPM_DIR in src/Makefile.
+
+! vim:tw=78:ts=8:ft=help:norl:
+--- 6,14 ----
+
+ Sun Visual WorkShop Features *workshop* *workshop-support*
+
+! The support for WorkShop was removed in patch 8.1.0763 in January 2019.
+! The product has not been available for a long time and has been replaced by
+! |NetBeans|.
+
+!
+! vim:tw=78:ts=8:noet:ft=help:norl:
+*** ../vim-8.1.0762/runtime/doc/help.txt 2018-05-17 13:41:40.000000000 +0200
+--- runtime/doc/help.txt 2019-01-17 14:55:00.628054659 +0100
+***************
+*** 171,177 ****
+ |if_ole.txt| OLE automation interface for Win32
+ |if_ruby.txt| Ruby interface
+ |debugger.txt| Interface with a debugger
+- |workshop.txt| Sun Visual Workshop interface
+ |netbeans.txt| NetBeans External Editor interface
+ |sign.txt| debugging signs
+
+--- 180,185 ----
+*** ../vim-8.1.0762/runtime/doc/netbeans.txt 2018-05-17 13:41:41.000000000 +0200
+--- runtime/doc/netbeans.txt 2019-01-17 14:53:47.956614503 +0100
+***************
+*** 1,10 ****
+! *netbeans.txt* For Vim version 8.1. Last change: 2016 Jul 15
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur et al.
+
+
+! *netbeans* *netbeans-support*
+
+ Vim NetBeans Protocol: a socket interface for Vim integration into an IDE.
+
+--- 1,10 ----
+! *netbeans.txt* For Vim version 8.1. Last change: 2019 Jan 17
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur et al.
+
+
+! *netbeans* *NetBeans* *netbeans-support*
+
+ Vim NetBeans Protocol: a socket interface for Vim integration into an IDE.
+
+***************
+*** 123,130 ****
+ by gvim when it is run with one of the following GUIs: GTK, GNOME, Windows,
+ Athena and Motif.
+
+! If Motif support is required the user must supply XPM libraries. See
+! |workshop-xpm| for details on obtaining the latest version of XPM.
+
+
+ On MS-Windows:
+--- 123,140 ----
+ by gvim when it is run with one of the following GUIs: GTK, GNOME, Windows,
+ Athena and Motif.
+
+! *netbeans-xpm*
+! If Motif support is required the user must supply XPM libraries.
+! The XPM library is required to show images within Vim with Motif or Athena.
+! Without it the toolbar and signs will be disabled.
+!
+! The XPM library is provided by Arnaud Le Hors of the French National Institute
+! for Research in Computer Science and Control. It can be downloaded from
+! http://cgit.freedesktop.org/xorg/lib/libXpm. The current release, as of this
+! writing, is xpm-3.4k-solaris.tgz, which is a gzip'ed tar file. If you create
+! the directory /usr/local/xpm and untar the file there you can use the
+! uncommented lines in the Makefile without changing them. If you use another
+! xpm directory you will need to change the XPM_DIR in src/Makefile.
+
+
+ On MS-Windows:
+***************
+*** 409,417 ****
+ Vim will define a sign for the annotation.
+ When color is a number, this is the "#rrggbb" Red, Green and
+ Blue values of the color (see |gui-colors|) and the
+! highlighting is only defined for GVim.
+ When color is a name, this color is defined both for Vim
+! running in a color terminal and for GVim.
+ When both "fg" and "bg" are "none" no line highlighting is
+ used (new in version 2.1).
+ When "glyphFile" is empty, no text sign is used (new in
+--- 419,427 ----
+ Vim will define a sign for the annotation.
+ When color is a number, this is the "#rrggbb" Red, Green and
+ Blue values of the color (see |gui-colors|) and the
+! highlighting is only defined for gVim.
+ When color is a name, this color is defined both for Vim
+! running in a color terminal and for gVim.
+ When both "fg" and "bg" are "none" no line highlighting is
+ used (new in version 2.1).
+ When "glyphFile" is empty, no text sign is used (new in
+*** ../vim-8.1.0762/src/Makefile 2019-01-12 22:47:01.256088105 +0100
+--- src/Makefile 2019-01-17 15:04:39.151775617 +0100
+***************
+*** 317,323 ****
+ # You can give a lot of options to configure.
+ # Change this to your desire and do 'make config' afterwards
+
+! # examples:
+ #CONF_ARGS1 = --exec-prefix=/usr
+ #CONF_ARGS2 = --with-vim-name=vim8 --with-ex-name=ex8 --with-view-name=view8
+ #CONF_ARGS3 = --with-global-runtime=/etc/vim,/usr/share/vim
+--- 317,323 ----
+ # You can give a lot of options to configure.
+ # Change this to your desire and do 'make config' afterwards
+
+! # examples you can uncomment:
+ #CONF_ARGS1 = --exec-prefix=/usr
+ #CONF_ARGS2 = --with-vim-name=vim8 --with-ex-name=ex8 --with-view-name=view8
+ #CONF_ARGS3 = --with-global-runtime=/etc/vim,/usr/share/vim
+***************
+*** 464,482 ****
+ # TCL
+ # Uncomment this when you want to include the Tcl interface.
+ # First one is for static linking, second one for dynamic loading.
+ #CONF_OPT_TCL = --enable-tclinterp
+ #CONF_OPT_TCL = --enable-tclinterp=dynamic
+ #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4
+
+ # CSCOPE
+ # Uncomment this when you want to include the Cscope interface.
+ #CONF_OPT_CSCOPE = --enable-cscope
+!
+! # WORKSHOP - Sun Visual Workshop interface. Only works with Motif!
+! #CONF_OPT_WORKSHOP = --enable-workshop
+
+ # NETBEANS - NetBeans interface. Only works with Motif, GTK, and gnome.
+! # Motif version must have XPM libraries (see |workshop-xpm|).
+ # Uncomment this when you do not want the netbeans interface.
+ #CONF_OPT_NETBEANS = --disable-netbeans
+
+--- 464,479 ----
+ # TCL
+ # Uncomment this when you want to include the Tcl interface.
+ # First one is for static linking, second one for dynamic loading.
+ #CONF_OPT_TCL = --enable-tclinterp
+ #CONF_OPT_TCL = --enable-tclinterp=dynamic
+ #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4
+
+ # CSCOPE
+ # Uncomment this when you want to include the Cscope interface.
+ #CONF_OPT_CSCOPE = --enable-cscope
+
+ # NETBEANS - NetBeans interface. Only works with Motif, GTK, and gnome.
+! # Motif version must have XPM libraries (see |netbeans-xpm|).
+ # Uncomment this when you do not want the netbeans interface.
+ #CONF_OPT_NETBEANS = --disable-netbeans
+
+***************
+*** 781,787 ****
+ #CC = /usr/ucb/cc
+ #EXTRA_LIBS = -R/usr/ucblib
+
+! ### Solaris with Forte Developer and FEAT_SUN_WORKSHOP
+ # The Xpm library is available from http://koala.ilog.fr/ftp/pub/xpm.
+ #CC = cc
+ #XPM_DIR = /usr/local/xpm/xpm-3.4k-solaris
+--- 780,786 ----
+ #CC = /usr/ucb/cc
+ #EXTRA_LIBS = -R/usr/ucblib
+
+! ### Solaris with Forte Developer and NetBeans.
+ # The Xpm library is available from http://koala.ilog.fr/ftp/pub/xpm.
+ #CC = cc
+ #XPM_DIR = /usr/local/xpm/xpm-3.4k-solaris
+***************
+*** 791,800 ****
+ #EXTRA_IPATHS = $(XPM_IPATH)
+ #EXTRA_DEFS = -xCC -DHAVE_X11_XPM_H
+
+- ### Solaris with workshop compilers: Vim is unstable when compiled with
+- # "-fast". Use this instead. (Shea Martin)
+- #CFLAGS = -x02 -xtarget=ultra
+-
+ ### (R) for Solaris 2.5 (or 2.5.1) with gcc > 2.5.6 you might need this:
+ #LDFLAGS = -lw -ldl -lXmu
+ #GUI_LIB_LOC = -L/usr/local/lib
+--- 790,795 ----
+***************
+*** 1651,1664 ****
+ $(PERL_SRC) \
+ $(PYTHON_SRC) $(PYTHON3_SRC) \
+ $(TCL_SRC) \
+! $(RUBY_SRC) \
+! $(WORKSHOP_SRC) \
+! $(WSDEBUG_SRC)
+
+ EXTRA_SRC = hangulin.c if_lua.c if_mzsch.c auto/if_perl.c if_perlsfio.c \
+ if_python.c if_python3.c if_tcl.c if_ruby.c \
+! gui_beval.c workshop.c wsdebug.c integration.c \
+! netbeans.c channel.c \
+ $(GRESOURCE_SRC)
+
+ # Unittest files
+--- 1646,1656 ----
+ $(PERL_SRC) \
+ $(PYTHON_SRC) $(PYTHON3_SRC) \
+ $(TCL_SRC) \
+! $(RUBY_SRC)
+
+ EXTRA_SRC = hangulin.c if_lua.c if_mzsch.c auto/if_perl.c if_perlsfio.c \
+ if_python.c if_python3.c if_tcl.c if_ruby.c \
+! gui_beval.c netbeans.c channel.c \
+ $(GRESOURCE_SRC)
+
+ # Unittest files
+***************
+*** 1684,1690 ****
+ # The perl sources also don't work well with lint.
+ LINT_SRC = $(BASIC_SRC) $(GUI_SRC) $(HANGULIN_SRC) \
+ $(PYTHON_SRC) $(PYTHON3_SRC) $(TCL_SRC) \
+- $(WORKSHOP_SRC) $(WSDEBUG_SRC) \
+ $(NETBEANS_SRC) $(CHANNEL_SRC) $(TERM_SRC)
+ #LINT_SRC = $(SRC)
+ #LINT_SRC = $(ALL_SRC)
+--- 1676,1681 ----
+***************
+*** 1761,1771 ****
+ $(TCL_OBJ) \
+ $(RUBY_OBJ) \
+ $(OS_EXTRA_OBJ) \
+- $(WORKSHOP_OBJ) \
+ $(NETBEANS_OBJ) \
+ $(CHANNEL_OBJ) \
+! $(XDIFF_OBJS) \
+! $(WSDEBUG_OBJ)
+
+ # The files included by tests are not in OBJ_COMMON.
+ OBJ_MAIN = \
+--- 1752,1760 ----
+ $(TCL_OBJ) \
+ $(RUBY_OBJ) \
+ $(OS_EXTRA_OBJ) \
+ $(NETBEANS_OBJ) \
+ $(CHANNEL_OBJ) \
+! $(XDIFF_OBJS)
+
+ # The files included by tests are not in OBJ_COMMON.
+ OBJ_MAIN = \
+***************
+*** 1889,1895 ****
+ window.pro \
+ beval.pro \
+ gui_beval.pro \
+- workshop.pro \
+ netbeans.pro \
+ channel.pro \
+ $(ALL_GUI_PRO) \
+--- 1878,1883 ----
+***************
+*** 1932,1938 ****
+ $(CONF_OPT_PERL) $(CONF_OPT_PYTHON) $(CONF_OPT_PYTHON3) \
+ $(CONF_OPT_TCL) $(CONF_OPT_RUBY) $(CONF_OPT_NLS) \
+ $(CONF_OPT_CSCOPE) $(CONF_OPT_MULTIBYTE) $(CONF_OPT_INPUT) \
+! $(CONF_OPT_OUTPUT) $(CONF_OPT_GPM) $(CONF_OPT_WORKSHOP) \
+ $(CONF_OPT_FEAT) $(CONF_TERM_LIB) \
+ $(CONF_OPT_COMPBY) $(CONF_OPT_ACL) $(CONF_OPT_NETBEANS) \
+ $(CONF_OPT_CHANNEL) $(CONF_OPT_TERMINAL) \
+--- 1920,1926 ----
+ $(CONF_OPT_PERL) $(CONF_OPT_PYTHON) $(CONF_OPT_PYTHON3) \
+ $(CONF_OPT_TCL) $(CONF_OPT_RUBY) $(CONF_OPT_NLS) \
+ $(CONF_OPT_CSCOPE) $(CONF_OPT_MULTIBYTE) $(CONF_OPT_INPUT) \
+! $(CONF_OPT_OUTPUT) $(CONF_OPT_GPM) \
+ $(CONF_OPT_FEAT) $(CONF_TERM_LIB) \
+ $(CONF_OPT_COMPBY) $(CONF_OPT_ACL) $(CONF_OPT_NETBEANS) \
+ $(CONF_OPT_CHANNEL) $(CONF_OPT_TERMINAL) \
+***************
+*** 3098,3106 ****
+ objects/if_tcl.o: if_tcl.c
+ $(CCC_NF) $(TCL_CFLAGS) $(ALL_CFLAGS) -o $@ if_tcl.c
+
+- objects/integration.o: integration.c
+- $(CCC) -o $@ integration.c
+-
+ objects/json.o: json.c
+ $(CCC) -o $@ json.c
+
+--- 3086,3091 ----
+***************
+*** 3239,3250 ****
+ objects/window.o: window.c
+ $(CCC) -o $@ window.c
+
+- objects/workshop.o: workshop.c
+- $(CCC) -o $@ workshop.c
+-
+- objects/wsdebug.o: wsdebug.c
+- $(CCC) -o $@ wsdebug.c
+-
+ objects/netbeans.o: netbeans.c
+ $(CCC) -o $@ netbeans.c
+
+--- 3224,3229 ----
+***************
+*** 3784,3799 ****
+ os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+ proto.h globals.h farsi.h arabic.h
+- objects/workshop.o: workshop.c protodef.h auto/config.h integration.h vim.h \
+- feature.h os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h \
+- option.h beval.h proto/gui_beval.pro structs.h regexp.h gui.h alloc.h \
+- ex_cmds.h spell.h proto.h globals.h farsi.h arabic.h version.h \
+- workshop.h
+- objects/wsdebug.o: wsdebug.c
+- objects/integration.o: integration.c vim.h protodef.h auto/config.h feature.h \
+- os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+- proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+- proto.h globals.h farsi.h arabic.h integration.h
+ objects/netbeans.o: netbeans.c vim.h protodef.h auto/config.h feature.h os_unix.h \
+ auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+--- 3763,3768 ----
+*** ../vim-8.1.0762/src/auto/configure 2019-01-12 16:10:47.415360504 +0100
+--- src/auto/configure 2019-01-17 14:58:28.142489864 +0100
+***************
+*** 661,668 ****
+ CHANNEL_SRC
+ NETBEANS_OBJ
+ NETBEANS_SRC
+- WORKSHOP_OBJ
+- WORKSHOP_SRC
+ RUBY_LIBS
+ RUBY_CFLAGS
+ RUBY_PRO
+--- 661,666 ----
+***************
+*** 812,818 ****
+ enable_rubyinterp
+ with_ruby_command
+ enable_cscope
+- enable_workshop
+ enable_netbeans
+ enable_channel
+ enable_terminal
+--- 810,815 ----
+***************
+*** 1494,1500 ****
+ --enable-tclinterp=OPTS Include Tcl interpreter. default=no OPTS=no/yes/dynamic
+ --enable-rubyinterp=OPTS Include Ruby interpreter. default=no OPTS=no/yes/dynamic
+ --enable-cscope Include cscope interface.
+- --enable-workshop Include Sun Visual Workshop support.
+ --disable-netbeans Disable NetBeans integration support.
+ --disable-channel Disable process communication support.
+ --enable-terminal Enable terminal emulation support.
+--- 1491,1496 ----
+***************
+*** 7665,7693 ****
+
+ fi
+
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-workshop argument" >&5
+- $as_echo_n "checking --enable-workshop argument... " >&6; }
+- # Check whether --enable-workshop was given.
+- if test "${enable_workshop+set}" = set; then :
+- enableval=$enable_workshop;
+- else
+- enable_workshop="no"
+- fi
+-
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_workshop" >&5
+- $as_echo "$enable_workshop" >&6; }
+- if test "$enable_workshop" = "yes"; then
+- $as_echo "#define FEAT_SUN_WORKSHOP 1" >>confdefs.h
+-
+- WORKSHOP_SRC="workshop.c integration.c"
+-
+- WORKSHOP_OBJ="objects/workshop.o objects/integration.o"
+-
+- if test "${enable_gui-xxx}" = xxx; then
+- enable_gui=motif
+- fi
+- fi
+-
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking --disable-netbeans argument" >&5
+ $as_echo_n "checking --disable-netbeans argument... " >&6; }
+ # Check whether --enable-netbeans was given.
+--- 7661,7666 ----
+*** ../vim-8.1.0762/src/beval.c 2018-10-02 14:15:08.991376909 +0200
+--- src/beval.c 2019-01-17 15:16:25.906741669 +0100
+***************
+*** 273,282 ****
+ if (bevalServers & BEVAL_NETBEANS)
+ netbeans_beval_cb(beval, state);
+ #endif
+- #ifdef FEAT_SUN_WORKSHOP
+- if (bevalServers & BEVAL_WORKSHOP)
+- workshop_beval_cb(beval, state);
+- #endif
+
+ recursive = FALSE;
+ }
+--- 273,278 ----
+*** ../vim-8.1.0762/src/buffer.c 2019-01-15 20:19:36.739904461 +0100
+--- src/buffer.c 2019-01-17 15:19:25.237997004 +0100
+***************
+*** 658,668 ****
+ */
+ if (wipe_buf)
+ {
+- #ifdef FEAT_SUN_WORKSHOP
+- if (usingSunWorkShop)
+- workshop_file_closed_lineno((char *)buf->b_ffname,
+- (int)buf->b_last_cursor.lnum);
+- #endif
+ if (buf->b_sfname != buf->b_ffname)
+ VIM_CLEAR(buf->b_sfname);
+ else
+--- 658,663 ----
+*** ../vim-8.1.0762/src/config.h.in 2018-12-21 11:48:48.320680492 +0100
+--- src/config.h.in 2019-01-17 14:58:51.046319671 +0100
+***************
+*** 441,449 ****
+ /* Define if we have shl_load() */
+ #undef HAVE_SHL_LOAD
+
+- /* Define if you want to include Sun Visual Workshop support. */
+- #undef FEAT_SUN_WORKSHOP
+-
+ /* Define if you want to include NetBeans integration. */
+ #undef FEAT_NETBEANS_INTG
+
+--- 441,446 ----
+*** ../vim-8.1.0762/src/config.mk.in 2018-04-11 22:14:38.000000000 +0200
+--- src/config.mk.in 2019-01-17 14:59:00.314250926 +0100
+***************
+*** 81,89 ****
+ HANGULIN_SRC = @HANGULIN_SRC@
+ HANGULIN_OBJ = @HANGULIN_OBJ@
+
+- WORKSHOP_SRC = @WORKSHOP_SRC@
+- WORKSHOP_OBJ = @WORKSHOP_OBJ@
+-
+ NETBEANS_SRC = @NETBEANS_SRC@
+ NETBEANS_OBJ = @NETBEANS_OBJ@
+ CHANNEL_SRC = @CHANNEL_SRC@
+--- 81,86 ----
+*** ../vim-8.1.0762/src/configure.ac 2019-01-12 16:10:47.411360533 +0100
+--- src/configure.ac 2019-01-17 14:58:24.194519245 +0100
+***************
+*** 1996,2017 ****
+ AC_DEFINE(FEAT_CSCOPE)
+ fi
+
+- AC_MSG_CHECKING(--enable-workshop argument)
+- AC_ARG_ENABLE(workshop,
+- [ --enable-workshop Include Sun Visual Workshop support.], ,
+- [enable_workshop="no"])
+- AC_MSG_RESULT($enable_workshop)
+- if test "$enable_workshop" = "yes"; then
+- AC_DEFINE(FEAT_SUN_WORKSHOP)
+- WORKSHOP_SRC="workshop.c integration.c"
+- AC_SUBST(WORKSHOP_SRC)
+- WORKSHOP_OBJ="objects/workshop.o objects/integration.o"
+- AC_SUBST(WORKSHOP_OBJ)
+- if test "${enable_gui-xxx}" = xxx; then
+- enable_gui=motif
+- fi
+- fi
+-
+ AC_MSG_CHECKING(--disable-netbeans argument)
+ AC_ARG_ENABLE(netbeans,
+ [ --disable-netbeans Disable NetBeans integration support.],
+--- 1996,2001 ----
+*** ../vim-8.1.0762/src/evalfunc.c 2019-01-15 22:16:37.414340200 +0100
+--- src/evalfunc.c 2019-01-17 14:50:04.854386619 +0100
+***************
+*** 6512,6520 ****
+ #ifdef FEAT_STL_OPT
+ "statusline",
+ #endif
+- #ifdef FEAT_SUN_WORKSHOP
+- "sun_workshop",
+- #endif
+ #ifdef FEAT_NETBEANS_INTG
+ "netbeans_intg",
+ #endif
+--- 6512,6517 ----
+*** ../vim-8.1.0762/src/ex_cmds.c 2019-01-13 23:38:33.387773334 +0100
+--- src/ex_cmds.c 2019-01-17 15:20:04.497831990 +0100
+***************
+*** 3805,3813 ****
+ int newcol = -1;
+ int solcol = -1;
+ pos_T *pos;
+- #ifdef FEAT_SUN_WORKSHOP
+- char_u *cp;
+- #endif
+ char_u *command = NULL;
+ #ifdef FEAT_SPELL
+ int did_get_winopts = FALSE;
+--- 3805,3810 ----
+***************
+*** 3881,3891 ****
+ if (free_fname != NULL)
+ ffname = free_fname;
+ other_file = otherfile(ffname);
+- #ifdef FEAT_SUN_WORKSHOP
+- if (usingSunWorkShop && p_acd
+- && (cp = vim_strrchr(sfname, '/')) != NULL)
+- sfname = ++cp;
+- #endif
+ }
+ }
+
+--- 3878,3883 ----
+***************
+*** 4457,4469 ****
+ }
+ #endif
+
+! #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG)
+ if (curbuf->b_ffname != NULL)
+ {
+- # ifdef FEAT_SUN_WORKSHOP
+- if (gui.in_use && usingSunWorkShop)
+- workshop_file_opened((char *)curbuf->b_ffname, curbuf->b_p_ro);
+- # endif
+ # ifdef FEAT_NETBEANS_INTG
+ if ((flags & ECMD_SET_HELP) != ECMD_SET_HELP)
+ netbeans_file_opened(curbuf);
+--- 4449,4457 ----
+ }
+ #endif
+
+! #if defined(FEAT_NETBEANS_INTG)
+ if (curbuf->b_ffname != NULL)
+ {
+ # ifdef FEAT_NETBEANS_INTG
+ if ((flags & ECMD_SET_HELP) != ECMD_SET_HELP)
+ netbeans_file_opened(curbuf);
+*** ../vim-8.1.0762/src/ex_cmds.h 2019-01-13 23:38:33.387773334 +0100
+--- src/ex_cmds.h 2019-01-17 14:56:18.839459572 +0100
+***************
+*** 1670,1678 ****
+ EX(CMD_wqall, "wqall", do_wqall,
+ BANG|FILE1|ARGOPT|DFLALL|TRLBAR,
+ ADDR_LINES),
+- EX(CMD_wsverb, "wsverb", ex_wsverb,
+- EXTRA|NOTADR|NEEDARG,
+- ADDR_LINES),
+ EX(CMD_wundo, "wundo", ex_wundo,
+ BANG|NEEDARG|FILE1,
+ ADDR_LINES),
+--- 1670,1675 ----
+*** ../vim-8.1.0762/src/ex_docmd.c 2019-01-15 20:19:36.743904434 +0100
+--- src/ex_docmd.c 2019-01-17 15:20:26.561736397 +0100
+***************
+*** 411,419 ****
+ #ifndef FEAT_SIGNS
+ # define ex_sign ex_ni
+ #endif
+- #ifndef FEAT_SUN_WORKSHOP
+- # define ex_wsverb ex_ni
+- #endif
+ #ifndef FEAT_NETBEANS_INTG
+ # define ex_nbclose ex_ni
+ # define ex_nbkey ex_ni
+--- 411,416 ----
+*** ../vim-8.1.0762/src/feature.h 2019-01-12 16:10:47.415360504 +0100
+--- src/feature.h 2019-01-17 15:11:32.124821752 +0100
+***************
+*** 1232,1238 ****
+ * +perl Perl interface: "--enable-perlinterp"
+ * +python Python interface: "--enable-pythoninterp"
+ * +tcl TCL interface: "--enable-tclinterp"
+- * +sun_workshop Sun Workshop integration
+ * +netbeans_intg Netbeans integration
+ * +channel Inter process communication
+ */
+--- 1232,1237 ----
+***************
+*** 1244,1256 ****
+ */
+
+ /*
+- * The Sun Workshop features currently only work with Motif.
+- */
+- #if !defined(FEAT_GUI_MOTIF) && defined(FEAT_SUN_WORKSHOP)
+- # undef FEAT_SUN_WORKSHOP
+- #endif
+-
+- /*
+ * The Netbeans feature requires +eval.
+ */
+ #if !defined(FEAT_EVAL) && defined(FEAT_NETBEANS_INTG)
+--- 1243,1248 ----
+***************
+*** 1279,1286 ****
+ * +signs Allow signs to be displayed to the left of text lines.
+ * Adds the ":sign" command.
+ */
+! #if defined(FEAT_BIG) || defined(FEAT_SUN_WORKSHOP) \
+! || defined(FEAT_NETBEANS_INTG)
+ # define FEAT_SIGNS
+ # if ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \
+ && defined(HAVE_X11_XPM_H)) \
+--- 1271,1277 ----
+ * +signs Allow signs to be displayed to the left of text lines.
+ * Adds the ":sign" command.
+ */
+! #if defined(FEAT_BIG) || defined(FEAT_NETBEANS_INTG)
+ # define FEAT_SIGNS
+ # if ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \
+ && defined(HAVE_X11_XPM_H)) \
+***************
+*** 1299,1305 ****
+ || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32)) \
+ && ( ((defined(FEAT_TOOLBAR) || defined(FEAT_GUI_TABLINE)) \
+ && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_W32)) \
+- || defined(FEAT_SUN_WORKSHOP) \
+ || defined(FEAT_NETBEANS_INTG) || defined(FEAT_EVAL))
+ # define FEAT_BEVAL_GUI
+ # if !defined(FEAT_XFONTSET) && !defined(FEAT_GUI_GTK) \
+--- 1290,1295 ----
+***************
+*** 1329,1365 ****
+ # define FEAT_GUI_X11
+ #endif
+
+! #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG)
+! /*
+! * The following features are (currently) only used by Sun Visual WorkShop 6
+! * and NetBeans. These features could be used with other integrations with
+! * debuggers so I've used separate feature defines.
+! */
+ # if !defined(FEAT_MENU)
+ # define FEAT_MENU
+ # endif
+ #endif
+
+! #if defined(FEAT_SUN_WORKSHOP)
+! /*
+! * Use an alternative method of X input for a secondary
+! * command input.
+! */
+! # define ALT_X_INPUT
+!
+ /*
+ * +footer Motif only: Add a message area at the bottom of the
+ * main window area.
+ */
+ # define FEAT_FOOTER
+-
+ #endif
+
+ /*
+ * +autochdir 'autochdir' option.
+ */
+! #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
+! || defined(FEAT_BIG)
+ # define FEAT_AUTOCHDIR
+ #endif
+
+--- 1319,1343 ----
+ # define FEAT_GUI_X11
+ #endif
+
+! #if defined(FEAT_NETBEANS_INTG)
+! // NetBeans uses menus.
+ # if !defined(FEAT_MENU)
+ # define FEAT_MENU
+ # endif
+ #endif
+
+! #if 0
+ /*
+ * +footer Motif only: Add a message area at the bottom of the
+ * main window area.
+ */
+ # define FEAT_FOOTER
+ #endif
+
+ /*
+ * +autochdir 'autochdir' option.
+ */
+! #if defined(FEAT_NETBEANS_INTG) || defined(FEAT_BIG)
+ # define FEAT_AUTOCHDIR
+ #endif
+
+*** ../vim-8.1.0762/src/fileio.c 2019-01-13 23:38:33.391773303 +0100
+--- src/fileio.c 2019-01-17 15:20:35.345697789 +0100
+***************
+*** 5094,5104 ****
+ if (!p_bk && backup != NULL && mch_remove(backup) != 0)
+ emsg(_("E207: Can't delete backup file"));
+
+- #ifdef FEAT_SUN_WORKSHOP
+- if (usingSunWorkShop)
+- workshop_file_saved((char *) ffname);
+- #endif
+-
+ goto nofail;
+
+ /*
+--- 5094,5099 ----
+*** ../vim-8.1.0762/src/globals.h 2019-01-16 22:41:50.091917818 +0100
+--- src/globals.h 2019-01-17 15:26:00.420093561 +0100
+***************
+*** 1218,1227 ****
+ #if defined(FEAT_BEVAL) && !defined(NO_X11_INCLUDES)
+ EXTERN BalloonEval *balloonEval INIT(= NULL);
+ EXTERN int balloonEvalForTerm INIT(= FALSE);
+! # if defined(FEAT_NETBEANS_INTG) || defined(FEAT_SUN_WORKSHOP)
+ EXTERN int bevalServers INIT(= 0);
+ # define BEVAL_NETBEANS 0x01
+- # define BEVAL_WORKSHOP 0x02
+ # endif
+ #endif
+
+--- 1218,1226 ----
+ #if defined(FEAT_BEVAL) && !defined(NO_X11_INCLUDES)
+ EXTERN BalloonEval *balloonEval INIT(= NULL);
+ EXTERN int balloonEvalForTerm INIT(= FALSE);
+! # if defined(FEAT_NETBEANS_INTG)
+ EXTERN int bevalServers INIT(= 0);
+ # define BEVAL_NETBEANS 0x01
+ # endif
+ #endif
+
+***************
+*** 1363,1376 ****
+ EXTERN int need_cursor_line_redraw INIT(= FALSE);
+ #endif
+
+- #ifdef ALT_X_INPUT
+- /* we need to be able to go into the dispatch loop while processing a command
+- * received via alternate input. However, we don't want to process another
+- * command until the first is completed.
+- */
+- EXTERN int suppress_alternate_input INIT(= FALSE);
+- #endif
+-
+ #ifdef USE_MCH_ERRMSG
+ /* Grow array to collect error messages in until they can be displayed. */
+ EXTERN garray_T error_ga
+--- 1362,1367 ----
+*** ../vim-8.1.0762/src/gui.c 2019-01-13 23:38:33.391773303 +0100
+--- src/gui.c 2019-01-17 15:21:11.121537479 +0100
+***************
+*** 672,681 ****
+ #ifdef FEAT_MENU
+ gui_create_initial_menus(root_menu);
+ #endif
+- #ifdef FEAT_SUN_WORKSHOP
+- if (usingSunWorkShop)
+- workshop_init();
+- #endif
+ #ifdef FEAT_SIGN_ICONS
+ sign_gui_started();
+ #endif
+--- 672,677 ----
+***************
+*** 1604,1622 ****
+ /* Remember the original window position. */
+ (void)gui_mch_get_winpos(&x, &y);
+
+! #ifdef USE_SUN_WORKSHOP
+! if (!mustset && usingSunWorkShop
+! && workshop_get_width_height(&width, &height))
+! {
+! Columns = (width - base_width + gui.char_width - 1) / gui.char_width;
+! Rows = (height - base_height + gui.char_height - 1) / gui.char_height;
+! }
+! else
+! #endif
+! {
+! width = Columns * gui.char_width + base_width;
+! height = Rows * gui.char_height + base_height;
+! }
+
+ if (fit_to_display)
+ {
+--- 1600,1607 ----
+ /* Remember the original window position. */
+ (void)gui_mch_get_winpos(&x, &y);
+
+! width = Columns * gui.char_width + base_width;
+! height = Rows * gui.char_height + base_height;
+
+ if (fit_to_display)
+ {
+***************
+*** 5128,5134 ****
+ }
+ #endif
+
+! #if defined(FIND_REPLACE_DIALOG) || defined(FEAT_SUN_WORKSHOP) \
+ || defined(NEED_GUI_UPDATE_SCREEN) \
+ || defined(PROTO)
+ /*
+--- 5113,5119 ----
+ }
+ #endif
+
+! #if defined(FIND_REPLACE_DIALOG) \
+ || defined(NEED_GUI_UPDATE_SCREEN) \
+ || defined(PROTO)
+ /*
+*** ../vim-8.1.0762/src/gui_beval.c 2019-01-13 23:38:33.391773303 +0100
+--- src/gui_beval.c 2019-01-17 15:21:35.733424452 +0100
+***************
+*** 199,206 ****
+ #endif
+ #endif /* !FEAT_GUI_W32 */
+
+! #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
+! || defined(FEAT_EVAL) || defined(PROTO)
+ # if !defined(FEAT_GUI_W32) || defined(PROTO)
+
+ /*
+--- 199,205 ----
+ #endif
+ #endif /* !FEAT_GUI_W32 */
+
+! #if defined(FEAT_NETBEANS_INTG) || defined(FEAT_EVAL) || defined(PROTO)
+ # if !defined(FEAT_GUI_W32) || defined(PROTO)
+
+ /*
+***************
+*** 216,222 ****
+ undrawBalloon(beval);
+ }
+ # endif /* !FEAT_GUI_W32 */
+! #endif /* FEAT_SUN_WORKSHOP || FEAT_NETBEANS_INTG || PROTO */
+
+ #if !defined(FEAT_GUI_W32) || defined(PROTO)
+ #if defined(FEAT_BEVAL_TIP) || defined(PROTO)
+--- 215,221 ----
+ undrawBalloon(beval);
+ }
+ # endif /* !FEAT_GUI_W32 */
+! #endif /* FEAT_NETBEANS_INTG || PROTO */
+
+ #if !defined(FEAT_GUI_W32) || defined(PROTO)
+ #if defined(FEAT_BEVAL_TIP) || defined(PROTO)
+*** ../vim-8.1.0762/src/gui_motif.c 2018-12-11 20:39:15.442937076 +0100
+--- src/gui_motif.c 2019-01-17 15:21:49.653359579 +0100
+***************
+*** 698,705 ****
+ XtVaSetValues(shell, XmNmappedWhenManaged, mappedWhenManaged, NULL);
+ }
+
+! #if defined(FEAT_MENU) || defined(FEAT_SUN_WORKSHOP) \
+! || defined(FEAT_GUI_DIALOG) || defined(PROTO)
+
+ /*
+ * Encapsulate the way an XmFontList is created.
+--- 698,704 ----
+ XtVaSetValues(shell, XmNmappedWhenManaged, mappedWhenManaged, NULL);
+ }
+
+! #if defined(FEAT_MENU) || defined(FEAT_GUI_DIALOG) || defined(PROTO)
+
+ /*
+ * Encapsulate the way an XmFontList is created.
+*** ../vim-8.1.0762/src/gui_x11.c 2019-01-16 22:15:07.872962363 +0100
+--- src/gui_x11.c 2019-01-17 15:23:32.516860907 +0100
+***************
+*** 22,32 ****
+ #include <X11/cursorfont.h>
+
+ /*
+! * For Workshop XpmP.h is preferred, because it makes the signs drawn with a
+! * transparent background instead of black.
+ */
+ #if defined(HAVE_XM_XPMP_H) && defined(FEAT_GUI_MOTIF) \
+! && (!defined(HAVE_X11_XPM_H) || defined(FEAT_SUN_WORKSHOP))
+ # include <Xm/XpmP.h>
+ #else
+ # ifdef HAVE_X11_XPM_H
+--- 22,32 ----
+ #include <X11/cursorfont.h>
+
+ /*
+! * XpmP.h is preferred, because it makes the signs drawn with a transparent
+! * background instead of black.
+ */
+ #if defined(HAVE_XM_XPMP_H) && defined(FEAT_GUI_MOTIF) \
+! && !defined(HAVE_X11_XPM_H)
+ # include <Xm/XpmP.h>
+ #else
+ # ifdef HAVE_X11_XPM_H
+***************
+*** 469,475 ****
+ XtRString,
+ DFLT_TOOLTIP_FONT
+ },
+! /* This one isn't really needed, keep for Sun Workshop? */
+ {
+ "balloonEvalFontSet",
+ XtCFontSet,
+--- 469,475 ----
+ XtRString,
+ DFLT_TOOLTIP_FONT
+ },
+! /* This one may not be really needed? */
+ {
+ "balloonEvalFontSet",
+ XtCFontSet,
+***************
+*** 636,643 ****
+ gui_mch_update();
+ }
+
+! #if ((defined(FEAT_NETBEANS_INTG) || defined(FEAT_SUN_WORKSHOP)) \
+! && defined(FEAT_GUI_MOTIF)) || defined(PROTO)
+ /*
+ * This function fills in the XRectangle object with the current x,y
+ * coordinates and height, width so that an XtVaSetValues to the same shell of
+--- 636,642 ----
+ gui_mch_update();
+ }
+
+! #if (defined(FEAT_NETBEANS_INTG) && defined(FEAT_GUI_MOTIF)) || defined(PROTO)
+ /*
+ * This function fills in the XRectangle object with the current x,y
+ * coordinates and height, width so that an XtVaSetValues to the same shell of
+***************
+*** 701,715 ****
+ #endif
+ );
+ }
+- #ifdef FEAT_SUN_WORKSHOP
+- if (usingSunWorkShop)
+- {
+- XRectangle rec;
+-
+- shellRectangle(w, &rec);
+- workshop_frame_moved(rec.x, rec.y, rec.width, rec.height);
+- }
+- #endif
+ #if defined(FEAT_NETBEANS_INTG) && defined(FEAT_GUI_MOTIF)
+ if (netbeans_active())
+ {
+--- 700,705 ----
+***************
+*** 1224,1245 ****
+ argv[*argc] = NULL;
+ }
+ else
+- #ifdef FEAT_SUN_WORKSHOP
+- if (strcmp("-ws", argv[arg]) == 0)
+- {
+- usingSunWorkShop++;
+- p_acd = TRUE;
+- gui.dofork = FALSE; /* don't fork() when starting GUI */
+- mch_memmove(&argv[arg], &argv[arg + 1],
+- (--*argc - arg) * sizeof(char *));
+- argv[*argc] = NULL;
+- # ifdef WSDEBUG
+- wsdebug_wait(WT_ENV | WT_WAIT | WT_STOP, "SPRO_GVIM_WAIT", 20);
+- wsdebug_log_init("SPRO_GVIM_DEBUG", "SPRO_GVIM_DLEVEL");
+- # endif
+- }
+- else
+- #endif
+ #ifdef FEAT_NETBEANS_INTG
+ if (strncmp("-nb", argv[arg], 3) == 0)
+ {
+--- 1214,1219 ----
+***************
+*** 1543,1553 ****
+ if (gui.color_approx)
+ emsg(_("Vim E458: Cannot allocate colormap entry, some colors may be incorrect"));
+
+- #ifdef FEAT_SUN_WORKSHOP
+- if (usingSunWorkShop)
+- workshop_connect(app_context);
+- #endif
+-
+ #ifdef FEAT_BEVAL_GUI
+ gui_init_tooltip_font();
+ #endif
+--- 1517,1522 ----
+***************
+*** 1681,1689 ****
+ #ifdef FEAT_XIM
+ xim_init();
+ #endif
+- #ifdef FEAT_SUN_WORKSHOP
+- workshop_postinit();
+- #endif
+
+ return OK;
+ }
+--- 1650,1655 ----
+***************
+*** 2748,2759 ****
+ #endif
+
+ focus = gui.in_focus;
+! #ifdef ALT_X_INPUT
+! if (suppress_alternate_input)
+! desired = (XtIMXEvent | XtIMTimer);
+! else
+! #endif
+! desired = (XtIMAll);
+ while (!timed_out)
+ {
+ /* Stop or start blinking when focus changes */
+--- 2714,2720 ----
+ #endif
+
+ focus = gui.in_focus;
+! desired = (XtIMAll);
+ while (!timed_out)
+ {
+ /* Stop or start blinking when focus changes */
+*** ../vim-8.1.0762/src/integration.c 2019-01-13 23:50:56.358162250 +0100
+--- src/integration.c 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,1112 ****
+- /* vi:set ts=8 sw=8 noet:
+- *
+- * VIM - Vi IMproved by Bram Moolenaar
+- * Visual Workshop integration by Gordon Prieur
+- *
+- * Do ":help uganda" in Vim to read copying and usage conditions.
+- * Do ":help credits" in Vim to see a list of people who contributed.
+- * See README.txt for an overview of the Vim source code.
+- */
+-
+- /*
+- * Integration with Sun Workshop.
+- *
+- * This file should not change much, it's also used by other editors that
+- * connect to Workshop. Consider changing workshop.c instead.
+- */
+- /*
+- -> consider using MakeSelectionVisible instead of gotoLine hacks
+- to show the line properly
+- -> consider using glue instead of our own message wrapping functions
+- (but can only use glue if we don't have to distribute source)
+- */
+-
+- #include "vim.h"
+-
+- #include <stdio.h>
+- #include <stdlib.h>
+-
+- #ifdef INET_SOCKETS
+- #include <netdb.h>
+- #include <netinet/in.h>
+- #else
+- #include <sys/un.h>
+- #endif
+-
+- #include <sys/types.h>
+- #include <sys/socket.h>
+- #include <sys/param.h>
+- #ifdef HAVE_LIBGEN_H
+- # include <libgen.h>
+- #endif
+- #include <unistd.h>
+- #include <string.h>
+-
+- #include <X11/Intrinsic.h>
+- #include <Xm/Xm.h>
+- #include <Xm/AtomMgr.h>
+- #include <Xm/PushB.h>
+-
+- #ifdef HAVE_X11_XPM_H
+- # include <X11/xpm.h>
+- #else
+- # ifdef HAVE_XM_XPMP_H
+- # include <Xm/XpmP.h>
+- # endif
+- #endif
+-
+- #ifdef HAVE_UTIL_DEBUG_H
+- # include <util/debug.h>
+- #endif
+- #ifdef HAVE_UTIL_MSGI18N_H
+- # include <util/msgi18n.h>
+- #endif
+-
+- #include "integration.h" /* <EditPlugin/integration.h> */
+- #ifdef HAVE_FRAME_H
+- # include <frame.h>
+- #endif
+-
+- #ifndef MAX
+- # define MAX(a, b) (a) > (b) ? (a) : (b)
+- #endif
+-
+- #ifndef NOCATGETS
+- # define NOCATGETS(x) x
+- #endif
+-
+- /* Functions private to this file */
+- static void workshop_disconnect(void);
+- static void workshop_sensitivity(int num, char *table);
+- static void adjust_sign_name(char *filename);
+- static void process_menuItem(char *);
+- static void process_toolbarButton(char *);
+- static void workshop_set_option_first(char *name, char *value);
+-
+- static size_t dummy; /* to ignore return value of write() */
+-
+- #define CMDBUFSIZ 2048
+-
+- #ifdef DEBUG
+- static FILE *dfd;
+- static void pldebug(char *, ...);
+- static void unrecognised_message(char *);
+-
+- #define HANDLE_ERRORS(cmd) else unrecognised_message(cmd);
+- #else
+- #define HANDLE_ERRORS(cmd)
+- #endif
+-
+- /*
+- * Version number of the protocol between an editor and eserve.
+- * This number should be incremented when the protocol
+- * is changed.
+- */
+- #define PROTOCOL_VERSION "4.0.0"
+-
+- static int sd = -1;
+- static XtInputId inputHandler; /* Cookie for input */
+-
+- Boolean save_files = True; /* When true, save all files before build actions */
+-
+- static void
+- workshop_connection_closed(void)
+- {
+- /*
+- * socket closed on other end
+- */
+- XtRemoveInput(inputHandler);
+- inputHandler = 0;
+- sd = -1;
+- }
+-
+- static char *
+- getCommand(void)
+- {
+- int len; /* length of this command */
+- char lenbuf[7]; /* get the length string here */
+- char *newcb; /* used to realloc cmdbuf */
+- static char *cmdbuf;/* get the command string here */
+- static int cbsize;/* size of cmdbuf */
+-
+- if ((len = read(sd, &lenbuf, 6)) == 6) {
+- lenbuf[6] = 0; /* Terminate buffer such that atoi() works right */
+- len = atoi(lenbuf);
+- if (cbsize < (len + 1)) {
+- newcb = (char *) realloc(cmdbuf,
+- MAX((len + 256), CMDBUFSIZ));
+- if (newcb != NULL) {
+- cmdbuf = newcb;
+- cbsize = MAX((len + 256), CMDBUFSIZ);
+- }
+- }
+- if (cbsize >= len && (len = read(sd, cmdbuf, len)) > 0) {
+- cmdbuf[len] = 0;
+- return cmdbuf;
+- } else {
+- return NULL;
+- }
+- } else {
+- if (len == 0) { /* EOF */
+- workshop_connection_closed();
+- }
+- return NULL;
+- }
+-
+- }
+-
+- static void
+- messageFromEserve(XtPointer clientData UNUSED,
+- int *dum1 UNUSED,
+- XtInputId *dum2 UNUSED)
+- {
+- char *cmd; /* the 1st word of the command */
+-
+- cmd = getCommand();
+- if (cmd == NULL) {
+- /* We're being shut down by eserve and the "quit" message
+- * didn't arrive before the socket connection got closed */
+- return;
+- }
+- #ifdef DEBUG
+- pldebug("%s\n", cmd);
+- #endif
+- switch (*cmd) {
+- case 'a':
+- if (cmd[1] == 'c' &&
+- strncmp(cmd, NOCATGETS("ack "), 4) == 0) {
+- int ackNum;
+- char buf[20];
+-
+- ackNum = atoi(&cmd[4]);
+- vim_snprintf(buf, sizeof(buf),
+- NOCATGETS("ack %d\n"), ackNum);
+- dummy = write(sd, buf, strlen(buf));
+- } else if (strncmp(cmd,
+- NOCATGETS("addMarkType "), 12) == 0) {
+- int idx;
+- char *color;
+- char *sign;
+-
+- idx = atoi(strtok(&cmd[12], " "));
+- color = strtok(NULL, NOCATGETS("\001"));
+- sign = strtok(NULL, NOCATGETS("\001"));
+- /* Skip space that separates names */
+- if (color) {
+- color++;
+- }
+- if (sign) {
+- sign++;
+- }
+- /* Change sign name to accommodate a different size? */
+- adjust_sign_name(sign);
+- workshop_add_mark_type(idx, color, sign);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'b':
+- if (strncmp(cmd,
+- NOCATGETS("balloon "), 8) == 0) {
+- char *tip;
+-
+- tip = strtok(&cmd[8], NOCATGETS("\001"));
+- workshop_show_balloon_tip(tip);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'c':
+- if (strncmp(cmd,
+- NOCATGETS("changeMarkType "), 15) == 0) {
+- char *file;
+- int markId;
+- int type;
+-
+- file = strtok(&cmd[15], " ");
+- markId = atoi(strtok(NULL, " "));
+- type = atoi(strtok(NULL, " "));
+- workshop_change_mark_type(file, markId, type);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'd':
+- if (strncmp(cmd, NOCATGETS("deleteMark "), 11) == 0) {
+- char *file;
+- int markId;
+-
+- file = strtok(&cmd[11], " ");
+- markId = atoi(strtok(NULL, " "));
+- workshop_delete_mark(file, markId);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'f':
+- if (cmd[1] == 'o' &&
+- strncmp(cmd, NOCATGETS("footerMsg "), 10) == 0) {
+- int severity;
+- char *message;
+-
+- severity =
+- atoi(strtok(&cmd[10], " "));
+- message = strtok(NULL, NOCATGETS("\001"));
+-
+- workshop_footer_message(message, severity);
+- } else if (strncmp(cmd,
+- NOCATGETS("frontFile "), 10) == 0) {
+- char *file;
+-
+- file = strtok(&cmd[10], " ");
+- workshop_front_file(file);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'g':
+- if (cmd[1] == 'e' &&
+- strncmp(cmd, NOCATGETS("getMarkLine "), 12) == 0) {
+- char *file;
+- int markid;
+- int line;
+- char buf[100];
+-
+- file = strtok(&cmd[12], " ");
+- markid = atoi(strtok(NULL, " "));
+- line = workshop_get_mark_lineno(file, markid);
+- vim_snprintf(buf, sizeof(buf),
+- NOCATGETS("markLine %s %d %d\n"),
+- file, markid, line);
+- dummy = write(sd, buf, strlen(buf));
+- } else if (cmd[1] == 'o' && cmd[4] == 'L' &&
+- strncmp(cmd, NOCATGETS("gotoLine "), 9) == 0) {
+- char *file;
+- int lineno;
+-
+- file = strtok(&cmd[9], " ");
+- lineno = atoi(strtok(NULL, " "));
+- workshop_goto_line(file, lineno);
+- } else if (strncmp(cmd,
+- NOCATGETS("gotoMark "), 9) == 0) {
+- char *file;
+- int markId;
+- char *message;
+-
+- file = strtok(&cmd[9], " ");
+- markId = atoi(strtok(NULL, " "));
+- message = strtok(NULL, NOCATGETS("\001"));
+- workshop_goto_mark(file, markId, message);
+- #ifdef NOHANDS_SUPPORT_FUNCTIONS
+- } else if (strcmp(cmd, NOCATGETS("getCurrentFile")) == 0) {
+- char *f = workshop_test_getcurrentfile();
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("currentFile %d %s"),
+- f ? (int)strlen(f) : 0, f ? f : "");
+- workshop_send_message(buffer);
+- } else if (strcmp(cmd, NOCATGETS("getCursorRow")) == 0) {
+- int row = workshop_test_getcursorrow();
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("cursorRow %d"), row);
+- workshop_send_message(buffer);
+- } else if (strcmp(cmd, NOCATGETS("getCursorCol")) == 0) {
+- int col = workshop_test_getcursorcol();
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("cursorCol %d"), col);
+- workshop_send_message(buffer);
+- } else if (strcmp(cmd, NOCATGETS("getCursorRowText")) == 0) {
+- char *t = workshop_test_getcursorrowtext();
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("cursorRowText %d %s"),
+- t ? (int)strlen(t) : 0, t ? t : "");
+- workshop_send_message(buffer);
+- } else if (strcmp(cmd, NOCATGETS("getSelectedText")) == 0) {
+- char *t = workshop_test_getselectedtext();
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("selectedText %d %s"),
+- t ? (int)strlen(t) : 0, t ? t : "");
+- workshop_send_message(buffer);
+- #endif
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'l':
+- if (strncmp(cmd, NOCATGETS("loadFile "), 9) == 0) {
+- char *file;
+- int line;
+- char *frameid;
+-
+- file = strtok(&cmd[9], " ");
+- line = atoi(strtok(NULL, " "));
+- frameid = strtok(NULL, " ");
+- workshop_load_file(file, line, frameid);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'm': /* Menu, minimize, maximize */
+- if (cmd[1] == 'e' && cmd[4] == 'B' &&
+- strncmp(cmd, NOCATGETS("menuBegin "), 10) == 0) {
+- workshop_menu_begin(&cmd[10]);
+- } else if (cmd[1] == 'e' && cmd[4] == 'I' &&
+- strncmp(cmd, NOCATGETS("menuItem "), 9) == 0) {
+- process_menuItem(cmd);
+- } else if (cmd[1] == 'e' && cmd[4] == 'E' &&
+- strcmp(cmd, NOCATGETS("menuEnd")) == 0) {
+- workshop_menu_end();
+- } else if (cmd[1] == 'a' &&
+- strcmp(cmd, NOCATGETS("maximize")) == 0) {
+- workshop_maximize();
+- } else if (strcmp(cmd, NOCATGETS("minimize")) == 0) {
+- workshop_minimize();
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'o':
+- if (cmd[1] == 'p' &&
+- strcmp(cmd, NOCATGETS("option"))) {
+- char *name;
+- char *value;
+-
+- name = strtok(&cmd[7], " ");
+- value = strtok(NULL, " ");
+- workshop_set_option_first(name, value);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'p':
+- if (strcmp(cmd, NOCATGETS("ping")) == 0) {
+- #if 0
+- int pingNum;
+-
+- pingNum = atoi(&cmd[5]);
+- workshop_send_ack(ackNum);
+- /* WHAT DO I DO HERE? */
+- #endif
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'q':
+- if (strncmp(cmd, NOCATGETS("quit"), 4) == 0) {
+-
+- /* Close the connection. It's important to do
+- * that now, since workshop_quit might be
+- * looking at open files. For example, if you
+- * have modified one of the files without
+- * saving, NEdit will ask you what you want to
+- * do, and spin loop by calling
+- * XtAppProcessEvent while waiting for your
+- * reply. In this case, if we still have an
+- * input handler and the socket has been
+- * closed on the other side when eserve
+- * expired, we will hang in IoWait.
+- */
+- workshop_disconnect();
+-
+- workshop_quit();
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 'r':
+- if (cmd[1] == 'e' &&
+- strncmp(cmd, NOCATGETS("reloadFile "), 11) == 0) {
+- char *file;
+- int line;
+-
+- file = strtok(&cmd[11], " ");
+- line = atoi(strtok(NULL, " "));
+- workshop_reload_file(file, line);
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 's':
+- if (cmd[1] == 'e' && cmd[2] == 't' &&
+- strncmp(cmd, NOCATGETS("setMark "), 8) == 0) {
+- char *file;
+- int line;
+- int markId;
+- int type;
+-
+- file = strtok(&cmd[8], " ");
+- line = atoi(strtok(NULL, " "));
+- markId = atoi(strtok(NULL, " "));
+- type = atoi(strtok(NULL, " "));
+- workshop_set_mark(file, line, markId, type);
+- } else if (cmd[1] == 'h' &&
+- strncmp(cmd, NOCATGETS("showFile "), 9) == 0) {
+- workshop_show_file(&cmd[9]);
+- } else if (cmd[1] == 'u' &&
+- strncmp(cmd, NOCATGETS("subMenu "), 8) == 0) {
+- char *label;
+-
+- label = strtok(&cmd[8], NOCATGETS("\001"));
+- workshop_submenu_begin(label);
+- } else if (cmd[1] == 'u' &&
+- strcmp(cmd, NOCATGETS("subMenuEnd")) == 0) {
+- workshop_submenu_end();
+- } else if (cmd[1] == 'e' && cmd[2] == 'n' &&
+- strncmp(cmd, NOCATGETS("sensitivity "), 12) == 0) {
+- int num;
+- char *bracket;
+- char *table;
+-
+- num = atoi(strtok(&cmd[12], " "));
+- bracket = strtok(NULL, " ");
+- if (*bracket != '[') {
+- fprintf(stderr, NOCATGETS("Parsing "
+- "error for sensitivity\n"));
+- } else {
+- table = strtok(NULL, NOCATGETS("]"));
+- workshop_sensitivity(num, table);
+- }
+- } else if (cmd[1] == 'e' && cmd[2] == 'n' && cmd[3] == 'd' &&
+- strncmp(cmd, NOCATGETS("sendVerb "), 9) == 0) {
+- /* Send the given verb back (used for the
+- * debug.lineno callback (such that other tools
+- * can obtain the position coordinates or the
+- * selection) */
+- char *verb;
+-
+- verb = strtok(&cmd[9], " ");
+- workshop_perform_verb(verb, NULL);
+- } else if (cmd[1] == 'a' &&
+- strncmp(cmd, NOCATGETS("saveFile "), 9) == 0) {
+- workshop_save_file(&cmd[9]);
+- #ifdef NOHANDS_SUPPORT_FUNCTIONS
+- } else if (strncmp(cmd, NOCATGETS("saveSensitivity "), 16) == 0) {
+- char *file;
+-
+- file = strtok(&cmd[16], " ");
+- workshop_save_sensitivity(file);
+- #endif
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- case 't': /* Toolbar */
+- if (cmd[8] == 'e' &&
+- strncmp(cmd, NOCATGETS("toolbarBegin"), 12) == 0) {
+- workshop_toolbar_begin();
+- } else if (cmd[8] == 'u' &&
+- strncmp(cmd, NOCATGETS("toolbarButton"), 13) == 0) {
+- process_toolbarButton(cmd);
+- } else if (cmd[7] == 'E' &&
+- strcmp(cmd, NOCATGETS("toolbarEnd")) == 0) {
+- workshop_toolbar_end();
+- }
+- HANDLE_ERRORS(cmd);
+- break;
+-
+- #ifdef DEBUG
+- default:
+- unrecognised_message(cmd);
+- break;
+- #endif
+- }
+- }
+-
+- static void
+- process_menuItem(
+- char *cmd)
+- {
+- char *label = strtok(&cmd[9], NOCATGETS("\001"));
+- char *verb = strtok(NULL, NOCATGETS("\001"));
+- char *acc = strtok(NULL, NOCATGETS("\001"));
+- char *accText = strtok(NULL, NOCATGETS("\001"));
+- char *name = strtok(NULL, NOCATGETS("\001"));
+- char *sense = strtok(NULL, NOCATGETS("\n"));
+- char *filepos = strtok(NULL, NOCATGETS("\n"));
+- if (*acc == '-') {
+- acc = NULL;
+- }
+- if (*accText == '-') {
+- accText = NULL;
+- }
+- workshop_menu_item(label, verb, acc, accText, name, filepos, sense);
+-
+- }
+-
+-
+- static void
+- process_toolbarButton(
+- char *cmd) /* button definition */
+- {
+- char *label = strtok(&cmd[14], NOCATGETS("\001"));
+- char *verb = strtok(NULL, NOCATGETS("\001"));
+- char *senseVerb = strtok(NULL, NOCATGETS("\001"));
+- char *filepos = strtok(NULL, NOCATGETS("\001"));
+- char *help = strtok(NULL, NOCATGETS("\001"));
+- char *sense = strtok(NULL, NOCATGETS("\001"));
+- char *file = strtok(NULL, NOCATGETS("\001"));
+- char *left = strtok(NULL, NOCATGETS("\n"));
+-
+- if (!strcmp(label, NOCATGETS("-"))) {
+- label = NULL;
+- }
+- if (!strcmp(help, NOCATGETS("-"))) {
+- help = NULL;
+- }
+- if (!strcmp(file, NOCATGETS("-"))) {
+- file = NULL;
+- }
+- if (!strcmp(senseVerb, NOCATGETS("-"))) {
+- senseVerb = NULL;
+- }
+- workshop_toolbar_button(label, verb, senseVerb, filepos, help,
+- sense, file, left);
+- }
+-
+-
+- #ifdef DEBUG
+- static void
+- unrecognised_message(
+- char *cmd)
+- {
+- pldebug("Unrecognised eserve message:\n\t%s\n", cmd);
+- /* abort(); */
+- }
+- #endif
+-
+-
+- /* Change sign name to accommodate a different size:
+- * Create the filename based on the height. The filename format
+- * of multisize icons are:
+- * x.xpm : largest icon
+- * x1.xpm : smaller icon
+- * x2.xpm : smallest icon */
+- static void
+- adjust_sign_name(char *filename)
+- {
+- char *s;
+- static int fontSize = -1;
+-
+- if (fontSize == -1)
+- fontSize = workshop_get_font_height();
+- if (fontSize == 0)
+- return;
+- if (filename[0] == '-')
+- return;
+-
+- /* This is ugly: later we should instead pass the fontheight over
+- * to eserve on startup and let eserve just send the right filenames
+- * to us in the first place
+-
+- * I know that the filename will end with 1.xpm (see
+- * GuiEditor.cc`LispPrintSign if you wonder why) */
+- s = filename+strlen(filename)-5;
+- if (fontSize <= 11)
+- strcpy(s, "2.xpm");
+- else if (fontSize <= 15)
+- strcpy(s, "1.xpm");
+- else
+- strcpy(s, ".xpm");
+- }
+-
+- #if 0
+- /* Were we invoked by WorkShop? This function can be used early during startup
+- if you want to do things differently if the editor is started standalone
+- or in WorkShop mode. For example, in standalone mode you may not want to
+- add a footer/message area or a sign gutter. */
+- int
+- workshop_invoked(void)
+- {
+- static int result = -1;
+- if (result == -1) {
+- result = (getenv(NOCATGETS("SPRO_EDITOR_SOCKET")) != NULL);
+- }
+- return result;
+- }
+- #endif
+-
+- /* Connect back to eserve */
+- void workshop_connect(XtAppContext context)
+- {
+- #ifdef INET_SOCKETS
+- struct sockaddr_in server;
+- struct hostent * host;
+- int port;
+- #else
+- struct sockaddr_un server;
+- #endif
+- char buf[32];
+- char * address;
+- #ifdef DEBUG
+- char *file;
+- #endif
+-
+- address = getenv(NOCATGETS("SPRO_EDITOR_SOCKET"));
+- if (address == NULL) {
+- return;
+- }
+-
+- #ifdef INET_SOCKETS
+- port = atoi(address);
+-
+- if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+- PERROR(NOCATGETS("workshop_connect"));
+- return;
+- }
+-
+- /* Get the server internet address and put into addr structure */
+- /* fill in the socket address structure and connect to server */
+- vim_memset((char *)&server, '\0', sizeof(server));
+- server.sin_family = AF_INET;
+- server.sin_port = port;
+- if ((host = gethostbyname(NOCATGETS("localhost"))) == NULL) {
+- PERROR(NOCATGETS("gethostbyname"));
+- sd = -1;
+- return;
+- }
+- memcpy((char *)&server.sin_addr, host->h_addr, host->h_length);
+- #else
+- if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
+- PERROR(NOCATGETS("workshop_connect"));
+- return;
+- }
+-
+- server.sun_family = AF_UNIX;
+- strcpy(server.sun_path, address);
+- #endif
+- /* Connect to server */
+- if (connect(sd, (struct sockaddr *)&server, sizeof(server))) {
+- if (errno == ECONNREFUSED) {
+- close(sd);
+- #ifdef INET_SOCKETS
+- if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+- PERROR(NOCATGETS("workshop_connect"));
+- return;
+- }
+- #else
+- if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
+- PERROR(NOCATGETS("workshop_connect"));
+- return;
+- }
+- #endif
+- if (connect(sd, (struct sockaddr *)&server,
+- sizeof(server))) {
+- PERROR(NOCATGETS("workshop_connect"));
+- return;
+- }
+-
+- } else {
+- PERROR(NOCATGETS("workshop_connect"));
+- return;
+- }
+- }
+-
+- /* tell notifier we are interested in being called
+- * when there is input on the editor connection socket
+- */
+- inputHandler = XtAppAddInput(context, sd, (XtPointer) XtInputReadMask,
+- messageFromEserve, NULL);
+- #ifdef DEBUG
+- if ((file = getenv(NOCATGETS("SPRO_PLUGIN_DEBUG"))) != NULL) {
+- char buf[BUFSIZ];
+-
+- unlink(file);
+- vim_snprintf(buf, sizeof(buf), "date > %s", file);
+- system(buf);
+- dfd = fopen(file, "a");
+- } else {
+- dfd = NULL;
+- }
+- #endif
+-
+- vim_snprintf(buf, sizeof(buf), NOCATGETS("connected %s %s %s\n"),
+- workshop_get_editor_name(),
+- PROTOCOL_VERSION,
+- workshop_get_editor_version());
+- dummy = write(sd, buf, strlen(buf));
+-
+- vim_snprintf(buf, sizeof(buf), NOCATGETS("ack 1\n"));
+- dummy = write(sd, buf, strlen(buf));
+- }
+-
+- static void
+- workshop_disconnect(void)
+- {
+- /* Probably need to send some message here */
+-
+- /*
+- * socket closed on other end
+- */
+- XtRemoveInput(inputHandler);
+- close(sd);
+- inputHandler = 0;
+- sd = -1;
+-
+- }
+-
+- /*
+- * Utility functions
+- */
+-
+-
+- /* Minimize and maximize shells. From libutil's shell.cc. */
+-
+- /* utility functions from libutil's shell.cc */
+- static Boolean
+- isWindowMapped(Display *display, Window win)
+- {
+- XWindowAttributes winAttrs;
+- XGetWindowAttributes(display,
+- win,
+- &winAttrs);
+- if (winAttrs.map_state == IsViewable) {
+- return(True);
+- } else {
+- return(False);
+- }
+- }
+-
+- static Boolean
+- isMapped(Widget widget)
+- {
+- if (widget == NULL) {
+- return(False);
+- }
+-
+- if (XtIsRealized(widget) == False) {
+- return(False);
+- }
+-
+- return(isWindowMapped(XtDisplay(widget), XtWindow(widget)));
+- }
+-
+- static Boolean
+- widgetIsIconified(
+- Widget w)
+- {
+- Atom wm_state;
+- Atom act_type; /* actual Atom type returned */
+- int act_fmt; /* actual format returned */
+- u_long nitems_ret; /* number of items returned */
+- u_long bytes_after; /* number of bytes remaining */
+- u_long *property; /* actual property returned */
+-
+- /*
+- * If a window is iconified its WM_STATE is set to IconicState. See
+- * ICCCM Version 2.0, section 4.1.3.1 for more details.
+- */
+-
+- wm_state = XmInternAtom(XtDisplay(w), NOCATGETS("WM_STATE"), False);
+- if (XtWindow(w) != 0) { /* only check if window exists! */
+- XGetWindowProperty(XtDisplay(w), XtWindow(w), wm_state, 0L, 2L,
+- False, AnyPropertyType, &act_type, &act_fmt, &nitems_ret,
+- &bytes_after, (char_u **) &property);
+- if (nitems_ret == 2 && property[0] == IconicState) {
+- return True;
+- }
+- }
+-
+- return False;
+-
+- } /* end widgetIsIconified */
+-
+- void
+- workshop_minimize_shell(Widget shell)
+- {
+- if (shell != NULL &&
+- XtIsObject(shell) &&
+- XtIsRealized(shell) == True) {
+- if (isMapped(shell) == True) {
+- XIconifyWindow(XtDisplay(shell), XtWindow(shell),
+- XScreenNumberOfScreen(XtScreen(shell)));
+- }
+- XtVaSetValues(shell,
+- XmNiconic, True,
+- NULL);
+- }
+- }
+-
+- void workshop_maximize_shell(Widget shell)
+- {
+- if (shell != NULL &&
+- XtIsRealized(shell) == True &&
+- widgetIsIconified(shell) == True &&
+- isMapped(shell) == False) {
+- XtMapWidget(shell);
+- /* This used to be
+- XtPopdown(shell);
+- XtPopup(shell, XtGrabNone);
+- However, I found that that would drop any transient
+- windows that had been iconified with the window.
+- According to the ICCCM, XtMapWidget should be used
+- to bring a window from Iconic to Normal state.
+- However, Rich Mauri did a lot of work on this during
+- Bart, and found that XtPopDown,XtPopup was required
+- to fix several bugs involving multiple CDE workspaces.
+- I've tested it now and things seem to work fine but
+- I'm leaving this note for history in case this needs
+- to be revisited.
+- */
+- }
+- }
+-
+-
+- Boolean workshop_get_width_height(int *width, int *height)
+- {
+- static int wid = 0;
+- static int hgt = 0;
+- static Boolean firstTime = True;
+- static Boolean success = False;
+-
+- if (firstTime) {
+- char *settings;
+-
+- settings = getenv(NOCATGETS("SPRO_GUI_WIDTH_HEIGHT"));
+- if (settings != NULL) {
+- wid = atoi(settings);
+- settings = strrchr(settings, ':');
+- if (settings++ != NULL) {
+- hgt = atoi(settings);
+- }
+- if (wid > 0 && hgt > 0) {
+- success = True;
+- }
+- firstTime = False;
+- }
+- }
+-
+- if (success) {
+- *width = wid;
+- *height = hgt;
+- }
+- return success;
+- }
+-
+- /*
+- * Toolbar code
+- */
+-
+- static void
+- workshop_sensitivity(int num, char *table)
+- {
+- /* build up a verb table */
+- VerbSense *vs;
+- int i;
+- char *s;
+- if ((num < 1) || (num > 500)) {
+- return;
+- }
+-
+- vs = (VerbSense *)malloc((num+1)*sizeof(VerbSense));
+-
+- /* Point to the individual names (destroys the table string, but
+- * that's okay -- this is more efficient than duplicating strings) */
+- s = table;
+- for (i = 0; i < num; i++) {
+- while (*s == ' ') {
+- s++;
+- }
+- vs[i].verb = s;
+- while (*s && (*s != ' ') && (*s != '\001')) {
+- s++;
+- }
+- if (*s == 0) {
+- vs[i].verb = NULL;
+- break;
+- }
+- if (*s == '\001') {
+- *s = 0;
+- s++;
+- }
+- *s = 0;
+- s++;
+- while (*s == ' ') {
+- s++;
+- }
+- if (*s == '1') {
+- vs[i].sense = 1;
+- } else {
+- vs[i].sense = 0;
+- }
+- s++;
+- }
+- vs[i].verb = NULL;
+-
+- workshop_frame_sensitivities(vs);
+-
+- free(vs);
+- }
+-
+- /*
+- * Options code
+- */
+- /* Set an editor option.
+- * IGNORE an option if you do not recognize it.
+- */
+- static void
+- workshop_set_option_first(char *name, char *value)
+- {
+- /* Currently value can only be on/off. This may change later (for
+- * example to set an option like "balloon evaluate delay", but
+- * for now just convert it into a boolean */
+- Boolean on = !strcmp(value, "on");
+-
+- if (!strcmp(name, "workshopkeys")) {
+- workshop_hotkeys(on);
+- } else if (!strcmp(name, "savefiles")) {
+- save_files = on;
+- } else if (!strcmp(name, "balloon")) {
+- workshop_balloon_mode(on);
+- } else if (!strcmp(name, "balloondelay")) {
+- int delay = atoi(value);
+- /* Should I validate the number here?? */
+- workshop_balloon_delay(delay);
+- } else {
+- /* Let editor interpret it */
+- workshop_set_option(name, value);
+- }
+- }
+-
+-
+- void workshop_file_closed_lineno(char *filename, int lineno)
+- {
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("deletedFile %s %d\n"), filename, lineno);
+- dummy = write(sd, buffer, strlen(buffer));
+- }
+-
+- void workshop_file_opened(char *filename, int readOnly)
+- {
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("loadedFile %s %d\n"), filename, readOnly);
+- dummy = write(sd, buffer, strlen(buffer));
+- }
+-
+-
+- void workshop_file_saved(char *filename)
+- {
+- char buffer[2*MAXPATHLEN];
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("savedFile %s\n"), filename);
+- dummy = write(sd, buffer, strlen(buffer));
+-
+- /* Let editor report any moved marks that the eserve client
+- * should deal with (for example, moving location-based breakpoints) */
+- workshop_moved_marks(filename);
+- }
+-
+- void workshop_frame_moved(int new_x, int new_y, int new_w, int new_h)
+- {
+- char buffer[200];
+-
+- if (sd >= 0)
+- {
+- vim_snprintf(buffer, sizeof(buffer),
+- NOCATGETS("frameAt %d %d %d %d\n"),
+- new_x, new_y, new_w, new_h);
+- dummy = write(sd, buffer, strlen(buffer));
+- }
+- }
+-
+- /* A button in the toolbar has been pushed.
+- * Clientdata is a pointer used by the editor code to figure out the
+- * positions for this toolbar (probably by storing a window pointer,
+- * and then fetching the current buffer for that window and looking up
+- * cursor and selection positions etc.) */
+- void workshop_perform_verb(char *verb, void *clientData)
+- {
+- char *filename;
+- int curLine;
+- int curCol;
+- int selStartLine;
+- int selStartCol;
+- int selEndLine;
+- int selEndCol;
+- int selLength;
+- char *selection;
+-
+- char buf[2*MAXPATHLEN];
+- /* Later: needsFilePos indicates whether or not we need to fetch all this
+- * info for this verb... for now, however, it looks as if
+- * eserve parsing routines depend on it always being present */
+-
+- if (workshop_get_positions(clientData,
+- &filename,
+- &curLine,
+- &curCol,
+- &selStartLine,
+- &selStartCol,
+- &selEndLine,
+- &selEndCol,
+- &selLength,
+- &selection)) {
+- if (selection == NULL) {
+- selection = NOCATGETS("");
+- }
+-
+- /* Should I save the files??? This is currently done by checking
+- if the verb is one of a few recognized ones. Later we can pass
+- this list from eserve to the editor (it's currently hardcoded in
+- vi and emacs as well). */
+- if (save_files) {
+- if (!strcmp(verb, "build.build") || !strcmp(verb, "build.build-file") ||
+- !strcmp(verb, "debug.fix") || !strcmp(verb, "debug.fix-all")) {
+- workshop_save_files();
+- }
+- }
+-
+- vim_snprintf(buf, sizeof(buf),
+- NOCATGETS("toolVerb %s %s %d,%d %d,%d %d,%d %d %s\n"),
+- verb,
+- filename,
+- curLine, curCol,
+- selStartLine, selStartCol,
+- selEndLine, selEndCol,
+- selLength,
+- selection);
+- dummy = write(sd, buf, strlen(buf));
+- if (*selection) {
+- free(selection);
+- }
+- }
+- }
+-
+- /* Send a message to eserve */
+- #if defined(NOHANDS_SUPPORT_FUNCTIONS) || defined(FEAT_BEVAL_GUI)
+- void workshop_send_message(char *buf)
+- {
+- dummy = write(sd, buf, strlen(buf));
+- }
+- #endif
+-
+- /* Some methods, like currentFile, cursorPos, etc. are missing here.
+- * But it looks like these are used for NoHands testing only so we
+- * won't bother requiring editors to implement these
+- */
+-
+-
+- #ifdef DEBUG
+-
+- static void
+- pldebug(
+- char *fmt, /* a printf style format line */
+- ...)
+- {
+- va_list ap;
+-
+- if (dfd != NULL) {
+- va_start(ap, fmt);
+- vfprintf(dfd, fmt, ap);
+- va_end(ap);
+- fflush(dfd);
+- }
+-
+- } /* end pldebug */
+-
+- #endif
+--- 0 ----
+*** ../vim-8.1.0762/src/integration.h 2016-08-29 22:42:20.000000000 +0200
+--- src/integration.h 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,452 ****
+- /* vi:set ts=8 sts=4 sw=4 noet:
+- *
+- * VIM - Vi IMproved by Bram Moolenaar
+- * Visual Workshop integration by Gordon Prieur
+- *
+- * Do ":help uganda" in Vim to read copying and usage conditions.
+- * Do ":help credits" in Vim to see a list of people who contributed.
+- */
+- /*
+- THIS IS AN UNSTABLE INTERFACE! It is unsupported and will likely
+- change in future releases, possibly breaking compatibility!
+- */
+-
+- #ifndef _INTEGRATION_H
+- #define _INTEGRATION_H
+-
+- #include <X11/Intrinsic.h>
+- #include <Xm/Xm.h>
+-
+- #ifdef __cplusplus
+- extern "C" {
+- #endif
+-
+- /* Enable NoHands test support functions. Define this only if you want to
+- compile in support in the editor such that it can be run under
+- the WorkShop test suite. */
+- #ifndef NOHANDS_SUPPORT_FUNCTIONS
+- #define NOHANDS_SUPPORT_FUNCTIONS
+- #endif
+-
+-
+- /* This header file has three parts.
+- * 1. Functions you need to implement; these are called by the integration
+- * library
+- * 2. Functions you need to call when certain events happen in the editor;
+- * these are implemented by the integration library
+- * 3. Utility functions provided by the integration library; these make
+- * task 1 a bit easier.
+- */
+-
+- /*
+- * The following functions need to be implemented by the editor
+- * integration code (and will be editor-specific). Please see the
+- * sample workshop.c file for comments explaining what each functions
+- * needs to do, what the arguments mean, etc.
+- */
+-
+- /*
+- * This string is recognized by eserve and should be all lower case.
+- * This is how the editor detects that it is talking to NEdit instead
+- * of Vim, for example, when the connection is initiated from the editor.
+- * Examples: "nedit", "gvim"
+- */
+- char *workshop_get_editor_name();
+-
+- /*
+- * Version number of the editor.
+- * This number is communicated along with the protocol
+- * version to the application.
+- * Examples: "5.0.2", "19.3"
+- */
+- char *workshop_get_editor_version();
+-
+-
+- /* Goto a given line in a given file */
+- void workshop_goto_line(char *filename, int lineno);
+-
+-
+- /* Set mark in a given file */
+- void workshop_set_mark(char *filename, int lineno, int markId, int type);
+-
+-
+- /* Change mark type (for example from current-pc to pc-and-breakpoint) */
+- void workshop_change_mark_type(char *filename, int markId, int type);
+-
+- /*
+- * Goto the given mark in a file (e.g. show it).
+- * If message is not null, display it in the footer.
+- */
+-
+- void workshop_goto_mark(char *filename, int markId, char *message);
+-
+-
+- /* Delete mark */
+- void workshop_delete_mark(char *filename, int markId);
+-
+- /* Begin/end pair of messages indicating that a series of _set_mark and
+- * _delete_mark messages will be sent. This can/should be used to suppress gui
+- * redraws between the begin and end messages. For example, if you switch
+- * to a headerfile that has a class breakpoint set, there may be hundreds
+- * of marks that need to be added. You don't want to refresh the gui for each
+- * added sign, you want to wait until the final end message.
+- */
+- void workshop_mark_batch_begin();
+- void workshop_mark_batch_end();
+-
+-
+- /* Load a given file into the WorkShop buffer. "frameid" is a token string
+- * that identifies which frame the file would like to be loaded into. This
+- * will usually be null, in which case you should use the default frame.
+- * However, if frameid is not null, you need to find a frame that has this
+- * frameid, and replace the file in that frame. Finally, if the frameid is
+- * one you haven't seen before, you should create a new frame for this file.
+- * Note that "frameid" is a string value, not just an opaque pointer, so
+- * you should use strcmp rather than == when testing for equality.
+- */
+- void workshop_load_file(char *filename, int line, char *frameid);
+-
+-
+- /* Reload the WorkShop buffer */
+- void workshop_reload_file(char *filename, int line);
+-
+-
+- /* Show the given file */
+- void workshop_show_file(char *filename);
+-
+-
+- /* Front the given file */
+- void workshop_front_file(char *filename);
+-
+-
+- /* Save the given file */
+- void workshop_save_file(char *filename);
+-
+- /* Save all WorkShop edited files. You can ask user about modified files
+- * and skip saving any files the user doesn't want to save.
+- * This function is typically called when the user issues a build, a fix,
+- * etc. (and also if you select "Save All" from the File menu :-)
+- */
+- void workshop_save_files();
+-
+- /* Show a message in all footers.
+- Severity currently is not defined. */
+- void workshop_footer_message(char *message, int severity);
+-
+- /* Minimize all windows */
+- void workshop_minimize();
+-
+-
+- /* Maximize all windows */
+- void workshop_maximize();
+-
+-
+- /*
+- * Create a new mark type, assign it a given index, a given textbackground
+- * color, and a given left-margin sign (where sign is a filename to an
+- * .xpm file)
+- */
+- void workshop_add_mark_type(int idx, char *colorspec, char *sign);
+-
+-
+- /* Get mark line number */
+- int workshop_get_mark_lineno(char *filename, int markId);
+-
+-
+- /* Exit editor; save confirmation dialogs are okay */
+- void workshop_quit();
+-
+- /* Set an editor option.
+- * For example, name="syntax",value="on" would enable syntax highlighting.
+- * The currently defined options are:
+- * lineno {on,off} show line numbers
+- * syntax {on,off} highlight syntax
+- * parentheses {on,off} show matching parentheses
+- * The following options are interpreted by the library for you (so you
+- * will never see the message. However, the implementation requires you
+- * to provide certain callbacks, like restore hotkeys or save all files.
+- * These are documented separately).
+- * workshopkeys {on,off} set workshop hotkeys
+- * savefiles {on,off} save all files before issuing a build
+- * balloon {on,off} enable/disable balloon evaluate
+- *
+- * IGNORE an option if you do not recognize it.
+- */
+- void workshop_set_option(char *name, char *value);
+-
+- /*
+- * (See workshop_add_frame first.) This function notifies the editor
+- * that the frame for the given window (indicated by "frame", which
+- * was supplied by the editor in workshop_add_frame) has been created.
+- * This can happen much later than the workshop_add_frame message, since
+- * often a window is created on editor startup, while the frame description
+- * is passed over from eserve much later, when the connection is complete.
+- * This gives the editor a chance to kick its GUI to show the frame
+- * properly; typically you'll unmanage and remanage the parent widget to
+- * force a geometry recalculation.
+- */
+-
+- void workshop_reconfigure_frame(void *frame);
+-
+-
+- /* Are there any moved marks? If so, call workshop_move_mark on
+- * each of them now. This is how eserve can find out if for example
+- * breakpoints have moved when a program has been recompiled and
+- * reloaded into dbx.
+- */
+- void workshop_moved_marks(char *filename);
+-
+-
+- /* A button in the toolbar has been pushed. "frame" is provided
+- * which should let you determine which toolbar had a button pushed
+- * (you supplied this clientData when you created a toolbar). From
+- * this you should be able to figure out which file the operation
+- * applies to, and for that window the cursor line and column,
+- * selection begin line and column, selection end line and column,
+- * selection text and selection text length. The column numbers are
+- * currently unused but implement it anyway in case we decide to use
+- * them in the future.
+- * Note that frame can be NULL. In this case, you should pick
+- * a default window to translate coordinates for (ideally, the
+- * last window the user has operated on.) This will be the case when
+- * the user clicks on a Custom Button programmed to take the current
+- * line number as an argument. Here it's ambiguous which buffer
+- * to use, so you need to pick one.
+- * (Interface consideration: Perhaps we instead should add smarts
+- * into the library such that we remember which frame pointer
+- * we last noticed (e.g. last call to get_positions, or perhaps
+- * last add_frame) and then pass that instead? For example, we could
+- * have all workshop operations return the clientData when passed
+- * the filename (or add a filename-to-clientData converter?) and then
+- * remember the last filename/clientData used.
+- */
+- int workshop_get_positions(void *frame,
+- char **filename,
+- int *curLine,
+- int *curCol,
+- int *selStartLine,
+- int *selStartCol,
+- int *selEndLine,
+- int *selEndCol,
+- int *selLength,
+- char **selection);
+-
+- /* The following function should return the height of a character
+- * in the text display. This is used to pick out a suitable size
+- * for the signs to match the text (currently available in three
+- * sizes). If you just return 0, WorkShop will use the default
+- * sign size. (Use XmStringExtent on character "A" to get the height.)
+- */
+-
+- int workshop_get_font_height(void);
+-
+- /* The following function requests that you register the given
+- * hotkey as a keyboard accelerator for all frames. Whenever the
+- * hotkey is pressed, you should invoke workshop_hotkey_pressed
+- * and pass the current frame pointer as an argument as well as
+- * the clientData pointer passed in to this function.
+- * The remove function unregisters the hotkey.
+- */
+- void workshop_register_hotkey(Modifiers modifiers, KeySym keysym,
+- void *clientData);
+- void workshop_unregister_hotkey(Modifiers modifiers, KeySym keysym,
+- void *clientData);
+-
+-
+-
+-
+- /*
+- *
+- * The following functions notify eserve of important editor events,
+- * such as files being modified, files being saved, etc. You must
+- * sprinkle your editor code with calls to these. For example, whenever
+- * a file is modified (well, when its read-only status changes to modified),
+- * call workshop_file_modified().
+- *
+- */
+-
+-
+-
+- /* Connect with eserve. Add this call after you editor initialization
+- * is done, right before entering the event loop or blocking on input.
+- * This will set up a socket connection with eserve.
+- */
+- void workshop_connect(XtAppContext context);
+-
+- /* A file has been opened. */
+- void workshop_file_opened(char *filename, int readOnly);
+-
+-
+- /* A file has been saved. Despite its name, eserve also uses this
+- * message to mean a file has been reverted or unmodified.
+- */
+- void workshop_file_saved(char *filename);
+-
+-
+- #if 0
+- /* A file has been closed */
+- void workshop_file_closed(char *filename);
+- #endif
+-
+- /* Like workshop_file_closed, but also inform eserve what line the
+- cursor was on when you left the file. That way eserve can put you
+- back where you left off when you return to this file. */
+- void workshop_file_closed_lineno(char *filename, int line);
+-
+- #if 0
+- /* A file has been modified */
+- void workshop_file_modified(char *filename);
+-
+- /*
+- * A mark has been moved. Only call this as a response to
+- * a workshop_moved_marks request call.
+- */
+- void workshop_move_mark(char *filename, int markId, int newLineno);
+- #endif
+-
+- /* Tell the integration library about a new frame being added.
+- * Supply a form for the toolbar, a label for the footer, and an
+- * XmPulldown menu for the WorkShop menu to attach to. Top and bottom
+- * are the widgets above and below the toolbar form widget, if
+- * any. Call this function when you create a new window. It returns a
+- * void *, a handle which you should keep and return when you delete
+- * the window with workshop_delete_toolbar. The "footer" argument
+- * points to a Label widget that is going to be used as a status
+- * message area, and "menu" (if any) points to an Menu widget that
+- * should contain a WorkShop menu. Clientdata is a pointer which is
+- * only used by the editor. It will typically be a pointer to the
+- * window object that the toolbar is placed in. If you have multiple
+- * windows, you need to use this pointer to figure out which window
+- * (and thus corresponding buffer) the user has clicked on to respond
+- * to the workshop_get_positions message.
+- * Each frame's clientData ("frame") should be unique.
+- */
+- void *workshop_add_frame(void *frame, Widget form,
+- Widget top, Widget bottom, Widget footer,
+- Widget menu);
+-
+- /* Delete a window/frame. Call this when an editor window is being deleted. */
+- void workshop_delete_frame(void *handle);
+-
+- /* Add a balloon evaluate text area. "frame" is used the same way
+- * as in workshop_add_frame. This call is not part of workshop_add_frame because
+- * a frame can have multiple tooltip areas (typically, an editor frame that
+- * is split showing multiple buffers will have a separate tooltip area for
+- * each text widget. Each such area is called a "window" (consistent with
+- * XEmacs terminology). Separate these by the window argument if necessary.
+- * You will need to implement workshop_get_balloon_text such that it uses
+- * these two arguments to derive the file, line etc. for the tip.
+- * Call the remove function if you delete this area such that the integration
+- * library can update itself. You must call workshop_add_frame before you
+- * call add_balloon_eval_area, and you must pass the same frame pointer.
+- */
+- void workshop_add_balloon_eval_area(void *frame, void *window, Widget widget);
+- void workshop_remove_balloon_eval_area(void *frame, void *window, Widget widget);
+-
+-
+- /* For a given mouse position inside the balloon area (passed as x,y),
+- * return the balloon text to be evaluated. There are two scenarios:
+- * If the position is inside the selection, return the selection
+- * string. Else, return the full line (or possibly the full line up
+- * to the last semicolon (that's TBD), along with an index pointing to
+- * where which character the mouse is over.
+- * If we have the selection-scenario, set mouseIndex to -1 to indicate
+- * that no autoexpansion should occur but that the selection should
+- * be evaluated as is.
+- *
+- * XXX Does dbx need more information here, like the filename and line
+- * number in order to determine the correct language and scope to be
+- * used during evaluation?? Or should it just work like the p= button
+- * (where the current scope and language is used, even if you are
+- * pointing at a different file with a different scope) ?
+- */
+- int workshop_get_balloon_text(Position x, Position y,
+- void *frame,
+- void *window,
+- char **filename,
+- int *line,
+- char **text,
+- int *mouseIndex);
+-
+-
+- /* Window size and location
+- * WorkShop will attempt to restore the size and location of a single
+- * editor frame. For vi, this window is designated as the "reusable" one.
+- * You can implement your own scheme for determining which window you
+- * want to associate with WorkShop. Whenever the size and location of
+- * this window is changed, call the following function to notify eserve.
+- * Like workshop_invoked, this can be called before the workshop_connect()
+- * call.
+- */
+- void workshop_frame_moved(int new_x, int new_y, int new_w, int new_h);
+- Boolean workshop_get_width_height(int *, int *);
+- #if 0
+- Boolean workshop_get_rows_cols(int *, int *);
+- #endif
+-
+- /* This function should be invoked when you press a hotkey
+- * set up by workshop_register_hotkey. Pass the clientData
+- * to it that was given to you with workshop_register_hotkey.
+- */
+- void workshop_hotkey_pressed(void *frame, void *clientData);
+-
+-
+-
+-
+-
+- /*
+- * Utility functions
+- * These provide convenience functions to simplify implementing some
+- * of the above functions.
+- *
+- */
+-
+- #if 0
+- /* Were we invoked by WorkShop? This function can be used early during startup
+- * if you want to do things differently if the editor is started standalone
+- * or in WorkShop mode. For example, in standalone mode you may not want to
+- * add a footer/message area or a sign gutter.
+- */
+- int workshop_invoked(void);
+- #endif
+-
+-
+- /* Minimize (iconify) the given shell */
+- void workshop_minimize_shell(Widget shell);
+-
+- /* Maximize (deiconify) the given shell */
+- void workshop_maximize_shell(Widget shell);
+-
+- /* Called by frame.cc -- editor shouldn't call this directly.
+- * Perhaps we need an integrationP.h file ? */
+- void workshop_perform_verb(char *verb, void *clientData);
+- void workshop_send_message(char *buf);
+-
+-
+- #ifdef NOHANDS_SUPPORT_FUNCTIONS
+- /* The following functions are needed to run the WorkShop testsuite
+- * with this editor. You don't need to implement these unless you
+- * intend for your editor to be run by Workshop's testsuite.
+- * getcursorrow should return the number of lines from the top of
+- * the window the cursor is; similarly for getcursorcol.
+- */
+- char *workshop_test_getcurrentfile();
+- int workshop_test_getcursorrow();
+- int workshop_test_getcursorcol();
+- char *workshop_test_getcursorrowtext();
+- char *workshop_test_getselectedtext();
+- #endif
+-
+- /*
+- * Struct used to set/unset the sensitivity of verbs.
+- */
+- typedef struct {
+- char *verb;
+- Boolean sense;
+- } VerbSense;
+-
+- #ifdef __cplusplus
+- }
+- #endif
+-
+- #endif /* _INTEGRATION_H */
+--- 0 ----
+*** ../vim-8.1.0762/src/main.c 2019-01-14 21:51:17.987461933 +0100
+--- src/main.c 2019-01-17 15:23:50.756769234 +0100
+***************
+*** 628,637 ****
+ */
+ if (gui.in_use)
+ {
+! # ifdef FEAT_SUN_WORKSHOP
+! if (!usingSunWorkShop)
+! # endif
+! gui_wait_for_chars(50L, typebuf.tb_change_cnt);
+ TIME_MSG("GUI delay");
+ }
+ #endif
+--- 628,634 ----
+ */
+ if (gui.in_use)
+ {
+! gui_wait_for_chars(50L, typebuf.tb_change_cnt);
+ TIME_MSG("GUI delay");
+ }
+ #endif
+***************
+*** 983,991 ****
+ */
+ early_arg_scan(paramp);
+
+- #ifdef FEAT_SUN_WORKSHOP
+- findYourself(paramp->argv[0]);
+- #endif
+ #if defined(FEAT_GUI)
+ /* Prepare for possibly starting GUI sometime */
+ gui_prepare(&paramp->argc, paramp->argv);
+--- 980,985 ----
+*** ../vim-8.1.0762/src/misc2.c 2019-01-13 23:38:33.403773217 +0100
+--- src/misc2.c 2019-01-17 15:24:05.616693884 +0100
+***************
+*** 3411,3417 ****
+
+ #if defined(FEAT_SESSION) || defined(FEAT_AUTOCHDIR) \
+ || defined(MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK) \
+! || defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
+ || defined(PROTO)
+ /*
+ * Change to a file's directory.
+--- 3411,3417 ----
+
+ #if defined(FEAT_SESSION) || defined(FEAT_AUTOCHDIR) \
+ || defined(MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK) \
+! || defined(FEAT_NETBEANS_INTG) \
+ || defined(PROTO)
+ /*
+ * Change to a file's directory.
+*** ../vim-8.1.0762/src/nbdebug.c 2016-09-25 21:41:24.000000000 +0200
+--- src/nbdebug.c 2019-01-17 15:24:41.628508930 +0100
+***************
+*** 42,48 ****
+ /*
+ * nbdebug_wait - This function can be used to delay or stop execution of vim.
+ * It's normally used to delay startup while attaching a
+! * debugger to a running process. Since workshop starts gvim
+ * from a background process this is the only way to debug
+ * startup problems.
+ */
+--- 42,48 ----
+ /*
+ * nbdebug_wait - This function can be used to delay or stop execution of vim.
+ * It's normally used to delay startup while attaching a
+! * debugger to a running process. Since NetBeans starts gvim
+ * from a background process this is the only way to debug
+ * startup problems.
+ */
+*** ../vim-8.1.0762/src/netbeans.c 2019-01-15 20:19:36.743904434 +0100
+--- src/netbeans.c 2019-01-17 15:09:18.877769920 +0100
+***************
+*** 2273,2281 ****
+
+ nbdebug((" COLONCMD %s\n", buf));
+
+- /* ALT_INPUT_LOCK_ON; */
+ do_cmdline((char_u *)buf, NULL, NULL, DOCMD_NOWAIT | DOCMD_KEYTYPED);
+- /* ALT_INPUT_LOCK_OFF; */
+
+ setcursor(); /* restore the cursor position */
+ out_flush_cursor(TRUE, FALSE);
+--- 2273,2279 ----
+*** ../vim-8.1.0762/src/proto.h 2019-01-15 20:19:36.743904434 +0100
+--- src/proto.h 2019-01-17 15:26:51.439817568 +0100
+***************
+*** 295,303 ****
+ # ifdef FEAT_GUI_PHOTON
+ # include "gui_photon.pro"
+ # endif
+- # ifdef FEAT_SUN_WORKSHOP
+- # include "workshop.pro"
+- # endif
+ # endif /* FEAT_GUI */
+
+ # ifdef FEAT_OLE
+--- 295,300 ----
+*** ../vim-8.1.0762/src/proto/workshop.pro 2018-05-17 13:52:57.000000000 +0200
+--- src/proto/workshop.pro 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,49 ****
+- /* workshop.c */
+- void workshop_init(void);
+- void workshop_postinit(void);
+- void ex_wsverb(exarg_T *eap);
+- char *workshop_get_editor_name(void);
+- char *workshop_get_editor_version(void);
+- void workshop_load_file(char *filename, int line, char *frameid);
+- void workshop_reload_file(char *filename, int line);
+- void workshop_show_file(char *filename);
+- void workshop_goto_line(char *filename, int lineno);
+- void workshop_front_file(char *filename);
+- void workshop_save_file(char *filename);
+- void workshop_save_files(void);
+- void workshop_quit(void);
+- void workshop_minimize(void);
+- void workshop_maximize(void);
+- void workshop_add_mark_type(int idx, char *colorspec, char *sign);
+- void workshop_set_mark(char *filename, int lineno, int markId, int idx);
+- void workshop_change_mark_type(char *filename, int markId, int idx);
+- void workshop_goto_mark(char *filename, int markId, char *message);
+- void workshop_delete_mark(char *filename, int markId);
+- int workshop_get_mark_lineno(char *filename, int markId);
+- void workshop_moved_marks(char *filename);
+- int workshop_get_font_height(void);
+- void workshop_footer_message(char *message, int severity);
+- void workshop_menu_begin(char *label);
+- void workshop_submenu_begin(char *label);
+- void workshop_submenu_end(void);
+- void workshop_menu_item(char *label, char *verb, char *accelerator, char *acceleratorText, char *name, char *filepos, char *sensitive);
+- void workshop_menu_end(void);
+- void workshop_toolbar_begin(void);
+- void workshop_toolbar_end(void);
+- void workshop_toolbar_button(char *label, char *verb, char *senseVerb, char *filepos, char *help, char *sense, char *file, char *left);
+- void workshop_frame_sensitivities(VerbSense *vs);
+- void workshop_set_option(char *option, char *value);
+- void workshop_balloon_mode(Boolean on);
+- void workshop_balloon_delay(int delay);
+- void workshop_show_balloon_tip(char *tip);
+- void workshop_hotkeys(Boolean on);
+- int workshop_get_positions(void *clientData, char **filename, int *curLine, int *curCol, int *selStartLine, int *selStartCol, int *selEndLine, int *selEndCol, int *selLength, char **selection);
+- char *workshop_test_getcurrentfile(void);
+- int workshop_test_getcursorrow(void);
+- int workshop_test_getcursorcol(void);
+- char *workshop_test_getcursorrowtext(void);
+- char *workshop_test_getselectedtext(void);
+- void workshop_save_sensitivity(char *filename);
+- void workshop_beval_cb(BalloonEval *beval, int state);
+- void findYourself(char *argv0);
+- /* vim: set ft=c : */
+--- 0 ----
+*** ../vim-8.1.0762/src/ui.c 2019-01-17 14:11:56.434600704 +0100
+--- src/ui.c 2019-01-17 15:25:20.972303268 +0100
+***************
+*** 1625,1634 ****
+ * descriptions which would otherwise overflow. The buffer is considered full
+ * when only this extra space (or part of it) remains.
+ */
+! #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_JOB_CHANNEL) \
+! || defined(FEAT_CLIENTSERVER)
+ /*
+! * Sun WorkShop and NetBeans stuff debugger commands into the input buffer.
+ * This requires a larger buffer...
+ * (Madsen) Go with this for remote input as well ...
+ */
+--- 1625,1633 ----
+ * descriptions which would otherwise overflow. The buffer is considered full
+ * when only this extra space (or part of it) remains.
+ */
+! #if defined(FEAT_JOB_CHANNEL) || defined(FEAT_CLIENTSERVER)
+ /*
+! * NetBeans stuffs debugger commands into the input buffer.
+ * This requires a larger buffer...
+ * (Madsen) Go with this for remote input as well ...
+ */
+*** ../vim-8.1.0762/src/version.c 2019-01-17 14:31:10.190919265 +0100
+--- src/version.c 2019-01-17 15:39:12.143436999 +0100
+***************
+*** 598,608 ****
+ #else
+ "-statusline",
+ #endif
+- #ifdef FEAT_SUN_WORKSHOP
+- "+sun_workshop",
+- #else
+ "-sun_workshop",
+- #endif
+ #ifdef FEAT_SYN_HL
+ "+syntax",
+ #else
+--- 598,604 ----
+*** ../vim-8.1.0762/src/vim.h 2019-01-13 23:38:33.415773131 +0100
+--- src/vim.h 2019-01-17 15:27:00.275769256 +0100
+***************
+*** 288,297 ****
+ # include "os_qnx.h"
+ #endif
+
+- #ifdef FEAT_SUN_WORKSHOP
+- # include "workshop.h"
+- #endif
+-
+ #ifdef X_LOCALE
+ # include <X11/Xlocale.h>
+ #else
+--- 288,293 ----
+***************
+*** 2236,2249 ****
+ # define vim_realloc(ptr, size) realloc((ptr), (size))
+ #endif
+
+- /*
+- * The following macros stop display/event loop nesting at the wrong time.
+- */
+- #ifdef ALT_X_INPUT
+- # define ALT_INPUT_LOCK_OFF suppress_alternate_input = FALSE
+- # define ALT_INPUT_LOCK_ON suppress_alternate_input = TRUE
+- #endif
+-
+ #ifdef FEAT_MBYTE
+ /*
+ * Return byte length of character that starts with byte "b".
+--- 2232,2237 ----
+*** ../vim-8.1.0762/src/workshop.c 2018-12-21 15:16:57.483579762 +0100
+--- src/workshop.c 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,1830 ****
+- /* vi:set ts=8 sts=4 sw=4 noet:
+- *
+- * VIM - Vi IMproved by Bram Moolenaar
+- * Visual Workshop integration by Gordon Prieur
+- *
+- * Do ":help uganda" in Vim to read copying and usage conditions.
+- * Do ":help credits" in Vim to see a list of people who contributed.
+- * See README.txt for an overview of the Vim source code.
+- */
+-
+- #include "protodef.h"
+- #ifdef HAVE_CONFIG_H
+- # include "auto/config.h"
+- #endif
+- #include <stdio.h>
+- #include <stdlib.h>
+- #include <sys/types.h>
+- #include <netdb.h>
+- #include <netinet/in.h>
+- #include <sys/socket.h>
+- #ifdef HAVE_LIBGEN_H
+- # include <libgen.h>
+- #endif
+- #include <unistd.h>
+- #include <string.h>
+- #include <stdlib.h>
+- #include <ctype.h>
+-
+- #include <X11/Intrinsic.h>
+- #include <Xm/Xm.h>
+- #include <Xm/PushB.h>
+-
+- #include "integration.h" /* <EditPlugin/integration.h> */
+-
+- #include "vim.h"
+- #include "version.h"
+- #include "workshop.h"
+-
+- void workshop_hotkeys(Boolean);
+-
+- static Boolean isShowing(int);
+- static win_T *get_window(buf_T *);
+- static void updatePriority(Boolean);
+- static char *addUniqueMnemonic(char *, char *);
+- static char *fixup(char *);
+- static char *get_selection(buf_T *);
+- static char *append_selection(int, char *, int *, int *);
+- static void load_window(char *, int lnum);
+- static void warp_to_pc(int);
+- #ifdef FEAT_BEVAL_GUI
+- void workshop_beval_cb(BalloonEval *, int);
+- # ifdef FEAT_VARTABS
+- static int computeIndex(int, char_u *, int, int *);
+- # else
+- static int computeIndex(int, char_u *, int);
+- # endif
+- #endif
+- static char *fixAccelText(char *);
+- static void addMenu(char *, char *, char *);
+- static char *lookupVerb(char *, int);
+- static void coloncmd(char *, Boolean);
+-
+- extern Widget vimShell;
+- extern Widget textArea;
+- extern XtAppContext app_context;
+-
+- static int tbpri; /* ToolBar priority */
+- int usingSunWorkShop = 0; /* set if -ws flag is used */
+- char curMenuName[BUFSIZ];
+- char curMenuPriority[BUFSIZ];
+-
+- static Boolean workshopInitDone = False;
+- static Boolean workshopHotKeysEnabled = False;
+-
+- /*
+- * The following enum is from <gp_dbx/gp_dbx_common.h>. We can't include it
+- * here because it's C++.
+- */
+- enum
+- {
+- GPLineEval_EVALUATE, /* evaluate expression */
+- GPLineEval_INDIRECT, /* evaluate *<expression> */
+- GPLineEval_TYPE /* type of expression */
+- };
+-
+- /*
+- * Store each verb in the MenuMap. This lets us map from a verb to a menu.
+- * There may be multiple matches for a single verb in this table.
+- */
+- #define MENU_INC 50 /* menuMap incremental size increases */
+- typedef struct
+- {
+- char *name; /* name of the menu */
+- char *accel; /* optional accelerator key */
+- char *verb; /* menu verb */
+- } MenuMap;
+- static MenuMap *menuMap; /* list of verb/menu mappings */
+- static int menuMapSize; /* current size of menuMap */
+- static int menuMapMax; /* allocated size of menuMap */
+- static char *initialFileCmd; /* save command but defer doing it */
+-
+-
+- void
+- workshop_init(void)
+- {
+- char_u buf[64];
+- int is_dirty = FALSE;
+- int width, height;
+- XtInputMask mask;
+-
+- /*
+- * Turn on MenuBar, ToolBar, and Footer.
+- */
+- STRCPY(buf, p_go);
+- if (vim_strchr(p_go, GO_MENUS) == NULL)
+- {
+- STRCAT(buf, "m");
+- is_dirty = TRUE;
+- }
+- if (vim_strchr(p_go, GO_TOOLBAR) == NULL)
+- {
+- STRCAT(buf, "T");
+- is_dirty = TRUE;
+- }
+- if (vim_strchr(p_go, GO_FOOTER) == NULL)
+- {
+- STRCAT(buf, "F");
+- is_dirty = TRUE;
+- }
+- if (is_dirty)
+- set_option_value((char_u *)"go", 0L, buf, 0);
+-
+- /*
+- * Set size from workshop_get_width_height().
+- */
+- width = height = 0;
+- if (workshop_get_width_height(&width, &height))
+- {
+- XtVaSetValues(vimShell,
+- XmNwidth, width,
+- XmNheight, height,
+- NULL);
+- }
+-
+- /*
+- * Now read in the initial messages from eserve.
+- */
+- while ((mask = XtAppPending(app_context))
+- && (mask & XtIMAlternateInput) && !workshopInitDone)
+- XtAppProcessEvent(app_context, (XtInputMask)XtIMAlternateInput);
+- }
+-
+- void
+- workshop_postinit(void)
+- {
+- do_cmdline_cmd((char_u *)initialFileCmd);
+- ALT_INPUT_LOCK_OFF;
+- free(initialFileCmd);
+- initialFileCmd = NULL;
+- }
+-
+- void
+- ex_wsverb(exarg_T *eap)
+- {
+- msg_clr_cmdline();
+- workshop_perform_verb((char *) eap->arg, NULL);
+- }
+-
+- /*
+- * Editor name
+- * This string is recognized by eserve and should be all lower case.
+- * This is how the editor detects that it is talking to gvim instead
+- * of NEdit, for example, when the connection is initiated from the editor.
+- */
+- char *
+- workshop_get_editor_name(void)
+- {
+- return "gvim";
+- }
+-
+- /*
+- * Version number of the editor.
+- * This number is communicated along with the protocol
+- * version to the application.
+- */
+- char *
+- workshop_get_editor_version(void)
+- {
+- return Version;
+- }
+-
+- /*
+- * Answer functions: called by eserve
+- */
+-
+- /*
+- * Name:
+- * workshop_load_file
+- *
+- * Function:
+- * Load a given file into the WorkShop buffer.
+- */
+- void
+- workshop_load_file(
+- char *filename, /* the file to load */
+- int line, /* an optional line number (or 0) */
+- char *frameid UNUSED) /* used for multi-frame support */
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_load_file(%s, %d)\n", filename, line);
+- #endif
+-
+- #ifdef FEAT_BEVAL_GUI
+- bevalServers |= BEVAL_WORKSHOP;
+- #endif
+-
+- load_window(filename, line);
+- }
+-
+- /*
+- * Reload the WorkShop buffer
+- */
+- void
+- workshop_reload_file(
+- char *filename,
+- int line)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_reload_file(%s, %d)\n", filename, line);
+- #endif
+- load_window(filename, line);
+- }
+-
+- void
+- workshop_show_file(
+- char *filename)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_show_file(%s)\n", filename);
+- #endif
+-
+- load_window(filename, 0);
+- }
+-
+- void
+- workshop_goto_line(
+- char *filename,
+- int lineno)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_goto_line(%s, %d)\n", filename, lineno);
+- #endif
+-
+- load_window(filename, lineno);
+- }
+-
+- void
+- workshop_front_file(
+- char *filename UNUSED)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_front_file()\n");
+- #endif
+- /*
+- * Assumption: This function will always be called after a call to
+- * workshop_show_file(), so the file is always showing.
+- */
+- if (vimShell != NULL)
+- XRaiseWindow(gui.dpy, XtWindow(vimShell));
+- }
+-
+- void
+- workshop_save_file(
+- char *filename)
+- {
+- char cbuf[BUFSIZ]; /* build vim command here */
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_save_file(%s)\n", filename);
+- #endif
+-
+- /* Save the given file */
+- vim_snprintf(cbuf, sizeof(cbuf), "w %s", filename);
+- coloncmd(cbuf, TRUE);
+- }
+-
+- void
+- workshop_save_files(void)
+- {
+- /* Save the given file */
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_save_files()\n");
+- #endif
+-
+- add_to_input_buf((char_u *) ":wall\n", 6);
+- }
+-
+- void
+- workshop_quit(void)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_quit()\n");
+- #endif
+-
+- add_to_input_buf((char_u *) ":qall\n", 6);
+- }
+-
+- void
+- workshop_minimize(void)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_minimize()\n");
+- #endif
+- workshop_minimize_shell(vimShell);
+- }
+- void
+- workshop_maximize(void)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_maximize()\n");
+- #endif
+-
+- workshop_maximize_shell(vimShell);
+- }
+-
+- void
+- workshop_add_mark_type(
+- int idx,
+- char *colorspec,
+- char *sign)
+- {
+- char gbuf[BUFSIZ]; /* buffer for sign name */
+- char cibuf[BUFSIZ]; /* color information */
+- char cbuf[BUFSIZ]; /* command buffer */
+- char *bp;
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- {
+- char *cp;
+-
+- cp = strrchr(sign, '/');
+- if (cp == NULL)
+- cp = sign;
+- else
+- cp++; /* skip '/' character */
+- wstrace("workshop_add_mark_type(%d, \"%s\", \"%s\")\n", idx,
+- colorspec && *colorspec ? colorspec : "<None>", cp);
+- }
+- #endif
+-
+- /*
+- * Isolate the basename of sign in gbuf. We will use this for the
+- * GroupName in the highlight command sent to vim.
+- */
+- STRCPY(gbuf, gettail((char_u *)sign));
+- bp = strrchr(gbuf, '.');
+- if (bp != NULL)
+- *bp = NUL;
+-
+- if (gbuf[0] != '-' && gbuf[1] != NUL)
+- {
+- if (colorspec != NULL && *colorspec)
+- {
+- vim_snprintf(cbuf, sizeof(cbuf),
+- "highlight WS%s guibg=%s", gbuf, colorspec);
+- coloncmd(cbuf, FALSE);
+- vim_snprintf(cibuf, sizeof(cibuf), "linehl=WS%s", gbuf);
+- }
+- else
+- cibuf[0] = NUL;
+-
+- vim_snprintf(cbuf, sizeof(cbuf),
+- "sign define %d %s icon=%s", idx, cibuf, sign);
+- coloncmd(cbuf, TRUE);
+- }
+- }
+-
+- void
+- workshop_set_mark(
+- char *filename, /* filename which gets the mark */
+- int lineno, /* line number which gets the mark */
+- int markId, /* unique mark identifier */
+- int idx) /* which mark to use */
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- /* Set mark in a given file */
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_set_mark(%s, %d (ln), %d (id), %d (idx))\n",
+- filename, lineno, markId, idx);
+- #endif
+-
+- vim_snprintf(cbuf, sizeof(cbuf), "sign place %d line=%d name=%d file=%s",
+- markId, lineno, idx, filename);
+- coloncmd(cbuf, TRUE);
+- }
+-
+- void
+- workshop_change_mark_type(
+- char *filename, /* filename which gets the mark */
+- int markId, /* unique mark identifier */
+- int idx) /* which mark to use */
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- /* Change mark type */
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_change_mark_type(%s, %d, %d)\n",
+- filename, markId, idx);
+- #endif
+-
+- vim_snprintf(cbuf, sizeof(cbuf),
+- "sign place %d name=%d file=%s", markId, idx, filename);
+- coloncmd(cbuf, TRUE);
+- }
+-
+- /*
+- * Goto the given mark in a file (e.g. show it).
+- * If message is not null, display it in the footer.
+- */
+- void
+- workshop_goto_mark(
+- char *filename,
+- int markId,
+- char *message)
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- /* Goto mark */
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_goto_mark(%s, %d (id), %s)\n",
+- filename, markId, message && *message &&
+- !(*message == ' ' && message[1] == NULL) ?
+- message : "<None>");
+- #endif
+-
+- vim_snprintf(cbuf, sizeof(cbuf), "sign jump %d file=%s", markId, filename);
+- coloncmd(cbuf, TRUE);
+- if (message != NULL && *message != NUL)
+- gui_mch_set_footer((char_u *)message);
+- }
+-
+- void
+- workshop_delete_mark(
+- char *filename,
+- int markId)
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- /* Delete mark */
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_delete_mark(%s, %d (id))\n",
+- filename, markId);
+- #endif
+-
+- vim_snprintf(cbuf, sizeof(cbuf),
+- "sign unplace %d file=%s", markId, filename);
+- coloncmd(cbuf, TRUE);
+- }
+-
+- int
+- workshop_get_mark_lineno(
+- char *filename,
+- int markId)
+- {
+- buf_T *buf; /* buffer containing filename */
+- int lineno; /* line number of filename in buf */
+-
+- /* Get mark line number */
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_get_mark_lineno(%s, %d)\n",
+- filename, markId);
+- #endif
+-
+- lineno = 0;
+- buf = buflist_findname((char_u *)filename);
+- if (buf != NULL)
+- lineno = buf_findsign(buf, markId, NULL);
+-
+- return lineno;
+- }
+-
+-
+- /*
+- * Are there any moved marks? If so, call workshop_move_mark on
+- * each of them now. This is how eserve can find out if for example
+- * breakpoints have moved when a program has been recompiled and
+- * reloaded into dbx.
+- */
+- void
+- workshop_moved_marks(char *filename UNUSED)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("XXXworkshop_moved_marks(%s)\n", filename);
+- #endif
+- }
+-
+- int
+- workshop_get_font_height(void)
+- {
+- XmFontList fontList; /* fontList made from gui.norm_font */
+- XmString str;
+- Dimension w;
+- Dimension h;
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_get_font_height()\n");
+- #endif
+-
+- /* Pick the proper signs for this font size */
+- fontList = gui_motif_create_fontlist((XFontStruct *)gui.norm_font);
+- h = 0;
+- if (fontList != NULL)
+- {
+- str = XmStringCreateLocalized("A");
+- XmStringExtent(fontList, str, &w, &h);
+- XmStringFree(str);
+- XmFontListFree(fontList);
+- }
+-
+- return (int)h;
+- }
+-
+- void
+- workshop_footer_message(
+- char *message,
+- int severity UNUSED) /* severity is currently unused */
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_footer_message(%s, %d)\n", message, severity);
+- #endif
+-
+- gui_mch_set_footer((char_u *) message);
+- }
+-
+- /*
+- * workshop_menu_begin() is passed the menu name. We determine its mnemonic
+- * here and store its name and priority.
+- */
+- void
+- workshop_menu_begin(
+- char *label)
+- {
+- vimmenu_T *menu; /* pointer to last menu */
+- int menuPriority = 0; /* priority of new menu */
+- char mnembuf[64]; /* store menubar mnemonics here */
+- char *name; /* label with a mnemonic */
+- char *p; /* used to find mnemonics */
+- int idx; /* index into mnembuf */
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_menu_begin()\n");
+- #endif
+-
+- /*
+- * Look through all existing (non-PopUp and non-Toolbar) menus
+- * and gather their mnemonics. Use this list to decide what
+- * mnemonic should be used for label.
+- */
+-
+- idx = 0;
+- mnembuf[idx++] = 'H'; /* H is mnemonic for Help */
+- for (menu = root_menu; menu != NULL; menu = menu->next)
+- {
+- if (menu_is_menubar(menu->name))
+- {
+- p = strchr((char *)menu->name, '&');
+- if (p != NULL)
+- mnembuf[idx++] = *++p;
+- }
+- if (menu->next != NULL
+- && strcmp((char *) menu->next->dname, "Help") == 0)
+- {
+- menuPriority = menu->priority + 10;
+- break;
+- }
+- }
+- mnembuf[idx++] = NUL;
+- name = addUniqueMnemonic(mnembuf, label);
+-
+- vim_snprintf(curMenuName, sizeof(curMenuName), "%s", name);
+- sprintf(curMenuPriority, "%d.0", menuPriority);
+- }
+-
+- /*
+- * Append the name and priority to strings to be used in vim menu commands.
+- */
+- void
+- workshop_submenu_begin(
+- char *label)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (ws_debug && ws_dlevel & WS_TRACE
+- && strncmp(curMenuName, "ToolBar", 7) != 0)
+- wstrace("workshop_submenu_begin(%s)\n", label);
+- #endif
+-
+- strcat(curMenuName, ".");
+- strcat(curMenuName, fixup(label));
+-
+- updatePriority(True);
+- }
+-
+- /*
+- * Remove the submenu name and priority from curMenu*.
+- */
+-
+- void
+- workshop_submenu_end(void)
+- {
+- char *p;
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE)
+- && strncmp(curMenuName, "ToolBar", 7) != 0)
+- wstrace("workshop_submenu_end()\n");
+- #endif
+-
+- p = strrchr(curMenuPriority, '.');
+- ASSERT(p != NULL);
+- *p = NUL;
+-
+- p = strrchr(curMenuName, '.');
+- ASSERT(p != NULL);
+- *p = NUL;
+- }
+-
+- /*
+- * This is where menus are really made. Each item will generate an amenu vim
+- * command. The globals curMenuName and curMenuPriority contain the name and
+- * priority of the parent menu tree.
+- */
+- void
+- workshop_menu_item(
+- char *label,
+- char *verb,
+- char *accelerator UNUSED,
+- char *acceleratorText,
+- char *name UNUSED,
+- char *filepos UNUSED,
+- char *sensitive)
+- {
+- char cbuf[BUFSIZ];
+- char namebuf[BUFSIZ];
+- char accText[BUFSIZ];
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE)
+- && strncmp(curMenuName, "ToolBar", 7) != 0)
+- {
+- if (ws_dlevel & WS_TRACE_VERBOSE)
+- wsdebug("workshop_menu_item(\n"
+- "\tlabel = \"%s\",\n"
+- "\tverb = %s,\n"
+- "\taccelerator = %s,\n"
+- "\tacceleratorText = \"%s\",\n"
+- "\tname = %s,\n"
+- "\tfilepos = %s,\n"
+- "\tsensitive = %s)\n",
+- label && *label ? label : "<None>",
+- verb && *verb ? verb : "<None>",
+- accelerator && *accelerator ?
+- accelerator : "<None>",
+- acceleratorText && *acceleratorText ?
+- acceleratorText : "<None>",
+- name && *name ? name : "<None>",
+- filepos && *filepos ? filepos : "<None>",
+- sensitive);
+- else if (ws_dlevel & WS_TRACE)
+- wstrace("workshop_menu_item(\"%s\", %s)\n",
+- label && *label ? label : "<None>",
+- verb && *verb ? verb : "<None>", sensitive);
+- }
+- #endif
+- #ifdef WSDEBUG_SENSE
+- if (ws_debug)
+- wstrace("menu: %-21.20s%-21.20s(%s)\n", label, verb,
+- *sensitive == '1' ? "Sensitive" : "Insensitive");
+- #endif
+-
+- if (acceleratorText != NULL)
+- vim_snprintf(accText, sizeof(accText), "<Tab>%s", acceleratorText);
+- else
+- accText[0] = NUL;
+- updatePriority(False);
+- vim_snprintf(namebuf, sizeof(namebuf), "%s.%s", curMenuName, fixup(label));
+- vim_snprintf(cbuf, sizeof(cbuf), "amenu %s %s%s\t:wsverb %s<CR>",
+- curMenuPriority, namebuf, accText, verb);
+-
+- coloncmd(cbuf, TRUE);
+- addMenu(namebuf, fixAccelText(acceleratorText), verb);
+-
+- if (*sensitive == '0')
+- {
+- vim_snprintf(cbuf, sizeof(cbuf), "amenu disable %s", namebuf);
+- coloncmd(cbuf, TRUE);
+- }
+- }
+-
+- /*
+- * This function is called when a complete WorkShop menu description has been
+- * sent over from eserve. We do some menu cleanup.
+- */
+-
+- void
+- workshop_menu_end(void)
+- {
+- Boolean using_tearoff; /* set per current option setting */
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_menu_end()\n");
+- #endif
+-
+- using_tearoff = vim_strchr(p_go, GO_TEAROFF) != NULL;
+- gui_mch_toggle_tearoffs(using_tearoff);
+- }
+-
+- void
+- workshop_toolbar_begin(void)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_toolbar_begin()\n");
+- #endif
+-
+- coloncmd("aunmenu ToolBar", True);
+- tbpri = 10;
+- }
+-
+- void
+- workshop_toolbar_end(void)
+- {
+- char_u buf[64];
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- {
+- wstrace("workshop_toolbar_end()\n");
+- }
+- #endif
+-
+- /*
+- * Turn on ToolBar.
+- */
+- STRCPY(buf, p_go);
+- if (vim_strchr(p_go, 'T') == NULL)
+- {
+- STRCAT(buf, "T");
+- set_option_value((char_u *)"go", 0L, buf, 0);
+- }
+- workshopInitDone = True;
+- }
+-
+- void
+- workshop_toolbar_button(
+- char *label,
+- char *verb,
+- char *senseVerb UNUSED,
+- char *filepos UNUSED,
+- char *help,
+- char *sense,
+- char *file,
+- char *left)
+- {
+- char cbuf[BUFSIZ + MAXPATHLEN];
+- char namebuf[BUFSIZ];
+- static int tbid = 1;
+- char_u *p;
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE))
+- wsdebug("workshop_toolbar_button(\"%s\", %s, %s,\n"
+- "\t%s, \"%s\", %s,\n\t\"%s\",\n\t<%s>)\n",
+- label && *label ? label : "<None>",
+- verb && *verb ? verb : "<None>",
+- senseVerb && *senseVerb ? senseVerb : "<None>",
+- filepos && *filepos ? filepos : "<None>",
+- help && *help ? help : "<None>",
+- sense && *sense ? sense : "<None>",
+- file && *file ? file : "<None>",
+- left && *left ? left : "<None>");
+- else if (WSDLEVEL(WS_TRACE))
+- wstrace("workshop_toolbar_button(\"%s\", %s)\n",
+- label && *label ? label : "<None>",
+- verb && *verb ? verb : "<None>");
+- #endif
+- #ifdef WSDEBUG_SENSE
+- if (ws_debug)
+- wsdebug("button: %-21.20s%-21.20s(%s)\n", label, verb,
+- *sense == '1' ? "Sensitive" : "Insensitive");
+- #endif
+-
+- if (left && *left && atoi(left) > 0)
+- {
+- /* Add a separator (but pass the width passed after the ':') */
+- sprintf(cbuf, "amenu 1.%d ToolBar.-sep%d:%s- <nul>",
+- tbpri - 5, tbid++, left);
+-
+- coloncmd(cbuf, True);
+- }
+-
+- p = vim_strsave_escaped((char_u *)label, (char_u *)"\\. ");
+- vim_snprintf(namebuf, sizeof(namebuf), "ToolBar.%s", p);
+- vim_free(p);
+- STRCPY(cbuf, "amenu <silent> ");
+- if (file != NULL && *file != NUL)
+- {
+- p = vim_strsave_escaped((char_u *)file, (char_u *)" ");
+- vim_snprintf_add(cbuf, sizeof(cbuf), "icon=%s ", p);
+- vim_free(p);
+- }
+- vim_snprintf_add(cbuf, sizeof(cbuf),"1.%d %s :wsverb %s<CR>",
+- tbpri, namebuf, verb);
+-
+- /* Define the menu item */
+- coloncmd(cbuf, True);
+-
+- if (*sense == '0')
+- {
+- /* If menu isn't sensitive at startup... */
+- vim_snprintf(cbuf, sizeof(cbuf), "amenu disable %s", namebuf);
+- coloncmd(cbuf, True);
+- }
+-
+- if (help && *help)
+- {
+- /* Do the tooltip */
+- vim_snprintf(cbuf, sizeof(cbuf), "tmenu %s %s", namebuf, help);
+- coloncmd(cbuf, True);
+- }
+-
+- addMenu(namebuf, NULL, verb);
+- tbpri += 10;
+- }
+-
+- void
+- workshop_frame_sensitivities(
+- VerbSense *vs) /* list of verbs to (de)sensitize */
+- {
+- VerbSense *vp; /* iterate through vs */
+- char *menu_name; /* used in menu lookup */
+- int cnt; /* count of verbs to skip */
+- int len; /* length of nonvariant part of command */
+- char cbuf[4096];
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE) || WSDLEVEL(4))
+- {
+- wsdebug("workshop_frame_sensitivities(\n");
+- for (vp = vs; vp->verb != NULL; vp++)
+- wsdebug("\t%-25s%d\n", vp->verb, vp->sense);
+- wsdebug(")\n");
+- }
+- else if (WSDLEVEL(WS_TRACE))
+- wstrace("workshop_frame_sensitivities()\n");
+- #endif
+- #ifdef WSDEBUG_SENSE
+- if (ws_debug)
+- for (vp = vs; vp->verb != NULL; vp++)
+- wsdebug("change: %-21.20s%-21.20s(%s)\n",
+- "", vp->verb, vp->sense == 1 ?
+- "Sensitive" : "Insensitive");
+- #endif
+-
+- /*
+- * Look for all matching menu entries for the verb. There may be more
+- * than one if the verb has both a menu and toolbar entry.
+- */
+- for (vp = vs; vp->verb != NULL; vp++)
+- {
+- cnt = 0;
+- strcpy(cbuf, "amenu");
+- strcat(cbuf, " ");
+- strcat(cbuf, vp->sense ? "enable" : "disable");
+- strcat(cbuf, " ");
+- len = strlen(cbuf);
+- while ((menu_name = lookupVerb(vp->verb, cnt++)) != NULL)
+- {
+- strcpy(&cbuf[len], menu_name);
+- coloncmd(cbuf, FALSE);
+- }
+- }
+- gui_update_menus(0);
+- gui_mch_flush();
+- }
+-
+- void
+- workshop_set_option(
+- char *option, /* name of a supported option */
+- char *value) /* value to set option to */
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- {
+- wstrace("workshop_set_option(%s, %s)\n", option, value);
+- }
+- #endif
+-
+- cbuf[0] = NUL;
+- switch (*option) /* switch on 1st letter */
+- {
+- case 's':
+- if (strcmp(option, "syntax") == 0)
+- vim_snprintf(cbuf, sizeof(cbuf), "syntax %s", value);
+- else if (strcmp(option, "savefiles") == 0)
+- {
+- /* XXX - Not yet implemented */
+- }
+- break;
+-
+- case 'l':
+- if (strcmp(option, "lineno") == 0)
+- sprintf(cbuf, "set %snu",
+- (strcmp(value, "on") == 0) ? "" : "no");
+- break;
+-
+- case 'p':
+- if (strcmp(option, "parentheses") == 0)
+- sprintf(cbuf, "set %ssm",
+- (strcmp(value, "on") == 0) ? "" : "no");
+- break;
+-
+- case 'w':
+- /* this option is set by a direct call */
+- #ifdef WSDEBUG
+- wsdebug("workshop_set_option: "
+- "Got unexpected workshopkeys option");
+- #endif
+- break;
+-
+- case 'b': /* these options are set from direct calls */
+- if (option[7] == NUL && strcmp(option, "balloon") == 0)
+- {
+- #ifdef WSDEBUG
+- /* set by direct call to workshop_balloon_mode */
+- wsdebug("workshop_set_option: "
+- "Got unexpected ballooneval option");
+- #endif
+- }
+- else if (strcmp(option, "balloondelay") == 0)
+- {
+- #ifdef WSDEBUG
+- /* set by direct call to workshop_balloon_delay */
+- wsdebug("workshop_set_option: "
+- "Got unexpected balloondelay option");
+- #endif
+- }
+- break;
+- }
+- if (cbuf[0] != NUL)
+- coloncmd(cbuf, TRUE);
+- }
+-
+-
+- void
+- workshop_balloon_mode(
+- Boolean on)
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_balloon_mode(%s)\n", on ? "True" : "False");
+- #endif
+-
+- sprintf(cbuf, "set %sbeval", on ? "" : "no");
+- coloncmd(cbuf, TRUE);
+- }
+-
+-
+- void
+- workshop_balloon_delay(
+- int delay)
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_balloon_delay(%d)\n", delay);
+- #endif
+-
+- sprintf(cbuf, "set bdlay=%d", delay);
+- coloncmd(cbuf, TRUE);
+- }
+-
+-
+- void
+- workshop_show_balloon_tip(
+- char *tip)
+- {
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_show_balloon_tip(%s)\n", tip);
+- #endif
+-
+- if (balloonEval != NULL)
+- gui_mch_post_balloon(balloonEval, (char_u *)tip);
+- }
+-
+-
+- void
+- workshop_hotkeys(
+- Boolean on)
+- {
+- char cbuf[BUFSIZ]; /* command buffer */
+- MenuMap *mp; /* iterate over menuMap entries */
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_hotkeys(%s)\n", on ? "True" : "False");
+- #endif
+-
+- workshopHotKeysEnabled = on;
+- if (workshopHotKeysEnabled)
+- for (mp = menuMap; mp < &menuMap[menuMapSize]; mp++)
+- {
+- if (mp->accel != NULL)
+- {
+- vim_snprintf(cbuf, sizeof(cbuf),
+- "map %s :wsverb %s<CR>", mp->accel, mp->verb);
+- coloncmd(cbuf, TRUE);
+- }
+- }
+- else
+- for (mp = menuMap; mp < &menuMap[menuMapSize]; mp++)
+- {
+- if (mp->accel != NULL)
+- {
+- vim_snprintf(cbuf, sizeof(cbuf), "unmap %s", mp->accel);
+- coloncmd(cbuf, TRUE);
+- }
+- }
+- }
+-
+- /*
+- * A button in the toolbar has been pushed.
+- */
+- int
+- workshop_get_positions(
+- void *clientData UNUSED,
+- char **filename, /* output data */
+- int *curLine, /* output data */
+- int *curCol, /* output data */
+- int *selStartLine, /* output data */
+- int *selStartCol, /* output data */
+- int *selEndLine, /* output data */
+- int *selEndCol, /* output data */
+- int *selLength, /* output data */
+- char **selection) /* output data */
+- {
+- static char ffname[MAXPATHLEN];
+-
+- #ifdef WSDEBUG_TRACE
+- if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+- wstrace("workshop_get_positions(%#x, \"%s\", ...)\n",
+- clientData, (curbuf && curbuf->b_sfname != NULL)
+- ? (char *)curbuf->b_sfname : "<None>");
+- #endif
+-
+- if (curbuf->b_ffname == NULL)
+- ffname[0] = NUL;
+- else
+- /* copy so nobody can change b_ffname */
+- strcpy(ffname, (char *) curbuf->b_ffname);
+- *filename = ffname;
+- *curLine = curwin->w_cursor.lnum;
+- *curCol = curwin->w_cursor.col;
+-
+- if (curbuf->b_visual.vi_mode == 'v' &&
+- EQUAL_POS(curwin->w_cursor, curbuf->b_visual.vi_end))
+- {
+- *selStartLine = curbuf->b_visual.vi_start.lnum;
+- *selStartCol = curbuf->b_visual.vi_start.col;
+- *selEndLine = curbuf->b_visual.vi_end.lnum;
+- *selEndCol = curbuf->b_visual.vi_end.col;
+- *selection = get_selection(curbuf);
+- if (*selection)
+- *selLength = strlen(*selection);
+- else
+- *selLength = 0;
+- }
+- else
+- {
+- *selStartLine = *selEndLine = -1;
+- *selStartCol = *selEndCol = -1;
+- *selLength = 0;
+- *selection = "";
+- }
+-
+- return True;
+- }
+-
+-
+-
+- /************************************************************************
+- * Utility functions
+- ************************************************************************/
+-
+- static char *
+- get_selection(
+- buf_T *buf) /* buffer whose selection we want */
+- {
+- pos_T *start; /* start of the selection */
+- pos_T *end; /* end of the selection */
+- char *lp; /* pointer to actual line data */
+- int llen; /* length of actual line data */
+- char *sp; /* pointer to selection buffer */
+- int slen; /* string length in selection buffer */
+- int size; /* size of selection buffer */
+- char *new_sp; /* temp pointer to new sp */
+- int lnum; /* line number we are appending */
+-
+- if (buf->b_visual.vi_mode == 'v')
+- {
+- start = &buf->b_visual.vi_start;
+- end = &buf->b_visual.vi_end;
+- if (start->lnum == end->lnum)
+- {
+- /* selection is all on one line */
+- lp = (char *) ml_get_pos(start);
+- llen = end->col - start->col + 1;
+- sp = (char *) malloc(llen + 1);
+- if (sp != NULL)
+- {
+- strncpy(sp, lp, llen);
+- sp[llen] = NUL;
+- }
+- }
+- else
+- {
+- /* multi-line selection */
+- lp = (char *) ml_get_pos(start);
+- llen = strlen(lp);
+- sp = (char *) malloc(BUFSIZ + llen);
+- if (sp != NULL)
+- {
+- size = BUFSIZ + llen;
+- strcpy(sp, lp);
+- sp[llen] = '\n';
+- slen = llen + 1;
+-
+- lnum = start->lnum + 1;
+- while (lnum < end->lnum)
+- sp = append_selection(lnum++, sp, &size, &slen);
+-
+- lp = (char *) ml_get(end->lnum);
+- llen = end->col + 1;
+- if ((slen + llen) >= size)
+- {
+- new_sp = (char *)
+- realloc(sp, slen + llen + 1);
+- if (new_sp != NULL)
+- {
+- size += llen + 1;
+- sp = new_sp;
+- }
+- }
+- if ((slen + llen) < size)
+- {
+- strncpy(&sp[slen], lp, llen);
+- sp[slen + llen] = NUL;
+- }
+-
+- }
+- }
+- }
+- else
+- sp = NULL;
+-
+- return sp;
+- }
+-
+- static char *
+- append_selection(
+- int lnum, /* line number to append */
+- char *sp, /* pointer to selection buffer */
+- int *size, /* ptr to size of sp */
+- int *slen) /* ptr to length of selection string */
+- {
+- char *lp; /* line of data from buffer */
+- int llen; /* strlen of lp */
+- char *new_sp; /* temp pointer to new sp */
+-
+- lp = (char *)ml_get((linenr_T)lnum);
+- llen = strlen(lp);
+-
+- if ((*slen + llen) <= *size)
+- {
+- new_sp = (char *) realloc((void *) sp, BUFSIZ + *slen + llen);
+- if (*new_sp != NUL)
+- {
+- *size = BUFSIZ + *slen + llen;
+- sp = new_sp;
+- }
+- }
+- if ((*slen + llen) > *size)
+- {
+- strcat(&sp[*slen], lp);
+- *slen += llen;
+- sp[*slen++] = '\n';
+- }
+-
+- return sp;
+- }
+-
+-
+- static void
+- load_buffer_by_name(
+- char *filename, /* the file to load */
+- int lnum) /* an optional line number (or 0) */
+- {
+- char lnumbuf[16]; /* make line number option for :e */
+- char cbuf[BUFSIZ]; /* command buffer */
+-
+- if (lnum > 0)
+- sprintf(lnumbuf, "+%d", lnum);
+- else
+- lnumbuf[0] = NUL;
+-
+- vim_snprintf(cbuf, sizeof(cbuf), "e %s %s", lnumbuf, filename);
+- coloncmd(cbuf, False);
+- }
+-
+-
+- static void
+- load_window(
+- char *filename, /* filename to load */
+- int lnum) /* linenumber to go to */
+- {
+- buf_T *buf; /* buffer filename is stored in */
+- win_T *win; /* window filenme is displayed in */
+-
+- /*
+- * Make sure filename is displayed and is the current window.
+- */
+-
+- buf = buflist_findname((char_u *)filename);
+- if (buf == NULL || (win = get_window(buf)) == NULL)
+- {
+- /* No buffer or buffer is not in current window */
+- /* wsdebug("load_window: load_buffer_by_name(\"%s\", %d)\n",
+- filename, lnum); */
+- load_buffer_by_name(filename, lnum);
+- }
+- else
+- {
+- /* buf is in a window */
+- if (win != curwin)
+- {
+- win_enter(win, False);
+- /* wsdebug("load_window: window enter %s\n",
+- win->w_buffer->b_sfname); */
+- }
+- if (lnum > 0 && win->w_cursor.lnum != lnum)
+- {
+- warp_to_pc(lnum);
+- /* wsdebug("load_window: warp to %s[%d]\n",
+- win->w_buffer->b_sfname, lnum); */
+- }
+- }
+- out_flush();
+- }
+-
+-
+-
+- static void
+- warp_to_pc(
+- int lnum) /* line number to warp to */
+- {
+- char lbuf[256]; /* build line command here */
+-
+- if (lnum > 0)
+- {
+- if (State & INSERT)
+- add_to_input_buf((char_u *) "\033", 1);
+- if (isShowing(lnum))
+- sprintf(lbuf, "%dG", lnum);
+- else
+- sprintf(lbuf, "%dz.", lnum);
+- add_to_input_buf((char_u *) lbuf, strlen(lbuf));
+- }
+- }
+-
+- static Boolean
+- isShowing(
+- int lnum) /* tell if line number is showing */
+- {
+- return lnum >= curwin->w_topline && lnum < curwin->w_botline;
+- }
+-
+-
+-
+- static win_T *
+- get_window(
+- buf_T *buf) /* buffer to find window for */
+- {
+- win_T *wp = NULL; /* window filename is in */
+-
+- FOR_ALL_WINDOWS(wp)
+- if (buf == wp->w_buffer)
+- break;
+- return wp;
+- }
+-
+-
+- static void
+- updatePriority(
+- Boolean subMenu) /* if True then start new submenu pri */
+- {
+- int pri; /* priority of this menu/item */
+- char *p;
+-
+- p = strrchr(curMenuPriority, '.');
+- ASSERT(p != NULL);
+- *p++ = NUL;
+-
+- pri = atoi(p) + 10; /* our new priority */
+-
+- if (subMenu)
+- vim_snprintf(curMenuPriority, sizeof(curMenuPriority),
+- "%s.%d.0", curMenuPriority, pri);
+- else
+- vim_snprintf(curMenuPriority, sizeof(curMenuPriority),
+- "%s.%d", curMenuPriority, pri);
+- }
+-
+- static char *
+- addUniqueMnemonic(
+- char *mnemonics, /* currently used mnemonics */
+- char *label) /* label of menu needing mnemonic */
+- {
+- static char name[BUFSIZ]; /* buffer for the updated name */
+- char *p; /* pointer into label */
+- char *found; /* pointer to possible mnemonic */
+-
+- found = NULL;
+- for (p = label; *p != NUL; p++)
+- if (strchr(mnemonics, *p) == 0)
+- if (found == NULL || (isupper((int)*p) && islower((int)*found)))
+- found = p;
+-
+- if (found != NULL)
+- {
+- strncpy(name, label, (found - label));
+- strcat(name, "&");
+- strcat(name, found);
+- }
+- else
+- strcpy(name, label);
+-
+- return name;
+- }
+-
+- /*
+- * Some characters in a menu name must be escaped in vim. Since this is vim
+- * specific, it must be done on this side.
+- */
+- static char *
+- fixup(
+- char *label)
+- {
+- static char buf[BUFSIZ];
+- char *bp; /* pointer into buf */
+- char *lp; /* pointer into label */
+-
+- lp = label;
+- bp = buf;
+- while (*lp != NUL)
+- {
+- if (*lp == ' ' || *lp == '.')
+- *bp++ = '\\';
+- *bp++ = *lp++;
+- }
+- *bp = NUL;
+-
+- return buf;
+- }
+-
+-
+- #ifdef NOHANDS_SUPPORT_FUNCTIONS
+-
+- /* For the NoHands test suite */
+-
+- char *
+- workshop_test_getcurrentfile(void)
+- {
+- char *filename, *selection;
+- int curLine, curCol, selStartLine, selStartCol, selEndLine;
+- int selEndCol, selLength;
+-
+- if (workshop_get_positions(
+- NULL, &filename, &curLine, &curCol, &selStartLine,
+- &selStartCol, &selEndLine, &selEndCol, &selLength,
+- &selection))
+- return filename;
+- else
+- return NULL;
+- }
+-
+- int
+- workshop_test_getcursorrow(void)
+- {
+- return 0;
+- }
+-
+- int
+- workshop_test_getcursorcol(void)
+- {
+- char *filename, *selection;
+- int curLine, curCol, selStartLine, selStartCol, selEndLine;
+- int selEndCol, selLength;
+-
+- if (workshop_get_positions(
+- NULL, &filename, &curLine, &curCol, &selStartLine,
+- &selStartCol, &selEndLine, &selEndCol, &selLength,
+- &selection))
+- return curCol;
+- else
+- return -1;
+- }
+-
+- char *
+- workshop_test_getcursorrowtext(void)
+- {
+- return NULL;
+- }
+-
+- char *
+- workshop_test_getselectedtext(void)
+- {
+- char *filename, *selection;
+- int curLine, curCol, selStartLine, selStartCol, selEndLine;
+- int selEndCol, selLength;
+-
+- if (workshop_get_positions(
+- NULL, &filename, &curLine, &curCol, &selStartLine,
+- &selStartCol, &selEndLine, &selEndCol, &selLength,
+- &selection))
+- return selection;
+- else
+- return NULL;
+- }
+-
+- void
+- workshop_save_sensitivity(char *filename UNUSED)
+- {
+- }
+-
+- #endif
+-
+- static char *
+- fixAccelText(
+- char *ap) /* original acceleratorText */
+- {
+- char buf[256]; /* build in temp buffer */
+- char *shift; /* shift string of "" */
+-
+- if (ap == NULL)
+- return NULL;
+-
+- /* If the accelerator is shifted use the vim form */
+- if (strncmp("Shift+", ap, 6) == 0)
+- {
+- shift = "S-";
+- ap += 6;
+- }
+- else
+- shift = "";
+-
+- if (*ap == 'F' && atoi(&ap[1]) > 0)
+- {
+- vim_snprintf(buf, sizeof(buf), "<%s%s>", shift, ap);
+- return strdup(buf);
+- }
+- else
+- return NULL;
+- }
+-
+- #ifdef FEAT_BEVAL_GUI
+- void
+- workshop_beval_cb(
+- BalloonEval *beval,
+- int state)
+- {
+- win_T *wp;
+- char_u *text;
+- int type;
+- linenr_T lnum;
+- int col;
+- int idx;
+- char buf[MAXPATHLEN * 2];
+- static int serialNo = -1;
+-
+- if (!p_beval)
+- return;
+-
+- if (get_beval_info(beval, FALSE, &wp, &lnum, &text, &col) == OK)
+- {
+- if (text && text[0])
+- {
+- /* Send debugger request */
+- if (strlen((char *) text) > (MAXPATHLEN/2))
+- {
+- /*
+- * The user has probably selected the entire
+- * buffer or something like that - don't attempt
+- * to evaluate it
+- */
+- return;
+- }
+-
+- /*
+- * WorkShop expects the col to be a character index, not
+- * a column number. Compute the index from col. Also set
+- * line to 0 because thats what dbx expects.
+- */
+- #ifdef FEAT_VARTABS
+- idx = computeIndex(col, text, beval->ts, beval->vts);
+- #else
+- idx = computeIndex(col, text, beval->ts, 0);
+- #endif
+- if (idx > 0)
+- {
+- lnum = 0;
+-
+- /*
+- * If successful, it will respond with a balloon cmd.
+- */
+- if (state & ControlMask)
+- /* Evaluate *(expression) */
+- type = (int)GPLineEval_INDIRECT;
+- else if (state & ShiftMask)
+- /* Evaluate type(expression) */
+- type = (int)GPLineEval_TYPE;
+- else
+- /* Evaluate value(expression) */
+- type = (int)GPLineEval_EVALUATE;
+-
+- /* Send request to dbx */
+- vim_snprintf(buf, sizeof(buf), "toolVerb debug.balloonEval "
+- "%s %ld,0 %d,0 %d,%d %ld %s\n",
+- (char *)wp->w_buffer->b_ffname,
+- (long)lnum, idx, type, serialNo++,
+- (long)strlen((char *)text), (char *)text);
+- balloonEval = beval;
+- workshop_send_message(buf);
+- }
+- }
+- }
+- }
+-
+- static int
+- computeIndex(
+- int wantedCol,
+- char_u *line,
+- int ts,
+- int *vts UNUSED)
+- {
+- int col = 0;
+- int idx = 0;
+-
+- while (line[idx])
+- {
+- if (line[idx] == '\t')
+- #ifdef FEAT_VARTABS
+- col += tabstop_padding(col, ts, vts);
+- #else
+- col += ts - (col % ts);
+- #endif
+- else
+- col++;
+- idx++;
+- if (col >= wantedCol)
+- return idx;
+- }
+-
+- return -1;
+- }
+- #endif
+-
+- static void
+- addMenu(
+- char *menu, /* menu name */
+- char *accel, /* accelerator text (optional) */
+- char *verb) /* WorkShop action-verb */
+- {
+- MenuMap *newMap;
+- char cbuf[BUFSIZ];
+-
+- if (menuMapSize >= menuMapMax)
+- {
+- newMap = realloc(menuMap,
+- sizeof(MenuMap) * (menuMapMax + MENU_INC));
+- if (newMap != NULL)
+- {
+- menuMap = newMap;
+- menuMapMax += MENU_INC;
+- }
+- }
+- if (menuMapSize < menuMapMax)
+- {
+- menuMap[menuMapSize].name = strdup(menu);
+- menuMap[menuMapSize].accel = accel && *accel ? strdup(accel) : NULL;
+- menuMap[menuMapSize++].verb = strdup(verb);
+- if (accel && workshopHotKeysEnabled)
+- {
+- vim_snprintf(cbuf, sizeof(cbuf),
+- "map %s :wsverb %s<CR>", accel, verb);
+- coloncmd(cbuf, TRUE);
+- }
+- }
+- }
+-
+- static char *
+- nameStrip(
+- char *raw) /* menu name, possibly with & chars */
+- {
+- static char buf[BUFSIZ]; /* build stripped name here */
+- char *bp = buf;
+-
+- while (*raw)
+- {
+- if (*raw != '&')
+- *bp++ = *raw;
+- raw++;
+- }
+- *bp = NUL;
+- return buf;
+- }
+-
+-
+- static char *
+- lookupVerb(
+- char *verb,
+- int skip) /* number of matches to skip */
+- {
+- int i; /* loop iterator */
+-
+- for (i = 0; i < menuMapSize; i++)
+- if (strcmp(menuMap[i].verb, verb) == 0 && skip-- == 0)
+- return nameStrip(menuMap[i].name);
+-
+- return NULL;
+- }
+-
+-
+- static void
+- coloncmd(
+- char *cmd, /* the command to print */
+- Boolean force) /* force cursor update */
+- {
+- char_u *cpo_save = p_cpo;
+-
+- #ifdef WSDEBUG
+- if (WSDLEVEL(WS_TRACE_COLONCMD))
+- wsdebug("Cmd: %s\n", cmd);
+- #endif
+-
+- p_cpo = empty_option;
+-
+- ALT_INPUT_LOCK_ON;
+- do_cmdline_cmd((char_u *)cmd);
+- ALT_INPUT_LOCK_OFF;
+-
+- p_cpo = cpo_save;
+-
+- if (force)
+- gui_update_screen();
+- }
+-
+- /*
+- * setDollarVim - Given the run directory, search for the vim install
+- * directory and set $VIM.
+- *
+- * We can be running out of SUNWspro/bin or out of
+- * SUNWspro/contrib/contrib6/vim5.6/bin so we check
+- * relative to both of these directories.
+- */
+- static void
+- setDollarVim(
+- char *rundir)
+- {
+- char buf[MAXPATHLEN];
+- char *cp;
+-
+- /*
+- * First case: Running from <install-dir>/SUNWspro/bin
+- */
+- strcpy(buf, rundir);
+- strcat(buf, "/../contrib/contrib6/vim" VIM_VERSION_SHORT "/share/vim/"
+- VIM_VERSION_NODOT "/syntax/syntax.vim");
+- if (access(buf, R_OK) == 0)
+- {
+- strcpy(buf, "SPRO_WSDIR=");
+- strcat(buf, rundir);
+- cp = strrchr(buf, '/');
+- if (cp != NULL)
+- strcpy(cp, "/WS6U2");
+- putenv(strdup(buf));
+-
+- strcpy(buf, "VIM=");
+- strcat(buf, rundir);
+- strcat(buf, "/../contrib/contrib6/vim" VIM_VERSION_SHORT "/share/vim/"
+- VIM_VERSION_NODOT);
+- putenv(strdup(buf));
+- return;
+- }
+-
+- /*
+- * Second case: Probably running from
+- * <install-dir>/SUNWspro/contrib/contrib6/vim5.6/bin
+- */
+- strcpy(buf, rundir);
+- strcat(buf, "/../../../contrib/contrib6/vim" VIM_VERSION_SHORT
+- "/share/vim/" VIM_VERSION_NODOT "/syntax/syntax.vim");
+- if (access(buf, R_OK) == 0)
+- {
+- strcpy(buf, "SPRO_WSDIR=");
+- strcat(buf, rundir);
+- cp = strrchr(buf, '/');
+- if (cp != NULL)
+- strcpy(cp, "../../../../WS6U2");
+- putenv(strdup(buf));
+-
+- strcpy(buf, "VIM=");
+- strcat(buf, rundir);
+- strcat(buf, "/../../../contrib/contrib6/vim" VIM_VERSION_SHORT
+- "/share/vim/" VIM_VERSION_NODOT);
+- putenv(strdup(buf));
+- return;
+- }
+- }
+-
+- /*
+- * findYourself - Find the directory we are running from. This is used to
+- * set $VIM. We need to set this because users can install
+- * the package in a different directory than the compiled
+- * directory. This is a Sun Visual WorkShop requirement!
+- *
+- * Note: We override a user's $VIM because it won't have the
+- * WorkShop specific files. S/he may not like this but it's
+- * better than getting the wrong files (especially as the
+- * user is likely to have $VIM set to 5.4 or later).
+- */
+- void
+- findYourself(
+- char *argv0)
+- {
+- char *runpath = NULL;
+- char *path;
+- char *pathbuf;
+-
+- if (*argv0 == '/')
+- runpath = strdup(argv0);
+- else if (*argv0 == '.' || strchr(argv0, '/'))
+- {
+- runpath = (char *) malloc(MAXPATHLEN);
+- if (getcwd(runpath, MAXPATHLEN) == NULL)
+- runpath[0] = NUL;
+- strcat(runpath, "/");
+- strcat(runpath, argv0);
+- }
+- else
+- {
+- path = getenv("PATH");
+- if (path != NULL)
+- {
+- runpath = (char *) malloc(MAXPATHLEN);
+- pathbuf = strdup(path);
+- path = strtok(pathbuf, ":");
+- do
+- {
+- strcpy(runpath, path);
+- strcat(runpath, "/");
+- strcat(runpath, argv0);
+- if (access(runpath, X_OK) == 0)
+- break;
+- } while ((path = strtok(NULL, ":")) != NULL);
+- free(pathbuf);
+- }
+- }
+-
+- if (runpath != NULL)
+- {
+- char runbuf[MAXPATHLEN];
+-
+- /*
+- * We found the run directory. Now find the install dir.
+- */
+- (void)vim_FullName((char_u *)runpath, (char_u *)runbuf, MAXPATHLEN, 1);
+- path = strrchr(runbuf, '/');
+- if (path != NULL)
+- *path = NUL; /* remove the vim/gvim name */
+- path = strrchr(runbuf, '/');
+- if (path != NULL)
+- {
+- if (strncmp(path, "/bin", 4) == 0)
+- setDollarVim(runbuf);
+- else if (strncmp(path, "/src", 4) == 0)
+- {
+- *path = NUL; /* development tree */
+- setDollarVim(runbuf);
+- }
+- }
+- free(runpath);
+- }
+- }
+--- 0 ----
+*** ../vim-8.1.0762/src/workshop.h 2016-08-29 22:42:21.000000000 +0200
+--- src/workshop.h 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,28 ****
+- /* vi:set ts=8 sts=4 sw=4 noet:
+- *
+- * VIM - Vi IMproved by Bram Moolenaar
+- * Visual Workshop integration by Gordon Prieur
+- *
+- * Do ":help uganda" in Vim to read copying and usage conditions.
+- * Do ":help credits" in Vim to see a list of people who contributed.
+- */
+-
+- #if !defined(WORKSHOP_H) && defined(FEAT_SUN_WORKSHOP)
+- #define WORKSHOP_H
+-
+- #include <X11/Intrinsic.h>
+- #include <Xm/Xm.h>
+-
+- #include "integration.h"
+-
+- #ifdef WSDEBUG
+- # include "wsdebug.h"
+- #else
+- # ifndef ASSERT
+- # define ASSERT(c)
+- # endif
+- #endif
+-
+- extern int usingSunWorkShop; /* set if -ws flag is used */
+-
+- #endif
+--- 0 ----
+*** ../vim-8.1.0762/src/wsdebug.c 2016-09-25 21:41:24.000000000 +0200
+--- src/wsdebug.c 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,184 ****
+- /* vi:set ts=8 sw=8 noet:
+- *
+- * VIM - Vi IMproved by Bram Moolenaar
+- * Visual Workshop integration by Gordon Prieur
+- *
+- * Do ":help uganda" in Vim to read copying and usage conditions.
+- * Do ":help credits" in Vim to see a list of people who contributed.
+- * See README.txt for an overview of the Vim source code.
+- */
+-
+- /*
+- * WorkShop Debugging Tools. What are these tools and why are they important?
+- * There are two main tools here. The first tool is a tool for delaying or
+- * stopping gvim during startup. The second tool is a protocol log tool.
+- *
+- * The startup delay tool is called wsdebug_wait(). This is very important for
+- * debugging startup problems because gvim will be started automatically from
+- * workshop and cannot be run directly from a debugger. The only way to debug
+- * a gvim started by workshop is by attaching a debugger to it. Without this
+- * tool all starup code will have completed before you can get the pid and
+- * attach.
+- *
+- * The second tool is a protocol log tool. The workshop editor server and gvim
+- * pass information back and forth during a workshop session. Sometimes it is
+- * very important to peruse this conversation in order to understand what is
+- * happening. The wsdebug_log_init() call sets up this protocol log tool and
+- * wsdebug() and wstrace() calls output the information to the log.
+- *
+- * This code must have WSDEBUG defined for it to be compiled into vim/gvim.
+- */
+-
+- #ifdef WSDEBUG
+-
+- #include "vim.h"
+-
+- FILE *ws_debug = NULL;
+- u_int ws_dlevel = 0; /* ws_debug verbosity level */
+-
+- void wsdebug(char *, ...);
+- void wstrace(char *, ...);
+-
+- static int lookup(char *);
+- #ifdef USE_WS_ERRORHANDLER
+- static int errorHandler(Display *, XErrorEvent *);
+- #endif
+-
+-
+- /*
+- * wsdebug_wait - This function can be used to delay or stop execution of vim.
+- * It's normally used to delay startup while attaching a
+- * debugger to a running process. Since workshop starts gvim
+- * from a background process this is the only way to debug
+- * startup problems.
+- */
+-
+- void wsdebug_wait(
+- u_int wait_flags, /* tells what to do */
+- char *wait_var, /* wait environment variable */
+- u_int wait_secs) /* how many seconds to wait */
+- {
+-
+- init_homedir(); /* not inited yet */
+- #ifdef USE_WDDUMP
+- WDDump(0, 0, 0);
+- #endif
+-
+- /* for debugging purposes only */
+- if (wait_flags & WT_ENV && wait_var && getenv(wait_var) != NULL) {
+- sleep(atoi(getenv(wait_var)));
+- } else if (wait_flags & WT_WAIT && lookup("~/.gvimwait")) {
+- sleep(wait_secs > 0 && wait_secs < 120 ? wait_secs : 20);
+- } else if (wait_flags & WT_STOP && lookup("~/.gvimstop")) {
+- int w = 1;
+- while (w) {
+- ;
+- }
+- }
+- } /* end wsdebug_wait */
+-
+-
+- void
+- wsdebug_log_init(
+- char *log_var, /* env var with log file */
+- char *level_var) /* env var with ws_debug level */
+- {
+- char *file; /* possible ws_debug output file */
+- char *cp; /* ws_dlevel pointer */
+-
+- if (log_var && (file = getenv(log_var)) != NULL)
+- {
+- char buf[BUFSIZ];
+-
+- vim_snprintf(buf, sizeof(buf), "date > %s", file);
+- system(buf);
+- ws_debug = fopen(file, "a");
+- if (level_var && (cp = getenv(level_var)) != NULL) {
+- ws_dlevel = strtoul(cp, NULL, 0);
+- } else {
+- ws_dlevel = WS_TRACE; /* default level */
+- }
+- #ifdef USE_WS_ERRORHANDLER
+- XSetErrorHandler(errorHandler);
+- #endif
+- }
+-
+- } /* end wsdebug_log_init */
+-
+-
+-
+-
+- void
+- wstrace(
+- char *fmt,
+- ...)
+- {
+- va_list ap;
+-
+- if (ws_debug!= NULL && (ws_dlevel & (WS_TRACE | WS_TRACE_VERBOSE))) {
+- va_start(ap, fmt);
+- vfprintf(ws_debug, fmt, ap);
+- va_end(ap);
+- fflush(ws_debug);
+- }
+-
+- } /* end wstrace */
+-
+-
+- void
+- wsdebug(
+- char *fmt,
+- ...)
+- {
+- va_list ap;
+-
+- if (ws_debug != NULL) {
+- va_start(ap, fmt);
+- vfprintf(ws_debug, fmt, ap);
+- va_end(ap);
+- fflush(ws_debug);
+- }
+-
+- } /* end wsdebug */
+-
+-
+- static int
+- lookup(
+- char *file)
+- {
+- char buf[BUFSIZ];
+-
+- expand_env((char_u *) file, (char_u *) buf, BUFSIZ);
+- return (access(buf, F_OK) == 0);
+-
+- } /* end lookup */
+-
+- #ifdef USE_WS_ERRORHANDLER
+- static int
+- errorHandler(
+- Display *dpy,
+- XErrorEvent *err)
+- {
+- char msg[256];
+- char buf[256];
+-
+- XGetErrorText(dpy, err->error_code, msg, sizeof(msg));
+- wsdebug("\n\nWSDEBUG Vim: X Error of failed request: %s\n", msg);
+-
+- sprintf(buf, "%d", err->request_code);
+- XGetErrorDatabaseText(dpy,
+- "XRequest", buf, "Unknown", msg, sizeof(msg));
+- wsdebug("\tMajor opcode of failed request: %d (%s)\n",
+- err->request_code, msg);
+- if (err->request_code > 128) {
+- wsdebug("\tMinor opcode of failed request: %d\n",
+- err->minor_code);
+- }
+-
+- return 0;
+- }
+- #endif
+-
+-
+-
+- #endif /* WSDEBUG */
+--- 0 ----
+*** ../vim-8.1.0762/src/wsdebug.h 2016-08-29 22:42:21.000000000 +0200
+--- src/wsdebug.h 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,81 ****
+- /* vi:set ts=8 sw=8 noet:
+- *
+- * VIM - Vi IMproved by Bram Moolenaar
+- * Visual Workshop integration by Gordon Prieur
+- *
+- * Do ":help uganda" in Vim to read copying and usage conditions.
+- * Do ":help credits" in Vim to see a list of people who contributed.
+- */
+-
+-
+- #ifndef WSDEBUG_H
+- #define WSDEBUG_H
+-
+- #ifdef WSDEBUG
+-
+- #ifndef ASSERT
+- #define ASSERT(c) \
+- if (!(c)) { \
+- fprintf(stderr, "Assertion failed: line %d, file %s\n", \
+- __LINE__, __FILE__); \
+- fflush(stderr); \
+- abort(); \
+- }
+- #endif
+-
+- #define WS_TRACE 0x00000001
+- #define WS_TRACE_VERBOSE 0x00000002
+- #define WS_TRACE_COLONCMD 0x00000004
+- #define WS_DEBUG_ALL 0xffffffff
+-
+- #define WSDLEVEL(flags) (ws_debug != NULL && (ws_dlevel & (flags)))
+-
+- #ifdef USE_WDDUMP
+- #include "wdump.h"
+- #endif
+-
+- #define WSDEBUG_TRACE 1
+- //#define WSDEBUG_SENSE 2
+-
+- typedef enum {
+- WT_ENV = 1, /* look for env var if set */
+- WT_WAIT, /* look for ~/.gvimwait if set */
+- WT_STOP /* look for ~/.gvimstop if set */
+- } WtWait;
+-
+-
+- void wsdebug(char *, ...);
+- void wstrace(char *, ...);
+-
+-
+- extern FILE *ws_debug;
+- extern u_int ws_dlevel; /* ws_debug verbosity level */
+-
+- # else /* not WSDEBUG */
+-
+- #ifndef ASSERT
+- # define ASSERT(c)
+- #endif
+-
+- /*
+- * The following 2 stubs are needed because a macro cannot be used because of
+- * the variable number of arguments.
+- */
+-
+- void
+- wsdebug(
+- char *fmt,
+- ...)
+- {
+- }
+-
+-
+- void
+- wstrace(
+- char *fmt,
+- ...)
+- {
+- }
+-
+- #endif /* WSDEBUG */
+- #endif /* WSDEBUG_H */
+--- 0 ----
+*** ../vim-8.1.0762/src/ex_cmdidxs.h 2019-01-08 22:02:36.044297306 +0100
+--- src/ex_cmdidxs.h 2019-01-17 15:31:43.054158710 +0100
+***************
+*** 28,36 ****
+ /* u */ 481,
+ /* v */ 492,
+ /* w */ 510,
+! /* x */ 525,
+! /* y */ 534,
+! /* z */ 535
+ };
+
+ /*
+--- 28,36 ----
+ /* u */ 481,
+ /* v */ 492,
+ /* w */ 510,
+! /* x */ 524,
+! /* y */ 533,
+! /* z */ 534
+ };
+
+ /*
+***************
+*** 63,72 ****
+ /* t */ { 2, 0, 19, 0, 22, 24, 0, 25, 0, 26, 0, 27, 31, 34, 36, 37, 0, 38, 40, 0, 41, 0, 0, 0, 0, 0 },
+ /* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* v */ { 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 9, 12, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0 },
+! /* w */ { 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 8, 0, 9, 10, 0, 12, 0, 13, 14, 0, 0, 0, 0 },
+ /* x */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0 },
+ /* y */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ };
+
+! static const int command_count = 548;
+--- 63,72 ----
+ /* t */ { 2, 0, 19, 0, 22, 24, 0, 25, 0, 26, 0, 27, 31, 34, 36, 37, 0, 38, 40, 0, 41, 0, 0, 0, 0, 0 },
+ /* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* v */ { 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 9, 12, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0 },
+! /* w */ { 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 8, 0, 9, 10, 0, 0, 0, 12, 13, 0, 0, 0, 0 },
+ /* x */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0 },
+ /* y */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ };
+
+! static const int command_count = 547;
+*** ../vim-8.1.0762/src/version.c 2019-01-17 14:31:10.190919265 +0100
+--- src/version.c 2019-01-17 15:39:12.143436999 +0100
+***************
+*** 797,798 ****
+--- 793,796 ----
+ { /* Add new patch number below this line */
++ /**/
++ 763,
+ /**/
+
+--
+You are Dead. Do you wish to restart, load, or quit?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///