diff --git a/src/INSTALL b/src/INSTALL
index b1aa6a8..0c01ef2 100644
--- a/src/INSTALL
+++ b/src/INSTALL
@@ -88,7 +88,7 @@
 Unix: COMPILING WITH/WITHOUT GUI
 
 These configure arguments can be used to select which GUI to use:
---enable-gui=	gtk, motif, athena or auto
+--enable-gui=	gtk, kde, motif, athena or auto
 --disable-gtk-check
 --disable-motif-check
 --disable-athena-check
@@ -98,19 +98,19 @@
 does not proceed to check any of the remaining ones.  Otherwise, it moves on
 to the next one.
 
---enable-{gtk,motif,athena}-check all default to "yes", such that if
+--enable-{gtk,kde,motif,athena}-check all default to "yes", such that if
 --enable-gui is "auto" (which it is by default), GTK, Motif, and Athena will
 be checked for.  If you want to *exclude* a certain check, then you use
---disable-{gtk,motif,athena}-check.
+--disable-{gtk,kde,motif,athena}-check.
 
 For example, if --enable-gui is set to "auto", but you don't want it look for
 Motif, you then also specify --disable-motif-check.  This results in only
 checking for GTK and Athena.
 
 Lastly, if you know which one you want to use, then you can just do
---enable-gui={gtk,motif,athena}.  So if you wanted to only use Motif, then
+--enable-gui={gtk,kde,motif,athena}.  So if you wanted to only use Motif, then
 you'd specify --enable-gui=motif.  Once you specify what you want, the
---enable-{gtk,motif,athena}-check options are ignored.
+--enable-{gtk,kde,motif,athena}-check options are ignored.
 
 For compiling with the GTK+ GUI, you need a recent version of glib and gtk+.
 Configure checks for at least version 1.1.16, but below 2.0.  An older versions
@@ -124,6 +124,9 @@
 auto/config.log for any error messages that may give you a hint as to what's
 happening.
 
+For KDE see INSTALLkde.txt.
+
+
 Unix: COMPILING WITH MULTI-BYTE
 
 When you want to compile with the multi-byte features enabled, make sure you
diff --git a/src/INSTALLkde.txt b/src/INSTALLkde.txt
new file mode 100644
index 0000000..42d4a12
--- /dev/null
+++ b/src/INSTALLkde.txt
@@ -0,0 +1,101 @@
+Vim with KDE: kvim
+
+ON THE INTERNET
+===============
+
+	The homepage is http://www.freehackers.org/kvim/
+	The core is build around the official vim-6.x releases and patches
+
+	KVim CVS is full and does not need extra package. Just download and compile it.
+
+INSTALL :
+=========
+	We now use Vim's configure to configure, compile and install KVim.
+
+	Don't forget, that you need to have QT and KDE headers and tools installed, otherwise it won't
+	work ! (these can commonly be found in kde-devel/qt-devel packages)
+	
+	Enter the 'src' directory and configure it your way (you need to add at least these flags to the configure command line : --enable-gui=kde --with-qt-dir=$QTDIR ) then make and make install as root.
+	We added to configure some options for KDE / QT detection, it will for example, find whether you use KDE 2.x or KDE 3.x automatically. For now, QT is _not_ autodetected. I hope to fix this soon.
+	From KVim 6.1, you can now use a KDE toolbar instead of Vim's Toolbar, to enable it, use the --enable-kde-toolbar configure flag.
+
+
+=> If it fails : (yes it still can, the configure script i wrote is still experimental and probably not
+perfect ;p)
+	or 'how to make a bug report' :
+
+	In some cases, I can imagine it will fail, if this happens then send to marchand@kde.org :
+		->auto/config.mk (important one)
+		->your configure command line with your options
+		->your paths : where KDE is (which version ?), where QT is (version ?), and find where your
+			libs are (your kdelibs, your QT libs and QT headers)
+		->the output of 'kde-config --version'
+		->your OS / Linux Distribution version
+		->in case of a compilation error : the full error output.
+		->the compiler used (gcc 2.95, 2.96, 3.1 ...)
+		->any stuff you think could be usefull to me :)
+
+	Thanks for giving KVim a try, we hope you'll enjoy it !
+
+
+DEVELOPMENT STATE AND KNOWN BUGS:
+=================================
+Most Vim GUI features are now implemented, only multibyte support is incomplete.
+We are working on this and this is our primary goal after KVim 6.1 release.
+We hope to get it to work before we include KVim into the core Vim which we want to
+do before the end of the year 2002 if possible.
+
+We would be happy to hear from you if you've tried kvim. Tell us
+what is missing, what you like and don't like, and what you want.
+
+As people have wished it for a while, Philippe developped a component for Vim.
+The component is now fully usable with GVim and KVim and can be found on KDE's CVS
+in the kdeextragear-1 module.
+
+SOURCE ACCESS:
+==============
+Releases and maybe snapshots are/will be found on http://freehackers.org/kvim/
+The CVS is CVSROOT=:pserver:anonymous@cvs.tuxfamily.org:/cvsroot/kvim
+(with no password)
+You'll find there a full vim 6.x package (with runtime files included).
+
+MAILING LIST:
+=============
+As we released KVim 6.0, we created a public mailing list, for feedback,
+user help and development related discussions : "kvim-dev@freenux.org",
+ to subscribe send a mail to "kvim-dev-subscribe@freenux.org" with
+"subscribe" as the subject and just reply to the mail you will receive.
+(sorry the admin messages are in french, but the list discussions are in
+english)
+
+THANKS :
+========
+To all the guys on #kde@opn (Neil, Malte and many other) and to all the people who
+tried, debugged, compiled and recompiled again KVim to bring now a much more robust KVim
+and of course to all of you who send patchs and comments :)
+And of course to Vim Authors :)
+
+CURRENT MAINTAINER:
+===================
+	Mickael Marchand <marchand@kde.org>
+	
+DEVELOPERS (CVS accounts):
+==========
+	Mickael Marchand <marchand@kde.org> (marchand)
+	Mark Westcott <mark@houseoffish.org> Qtopia GUI (mark)
+	Thomas Capricelli <orzel@kde.org> Initial KVim author (orzel)
+	Philippe Fremy <pfremy@chez.com> Initial KVim author (pfremy)
+
+AUTHORS
+=========
+	Thomas Capricelli <orzel@kde.org> Initial KVim author
+	Philippe Fremy <pfremy@chez.com> Initial KVim author
+	
+CONTRIBUTORS
+============
+	David Spencer Tyree <celer@scrypt.net>
+	Vince Negri <vince@bulbous.freeserve.co.uk> AntiAliasing support
+	Kailash Sethuraman (hsaliak, #netbsd@opn) NetBSD configuration/compilation fixes
+	Some other, see the About KVim dialog box in KVim...
+
+
diff --git a/src/Makefile b/src/Makefile
index d59f32a..7e4c385 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -336,6 +336,7 @@
 # use it (e.g., want a GTK-only version), then use --enable-gui=gtk.
 #
 # If the selected GUI isn't found, the GUI is disabled automatically
+#CONF_OPT_GUI = --enable-gui=kde
 #CONF_OPT_GUI = --enable-gui=gtk
 #CONF_OPT_GUI = --enable-gui=gtk --disable-gtktest
 #CONF_OPT_GUI = --enable-gui=gtk2
@@ -1041,6 +1042,35 @@
 # Without a GUI install the normal way.
 NONE_INSTALL = install_normal
 
+### KDE GUI interface.
+KDE_DIR		= $(KDE_PREFIX)
+KDE_INCL	= gui.h
+KDE_SRC		= gui.c pty.c gui_kde.cc gui_kde_x11.cc gui_kde_widget.cc gui_kde_widget_moc.cc kvim_iface_skel.cc
+KDE_OBJ		= objects/gui.o objects/pty.o objects/gui_kde.o objects/gui_kde_x11.o \
+	   		objects/gui_kde_widget.o objects/gui_kde_widget_moc.o \
+			objects/kvim_iface_skel.o
+KDE_DEFS	= -DFEAT_GUI_KDE $(NARROW_PROTO)
+KDE_IPATH	= $(GUI_INC_LOC)
+KDE_LIBS_DIR	= $(GUI_LIB_LOC)
+KDE_LIBS1	=
+KDE_LIBS2	= $(KDE_LIBNAME)
+KDE_INSTALL     = install_normal
+KDE_TARGETS	= installklinks installkdeicons
+KDE_MAN_TARGETS =
+KDE_TESTTARGET = gui
+
+#for KDE rename files to avoid confusion with gvim for GTK
+KVIMNAME	= k$(VIMNAME)
+KVIMTARGET	= $(KVIMNAME)$(LNKEXT)
+KVIEWNAME	= k$(VIEWNAME)
+KVIEWTARGET	= $(KVIEWNAME)$(LNKEXT)
+RKVIMNAME	= r$(KVIMNAME)
+RKVIMTARGET	= $(RKVIMNAME)$(LNKEXT)
+RKVIEWNAME	= r$(KVIEWNAME)
+RKVIEWTARGET	= $(RKVIEWNAME)$(LNKEXT)
+KVIMDIFFNAME	= k$(VIMDIFFNAME)
+KVIMDIFFTARGET	= $(KVIMDIFFNAME)$(LNKEXT)
+
 ### GTK GUI
 GTK_SRC		= gui.c gui_gtk.c gui_gtk_x11.c pty.c gui_gtk_f.c \
 			gui_beval.c
@@ -1170,8 +1200,8 @@
 CARBONGUI_TESTTARGET =
 
 # All GUI files
-ALL_GUI_SRC  = gui.c gui_gtk.c gui_gtk_f.c gui_motif.c gui_athena.c gui_gtk_x11.c gui_x11.c gui_at_sb.c gui_at_fs.c pty.c
-ALL_GUI_PRO  = gui.pro gui_gtk.pro gui_motif.pro gui_athena.pro gui_gtk_x11.pro gui_x11.pro gui_w16.pro gui_w32.pro gui_amiga.pro gui_photon.pro
+ALL_GUI_SRC  = gui.c gui_gtk.c gui_gtk_f.c gui_motif.c gui_athena.c gui_gtk_x11.c gui_x11.c gui_at_sb.c gui_at_fs.c pty.c gui_kde.cc gui_kde_widget.cc gui_kde_x11.cc gui_kde_widget_moc.cc
+ALL_GUI_PRO  = gui.pro gui_gtk.pro gui_motif.pro gui_athena.pro gui_gtk_x11.pro gui_x11.pro gui_w16.pro gui_w32.pro gui_amiga.pro gui_photon.pro gui_kde.pro gui_kde_x11.pro
 
 # }}}
 
@@ -1307,7 +1337,7 @@
 SRC =	$(BASIC_SRC) $(GUI_SRC) $(HANGULIN_SRC) $(PERL_SRC) $(PYTHON_SRC) \
 	$(TCL_SRC) $(RUBY_SRC) $(SNIFF_SRC) $(WORKSHOP_SRC) $(WSDEBUG_SRC)
 
-TAGS_SRC = *.c *.cpp if_perl.xs
+TAGS_SRC = *.c *.cpp *.cc if_perl.xs
 
 EXTRA_SRC = hangulin.c auto/if_perl.c if_perlsfio.c if_python.c if_tcl.c \
 		if_ruby.c if_sniff.c gui_beval.c \
@@ -1800,6 +1830,23 @@
 	fi
 
 # install the icons for KDE, if the directory exists and the icon doesn't.
+# doesn't.<=looks strange to install icons to user's directory ;), i add my
+# own install procedure, mikmak
+installkdeicons:
+	mkdir -p $(DESTDIR)$(KDE_DIR)/share/applnk/Editors/
+	mkdir -p $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/32x32/apps/
+	mkdir -p $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/48x48/apps/
+	mkdir -p $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/22x22/actions/
+	mkdir -p $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/16x16/actions/
+	mkdir -p $(DESTDIR)$(KDE_DIR)/share/apps/kvim
+
+	cp ../runtime/KVim.desktop $(DESTDIR)$(KDE_DIR)/share/applnk/Editors/ && chmod 644 $(DESTDIR)$(KDE_DIR)/share/applnk/Editors/KVim.desktop
+	cp ../runtime/kvim32x32.png $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/32x32/apps/kvim.png && chmod 644 $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/32x32/apps/kvim.png
+	cp ../runtime/kvim48x48.png $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/48x48/apps/kvim.png && chmod 644 $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/48x48/apps/kvim.png
+	cp ../runtime/hi16-action-make.png $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/16x16/actions/hi16-action-make.png
+	cp ../runtime/hi22-action-make.png $(DESTDIR)$(KDE_DIR)/share/icons/hicolor/22x22/actions/hi22-action-make.png
+	cp ../runtime/kde-tips $(DESTDIR)$(KDE_DIR)/share/apps/kvim/tips && chmod 644 $(DESTDIR)$(KDE_DIR)/share/apps/kvim/tips
+
 ICON48PATH = $(DESTDIR)$(DATADIR)/icons/hicolor/48x48/apps
 ICON32PATH = $(DESTDIR)$(DATADIR)/icons/locolor/32x32/apps
 ICON16PATH = $(DESTDIR)$(DATADIR)/icons/locolor/16x16/apps
@@ -1848,8 +1895,17 @@
 			$(DEST_BIN)/$(EVIEWTARGET) \
 			$(INSTALLGVIMDIFF)
 
+installklinks: $(DEST_BIN)/$(KVIMTARGET) \
+			$(DEST_BIN)/$(KVIEWTARGET) \
+			$(DEST_BIN)/$(RKVIMTARGET) \
+			$(DEST_BIN)/$(RKVIEWTARGET) \
+			$(DEST_BIN)/$(EVIMTARGET) \
+			$(DEST_BIN)/$(EVIEWTARGET) \
+			installkvimdiff
+
 installvimdiff: $(DEST_BIN)/$(VIMDIFFTARGET)
 installgvimdiff: $(DEST_BIN)/$(GVIMDIFFTARGET)
+installkvimdiff: $(DEST_BIN)/$(KVIMDIFFTARGET)
 
 $(DEST_BIN)/$(EXTARGET):
 	cd $(DEST_BIN); ln -s $(VIMTARGET) $(EXTARGET)
@@ -1863,6 +1919,12 @@
 $(DEST_BIN)/$(GVIEWTARGET):
 	cd $(DEST_BIN); ln -s $(VIMTARGET) $(GVIEWTARGET)
 
+$(DEST_BIN)/$(KVIMTARGET):
+	cd $(DEST_BIN); ln -s $(VIMTARGET) $(KVIMTARGET)
+
+$(DEST_BIN)/$(KVIEWTARGET):
+	cd $(DEST_BIN); ln -s $(VIMTARGET) $(KVIEWTARGET)
+
 $(DEST_BIN)/$(RVIMTARGET):
 	cd $(DEST_BIN); ln -s $(VIMTARGET) $(RVIMTARGET)
 
@@ -1875,12 +1937,21 @@
 $(DEST_BIN)/$(RGVIEWTARGET):
 	cd $(DEST_BIN); ln -s $(VIMTARGET) $(RGVIEWTARGET)
 
+$(DEST_BIN)/$(RKVIMTARGET):
+	cd $(DEST_BIN); ln -s $(VIMTARGET) $(RKVIMTARGET)
+
+$(DEST_BIN)/$(RKVIEWTARGET):
+	cd $(DEST_BIN); ln -s $(VIMTARGET) $(RKVIEWTARGET)
+
 $(DEST_BIN)/$(VIMDIFFTARGET):
 	cd $(DEST_BIN); ln -s $(VIMTARGET) $(VIMDIFFTARGET)
 
 $(DEST_BIN)/$(GVIMDIFFTARGET):
 	cd $(DEST_BIN); ln -s $(VIMTARGET) $(GVIMDIFFTARGET)
 
+$(DEST_BIN)/$(KVIMDIFFTARGET):
+	cd $(DEST_BIN); ln -s $(VIMTARGET) $(KVIMDIFFTARGET)
+
 $(DEST_BIN)/$(EVIMTARGET):
 	cd $(DEST_BIN); ln -s $(VIMTARGET) $(EVIMTARGET)
 
@@ -1895,7 +1966,7 @@
 			$(DEST_MAN)/$(RVIMNAME).1 \
 			$(DEST_MAN)/$(RVIEWNAME).1
 
-installghelplinks: $(DEST_MAN)/$(GVIMNAME).1 \
+installghelplinks installkhelplinks : $(DEST_MAN)/$(GVIMNAME).1 \
 			$(DEST_MAN)/$(GVIEWNAME).1 \
 			$(DEST_MAN)/$(RGVIMNAME).1 \
 			$(DEST_MAN)/$(RGVIEWNAME).1 \
@@ -1939,9 +2010,12 @@
 	-rm -f $(DEST_BIN)/xxd$(EXEEXT) $(DEST_MAN)/xxd.1
 	-rm -f $(DEST_BIN)/$(EXTARGET) $(DEST_BIN)/$(VIEWTARGET)
 	-rm -f $(DEST_BIN)/$(GVIMTARGET) $(DEST_BIN)/$(GVIEWTARGET)
+	-rm -f $(DEST_BIN)/$(KVIMTARGET) $(DEST_BIN)/$(KVIEWTARGET)
 	-rm -f $(DEST_BIN)/$(RVIMTARGET) $(DEST_BIN)/$(RVIEWTARGET)
 	-rm -f $(DEST_BIN)/$(RGVIMTARGET) $(DEST_BIN)/$(RGVIEWTARGET)
+	-rm -f $(DEST_BIN)/$(RKVIMTARGET) $(DEST_BIN)/$(RKVIEWTARGET)
 	-rm -f $(DEST_BIN)/$(VIMDIFFTARGET) $(DEST_BIN)/$(GVIMDIFFTARGET)
+	-rm -f $(DEST_BIN)/$(VIMDIFFTARGET) $(DEST_BIN)/$(KVIMDIFFTARGET)
 	-rm -f $(DEST_BIN)/$(EVIMTARGET) $(DEST_BIN)/$(EVIEWTARGET)
 	-rm -f $(DEST_MAN)/$(EXNAME).1 $(DEST_MAN)/$(VIEWNAME).1
 	-rm -f $(DEST_MAN)/$(GVIMNAME).1 $(DEST_MAN)/$(GVIEWNAME).1
@@ -1984,6 +2058,7 @@
 	-rm -f *.o objects/* core $(VIMTARGET).core $(VIMTARGET) xxd/*.o
 	-rm -f $(TOOLS) auto/osdef.h auto/pathdef.c auto/if_perl.c
 	-rm -f conftest* *~ auto/link.sed
+	-rm -f gui_kde_widget_moc.cc kvim_iface_skel.cc *.kidl
 	if test -d $(PODIR); then \
 		cd $(PODIR); $(MAKE) prefix=$(DESTDIR)$(prefix) clean; \
 	fi
@@ -2326,6 +2401,24 @@
 objects/wsdebug.o: wsdebug.c
 	$(CCC) -o $@ wsdebug.c
 
+objects/gui_kde.o: gui_kde.cc
+	$(CCC) -o $@ gui_kde.cc
+
+objects/gui_kde_x11.o: gui_kde_x11.cc
+	$(CCC) -o $@ gui_kde_x11.cc
+
+objects/gui_kde_widget.o: gui_kde_widget.cc
+	$(MOC) -o gui_kde_widget_moc.cc gui_kde_widget.h
+	$(KDE_DIR)/bin/dcopidl kvim_iface.h > kvim_iface.kidl || ( rm -f kvim_iface.kidl ; /bin/false )
+	$(KDE_DIR)/bin/dcopidl2cpp --c++-suffix cc --no-stub kvim_iface.kidl
+	$(CCC) -o $@ gui_kde_widget.cc
+
+objects/gui_kde_widget_moc.o: gui_kde_widget_moc.cc
+	$(CCC) -o $@ gui_kde_widget_moc.cc
+
+objects/kvim_iface_skel.o: kvim_iface_skel.cc
+	$(CCC) -o $@ kvim_iface_skel.cc
+
 objects/netbeans.o: netbeans.c
 	$(CCC) -o $@ netbeans.c
 
@@ -2637,6 +2730,24 @@
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h gui_beval.h \
  proto/gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
  arabic.h
+objects/gui_kde.o: gui_kde.cc gui_kde_widget.h kvim_iface.h vim.h \
+ auto/config.h feature.h os_unix.h auto/osdef.h ascii.h keymap.h \
+ term.h macros.h structs.h regexp.h gui.h option.h ex_cmds.h proto.h \
+ globals.h farsi.h
+objects/gui_kde_widget.o: gui_kde_widget.cc gui_kde_widget.h kvim_iface.h \
+ vim.h auto/config.h feature.h os_unix.h auto/osdef.h ascii.h keymap.h \
+ term.h macros.h structs.h regexp.h gui.h option.h ex_cmds.h proto.h \
+ globals.h farsi.h proto/../../pixmaps/alert.xpm proto/../../pixmaps/error.xpm \
+ proto/../../pixmaps/generic.xpm proto/../../pixmaps/info.xpm \
+ proto/../../pixmaps/quest.xpm
+objects/gui_kde_x11.o: gui_kde_x11.cc gui_kde_widget.h kvim_iface.h vim.h \
+ auto/config.h feature.h os_unix.h auto/osdef.h ascii.h keymap.h \
+ term.h macros.h structs.h regexp.h gui.h option.h ex_cmds.h proto.h \
+ globals.h farsi.h version.h ../runtime/vim32x32.xpm
+objects/gui_kde_widget_moc.o: gui_kde_widget_moc.cc gui_kde_widget.h \
+ kvim_iface.h vim.h auto/config.h feature.h os_unix.h auto/osdef.h \
+ ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h option.h \
+ ex_cmds.h proto.h globals.h
 objects/hangulin.o: hangulin.c vim.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h gui_beval.h proto/gui_beval.pro option.h ex_cmds.h proto.h \
diff --git a/src/auto/configure b/src/auto/configure
index b040a75..e9e5637 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -62,7 +62,9 @@
 ac_help="$ac_help
   --with-x                use the X Window System"
 ac_help="$ac_help
-  --enable-gui[=OPTS]     X11 GUI [default=auto] [OPTS=auto/no/gtk/gtk2/gnome/gnome2/motif/athena/neXtaw/beos/photon/carbon]"
+  --enable-gui[=OPTS]     X11 GUI [default=auto] [OPTS=auto/no/gtk/gtk2/gnome/gnome2/kde/motif/athena/neXtaw/beos/photon/carbon]"
+ac_help="$ac_help
+  --enable-kde-check      If auto-select GUI, check for KDE [default=no]"
 ac_help="$ac_help
   --enable-gtk-check      If auto-select GUI, check for GTK [default=yes]"
 ac_help="$ac_help
@@ -78,6 +80,24 @@
 ac_help="$ac_help
   --enable-carbon-check   If auto-select GUI, check for Carbon [default=yes]"
 ac_help="$ac_help
+  --with-qt-dir=DIR	Specify prefix of QT files"
+ac_help="$ac_help
+  --with-qt-includes=DIR	Specify location of Qt headers"
+ac_help="$ac_help
+  --with-qt-libs=DIR	Specify location of Qt libraries"
+ac_help="$ac_help
+  --enable-kde-toolbar   if KDE GUI is selected, enable a KDE-look toolbar [default=no]"
+ac_help="$ac_help
+  --disable-rpath      Disable rpath."
+ac_help="$ac_help
+  --with-kde-prefix=PFX	Prefix where KDE is installed (optional)"
+ac_help="$ac_help
+  --with-kde-includes=DIR	Specify location of KDE headers"
+ac_help="$ac_help
+  --with-kde-libs=DIR	Specify location of KDE libraries"
+ac_help="$ac_help
+  --disable-kdetest	Do not try to compile and run a test KDE program"
+ac_help="$ac_help
   --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)"
 ac_help="$ac_help
   --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)"
@@ -616,7 +636,7 @@
 EOF
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:620: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:640: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -646,7 +666,7 @@
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:650: checking for $ac_word" >&5
+echo "configure:670: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -676,7 +696,7 @@
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:680: checking for $ac_word" >&5
+echo "configure:700: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -727,7 +747,7 @@
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:731: checking for $ac_word" >&5
+echo "configure:751: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -759,7 +779,7 @@
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:763: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:783: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -770,12 +790,12 @@
 
 cat > conftest.$ac_ext << EOF
 
-#line 774 "configure"
+#line 794 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:799: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -801,12 +821,12 @@
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:805: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:825: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:810: checking whether we are using GNU C" >&5
+echo "configure:830: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -815,7 +835,7 @@
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:819: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:839: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -834,7 +854,7 @@
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:838: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:858: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -865,7 +885,7 @@
   fi
 fi
 	echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:869: checking how to run the C preprocessor" >&5
+echo "configure:889: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -880,13 +900,13 @@
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 884 "configure"
+#line 904 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:890: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -897,13 +917,13 @@
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 901 "configure"
+#line 921 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:907: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:927: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -914,13 +934,13 @@
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 918 "configure"
+#line 938 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:924: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:944: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -944,7 +964,7 @@
 fi
 echo "$ac_t""$CPP" 1>&6
 	cat > conftest.$ac_ext <<EOF
-#line 948 "configure"
+#line 968 "configure"
 #include "confdefs.h"
 
 EOF
@@ -954,7 +974,7 @@
 fi
 rm -f conftest*
  echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
-echo "configure:958: checking for POSIXized ISC" >&5
+echo "configure:978: checking for POSIXized ISC" >&5
 if test -d /etc/conf/kconfig.d &&
   grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
 then
@@ -978,7 +998,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:982: checking for $ac_word" >&5
+echo "configure:1002: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1010,7 +1030,7 @@
 # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1014: checking for $ac_word" >&5
+echo "configure:1034: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1039,12 +1059,12 @@
 
 
 echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:1043: checking for Cygwin environment" >&5
+echo "configure:1063: checking for Cygwin environment" >&5
 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1048 "configure"
+#line 1068 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -1055,7 +1075,7 @@
 return __CYGWIN__;
 ; return 0; }
 EOF
-if { (eval echo configure:1059: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1079: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_cygwin=yes
 else
@@ -1072,19 +1092,19 @@
 CYGWIN=
 test "$ac_cv_cygwin" = yes && CYGWIN=yes
 echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:1076: checking for mingw32 environment" >&5
+echo "configure:1096: checking for mingw32 environment" >&5
 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1081 "configure"
+#line 1101 "configure"
 #include "confdefs.h"
 
 int main() {
 return __MINGW32__;
 ; return 0; }
 EOF
-if { (eval echo configure:1088: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1108: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_mingw32=yes
 else
@@ -1103,7 +1123,7 @@
 
 
 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1107: checking for executable suffix" >&5
+echo "configure:1127: checking for executable suffix" >&5
 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1113,7 +1133,7 @@
   rm -f conftest*
   echo 'int main () { return 0; }' > conftest.$ac_ext
   ac_cv_exeext=
-  if { (eval echo configure:1117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+  if { (eval echo configure:1137: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
     for file in conftest.*; do
       case $file in
       *.c | *.o | *.obj) ;;
@@ -1160,14 +1180,14 @@
 
 if test -f ./toolcheck; then
   echo "checking for buggy tools" 1>&6
-echo "configure:1164: checking for buggy tools" >&5
+echo "configure:1184: checking for buggy tools" >&5
   sh ./toolcheck 1>&6
 fi
 
 OS_EXTRA_SRC=""; OS_EXTRA_OBJ=""
 
 echo $ac_n "checking for BeOS""... $ac_c" 1>&6
-echo "configure:1171: checking for BeOS" >&5
+echo "configure:1191: checking for BeOS" >&5
 case `uname` in
     BeOS)	OS_EXTRA_SRC=os_beos.c; OS_EXTRA_OBJ=objects/os_beos.o
 		BEOS=yes; echo "$ac_t""yes" 1>&6;;
@@ -1175,7 +1195,7 @@
 esac
 
 echo $ac_n "checking for QNX""... $ac_c" 1>&6
-echo "configure:1179: checking for QNX" >&5
+echo "configure:1199: checking for QNX" >&5
 case `uname` in
     QNX)	OS_EXTRA_SRC=os_qnx.c; OS_EXTRA_OBJ=objects/os_qnx.o
 		test -z "$with_x" && with_x=no
@@ -1185,12 +1205,12 @@
 
 DEFAULT_VIMNAME=vim
 echo $ac_n "checking for Darwin (Mac OS X)""... $ac_c" 1>&6
-echo "configure:1189: checking for Darwin (Mac OS X)" >&5
+echo "configure:1209: checking for Darwin (Mac OS X)" >&5
 if test "`(uname) 2>/dev/null`" = Darwin; then
   echo "$ac_t""yes" 1>&6
 
   echo $ac_n "checking --disable-darwin argument""... $ac_c" 1>&6
-echo "configure:1194: checking --disable-darwin argument" >&5
+echo "configure:1214: checking --disable-darwin argument" >&5
   # Check whether --enable-darwin or --disable-darwin was given.
 if test "${enable_darwin+set}" = set; then
   enableval="$enable_darwin"
@@ -1202,7 +1222,7 @@
   if test "$enable_darwin" = "yes"; then
     echo "$ac_t""no" 1>&6
     echo $ac_n "checking if Darwin files are there""... $ac_c" 1>&6
-echo "configure:1206: checking if Darwin files are there" >&5
+echo "configure:1226: checking if Darwin files are there" >&5
     if test -f os_macosx.c; then
       echo "$ac_t""yes" 1>&6
     else
@@ -1221,17 +1241,17 @@
 
             ac_safe=`echo "Carbon/Carbon.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Carbon/Carbon.h""... $ac_c" 1>&6
-echo "configure:1225: checking for Carbon/Carbon.h" >&5
+echo "configure:1245: checking for Carbon/Carbon.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1230 "configure"
+#line 1250 "configure"
 #include "confdefs.h"
 #include <Carbon/Carbon.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1235: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1255: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1288,7 +1308,7 @@
 fi
 
 echo $ac_n "checking --with-vim-name argument""... $ac_c" 1>&6
-echo "configure:1292: checking --with-vim-name argument" >&5
+echo "configure:1312: checking --with-vim-name argument" >&5
 # Check whether --with-vim-name or --without-vim-name was given.
 if test "${with_vim_name+set}" = set; then
   withval="$with_vim_name"
@@ -1299,7 +1319,7 @@
 
 
 echo $ac_n "checking --with-ex-name argument""... $ac_c" 1>&6
-echo "configure:1303: checking --with-ex-name argument" >&5
+echo "configure:1323: checking --with-ex-name argument" >&5
 # Check whether --with-ex-name or --without-ex-name was given.
 if test "${with_ex_name+set}" = set; then
   withval="$with_ex_name"
@@ -1310,7 +1330,7 @@
 
 
 echo $ac_n "checking --with-view-name argument""... $ac_c" 1>&6
-echo "configure:1314: checking --with-view-name argument" >&5
+echo "configure:1334: checking --with-view-name argument" >&5
 # Check whether --with-view-name or --without-view-name was given.
 if test "${with_view_name+set}" = set; then
   withval="$with_view_name"
@@ -1322,7 +1342,7 @@
 
 
 echo $ac_n "checking --with-global-runtime argument""... $ac_c" 1>&6
-echo "configure:1326: checking --with-global-runtime argument" >&5
+echo "configure:1346: checking --with-global-runtime argument" >&5
 # Check whether --with-global-runtime or --without-global-runtime was given.
 if test "${with_global_runtime+set}" = set; then
   withval="$with_global_runtime"
@@ -1336,7 +1356,7 @@
 
 
 echo $ac_n "checking --with-modified-by argument""... $ac_c" 1>&6
-echo "configure:1340: checking --with-modified-by argument" >&5
+echo "configure:1360: checking --with-modified-by argument" >&5
 # Check whether --with-modified-by or --without-modified-by was given.
 if test "${with_modified_by+set}" = set; then
   withval="$with_modified_by"
@@ -1350,9 +1370,9 @@
 
 
 echo $ac_n "checking if character set is EBCDIC""... $ac_c" 1>&6
-echo "configure:1354: checking if character set is EBCDIC" >&5
+echo "configure:1374: checking if character set is EBCDIC" >&5
 cat > conftest.$ac_ext <<EOF
-#line 1356 "configure"
+#line 1376 "configure"
 #include "confdefs.h"
  
 int main() {
@@ -1365,7 +1385,7 @@
 #endif 
 ; return 0; }
 EOF
-if { (eval echo configure:1369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
    # TryCompile action if true
 cf_cv_ebcdic=yes 
@@ -1393,7 +1413,7 @@
 
 if test "$cf_cv_ebcdic" = "yes"; then
 echo $ac_n "checking for OS/390 Unix""... $ac_c" 1>&6
-echo "configure:1397: checking for OS/390 Unix" >&5
+echo "configure:1417: checking for OS/390 Unix" >&5
 case `uname` in
     OS/390)	OS390Unix="yes";
 										if test "$CC" = "cc"; then
@@ -1430,7 +1450,7 @@
 
 
 echo $ac_n "checking --with-features argument""... $ac_c" 1>&6
-echo "configure:1434: checking --with-features argument" >&5
+echo "configure:1454: checking --with-features argument" >&5
 # Check whether --with-features or --without-features was given.
 if test "${with_features+set}" = set; then
   withval="$with_features"
@@ -1473,7 +1493,7 @@
 
 
 echo $ac_n "checking --with-compiledby argument""... $ac_c" 1>&6
-echo "configure:1477: checking --with-compiledby argument" >&5
+echo "configure:1497: checking --with-compiledby argument" >&5
 # Check whether --with-compiledby or --without-compiledby was given.
 if test "${with_compiledby+set}" = set; then
   withval="$with_compiledby"
@@ -1485,7 +1505,7 @@
 
 
 echo $ac_n "checking --disable-xsmp argument""... $ac_c" 1>&6
-echo "configure:1489: checking --disable-xsmp argument" >&5
+echo "configure:1509: checking --disable-xsmp argument" >&5
 # Check whether --enable-xsmp or --disable-xsmp was given.
 if test "${enable_xsmp+set}" = set; then
   enableval="$enable_xsmp"
@@ -1498,7 +1518,7 @@
 if test "$enable_xsmp" = "yes"; then
   echo "$ac_t""no" 1>&6
   echo $ac_n "checking --disable-xsmp-interact argument""... $ac_c" 1>&6
-echo "configure:1502: checking --disable-xsmp-interact argument" >&5
+echo "configure:1522: checking --disable-xsmp-interact argument" >&5
   # Check whether --enable-xsmp-interact or --disable-xsmp-interact was given.
 if test "${enable_xsmp_interact+set}" = set; then
   enableval="$enable_xsmp_interact"
@@ -1521,7 +1541,7 @@
 fi
 
 echo $ac_n "checking --enable-perlinterp argument""... $ac_c" 1>&6
-echo "configure:1525: checking --enable-perlinterp argument" >&5
+echo "configure:1545: checking --enable-perlinterp argument" >&5
 # Check whether --enable-perlinterp or --disable-perlinterp was given.
 if test "${enable_perlinterp+set}" = set; then
   enableval="$enable_perlinterp"
@@ -1536,7 +1556,7 @@
   # Extract the first word of "perl", so it can be a program name with args.
 set dummy perl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1540: checking for $ac_word" >&5
+echo "configure:1560: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_perl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1570,7 +1590,7 @@
 
   if test "X$vi_cv_path_perl" != "X"; then
     echo $ac_n "checking Perl version""... $ac_c" 1>&6
-echo "configure:1574: checking Perl version" >&5
+echo "configure:1594: checking Perl version" >&5
     if $vi_cv_path_perl -e 'require 5.003_01' >/dev/null 2>/dev/null; then
      eval `$vi_cv_path_perl -V:usethreads`
      if test "X$usethreads" = "XUNKNOWN" -o "X$usethreads" = "Xundef"; then
@@ -1606,7 +1626,7 @@
 		-e 'ccdlflags' | sed -e 's/-bE:perl.exp//'`
 
                   echo $ac_n "checking if compile and link flags for Perl are sane""... $ac_c" 1>&6
-echo "configure:1610: checking if compile and link flags for Perl are sane" >&5
+echo "configure:1630: checking if compile and link flags for Perl are sane" >&5
       cflags_save=$CFLAGS
       libs_save=$LIBS
       ldflags_save=$LDFLAGS
@@ -1614,14 +1634,14 @@
       LIBS="$LIBS $perllibs"
       LDFLAGS="$perlldflags $LDFLAGS"
       cat > conftest.$ac_ext <<EOF
-#line 1618 "configure"
+#line 1638 "configure"
 #include "confdefs.h"
 
 int main() {
  
 ; return 0; }
 EOF
-if { (eval echo configure:1625: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; perl_ok=yes
 else
@@ -1684,7 +1704,7 @@
 
 
 echo $ac_n "checking --enable-pythoninterp argument""... $ac_c" 1>&6
-echo "configure:1688: checking --enable-pythoninterp argument" >&5
+echo "configure:1708: checking --enable-pythoninterp argument" >&5
 # Check whether --enable-pythoninterp or --disable-pythoninterp was given.
 if test "${enable_pythoninterp+set}" = set; then
   enableval="$enable_pythoninterp"
@@ -1698,7 +1718,7 @@
     # Extract the first word of "python", so it can be a program name with args.
 set dummy python; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1702: checking for $ac_word" >&5
+echo "configure:1722: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_python'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1733,7 +1753,7 @@
   if test "X$vi_cv_path_python" != "X"; then
 
         echo $ac_n "checking Python version""... $ac_c" 1>&6
-echo "configure:1737: checking Python version" >&5
+echo "configure:1757: checking Python version" >&5
 if eval "test \"`echo '$''{'vi_cv_var_python_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1745,14 +1765,14 @@
 echo "$ac_t""$vi_cv_var_python_version" 1>&6
 
         echo $ac_n "checking Python is 1.4 or better""... $ac_c" 1>&6
-echo "configure:1749: checking Python is 1.4 or better" >&5
+echo "configure:1769: checking Python is 1.4 or better" >&5
     if ${vi_cv_path_python} -c \
 	"import sys; sys.exit(${vi_cv_var_python_version} < 1.4)"
     then
       echo "$ac_t""yep" 1>&6
 
             echo $ac_n "checking Python's install prefix""... $ac_c" 1>&6
-echo "configure:1756: checking Python's install prefix" >&5
+echo "configure:1776: checking Python's install prefix" >&5
 if eval "test \"`echo '$''{'vi_cv_path_python_pfx'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1764,7 +1784,7 @@
 echo "$ac_t""$vi_cv_path_python_pfx" 1>&6
 
             echo $ac_n "checking Python's execution prefix""... $ac_c" 1>&6
-echo "configure:1768: checking Python's execution prefix" >&5
+echo "configure:1788: checking Python's execution prefix" >&5
 if eval "test \"`echo '$''{'vi_cv_path_python_epfx'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1795,7 +1815,7 @@
 
 
       echo $ac_n "checking Python's configuration directory""... $ac_c" 1>&6
-echo "configure:1799: checking Python's configuration directory" >&5
+echo "configure:1819: checking Python's configuration directory" >&5
 if eval "test \"`echo '$''{'vi_cv_path_python_conf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1868,7 +1888,7 @@
 	PYTHON_GETPATH_CFLAGS="-DPYTHONPATH='\"${vi_cv_path_pythonpath}\"' -DPREFIX='\"${vi_cv_path_python_pfx}\"' -DEXEC_PREFIX='\"${vi_cv_path_python_epfx}\"'"
 
 								echo $ac_n "checking if -pthread should be used""... $ac_c" 1>&6
-echo "configure:1872: checking if -pthread should be used" >&5
+echo "configure:1892: checking if -pthread should be used" >&5
 	threadsafe_flag=
 	thread_lib=
 	if test "x$MACOSX" != "xyes"; then
@@ -1884,14 +1904,14 @@
 	  CFLAGS="$CFLAGS $threadsafe_flag"
 	  LIBS="$LIBS $thread_lib"
 	  cat > conftest.$ac_ext <<EOF
-#line 1888 "configure"
+#line 1908 "configure"
 #include "confdefs.h"
 
 int main() {
  
 ; return 0; }
 EOF
-if { (eval echo configure:1895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; PYTHON_CFLAGS="$PYTHON_CFLAGS $threadsafe_flag"
 else
@@ -1908,20 +1928,20 @@
 	fi
 
 			echo $ac_n "checking if compile and link flags for Python are sane""... $ac_c" 1>&6
-echo "configure:1912: checking if compile and link flags for Python are sane" >&5
+echo "configure:1932: checking if compile and link flags for Python are sane" >&5
 	cflags_save=$CFLAGS
 	libs_save=$LIBS
 	CFLAGS="$CFLAGS $PYTHON_CFLAGS"
 	LIBS="$LIBS $PYTHON_LIBS"
 	cat > conftest.$ac_ext <<EOF
-#line 1918 "configure"
+#line 1938 "configure"
 #include "confdefs.h"
 
 int main() {
  
 ; return 0; }
 EOF
-if { (eval echo configure:1925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1945: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; python_ok=yes
 else
@@ -1960,7 +1980,7 @@
 
 
 echo $ac_n "checking --enable-tclinterp argument""... $ac_c" 1>&6
-echo "configure:1964: checking --enable-tclinterp argument" >&5
+echo "configure:1984: checking --enable-tclinterp argument" >&5
 # Check whether --enable-tclinterp or --disable-tclinterp was given.
 if test "${enable_tclinterp+set}" = set; then
   enableval="$enable_tclinterp"
@@ -1974,7 +1994,7 @@
 if test "$enable_tclinterp" = "yes"; then
 
     echo $ac_n "checking --with-tclsh argument""... $ac_c" 1>&6
-echo "configure:1978: checking --with-tclsh argument" >&5
+echo "configure:1998: checking --with-tclsh argument" >&5
   # Check whether --with-tclsh or --without-tclsh was given.
 if test "${with_tclsh+set}" = set; then
   withval="$with_tclsh"
@@ -1986,7 +2006,7 @@
   # Extract the first word of "$tclsh_name", so it can be a program name with args.
 set dummy $tclsh_name; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1990: checking for $ac_word" >&5
+echo "configure:2010: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_tcl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2025,7 +2045,7 @@
     # Extract the first word of "$tclsh_name", so it can be a program name with args.
 set dummy $tclsh_name; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2029: checking for $ac_word" >&5
+echo "configure:2049: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_tcl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2063,7 +2083,7 @@
     # Extract the first word of "$tclsh_name", so it can be a program name with args.
 set dummy $tclsh_name; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2067: checking for $ac_word" >&5
+echo "configure:2087: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_tcl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2098,14 +2118,14 @@
   fi
   if test "X$vi_cv_path_tcl" != "X"; then
     echo $ac_n "checking Tcl version""... $ac_c" 1>&6
-echo "configure:2102: checking Tcl version" >&5
+echo "configure:2122: checking Tcl version" >&5
     if echo 'exit [expr [info tclversion] < 8.0]' | $vi_cv_path_tcl - ; then
       tclver=`echo 'puts [info tclversion]' | $vi_cv_path_tcl -`
       echo "$ac_t""$tclver - OK" 1>&6;
       tclloc=`echo 'set l [info library];set i [string last lib $l];incr i -2;puts [string range $l 0 $i]' | $vi_cv_path_tcl -`
 
       echo $ac_n "checking for location of Tcl include""... $ac_c" 1>&6
-echo "configure:2109: checking for location of Tcl include" >&5
+echo "configure:2129: checking for location of Tcl include" >&5
       if test "x$MACOSX" != "xyes"; then
 	tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include"
       else
@@ -2124,7 +2144,7 @@
       fi
       if test -z "$SKIP_TCL"; then
 	echo $ac_n "checking for location of tclConfig.sh script""... $ac_c" 1>&6
-echo "configure:2128: checking for location of tclConfig.sh script" >&5
+echo "configure:2148: checking for location of tclConfig.sh script" >&5
 	if test "x$MACOSX" != "xyes"; then
 	  tclcnf=`echo $tclinc | sed s/include/lib/g`
 	else
@@ -2142,7 +2162,7 @@
 	if test -z "$TCL_LIBS"; then
 	  echo "$ac_t""<not found>" 1>&6
 	  echo $ac_n "checking for Tcl library by myself""... $ac_c" 1>&6
-echo "configure:2146: checking for Tcl library by myself" >&5
+echo "configure:2166: checking for Tcl library by myself" >&5
 	  tcllib=`echo $tclinc | sed s/include/lib/g`
 	  for ext in .so .a ; do
 	    for ver in "" $tclver ; do
@@ -2188,7 +2208,7 @@
 
 
 echo $ac_n "checking --enable-rubyinterp argument""... $ac_c" 1>&6
-echo "configure:2192: checking --enable-rubyinterp argument" >&5
+echo "configure:2212: checking --enable-rubyinterp argument" >&5
 # Check whether --enable-rubyinterp or --disable-rubyinterp was given.
 if test "${enable_rubyinterp+set}" = set; then
   enableval="$enable_rubyinterp"
@@ -2203,7 +2223,7 @@
   # Extract the first word of "ruby", so it can be a program name with args.
 set dummy ruby; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2207: checking for $ac_word" >&5
+echo "configure:2227: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_ruby'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2237,11 +2257,11 @@
 
   if test "X$vi_cv_path_ruby" != "X"; then
     echo $ac_n "checking Ruby version""... $ac_c" 1>&6
-echo "configure:2241: checking Ruby version" >&5
+echo "configure:2261: checking Ruby version" >&5
     if $vi_cv_path_ruby -e 'VERSION >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
       echo "$ac_t""OK" 1>&6
       echo $ac_n "checking Ruby header files""... $ac_c" 1>&6
-echo "configure:2245: checking Ruby header files" >&5
+echo "configure:2265: checking Ruby header files" >&5
       rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
       if test "X$rubyhdrdir" != "X"; then
 	echo "$ac_t""$rubyhdrdir" 1>&6
@@ -2293,7 +2313,7 @@
 
 
 echo $ac_n "checking --enable-cscope argument""... $ac_c" 1>&6
-echo "configure:2297: checking --enable-cscope argument" >&5
+echo "configure:2317: checking --enable-cscope argument" >&5
 # Check whether --enable-cscope or --disable-cscope was given.
 if test "${enable_cscope+set}" = set; then
   enableval="$enable_cscope"
@@ -2311,7 +2331,7 @@
 fi
 
 echo $ac_n "checking --enable-workshop argument""... $ac_c" 1>&6
-echo "configure:2315: checking --enable-workshop argument" >&5
+echo "configure:2335: checking --enable-workshop argument" >&5
 # Check whether --enable-workshop or --disable-workshop was given.
 if test "${enable_workshop+set}" = set; then
   enableval="$enable_workshop"
@@ -2336,7 +2356,7 @@
 fi
 
 echo $ac_n "checking --disable-netbeans argument""... $ac_c" 1>&6
-echo "configure:2340: checking --disable-netbeans argument" >&5
+echo "configure:2360: checking --disable-netbeans argument" >&5
 # Check whether --enable-netbeans or --disable-netbeans was given.
 if test "${enable_netbeans+set}" = set; then
   enableval="$enable_netbeans"
@@ -2348,7 +2368,7 @@
 if test "$enable_netbeans" = "yes"; then
   echo "$ac_t""no" 1>&6
     echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
-echo "configure:2352: checking for socket in -lsocket" >&5
+echo "configure:2372: checking for socket in -lsocket" >&5
 ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2356,7 +2376,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2360 "configure"
+#line 2380 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2367,7 +2387,7 @@
 socket()
 ; return 0; }
 EOF
-if { (eval echo configure:2371: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2391: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2395,7 +2415,7 @@
 fi
 
   echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:2399: checking for gethostbyname in -lnsl" >&5
+echo "configure:2419: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2403,7 +2423,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2407 "configure"
+#line 2427 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2414,7 +2434,7 @@
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:2418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2438: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2442,9 +2462,9 @@
 fi
 
   echo $ac_n "checking whether compiling netbeans integration is possible""... $ac_c" 1>&6
-echo "configure:2446: checking whether compiling netbeans integration is possible" >&5
+echo "configure:2466: checking whether compiling netbeans integration is possible" >&5
   cat > conftest.$ac_ext <<EOF
-#line 2448 "configure"
+#line 2468 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -2474,7 +2494,7 @@
 	    
 ; return 0; }
 EOF
-if { (eval echo configure:2478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -2499,7 +2519,7 @@
 fi
 
 echo $ac_n "checking --enable-sniff argument""... $ac_c" 1>&6
-echo "configure:2503: checking --enable-sniff argument" >&5
+echo "configure:2523: checking --enable-sniff argument" >&5
 # Check whether --enable-sniff or --disable-sniff was given.
 if test "${enable_sniff+set}" = set; then
   enableval="$enable_sniff"
@@ -2521,7 +2541,7 @@
 fi
 
 echo $ac_n "checking --enable-multibyte argument""... $ac_c" 1>&6
-echo "configure:2525: checking --enable-multibyte argument" >&5
+echo "configure:2545: checking --enable-multibyte argument" >&5
 # Check whether --enable-multibyte or --disable-multibyte was given.
 if test "${enable_multibyte+set}" = set; then
   enableval="$enable_multibyte"
@@ -2539,7 +2559,7 @@
 fi
 
 echo $ac_n "checking --enable-hangulinput argument""... $ac_c" 1>&6
-echo "configure:2543: checking --enable-hangulinput argument" >&5
+echo "configure:2563: checking --enable-hangulinput argument" >&5
 # Check whether --enable-hangulinput or --disable-hangulinput was given.
 if test "${enable_hangulinput+set}" = set; then
   enableval="$enable_hangulinput"
@@ -2551,7 +2571,7 @@
 echo "$ac_t""$enable_hangulinput" 1>&6
 
 echo $ac_n "checking --enable-xim argument""... $ac_c" 1>&6
-echo "configure:2555: checking --enable-xim argument" >&5
+echo "configure:2575: checking --enable-xim argument" >&5
 # Check whether --enable-xim or --disable-xim was given.
 if test "${enable_xim+set}" = set; then
   enableval="$enable_xim"
@@ -2562,7 +2582,7 @@
 
 
 echo $ac_n "checking --enable-fontset argument""... $ac_c" 1>&6
-echo "configure:2566: checking --enable-fontset argument" >&5
+echo "configure:2586: checking --enable-fontset argument" >&5
 # Check whether --enable-fontset or --disable-fontset was given.
 if test "${enable_fontset+set}" = set; then
   enableval="$enable_fontset"
@@ -2582,7 +2602,7 @@
   # Extract the first word of "xmkmf", so it can be a program name with args.
 set dummy xmkmf; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2586: checking for $ac_word" >&5
+echo "configure:2606: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_xmkmfpath'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2620,7 +2640,7 @@
 # Uses ac_ vars as temps to allow command line to override cache and checks.
 # --without-x overrides everything else, but does not touch the cache.
 echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:2624: checking for X" >&5
+echo "configure:2644: checking for X" >&5
 
 # Check whether --with-x or --without-x was given.
 if test "${with_x+set}" = set; then
@@ -2682,12 +2702,12 @@
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 2686 "configure"
+#line 2706 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2691: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2711: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2756,14 +2776,14 @@
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2760 "configure"
+#line 2780 "configure"
 #include "confdefs.h"
 
 int main() {
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:2767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2787: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -2869,17 +2889,17 @@
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:2873: checking whether -R must be followed by a space" >&5
+echo "configure:2893: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 2876 "configure"
+#line 2896 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2903: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -2895,14 +2915,14 @@
       else
 	LIBS="$ac_xsave_LIBS -R $x_libraries"
 	cat > conftest.$ac_ext <<EOF
-#line 2899 "configure"
+#line 2919 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -2934,7 +2954,7 @@
     # libraries were built with DECnet support.  And karl@cs.umb.edu says
     # the Alpha needs dnet_stub (dnet does not exist).
     echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:2938: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:2958: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2942,7 +2962,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2946 "configure"
+#line 2966 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2953,7 +2973,7 @@
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:2957: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2975,7 +2995,7 @@
 
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:2979: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:2999: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2983,7 +3003,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2987 "configure"
+#line 3007 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2994,7 +3014,7 @@
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:2998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3023,12 +3043,12 @@
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:3027: checking for gethostbyname" >&5
+echo "configure:3047: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3032 "configure"
+#line 3052 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -3051,7 +3071,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:3055: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3075: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -3072,7 +3092,7 @@
 
     if test $ac_cv_func_gethostbyname = no; then
       echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:3076: checking for gethostbyname in -lnsl" >&5
+echo "configure:3096: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3080,7 +3100,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3084 "configure"
+#line 3104 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3091,7 +3111,7 @@
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:3095: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3115: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3121,12 +3141,12 @@
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:3125: checking for connect" >&5
+echo "configure:3145: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3130 "configure"
+#line 3150 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -3149,7 +3169,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:3153: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3173: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -3170,7 +3190,7 @@
 
     if test $ac_cv_func_connect = no; then
       echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:3174: checking for connect in -lsocket" >&5
+echo "configure:3194: checking for connect in -lsocket" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3178,7 +3198,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3182 "configure"
+#line 3202 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3189,7 +3209,7 @@
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:3193: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3213,12 +3233,12 @@
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:3217: checking for remove" >&5
+echo "configure:3237: checking for remove" >&5
 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3222 "configure"
+#line 3242 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -3241,7 +3261,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:3245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -3262,7 +3282,7 @@
 
     if test $ac_cv_func_remove = no; then
       echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:3266: checking for remove in -lposix" >&5
+echo "configure:3286: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3270,7 +3290,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3274 "configure"
+#line 3294 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3281,7 +3301,7 @@
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:3285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3305: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3305,12 +3325,12 @@
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:3309: checking for shmat" >&5
+echo "configure:3329: checking for shmat" >&5
 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3314 "configure"
+#line 3334 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -3333,7 +3353,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:3337: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -3354,7 +3374,7 @@
 
     if test $ac_cv_func_shmat = no; then
       echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:3358: checking for shmat in -lipc" >&5
+echo "configure:3378: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3362,7 +3382,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lipc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3366 "configure"
+#line 3386 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3373,7 +3393,7 @@
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:3377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3397: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3406,7 +3426,7 @@
   # libraries we check for below, so use a different variable.
   #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
   echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:3410: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:3430: checking for IceConnectionNumber in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3414,7 +3434,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lICE $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3418 "configure"
+#line 3438 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3425,7 +3445,7 @@
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:3429: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3449: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3479,18 +3499,18 @@
 
 
       echo $ac_n "checking if X11 header files can be found""... $ac_c" 1>&6
-echo "configure:3483: checking if X11 header files can be found" >&5
+echo "configure:3503: checking if X11 header files can be found" >&5
   cflags_save=$CFLAGS
   CFLAGS="$CFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 3487 "configure"
+#line 3507 "configure"
 #include "confdefs.h"
 #include <X11/Xlib.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3494: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3514: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -3516,7 +3536,7 @@
     LDFLAGS="-L$x_libraries $LDFLAGS"
 
             echo $ac_n "checking for _XdmcpAuthDoIt in -lXdmcp""... $ac_c" 1>&6
-echo "configure:3520: checking for _XdmcpAuthDoIt in -lXdmcp" >&5
+echo "configure:3540: checking for _XdmcpAuthDoIt in -lXdmcp" >&5
 ac_lib_var=`echo Xdmcp'_'_XdmcpAuthDoIt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3524,7 +3544,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lXdmcp -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lXdmcp $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3528 "configure"
+#line 3548 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3535,7 +3555,7 @@
 _XdmcpAuthDoIt()
 ; return 0; }
 EOF
-if { (eval echo configure:3539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3557,7 +3577,7 @@
 
 
                     echo $ac_n "checking for IceOpenConnection in -lICE""... $ac_c" 1>&6
-echo "configure:3561: checking for IceOpenConnection in -lICE" >&5
+echo "configure:3581: checking for IceOpenConnection in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceOpenConnection | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3565,7 +3585,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lICE $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3569 "configure"
+#line 3589 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3576,7 +3596,7 @@
 IceOpenConnection()
 ; return 0; }
 EOF
-if { (eval echo configure:3580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3599,7 +3619,7 @@
 
         LDFLAGS="$X_LIBS $ac_save_LDFLAGS"
     echo $ac_n "checking for XpmCreatePixmapFromData in -lXpm""... $ac_c" 1>&6
-echo "configure:3603: checking for XpmCreatePixmapFromData in -lXpm" >&5
+echo "configure:3623: checking for XpmCreatePixmapFromData in -lXpm" >&5
 ac_lib_var=`echo Xpm'_'XpmCreatePixmapFromData | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3607,7 +3627,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lXpm -lXt $X_PRE_LIBS -lXpm -lX11 $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3611 "configure"
+#line 3631 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3618,7 +3638,7 @@
 XpmCreatePixmapFromData()
 ; return 0; }
 EOF
-if { (eval echo configure:3622: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3640,18 +3660,18 @@
 
 
         echo $ac_n "checking if X11 header files implicitly declare return values""... $ac_c" 1>&6
-echo "configure:3644: checking if X11 header files implicitly declare return values" >&5
+echo "configure:3664: checking if X11 header files implicitly declare return values" >&5
     cflags_save=$CFLAGS
     CFLAGS="$CFLAGS $X_CFLAGS -Werror"
     cat > conftest.$ac_ext <<EOF
-#line 3648 "configure"
+#line 3668 "configure"
 #include "confdefs.h"
 #include <X11/Xlib.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3655: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3675: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""no" 1>&6
 else
@@ -3660,14 +3680,14 @@
   rm -rf conftest*
   CFLAGS="$CFLAGS -Wno-implicit-int"
 	cat > conftest.$ac_ext <<EOF
-#line 3664 "configure"
+#line 3684 "configure"
 #include "confdefs.h"
 #include <X11/Xlib.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3671: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3691: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cflags_save="$cflags_save -Wno-implicit-int"
 else
@@ -3691,7 +3711,7 @@
 test "x$with_x" = xno -a "x$BEOS" != "xyes" -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no
 
 echo $ac_n "checking --enable-gui argument""... $ac_c" 1>&6
-echo "configure:3695: checking --enable-gui argument" >&5
+echo "configure:3715: checking --enable-gui argument" >&5
 # Check whether --enable-gui or --disable-gui was given.
 if test "${enable_gui+set}" = set; then
   enableval="$enable_gui"
@@ -3753,7 +3773,6 @@
 
 else
 
-
   case "$enable_gui_canon" in
     no|none)	echo "$ac_t""no GUI support" 1>&6 ;;
     yes|""|auto)	echo "$ac_t""yes/auto - automatic GUI support" 1>&6
@@ -3764,6 +3783,8 @@
 		SKIP_ATHENA=
 		SKIP_NEXTAW=
 		SKIP_CARBON=;;
+    kde|Kde|KDE)	echo "$ac_t""KDE 2.x or 3.x GUI support" 1>&6
+    		SKIP_KDE=;;
     gtk)	echo "$ac_t""GTK+ 1.x GUI support" 1>&6
 		SKIP_GTK=;;
     gtk2)	echo "$ac_t""GTK+ 2.x GUI support" 1>&6
@@ -3787,9 +3808,26 @@
 
 fi
 
+if test "x$SKIP_KDE" != "xYES" -a "$enable_gui_canon" != "kde"; then
+    echo $ac_n "checking whether or not to look for KDE""... $ac_c" 1>&6
+echo "configure:3814: checking whether or not to look for KDE" >&5
+    # Check whether --enable-kde-check or --disable-kde-check was given.
+if test "${enable_kde_check+set}" = set; then
+  enableval="$enable_kde_check"
+  :
+else
+  enable_kde_check="no"
+fi
+
+    echo "$ac_t""$enable_kde_check" 1>&6;
+    if test "x$enable_kde_check" = "xno"; then
+       SKIP_KDE=YES
+    fi
+fi
+
 if test "x$SKIP_GTK" != "xYES" -a "$enable_gui_canon" != "gtk" -a "$enable_gui_canon" != "gtk2"; then
   echo $ac_n "checking whether or not to look for GTK""... $ac_c" 1>&6
-echo "configure:3793: checking whether or not to look for GTK" >&5
+echo "configure:3831: checking whether or not to look for GTK" >&5
   # Check whether --enable-gtk-check or --disable-gtk-check was given.
 if test "${enable_gtk_check+set}" = set; then
   enableval="$enable_gtk_check"
@@ -3808,7 +3846,7 @@
 if test "x$SKIP_GTK2" != "xYES" -a "$enable_gui_canon" != "gtk2" \
 				-a "$enable_gui_canon" != "gnome2"; then
   echo $ac_n "checking whether or not to look for GTK+ 2""... $ac_c" 1>&6
-echo "configure:3812: checking whether or not to look for GTK+ 2" >&5
+echo "configure:3850: checking whether or not to look for GTK+ 2" >&5
   # Check whether --enable-gtk2-check or --disable-gtk2-check was given.
 if test "${enable_gtk2_check+set}" = set; then
   enableval="$enable_gtk2_check"
@@ -3826,7 +3864,7 @@
 if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome" \
 				 -a "$enable_gui_canon" != "gnome2"; then
   echo $ac_n "checking whether or not to look for GNOME""... $ac_c" 1>&6
-echo "configure:3830: checking whether or not to look for GNOME" >&5
+echo "configure:3868: checking whether or not to look for GNOME" >&5
   # Check whether --enable-gnome-check or --disable-gnome-check was given.
 if test "${enable_gnome_check+set}" = set; then
   enableval="$enable_gnome_check"
@@ -3843,7 +3881,7 @@
 
 if test "x$SKIP_MOTIF" != "xYES" -a "$enable_gui_canon" != "motif"; then
   echo $ac_n "checking whether or not to look for Motif""... $ac_c" 1>&6
-echo "configure:3847: checking whether or not to look for Motif" >&5
+echo "configure:3885: checking whether or not to look for Motif" >&5
   # Check whether --enable-motif-check or --disable-motif-check was given.
 if test "${enable_motif_check+set}" = set; then
   enableval="$enable_motif_check"
@@ -3860,7 +3898,7 @@
 
 if test "x$SKIP_ATHENA" != "xYES" -a "$enable_gui_canon" != "athena"; then
   echo $ac_n "checking whether or not to look for Athena""... $ac_c" 1>&6
-echo "configure:3864: checking whether or not to look for Athena" >&5
+echo "configure:3902: checking whether or not to look for Athena" >&5
   # Check whether --enable-athena-check or --disable-athena-check was given.
 if test "${enable_athena_check+set}" = set; then
   enableval="$enable_athena_check"
@@ -3877,7 +3915,7 @@
 
 if test "x$SKIP_NEXTAW" != "xYES" -a "$enable_gui_canon" != "nextaw"; then
   echo $ac_n "checking whether or not to look for neXtaw""... $ac_c" 1>&6
-echo "configure:3881: checking whether or not to look for neXtaw" >&5
+echo "configure:3919: checking whether or not to look for neXtaw" >&5
   # Check whether --enable-nextaw-check or --disable-nextaw-check was given.
 if test "${enable_nextaw_check+set}" = set; then
   enableval="$enable_nextaw_check"
@@ -3894,7 +3932,7 @@
 
 if test "x$SKIP_CARBON" != "xYES" -a "$enable_gui_canon" != "carbon"; then
   echo $ac_n "checking whether or not to look for Carbon""... $ac_c" 1>&6
-echo "configure:3898: checking whether or not to look for Carbon" >&5
+echo "configure:3936: checking whether or not to look for Carbon" >&5
   # Check whether --enable-carbon-check or --disable-carbon-check was given.
 if test "${enable_carbon_check+set}" = set; then
   enableval="$enable_carbon_check"
@@ -3909,9 +3947,359 @@
   fi
 fi
 
+
+if test -z "$SKIP_KDE"; then
+# Check whether --with-qt-dir or --without-qt-dir was given.
+if test "${with_qt_dir+set}" = set; then
+  withval="$with_qt_dir"
+  
+						 ROOTQT="$withval"
+						 MOC="$withval"/bin/moc
+						 QT_INCLUDES="$withval"/include
+						 QT_LIBS="$withval"/lib
+						 
+fi
+
+
+if test "x$ROOTQT" = "x"; then
+	if test -z "$QTDIR"; then
+	    	    	    # Extract the first word of "moc", so it can be a program name with args.
+set dummy moc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3970: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MOC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$MOC" in
+  /*)
+  ac_cv_path_MOC="$MOC" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_MOC="$MOC" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_MOC="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_MOC" && ac_cv_path_MOC="no"
+  ;;
+esac
+fi
+MOC="$ac_cv_path_MOC"
+if test -n "$MOC"; then
+  echo "$ac_t""$MOC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+	    if text"x$MOC" = "x"; then
+		{ echo "configure: error: could not find Qt directory" 1>&2; exit 1; }
+	    else
+	      ROOTQT=`echo $MOC | sed 's+/bin/moc++'`
+	    fi
+	else
+		ROOTQT="$QTDIR"
+	fi
+fi
+MOC="$ROOTQT"/bin/moc
+QT_INCLUDES="$ROOTQT"/include
+QT_LIBS="$ROOTQT"/lib
+
+# Check whether --with-qt-includes or --without-qt-includes was given.
+if test "${with_qt_includes+set}" = set; then
+  withval="$with_qt_includes"
+  QT_INCLUDES="$withval"
+						
+fi
+
+
+# Check whether --with-qt-libraries or --without-qt-libraries was given.
+if test "${with_qt_libraries+set}" = set; then
+  withval="$with_qt_libraries"
+  QT_LIBS="$withval"
+						
+fi
+
+
+if test "x$QT_LIBS" = "x" ; then
+	QT_LIBS="$ROOTQT"/lib
+fi
+if test "x$QT_INCLUDES" = "x" ; then
+	QT_INCLUDES="$ROOTQT"/include
+fi
+
+echo $ac_n "checking whether or not to use a KDE Toolbar in KVim""... $ac_c" 1>&6
+echo "configure:4040: checking whether or not to use a KDE Toolbar in KVim" >&5
+# Check whether --enable-kde-toolbar or --disable-kde-toolbar was given.
+if test "${enable_kde_toolbar+set}" = set; then
+  enableval="$enable_kde_toolbar"
+  :
+else
+  enable_kde_toolbar="no"
+fi
+
+if test "x$enable_kde_toolbar" != "xno"; then
+  cat >> confdefs.h <<\EOF
+#define FEAT_KDETOOLBAR 1
+EOF
+
+fi
+echo "$ac_t""$enable_kde_toolbar" 1>&6;
+fi
+
+
+if test -z "$SKIP_KDE"; then
+
+
+echo $ac_n "checking --disable-rpath argument""... $ac_c" 1>&6
+echo "configure:4063: checking --disable-rpath argument" >&5
+# Check whether --enable-rpath or --disable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+  enableval="$enable_rpath"
+  :
+else
+  enable_rpath="yes"
+fi
+
+if test "$enable_rpath" = "yes"; then
+	echo "$ac_t""no" 1>&6
+else
+	echo "$ac_t""yes" 1>&6
+fi
+
+echo $ac_n "checking --with-kde-prefix argument""... $ac_c" 1>&6
+echo "configure:4079: checking --with-kde-prefix argument" >&5
+# Check whether --with-kde-prefix or --without-kde-prefix was given.
+if test "${with_kde_prefix+set}" = set; then
+  withval="$with_kde_prefix"
+  kde_config_prefix="$withval";
+echo "$ac_t""$kde_config_prefix" 1>&6
+else
+  kde_config_prefix="";echo "$ac_t""no" 1>&6
+fi
+
+
+# Check whether --with-kde-includes or --without-kde-includes was given.
+if test "${with_kde_includes+set}" = set; then
+  withval="$with_kde_includes"
+  KDE_INCLUDES="$withval"
+						
+fi
+
+
+# Check whether --with-kde-libraries or --without-kde-libraries was given.
+if test "${with_kde_libraries+set}" = set; then
+  withval="$with_kde_libraries"
+  KDE_LIBS="$withval"
+						
+fi
+
+
+echo $ac_n "checking --disable-kdetest argument""... $ac_c" 1>&6
+echo "configure:4107: checking --disable-kdetest argument" >&5
+# Check whether --enable-kdetest or --disable-kdetest was given.
+if test "${enable_kdetest+set}" = set; then
+  enableval="$enable_kdetest"
+  enable_kdetest=yes
+fi
+
+
+if test "x$enable_kdetest" = "xyes" ; then
+	echo "$ac_t""kde test enabled" 1>&6
+else
+	echo "$ac_t""kde test disabled" 1>&6
+fi
+
+if test "x$kde_config_prefix" != "x" ; then
+	kde_config_args=""
+	KDE_CONFIG=$kde_config_prefix/bin/kde-config
+fi
+
+if test "X$KDE_CONFIG" = "X"; then
+	# Extract the first word of "kde-config", so it can be a program name with args.
+set dummy kde-config; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:4130: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_KDE_CONFIG'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$KDE_CONFIG" in
+  /*)
+  ac_cv_path_KDE_CONFIG="$KDE_CONFIG" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_KDE_CONFIG="$KDE_CONFIG" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_KDE_CONFIG="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_KDE_CONFIG" && ac_cv_path_KDE_CONFIG="no"
+  ;;
+esac
+fi
+KDE_CONFIG="$ac_cv_path_KDE_CONFIG"
+if test -n "$KDE_CONFIG"; then
+  echo "$ac_t""$KDE_CONFIG" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+	echo "$ac_t""Using KDE configuration program $KDE_CONFIG" 1>&6
+fi
+
+if test "X$KDE_CONFIG" != "X" ; then
+	
+	if test "X$KDE_CONFIG" != "X"; then
+	  min_kde_version=2.0.0
+	  echo $ac_n "checking for KDE version >= $min_kde_version""... $ac_c" 1>&6
+echo "configure:4172: checking for KDE version >= $min_kde_version" >&5
+	  no_kde=""
+	  if test "$KDE_CONFIG" = "no" ; then
+		no_kde=yes
+	  else
+		KDE_PREFIX=`$KDE_CONFIG $kde_config_args --prefix`
+		if test "x$KDE_LIBS" = "x"; then
+		  KDE_LIBS="$KDE_PREFIX/lib"
+		fi
+		if test "x$KDE_INCLUDES" = "x"; then
+			KDE_INCLUDES="$KDE_PREFIX/include"
+		fi
+		kde_major_version=`$KDE_CONFIG --version | grep KDE | \
+sed 's/KDE:\ //' | sed 's/\([0-9]*\).\([0-9]*.*\)/\1/'`
+		kde_minor_version=`$KDE_CONFIG --version | grep KDE | \
+sed 's/KDE:\ //' | sed 's/\([0-9]*\).\([0-9]*.*\)/\2/'`
+	
+		qt_major_version=`$KDE_CONFIG --version | grep Qt | sed -e \
+'s/Qt:\ //' | sed 's/\([0-9]*\).\([0-9]*.*\)/\1/'`
+		qt_minor_version=`$KDE_CONFIG --version | grep Qt | sed -e \
+'s/Qt:\ //' | sed 's/\([0-9]*\).\([0-9]*.*\)/\2/'`
+	
+								if test "x$enable-kdetest" = "xyes" ; then
+			ac_save_LIBS="$LIBS"
+			LIBS="$LIBS $KDE_LIBS"
+
+						if test "$cross_compiling" = yes; then
+  echo $ac_n "cross compiling KDE ? ? how can i remove that ? :)"
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4202 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+int
+main()
+{ return 0; }
+			
+EOF
+if { (eval echo configure:4211: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  no_kde=yes
+fi
+rm -fr conftest*
+fi
+
+			LIBS="$ac_save_LIBS"
+		fi
+	fi
+	if test "x$no_kde" = x ; then
+	  echo "$ac_t""found KDE $kde_major_version.$kde_minor_version" 1>&6
+	  GUI_LIB_LOC="-L$KDE_LIBS -lkdeui -lkdecore -lDCOP"
+							 GUI_INC_LOC="-I$KDE_INCLUDES"
+							 KDEDIR="$KDE_PREFIX"
+	else
+	  echo "$ac_t""no" 1>&6
+	  KDE_LIBS=""
+	  :
+	fi
+else
+  echo "$ac_t""no" 1>&6
+  KDE_LIBS=""
+  :
+fi
+
+
+
+
+	if test "x$KDE_PREFIX" != "x"; then
+		echo $ac_n "checking for QT version $qt_major_version.x""... $ac_c" 1>&6
+echo "configure:4247: checking for QT version $qt_major_version.x" >&5
+		if test "x$ROOTQT" != "x" ; then
+			GUI_INC_LOC="-I$QT_INCLUDES $GUI_INC_LOC"
+			if test $qt_major_version -lt 2; then
+				{ echo "configure: error: Your QT version is prior to 2.0; KDE 2.x and 3.x require at least QT 2" 1>&2; exit 1; }
+			fi
+						if test "`(uname) 2>/dev/null`" = "FreeBSD"; then
+				CFLAGS="$CFLAGS -D_THREAD_SAFE"
+				CXXFLAGS="$CXXFLAGS -D_THREAD_SAFE"
+				GUI_LIB_LOC="$GUI_LIB_LOC -pthread"
+				LIBS="$LIBS -pthread"
+			fi
+
+						if test "x$enable_rpath" = "xyes"; then
+				if test $qt_major_version = 2; then
+					GUI_LIB_LOC="-L$KDE_LIBS -lkfile -L$QT_LIBS -lqt $GUI_LIB_LOC \
+-Wl,--rpath -Wl,$KDE_LIBS -Wl,--rpath -Wl,$QT_LIBS"
+				else
+					GUI_LIB_LOC="-L$KDE_LIBS -lkio -L$QT_LIBS -lqt-mt $GUI_LIB_LOC \
+-Wl,--rpath -Wl,$KDE_LIBS -Wl,--rpath -Wl,$QT_LIBS"
+				fi
+			else
+				if test $qt_major_version = 2; then
+					GUI_LIB_LOC="-L$KDE_LIBS -lkfile -L$QT_LIBS -lqt $GUI_LIB_LOC"
+				else
+					GUI_LIB_LOC="-L$KDE_LIBS -lkio -L$QT_LIBS -lqt-mt $GUI_LIB_LOC"
+				fi
+			fi
+
+						GUI_INC_LOC="`echo $GUI_INC_LOC\ | sed 's%-I/usr/include %%'`"
+
+			echo "$ac_t""found $qt_major_version.$qt_minor_version in $ROOTQT" 1>&6
+			SKIP_GTK=YES
+			SKIP_ATHENA=YES
+			SKIP_MOTIF=YES
+			GUITYPE=KDE
+			
+			
+			
+			
+			
+			cat >> confdefs.h <<\EOF
+#define FEAT_GUI_KDE 1
+EOF
+
+		else
+			{ echo "configure: error: Detected QT version mismatched" 1>&2; exit 1; }
+		fi
+	else
+		{ echo "configure: error: Could not find KDE installation prefix" 1>&2; exit 1; }
+	fi
+fi
+fi
+
 if test "x$MACOSX" = "xyes" -a -z "$SKIP_CARBON" -a "x$CARBON" = "xyes"; then
   echo $ac_n "checking for Carbon GUI""... $ac_c" 1>&6
-echo "configure:3915: checking for Carbon GUI" >&5
+echo "configure:4303: checking for Carbon GUI" >&5
     echo "$ac_t""yes" 1>&6;
   GUITYPE=CARBONGUI
     SKIP_GTK=YES;
@@ -3933,11 +4321,10 @@
 
 
 
-
 if test -z "$SKIP_GTK"; then
 
   echo $ac_n "checking --with-gtk-prefix argument""... $ac_c" 1>&6
-echo "configure:3941: checking --with-gtk-prefix argument" >&5
+echo "configure:4328: checking --with-gtk-prefix argument" >&5
   # Check whether --with-gtk-prefix or --without-gtk-prefix was given.
 if test "${with_gtk_prefix+set}" = set; then
   withval="$with_gtk_prefix"
@@ -3948,7 +4335,7 @@
 
 
   echo $ac_n "checking --with-gtk-exec-prefix argument""... $ac_c" 1>&6
-echo "configure:3952: checking --with-gtk-exec-prefix argument" >&5
+echo "configure:4339: checking --with-gtk-exec-prefix argument" >&5
   # Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given.
 if test "${with_gtk_exec_prefix+set}" = set; then
   withval="$with_gtk_exec_prefix"
@@ -3959,7 +4346,7 @@
 
 
   echo $ac_n "checking --disable-gtktest argument""... $ac_c" 1>&6
-echo "configure:3963: checking --disable-gtktest argument" >&5
+echo "configure:4350: checking --disable-gtktest argument" >&5
   # Check whether --enable-gtktest or --disable-gtktest was given.
 if test "${enable_gtktest+set}" = set; then
   enableval="$enable_gtktest"
@@ -3986,7 +4373,7 @@
     # Extract the first word of "gtk-config", so it can be a program name with args.
 set dummy gtk-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3990: checking for $ac_word" >&5
+echo "configure:4377: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4023,7 +4410,7 @@
             # Extract the first word of "gtk12-config", so it can be a program name with args.
 set dummy gtk12-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4027: checking for $ac_word" >&5
+echo "configure:4414: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GTK12_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4065,7 +4452,7 @@
     # Extract the first word of "pkg-config", so it can be a program name with args.
 set dummy pkg-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4069: checking for $ac_word" >&5
+echo "configure:4456: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4107,7 +4494,7 @@
   {
     min_gtk_version=2.2.0
     echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
-echo "configure:4111: checking for GTK - version >= $min_gtk_version" >&5
+echo "configure:4498: checking for GTK - version >= $min_gtk_version" >&5
     no_gtk=""
     if (test "X$SKIP_GTK2" != "XYES" -a "X$PKG_CONFIG" != "Xno") \
 	  && $PKG_CONFIG --exists gtk+-2.0; then
@@ -4148,7 +4535,7 @@
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
   cat > conftest.$ac_ext <<EOF
-#line 4152 "configure"
+#line 4539 "configure"
 #include "confdefs.h"
 
 #include <gtk/gtk.h>
@@ -4180,7 +4567,7 @@
 }
 
 EOF
-if { (eval echo configure:4184: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -4238,7 +4625,7 @@
   {
     min_gtk_version=1.1.16
     echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
-echo "configure:4242: checking for GTK - version >= $min_gtk_version" >&5
+echo "configure:4629: checking for GTK - version >= $min_gtk_version" >&5
     no_gtk=""
     if (test "X$SKIP_GTK2" != "XYES" -a "X$PKG_CONFIG" != "Xno") \
 	  && $PKG_CONFIG --exists gtk+-2.0; then
@@ -4279,7 +4666,7 @@
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
   cat > conftest.$ac_ext <<EOF
-#line 4283 "configure"
+#line 4670 "configure"
 #include "confdefs.h"
 
 #include <gtk/gtk.h>
@@ -4311,7 +4698,7 @@
 }
 
 EOF
-if { (eval echo configure:4315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4702: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -4429,7 +4816,7 @@
   if test "x$want_gnome" = xyes -a "0$gtk_major_version" -ge 2; then
   {
     echo $ac_n "checking for libgnomeui-2.0""... $ac_c" 1>&6
-echo "configure:4433: checking for libgnomeui-2.0" >&5
+echo "configure:4820: checking for libgnomeui-2.0" >&5
     if $PKG_CONFIG --exists libgnomeui-2.0; then
       echo "$ac_t""yes" 1>&6
       GNOME_LIBS=`$PKG_CONFIG --libs-only-l libgnomeui-2.0`
@@ -4448,7 +4835,7 @@
     # Extract the first word of "gnome-config", so it can be a program name with args.
 set dummy gnome-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4452: checking for $ac_word" >&5
+echo "configure:4839: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GNOME_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4485,7 +4872,7 @@
       no_gnome_config="yes"
     else
       echo $ac_n "checking if $GNOME_CONFIG works""... $ac_c" 1>&6
-echo "configure:4489: checking if $GNOME_CONFIG works" >&5
+echo "configure:4876: checking if $GNOME_CONFIG works" >&5
       if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then
 	echo "$ac_t""yes" 1>&6
 	GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome gnomeui`"
@@ -4510,7 +4897,7 @@
 
     if test "$no_gnome_config" = "yes"; then
       echo $ac_n "checking for gnomeConf.sh file in $gnome_prefix""... $ac_c" 1>&6
-echo "configure:4514: checking for gnomeConf.sh file in $gnome_prefix" >&5
+echo "configure:4901: checking for gnomeConf.sh file in $gnome_prefix" >&5
       if test -f $gnome_prefix/gnomeConf.sh; then
 	echo "$ac_t""found" 1>&6
 	echo "loading gnome configuration from" \
@@ -4548,7 +4935,7 @@
     GUI_INC_LOC="`echo $GUI_INC_LOC|sed 's%-I%%g'`"
 
   echo $ac_n "checking for location of Motif GUI includes""... $ac_c" 1>&6
-echo "configure:4552: checking for location of Motif GUI includes" >&5
+echo "configure:4939: checking for location of Motif GUI includes" >&5
   gui_includes="`echo $x_includes|sed 's%/^/^/*$%%'` `echo "$gui_XXX" | sed s/XXX/include/g` $GUI_INC_LOC"
   GUI_INC_LOC=
   for try in $gui_includes; do
@@ -4572,7 +4959,7 @@
 
 if test -z "$SKIP_MOTIF"; then
   echo $ac_n "checking --with-motif-lib argument""... $ac_c" 1>&6
-echo "configure:4576: checking --with-motif-lib argument" >&5
+echo "configure:4963: checking --with-motif-lib argument" >&5
   # Check whether --with-motif-lib or --without-motif-lib was given.
 if test "${with_motif_lib+set}" = set; then
   withval="$with_motif_lib"
@@ -4589,7 +4976,7 @@
         GUI_LIB_LOC="`echo $GUI_LIB_LOC|sed 's%-L%%g'`"
 
     echo $ac_n "checking for location of Motif GUI libs""... $ac_c" 1>&6
-echo "configure:4593: checking for location of Motif GUI libs" >&5
+echo "configure:4980: checking for location of Motif GUI libs" >&5
     gui_libs="`echo $x_libraries|sed 's%/^/^/*$%%'` `echo "$gui_XXX" | sed s/XXX/lib/g` `echo "$GUI_INC_LOC" | sed s/include/lib/` $GUI_LIB_LOC"
     GUI_LIB_LOC=
     for try in $gui_libs; do
@@ -4632,11 +5019,11 @@
 
 if test -z "$SKIP_ATHENA"; then
   echo $ac_n "checking if Athena header files can be found""... $ac_c" 1>&6
-echo "configure:4636: checking if Athena header files can be found" >&5
+echo "configure:5023: checking if Athena header files can be found" >&5
   cflags_save=$CFLAGS
   CFLAGS="$CFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 4640 "configure"
+#line 5027 "configure"
 #include "confdefs.h"
 
 #include <X11/Intrinsic.h>
@@ -4645,7 +5032,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:4649: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5036: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -4664,11 +5051,11 @@
 
 if test -z "$SKIP_NEXTAW"; then
   echo $ac_n "checking if neXtaw header files can be found""... $ac_c" 1>&6
-echo "configure:4668: checking if neXtaw header files can be found" >&5
+echo "configure:5055: checking if neXtaw header files can be found" >&5
   cflags_save=$CFLAGS
   CFLAGS="$CFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 4672 "configure"
+#line 5059 "configure"
 #include "confdefs.h"
 
 #include <X11/Intrinsic.h>
@@ -4677,7 +5064,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:4681: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5068: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -4705,7 +5092,7 @@
     ldflags_save=$LDFLAGS
   LDFLAGS="$X_LIBS $LDFLAGS"
   echo $ac_n "checking for XShapeQueryExtension in -lXext""... $ac_c" 1>&6
-echo "configure:4709: checking for XShapeQueryExtension in -lXext" >&5
+echo "configure:5096: checking for XShapeQueryExtension in -lXext" >&5
 ac_lib_var=`echo Xext'_'XShapeQueryExtension | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4713,7 +5100,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lXext -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4717 "configure"
+#line 5104 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4724,7 +5111,7 @@
 XShapeQueryExtension()
 ; return 0; }
 EOF
-if { (eval echo configure:4728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5115: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4745,7 +5132,7 @@
 fi
 
     echo $ac_n "checking for wslen in -lw""... $ac_c" 1>&6
-echo "configure:4749: checking for wslen in -lw" >&5
+echo "configure:5136: checking for wslen in -lw" >&5
 ac_lib_var=`echo w'_'wslen | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4753,7 +5140,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lw $GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4757 "configure"
+#line 5144 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4764,7 +5151,7 @@
 wslen()
 ; return 0; }
 EOF
-if { (eval echo configure:4768: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5155: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4785,7 +5172,7 @@
 fi
 
   echo $ac_n "checking for dlsym in -ldl""... $ac_c" 1>&6
-echo "configure:4789: checking for dlsym in -ldl" >&5
+echo "configure:5176: checking for dlsym in -ldl" >&5
 ac_lib_var=`echo dl'_'dlsym | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4793,7 +5180,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldl $GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4797 "configure"
+#line 5184 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4804,7 +5191,7 @@
 dlsym()
 ; return 0; }
 EOF
-if { (eval echo configure:4808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4825,7 +5212,7 @@
 fi
 
   echo $ac_n "checking for XmuCreateStippledPixmap in -lXmu""... $ac_c" 1>&6
-echo "configure:4829: checking for XmuCreateStippledPixmap in -lXmu" >&5
+echo "configure:5216: checking for XmuCreateStippledPixmap in -lXmu" >&5
 ac_lib_var=`echo Xmu'_'XmuCreateStippledPixmap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4833,7 +5220,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lXmu $GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4837 "configure"
+#line 5224 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4844,7 +5231,7 @@
 XmuCreateStippledPixmap()
 ; return 0; }
 EOF
-if { (eval echo configure:4848: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4866,7 +5253,7 @@
 
   if test -z "$SKIP_MOTIF"; then
     echo $ac_n "checking for XpEndJob in -lXp""... $ac_c" 1>&6
-echo "configure:4870: checking for XpEndJob in -lXp" >&5
+echo "configure:5257: checking for XpEndJob in -lXp" >&5
 ac_lib_var=`echo Xp'_'XpEndJob | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4874,7 +5261,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lXp $GUI_X_LIBS -lXm -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4878 "configure"
+#line 5265 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4885,7 +5272,7 @@
 XpEndJob()
 ; return 0; }
 EOF
-if { (eval echo configure:4889: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4909,7 +5296,7 @@
   LDFLAGS=$ldflags_save
 
     echo $ac_n "checking for extra X11 defines""... $ac_c" 1>&6
-echo "configure:4913: checking for extra X11 defines" >&5
+echo "configure:5300: checking for extra X11 defines" >&5
   NARROW_PROTO=
   rm -fr conftestdir
   if mkdir conftestdir; then
@@ -4939,17 +5326,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4943: checking for $ac_hdr" >&5
+echo "configure:5330: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4948 "configure"
+#line 5335 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4953: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5340: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4986,17 +5373,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4990: checking for $ac_hdr" >&5
+echo "configure:5377: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4995 "configure"
+#line 5382 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5000: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5387: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5025,9 +5412,9 @@
 
     if test ! "$enable_xim" = "no"; then
     echo $ac_n "checking for XIMText in X11/Xlib.h""... $ac_c" 1>&6
-echo "configure:5029: checking for XIMText in X11/Xlib.h" >&5
+echo "configure:5416: checking for XIMText in X11/Xlib.h" >&5
     cat > conftest.$ac_ext <<EOF
-#line 5031 "configure"
+#line 5418 "configure"
 #include "confdefs.h"
 #include <X11/Xlib.h>
 EOF
@@ -5058,17 +5445,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5062: checking for $ac_hdr" >&5
+echo "configure:5449: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5067 "configure"
+#line 5454 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5072: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5459: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5104,17 +5491,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5108: checking for $ac_hdr" >&5
+echo "configure:5495: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5113 "configure"
+#line 5500 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5118: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5505: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5207,17 +5594,17 @@
 
 
 echo $ac_n "checking quality of toupper""... $ac_c" 1>&6
-echo "configure:5211: checking quality of toupper" >&5
+echo "configure:5598: checking quality of toupper" >&5
 if test "$cross_compiling" = yes; then
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 5216 "configure"
+#line 5603 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 main() { exit(toupper('A') == 'A' && tolower('z') == 'z'); }
 EOF
-if { (eval echo configure:5221: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5608: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cat >> confdefs.h <<\EOF
 #define BROKEN_TOUPPER 1
@@ -5234,16 +5621,16 @@
 
 
 echo $ac_n "checking whether __DATE__ and __TIME__ work""... $ac_c" 1>&6
-echo "configure:5238: checking whether __DATE__ and __TIME__ work" >&5
+echo "configure:5625: checking whether __DATE__ and __TIME__ work" >&5
 cat > conftest.$ac_ext <<EOF
-#line 5240 "configure"
+#line 5627 "configure"
 #include "confdefs.h"
 
 int main() {
 printf("(" __DATE__ " " __TIME__ ")");
 ; return 0; }
 EOF
-if { (eval echo configure:5247: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5634: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_DATE_TIME 1
@@ -5259,17 +5646,17 @@
 
 ac_safe=`echo "elf.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for elf.h""... $ac_c" 1>&6
-echo "configure:5263: checking for elf.h" >&5
+echo "configure:5650: checking for elf.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5268 "configure"
+#line 5655 "configure"
 #include "confdefs.h"
 #include <elf.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5273: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5660: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5292,7 +5679,7 @@
 
 if test "$HAS_ELF" = 1; then
   echo $ac_n "checking for main in -lelf""... $ac_c" 1>&6
-echo "configure:5296: checking for main in -lelf" >&5
+echo "configure:5683: checking for main in -lelf" >&5
 ac_lib_var=`echo elf'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5300,14 +5687,14 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lelf  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5304 "configure"
+#line 5691 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5341,12 +5728,12 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:5345: checking for $ac_hdr that defines DIR" >&5
+echo "configure:5732: checking for $ac_hdr that defines DIR" >&5
 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5350 "configure"
+#line 5737 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_hdr>
@@ -5354,7 +5741,7 @@
 DIR *dirp = 0;
 ; return 0; }
 EOF
-if { (eval echo configure:5358: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5745: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_header_dirent_$ac_safe=yes"
 else
@@ -5379,7 +5766,7 @@
 # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
 if test $ac_header_dirent = dirent.h; then
 echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:5383: checking for opendir in -ldir" >&5
+echo "configure:5770: checking for opendir in -ldir" >&5
 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5387,7 +5774,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldir  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5391 "configure"
+#line 5778 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5398,7 +5785,7 @@
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:5402: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5789: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5420,7 +5807,7 @@
 
 else
 echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:5424: checking for opendir in -lx" >&5
+echo "configure:5811: checking for opendir in -lx" >&5
 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5428,7 +5815,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lx  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5432 "configure"
+#line 5819 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5439,7 +5826,7 @@
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:5443: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5830: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5463,12 +5850,12 @@
 
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:5467: checking for ANSI C header files" >&5
+echo "configure:5854: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5472 "configure"
+#line 5859 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -5476,7 +5863,7 @@
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5480: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5867: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5493,7 +5880,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 5497 "configure"
+#line 5884 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -5511,7 +5898,7 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 5515 "configure"
+#line 5902 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -5532,7 +5919,7 @@
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 5536 "configure"
+#line 5923 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -5543,7 +5930,7 @@
 exit (0); }
 
 EOF
-if { (eval echo configure:5547: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -5567,12 +5954,12 @@
 fi
 
 echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:5571: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:5958: checking for sys/wait.h that is POSIX.1 compatible" >&5
 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5576 "configure"
+#line 5963 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -5588,7 +5975,7 @@
 s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:5592: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5979: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_sys_wait_h=yes
 else
@@ -5611,16 +5998,16 @@
 
 if test $ac_cv_header_sys_wait_h = no; then
   echo $ac_n "checking for sys/wait.h that defines union wait""... $ac_c" 1>&6
-echo "configure:5615: checking for sys/wait.h that defines union wait" >&5
+echo "configure:6002: checking for sys/wait.h that defines union wait" >&5
   cat > conftest.$ac_ext <<EOF
-#line 5617 "configure"
+#line 6004 "configure"
 #include "confdefs.h"
 #include <sys/wait.h>
 int main() {
 union wait xx, yy; xx = yy
 ; return 0; }
 EOF
-if { (eval echo configure:5624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6011: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			cat >> confdefs.h <<\EOF
@@ -5651,17 +6038,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5655: checking for $ac_hdr" >&5
+echo "configure:6042: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5660 "configure"
+#line 6047 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5665: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6052: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5693,17 +6080,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5697: checking for $ac_hdr" >&5
+echo "configure:6084: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5702 "configure"
+#line 6089 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5707: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6094: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5732,11 +6119,11 @@
 fi
 
 echo $ac_n "checking if strings.h can be included after string.h""... $ac_c" 1>&6
-echo "configure:5736: checking if strings.h can be included after string.h" >&5
+echo "configure:6123: checking if strings.h can be included after string.h" >&5
 cppflags_save=$CPPFLAGS
 CPPFLAGS="$CPPFLAGS $X_CFLAGS"
 cat > conftest.$ac_ext <<EOF
-#line 5740 "configure"
+#line 6127 "configure"
 #include "confdefs.h"
 
 #if defined(_AIX) && !defined(_AIX51) && !defined(_NO_PROTO)
@@ -5757,7 +6144,7 @@
 int i; i = 0;
 ; return 0; }
 EOF
-if { (eval echo configure:5761: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6148: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -5775,13 +6162,13 @@
 
 if test $ac_cv_prog_gcc = yes; then
     echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
-echo "configure:5779: checking whether ${CC-cc} needs -traditional" >&5
+echo "configure:6166: checking whether ${CC-cc} needs -traditional" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
     ac_pattern="Autoconf.*'x'"
   cat > conftest.$ac_ext <<EOF
-#line 5785 "configure"
+#line 6172 "configure"
 #include "confdefs.h"
 #include <sgtty.h>
 Autoconf TIOCGETP
@@ -5799,7 +6186,7 @@
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat > conftest.$ac_ext <<EOF
-#line 5803 "configure"
+#line 6190 "configure"
 #include "confdefs.h"
 #include <termio.h>
 Autoconf TCGETA
@@ -5821,12 +6208,12 @@
 fi
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:5825: checking for working const" >&5
+echo "configure:6212: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5830 "configure"
+#line 6217 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -5875,7 +6262,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:5879: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6266: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -5896,12 +6283,12 @@
 fi
 
 echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:5900: checking for mode_t" >&5
+echo "configure:6287: checking for mode_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5905 "configure"
+#line 6292 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -5929,12 +6316,12 @@
 fi
 
 echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:5933: checking for off_t" >&5
+echo "configure:6320: checking for off_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5938 "configure"
+#line 6325 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -5962,12 +6349,12 @@
 fi
 
 echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:5966: checking for pid_t" >&5
+echo "configure:6353: checking for pid_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5971 "configure"
+#line 6358 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -5995,12 +6382,12 @@
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:5999: checking for size_t" >&5
+echo "configure:6386: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6004 "configure"
+#line 6391 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -6028,12 +6415,12 @@
 fi
 
 echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:6032: checking for uid_t in sys/types.h" >&5
+echo "configure:6419: checking for uid_t in sys/types.h" >&5
 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6037 "configure"
+#line 6424 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 EOF
@@ -6062,12 +6449,12 @@
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:6066: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:6453: checking whether time.h and sys/time.h may both be included" >&5
 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6071 "configure"
+#line 6458 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -6076,7 +6463,7 @@
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:6080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6467: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -6097,12 +6484,12 @@
 fi
 
 echo $ac_n "checking for ino_t""... $ac_c" 1>&6
-echo "configure:6101: checking for ino_t" >&5
+echo "configure:6488: checking for ino_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_ino_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6106 "configure"
+#line 6493 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -6130,12 +6517,12 @@
 fi
 
 echo $ac_n "checking for dev_t""... $ac_c" 1>&6
-echo "configure:6134: checking for dev_t" >&5
+echo "configure:6521: checking for dev_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_dev_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6139 "configure"
+#line 6526 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -6164,12 +6551,12 @@
 
 
 echo $ac_n "checking for rlim_t""... $ac_c" 1>&6
-echo "configure:6168: checking for rlim_t" >&5
+echo "configure:6555: checking for rlim_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_rlim_t'+set}'`\" = set"; then
   echo "$ac_t""(cached) $ac_cv_type_rlim_t" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6173 "configure"
+#line 6560 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -6201,12 +6588,12 @@
 fi
 
 echo $ac_n "checking for stack_t""... $ac_c" 1>&6
-echo "configure:6205: checking for stack_t" >&5
+echo "configure:6592: checking for stack_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_stack_t'+set}'`\" = set"; then
   echo "$ac_t""(cached) $ac_cv_type_stack_t" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6210 "configure"
+#line 6597 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -6236,9 +6623,9 @@
 fi
 
 echo $ac_n "checking whether stack_t has an ss_base field""... $ac_c" 1>&6
-echo "configure:6240: checking whether stack_t has an ss_base field" >&5
+echo "configure:6627: checking whether stack_t has an ss_base field" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6242 "configure"
+#line 6629 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -6253,7 +6640,7 @@
 stack_t sigstk; sigstk.ss_base = 0; 
 ; return 0; }
 EOF
-if { (eval echo configure:6257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6644: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_SS_BASE 1
@@ -6269,7 +6656,7 @@
 
 olibs="$LIBS"
 echo $ac_n "checking --with-tlib argument""... $ac_c" 1>&6
-echo "configure:6273: checking --with-tlib argument" >&5
+echo "configure:6660: checking --with-tlib argument" >&5
 # Check whether --with-tlib or --without-tlib was given.
 if test "${with_tlib+set}" = set; then
   withval="$with_tlib"
@@ -6287,7 +6674,7 @@
   esac
   for libname in $tlibs; do
     echo $ac_n "checking for tgetent in -l${libname}""... $ac_c" 1>&6
-echo "configure:6291: checking for tgetent in -l${libname}" >&5
+echo "configure:6678: checking for tgetent in -l${libname}" >&5
 ac_lib_var=`echo ${libname}'_'tgetent | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6295,7 +6682,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-l${libname}  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6299 "configure"
+#line 6686 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6306,7 +6693,7 @@
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:6310: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6697: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6338,7 +6725,7 @@
   res="FAIL"
 else
   cat > conftest.$ac_ext <<EOF
-#line 6342 "configure"
+#line 6729 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6346,7 +6733,7 @@
 #endif
 main() {char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(0); }
 EOF
-if { (eval echo configure:6350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   res="OK"
 else
@@ -6368,12 +6755,12 @@
 fi
 if test "x$olibs" != "x$LIBS"; then
   echo $ac_n "checking whether we talk terminfo""... $ac_c" 1>&6
-echo "configure:6372: checking whether we talk terminfo" >&5
+echo "configure:6759: checking whether we talk terminfo" >&5
   if test "$cross_compiling" = yes; then
   { echo "configure: error: failed to compile test program." 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 6377 "configure"
+#line 6764 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6382,7 +6769,7 @@
 main()
 {char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(!strcmp(s==0 ? "" : s, "1")); }
 EOF
-if { (eval echo configure:6386: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   echo "$ac_t""no -- we are in termcap land" 1>&6
 else
@@ -6403,12 +6790,12 @@
 
 if test "x$olibs" != "x$LIBS"; then
   echo $ac_n "checking what tgetent() returns for an unknown terminal""... $ac_c" 1>&6
-echo "configure:6407: checking what tgetent() returns for an unknown terminal" >&5
+echo "configure:6794: checking what tgetent() returns for an unknown terminal" >&5
   if test "$cross_compiling" = yes; then
   { echo "configure: error: failed to compile test program." 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 6412 "configure"
+#line 6799 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6417,7 +6804,7 @@
 main()
 {char s[10000]; int res = tgetent(s, "thisterminaldoesnotexist"); exit(res != 0); }
 EOF
-if { (eval echo configure:6421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   echo "$ac_t""zero" 1>&6; cat >> confdefs.h <<\EOF
 #define TGETENT_ZERO_ERR 0
@@ -6435,9 +6822,9 @@
 fi
 
 echo $ac_n "checking whether termcap.h contains ospeed""... $ac_c" 1>&6
-echo "configure:6439: checking whether termcap.h contains ospeed" >&5
+echo "configure:6826: checking whether termcap.h contains ospeed" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6441 "configure"
+#line 6828 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6448,7 +6835,7 @@
 ospeed = 20000
 ; return 0; }
 EOF
-if { (eval echo configure:6452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_OSPEED 1
@@ -6460,9 +6847,9 @@
   rm -rf conftest*
   echo "$ac_t""no" 1>&6
 	echo $ac_n "checking whether ospeed can be extern""... $ac_c" 1>&6
-echo "configure:6464: checking whether ospeed can be extern" >&5
+echo "configure:6851: checking whether ospeed can be extern" >&5
 	cat > conftest.$ac_ext <<EOF
-#line 6466 "configure"
+#line 6853 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6474,7 +6861,7 @@
 ospeed = 20000
 ; return 0; }
 EOF
-if { (eval echo configure:6478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define OSPEED_EXTERN 1
@@ -6492,9 +6879,9 @@
 rm -f conftest*
 
 echo $ac_n "checking whether termcap.h contains UP, BC and PC""... $ac_c" 1>&6
-echo "configure:6496: checking whether termcap.h contains UP, BC and PC" >&5
+echo "configure:6883: checking whether termcap.h contains UP, BC and PC" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6498 "configure"
+#line 6885 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6505,7 +6892,7 @@
 if (UP == 0 && BC == 0) PC = 1
 ; return 0; }
 EOF
-if { (eval echo configure:6509: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_UP_BC_PC 1
@@ -6517,9 +6904,9 @@
   rm -rf conftest*
   echo "$ac_t""no" 1>&6
 	echo $ac_n "checking whether UP, BC and PC can be extern""... $ac_c" 1>&6
-echo "configure:6521: checking whether UP, BC and PC can be extern" >&5
+echo "configure:6908: checking whether UP, BC and PC can be extern" >&5
 	cat > conftest.$ac_ext <<EOF
-#line 6523 "configure"
+#line 6910 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6531,7 +6918,7 @@
 if (UP == 0 && BC == 0) PC = 1
 ; return 0; }
 EOF
-if { (eval echo configure:6535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define UP_BC_PC_EXTERN 1
@@ -6549,9 +6936,9 @@
 rm -f conftest*
 
 echo $ac_n "checking whether tputs() uses outfuntype""... $ac_c" 1>&6
-echo "configure:6553: checking whether tputs() uses outfuntype" >&5
+echo "configure:6940: checking whether tputs() uses outfuntype" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6555 "configure"
+#line 6942 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_TERMCAP_H
@@ -6562,7 +6949,7 @@
 extern int xx(); tputs("test", 1, (outfuntype)xx)
 ; return 0; }
 EOF
-if { (eval echo configure:6566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6953: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_OUTFUNTYPE 1
@@ -6577,9 +6964,9 @@
 rm -f conftest*
 
 echo $ac_n "checking whether sys/select.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:6581: checking whether sys/select.h and sys/time.h may both be included" >&5
+echo "configure:6968: checking whether sys/select.h and sys/time.h may both be included" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6583 "configure"
+#line 6970 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -6589,7 +6976,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:6593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6980: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			cat >> confdefs.h <<\EOF
@@ -6606,7 +6993,7 @@
 
 
 echo $ac_n "checking for /dev/ptc""... $ac_c" 1>&6
-echo "configure:6610: checking for /dev/ptc" >&5
+echo "configure:6997: checking for /dev/ptc" >&5
 if test -r /dev/ptc; then
   cat >> confdefs.h <<\EOF
 #define HAVE_DEV_PTC 1
@@ -6618,17 +7005,17 @@
 fi
 
 echo $ac_n "checking for SVR4 ptys""... $ac_c" 1>&6
-echo "configure:6622: checking for SVR4 ptys" >&5
+echo "configure:7009: checking for SVR4 ptys" >&5
 if test -c /dev/ptmx ; then
   cat > conftest.$ac_ext <<EOF
-#line 6625 "configure"
+#line 7012 "configure"
 #include "confdefs.h"
 
 int main() {
 ptsname(0);grantpt(0);unlockpt(0);
 ; return 0; }
 EOF
-if { (eval echo configure:6632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_SVR4_PTYS 1
@@ -6646,14 +7033,14 @@
 fi
 
 echo $ac_n "checking for ptyranges""... $ac_c" 1>&6
-echo "configure:6650: checking for ptyranges" >&5
+echo "configure:7037: checking for ptyranges" >&5
 if test -d /dev/ptym ; then
   pdir='/dev/ptym'
 else
   pdir='/dev'
 fi
 cat > conftest.$ac_ext <<EOF
-#line 6657 "configure"
+#line 7044 "configure"
 #include "confdefs.h"
 #ifdef M_UNIX
    yes;
@@ -6687,13 +7074,13 @@
 fi
 
 echo $ac_n "checking default tty permissions/group""... $ac_c" 1>&6
-echo "configure:6691: checking default tty permissions/group" >&5
+echo "configure:7078: checking default tty permissions/group" >&5
 rm -f conftest_grp
 if test "$cross_compiling" = yes; then
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 6697 "configure"
+#line 7084 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -6725,7 +7112,7 @@
 }
 
 EOF
-if { (eval echo configure:6729: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   
     if test -f conftest_grp; then
@@ -6756,12 +7143,12 @@
 
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:6760: checking return type of signal handlers" >&5
+echo "configure:7147: checking return type of signal handlers" >&5
 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6765 "configure"
+#line 7152 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -6778,7 +7165,7 @@
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:6782: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7169: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -6810,9 +7197,9 @@
 fi
 
 echo $ac_n "checking for struct sigcontext""... $ac_c" 1>&6
-echo "configure:6814: checking for struct sigcontext" >&5
+echo "configure:7201: checking for struct sigcontext" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6816 "configure"
+#line 7203 "configure"
 #include "confdefs.h"
 
 #include <signal.h>
@@ -6826,7 +7213,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:6830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7217: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 		cat >> confdefs.h <<\EOF
@@ -6842,12 +7229,12 @@
 rm -f conftest*
 
 echo $ac_n "checking getcwd implementation""... $ac_c" 1>&6
-echo "configure:6846: checking getcwd implementation" >&5
+echo "configure:7233: checking getcwd implementation" >&5
 if test "$cross_compiling" = yes; then
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 6851 "configure"
+#line 7238 "configure"
 #include "confdefs.h"
 
 char *dagger[] = { "IFS=pwd", 0 };
@@ -6859,7 +7246,7 @@
   return getcwd(buffer, 500) ? 0 : 1;
 }
 EOF
-if { (eval echo configure:6863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7250: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   echo "$ac_t""it is usable" 1>&6
 else
@@ -6884,12 +7271,12 @@
 	strnicmp strpbrk strtol tgetent towlower towupper usleep utime utimes
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6888: checking for $ac_func" >&5
+echo "configure:7275: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6893 "configure"
+#line 7280 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -6912,7 +7299,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:6916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -6938,9 +7325,9 @@
 
 
 echo $ac_n "checking for st_blksize""... $ac_c" 1>&6
-echo "configure:6942: checking for st_blksize" >&5
+echo "configure:7329: checking for st_blksize" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6944 "configure"
+#line 7331 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -6952,7 +7339,7 @@
 	n = (int)st.st_blksize;
 ; return 0; }
 EOF
-if { (eval echo configure:6956: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7343: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_ST_BLKSIZE 1
@@ -6967,18 +7354,18 @@
 rm -f conftest*
 
 echo $ac_n "checking whether stat() ignores a trailing slash""... $ac_c" 1>&6
-echo "configure:6971: checking whether stat() ignores a trailing slash" >&5
+echo "configure:7358: checking whether stat() ignores a trailing slash" >&5
 if test "$cross_compiling" = yes; then
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 6976 "configure"
+#line 7363 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
 main() {struct stat st;  exit(stat("configure/", &st) != 0); }
 EOF
-if { (eval echo configure:6982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define STAT_IGNORES_SLASH 1
@@ -6995,11 +7382,11 @@
 
 
 echo $ac_n "checking for iconv_open()""... $ac_c" 1>&6
-echo "configure:6999: checking for iconv_open()" >&5
+echo "configure:7386: checking for iconv_open()" >&5
 save_LIBS="$LIBS"
 LIBS="$LIBS -liconv"
 cat > conftest.$ac_ext <<EOF
-#line 7003 "configure"
+#line 7390 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_ICONV_H
@@ -7010,7 +7397,7 @@
 iconv_open("fr", "to");
 ; return 0; }
 EOF
-if { (eval echo configure:7014: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes; with -liconv" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_ICONV 1
@@ -7022,7 +7409,7 @@
   rm -rf conftest*
   LIBS="$save_LIBS"
     cat > conftest.$ac_ext <<EOF
-#line 7026 "configure"
+#line 7413 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_ICONV_H
@@ -7033,7 +7420,7 @@
 iconv_open("fr", "to");
 ; return 0; }
 EOF
-if { (eval echo configure:7037: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_ICONV 1
@@ -7051,9 +7438,9 @@
 
 
 echo $ac_n "checking for nl_langinfo(CODESET)""... $ac_c" 1>&6
-echo "configure:7055: checking for nl_langinfo(CODESET)" >&5
+echo "configure:7442: checking for nl_langinfo(CODESET)" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7057 "configure"
+#line 7444 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_LANGINFO_H
@@ -7064,7 +7451,7 @@
 char *cs = nl_langinfo(CODESET);
 ; return 0; }
 EOF
-if { (eval echo configure:7068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7455: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_NL_LANGINFO_CODESET 1
@@ -7079,7 +7466,7 @@
 rm -f conftest*
 
 echo $ac_n "checking --disable-acl argument""... $ac_c" 1>&6
-echo "configure:7083: checking --disable-acl argument" >&5
+echo "configure:7470: checking --disable-acl argument" >&5
 # Check whether --enable-acl or --disable-acl was given.
 if test "${enable_acl+set}" = set; then
   enableval="$enable_acl"
@@ -7091,7 +7478,7 @@
 if test "$enable_acl" = "yes"; then
 echo "$ac_t""no" 1>&6
 echo $ac_n "checking for acl_get_file in -lposix1e""... $ac_c" 1>&6
-echo "configure:7095: checking for acl_get_file in -lposix1e" >&5
+echo "configure:7482: checking for acl_get_file in -lposix1e" >&5
 ac_lib_var=`echo posix1e'_'acl_get_file | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7099,7 +7486,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lposix1e  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7103 "configure"
+#line 7490 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7110,7 +7497,7 @@
 acl_get_file()
 ; return 0; }
 EOF
-if { (eval echo configure:7114: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7501: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7129,7 +7516,7 @@
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for acl_get_file in -lacl""... $ac_c" 1>&6
-echo "configure:7133: checking for acl_get_file in -lacl" >&5
+echo "configure:7520: checking for acl_get_file in -lacl" >&5
 ac_lib_var=`echo acl'_'acl_get_file | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7137,7 +7524,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lacl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7141 "configure"
+#line 7528 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7148,7 +7535,7 @@
 acl_get_file()
 ; return 0; }
 EOF
-if { (eval echo configure:7152: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7165,7 +7552,7 @@
   echo "$ac_t""yes" 1>&6
   LIBS="$LIBS -lacl"
 		  echo $ac_n "checking for fgetxattr in -lattr""... $ac_c" 1>&6
-echo "configure:7169: checking for fgetxattr in -lattr" >&5
+echo "configure:7556: checking for fgetxattr in -lattr" >&5
 ac_lib_var=`echo attr'_'fgetxattr | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7173,7 +7560,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lattr  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7177 "configure"
+#line 7564 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7184,7 +7571,7 @@
 fgetxattr()
 ; return 0; }
 EOF
-if { (eval echo configure:7188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7575: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7212,9 +7599,9 @@
 
 
 echo $ac_n "checking for POSIX ACL support""... $ac_c" 1>&6
-echo "configure:7216: checking for POSIX ACL support" >&5
+echo "configure:7603: checking for POSIX ACL support" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7218 "configure"
+#line 7605 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -7228,7 +7615,7 @@
 	acl_free(acl);
 ; return 0; }
 EOF
-if { (eval echo configure:7232: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7619: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_POSIX_ACL 1
@@ -7243,9 +7630,9 @@
 rm -f conftest*
 
 echo $ac_n "checking for Solaris ACL support""... $ac_c" 1>&6
-echo "configure:7247: checking for Solaris ACL support" >&5
+echo "configure:7634: checking for Solaris ACL support" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7249 "configure"
+#line 7636 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_SYS_ACL_H
@@ -7256,7 +7643,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:7260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_SOLARIS_ACL 1
@@ -7271,9 +7658,9 @@
 rm -f conftest*
 
 echo $ac_n "checking for AIX ACL support""... $ac_c" 1>&6
-echo "configure:7275: checking for AIX ACL support" >&5
+echo "configure:7662: checking for AIX ACL support" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7277 "configure"
+#line 7664 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_SYS_ACL_H
@@ -7295,7 +7682,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:7299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7686: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_AIX_ACL 1
@@ -7313,7 +7700,7 @@
 fi
 
 echo $ac_n "checking --disable-gpm argument""... $ac_c" 1>&6
-echo "configure:7317: checking --disable-gpm argument" >&5
+echo "configure:7704: checking --disable-gpm argument" >&5
 # Check whether --enable-gpm or --disable-gpm was given.
 if test "${enable_gpm+set}" = set; then
   enableval="$enable_gpm"
@@ -7326,13 +7713,13 @@
 if test "$enable_gpm" = "yes"; then
   echo "$ac_t""no" 1>&6
     echo $ac_n "checking for gpm""... $ac_c" 1>&6
-echo "configure:7330: checking for gpm" >&5
+echo "configure:7717: checking for gpm" >&5
 if eval "test \"`echo '$''{'vi_cv_have_gpm'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   olibs="$LIBS" ; LIBS="-lgpm"
 	cat > conftest.$ac_ext <<EOF
-#line 7336 "configure"
+#line 7723 "configure"
 #include "confdefs.h"
 #include <gpm.h>
 	    #include <linux/keyboard.h>
@@ -7340,7 +7727,7 @@
 Gpm_GetLibVersion(NULL);
 ; return 0; }
 EOF
-if { (eval echo configure:7344: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   	    	    vi_cv_have_gpm=yes
 else
@@ -7367,12 +7754,12 @@
 fi
 
 echo $ac_n "checking for vsnprintf()""... $ac_c" 1>&6
-echo "configure:7371: checking for vsnprintf()" >&5
+echo "configure:7758: checking for vsnprintf()" >&5
 if test "$cross_compiling" = yes; then
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 7376 "configure"
+#line 7763 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -7393,7 +7780,7 @@
 	}
 	    
 EOF
-if { (eval echo configure:7397: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7784: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cat >> confdefs.h <<\EOF
 #define HAVE_VSNPRINTF 1
@@ -7411,16 +7798,16 @@
 
 
 echo $ac_n "checking for rename""... $ac_c" 1>&6
-echo "configure:7415: checking for rename" >&5
+echo "configure:7802: checking for rename" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7417 "configure"
+#line 7804 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 int main() {
 rename("this", "that")
 ; return 0; }
 EOF
-if { (eval echo configure:7424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_RENAME 1
@@ -7435,9 +7822,9 @@
 rm -f conftest*
 
 echo $ac_n "checking for sysctl""... $ac_c" 1>&6
-echo "configure:7439: checking for sysctl" >&5
+echo "configure:7826: checking for sysctl" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7441 "configure"
+#line 7828 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/sysctl.h>
@@ -7452,7 +7839,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:7456: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7843: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_SYSCTL 1
@@ -7467,9 +7854,9 @@
 rm -f conftest*
 
 echo $ac_n "checking for sysinfo""... $ac_c" 1>&6
-echo "configure:7471: checking for sysinfo" >&5
+echo "configure:7858: checking for sysinfo" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7473 "configure"
+#line 7860 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/sysinfo.h>
@@ -7482,7 +7869,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:7486: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7873: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_SYSINFO 1
@@ -7497,9 +7884,9 @@
 rm -f conftest*
 
 echo $ac_n "checking for sysconf""... $ac_c" 1>&6
-echo "configure:7501: checking for sysconf" >&5
+echo "configure:7888: checking for sysconf" >&5
 cat > conftest.$ac_ext <<EOF
-#line 7503 "configure"
+#line 7890 "configure"
 #include "confdefs.h"
 #include <unistd.h>
 int main() {
@@ -7508,7 +7895,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:7512: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7899: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_SYSCONF 1
@@ -7524,7 +7911,7 @@
 
 
 echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:7528: checking size of int" >&5
+echo "configure:7915: checking size of int" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7532,7 +7919,7 @@
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 7536 "configure"
+#line 7923 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 		main()
@@ -7543,7 +7930,7 @@
 		  exit(0);
 		}
 EOF
-if { (eval echo configure:7547: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_int=`cat conftestval`
 else
@@ -7564,7 +7951,7 @@
 
 
 echo $ac_n "checking whether memmove/bcopy/memcpy handle overlaps""... $ac_c" 1>&6
-echo "configure:7568: checking whether memmove/bcopy/memcpy handle overlaps" >&5
+echo "configure:7955: checking whether memmove/bcopy/memcpy handle overlaps" >&5
 bcopy_test_prog='
 main() {
   char buf[10];
@@ -7584,11 +7971,11 @@
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 7588 "configure"
+#line 7975 "configure"
 #include "confdefs.h"
 #define mch_memmove(s,d,l) memmove(d,s,l) $bcopy_test_prog
 EOF
-if { (eval echo configure:7592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cat >> confdefs.h <<\EOF
 #define USEMEMMOVE 1
@@ -7602,11 +7989,11 @@
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 7606 "configure"
+#line 7993 "configure"
 #include "confdefs.h"
 #define mch_memmove(s,d,l) bcopy(d,s,l) $bcopy_test_prog
 EOF
-if { (eval echo configure:7610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cat >> confdefs.h <<\EOF
 #define USEBCOPY 1
@@ -7620,11 +8007,11 @@
   { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 7624 "configure"
+#line 8011 "configure"
 #include "confdefs.h"
 #define mch_memmove(s,d,l) memcpy(d,s,l) $bcopy_test_prog
 EOF
-if { (eval echo configure:7628: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:8015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cat >> confdefs.h <<\EOF
 #define USEMEMCPY 1
@@ -7656,19 +8043,19 @@
     CFLAGS="$CFLAGS -I$x_includes"
     LDFLAGS="$X_LIBS $LDFLAGS -lX11"
     echo $ac_n "checking whether X_LOCALE needed""... $ac_c" 1>&6
-echo "configure:7660: checking whether X_LOCALE needed" >&5
+echo "configure:8047: checking whether X_LOCALE needed" >&5
     cat > conftest.$ac_ext <<EOF
-#line 7662 "configure"
+#line 8049 "configure"
 #include "confdefs.h"
 #include <X11/Xlocale.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:7669: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8056: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 7672 "configure"
+#line 8059 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7679,7 +8066,7 @@
 _Xsetlocale()
 ; return 0; }
 EOF
-if { (eval echo configure:7683: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8070: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 		cat >> confdefs.h <<\EOF
@@ -7706,7 +8093,7 @@
 fi
 
 echo $ac_n "checking for _xpg4_setrunelocale in -lxpg4""... $ac_c" 1>&6
-echo "configure:7710: checking for _xpg4_setrunelocale in -lxpg4" >&5
+echo "configure:8097: checking for _xpg4_setrunelocale in -lxpg4" >&5
 ac_lib_var=`echo xpg4'_'_xpg4_setrunelocale | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7714,7 +8101,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lxpg4  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7718 "configure"
+#line 8105 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7725,7 +8112,7 @@
 _xpg4_setrunelocale()
 ; return 0; }
 EOF
-if { (eval echo configure:7729: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7747,7 +8134,7 @@
 
 
 echo $ac_n "checking how to create tags""... $ac_c" 1>&6
-echo "configure:7751: checking how to create tags" >&5
+echo "configure:8138: checking how to create tags" >&5
 test -f tags && mv tags tags.save
 if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&5 2>&1; then
   TAGPRG="ctags"
@@ -7764,7 +8151,7 @@
 echo "$ac_t""$TAGPRG" 1>&6 
 
 echo $ac_n "checking how to run man with a section nr""... $ac_c" 1>&6
-echo "configure:7768: checking how to run man with a section nr" >&5
+echo "configure:8155: checking how to run man with a section nr" >&5
 MANDEF="man"
 (eval man -s 2 read) < /dev/null > /dev/null 2>&5 && MANDEF="man -s"
 echo "$ac_t""$MANDEF" 1>&6
@@ -7776,7 +8163,7 @@
 fi
 
 echo $ac_n "checking --disable-nls argument""... $ac_c" 1>&6
-echo "configure:7780: checking --disable-nls argument" >&5
+echo "configure:8167: checking --disable-nls argument" >&5
 # Check whether --enable-nls or --disable-nls was given.
 if test "${enable_nls+set}" = set; then
   enableval="$enable_nls"
@@ -7791,7 +8178,7 @@
   # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7795: checking for $ac_word" >&5
+echo "configure:8182: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7818,19 +8205,19 @@
 fi
 
   echo $ac_n "checking for NLS""... $ac_c" 1>&6
-echo "configure:7822: checking for NLS" >&5
+echo "configure:8209: checking for NLS" >&5
   if test -f po/Makefile; then
     have_gettext="no"
     if test -n "$MSGFMT"; then
       cat > conftest.$ac_ext <<EOF
-#line 7827 "configure"
+#line 8214 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 int main() {
 gettext("Test");
 ; return 0; }
 EOF
-if { (eval echo configure:7834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8221: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""gettext() works" 1>&6; have_gettext="yes"
 else
@@ -7840,14 +8227,14 @@
   olibs=$LIBS
 	  LIBS="$LIBS -lintl"
 	  cat > conftest.$ac_ext <<EOF
-#line 7844 "configure"
+#line 8231 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 int main() {
 gettext("Test");
 ; return 0; }
 EOF
-if { (eval echo configure:7851: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8238: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""gettext() works with -lintl" 1>&6; have_gettext="yes"
 else
@@ -7873,12 +8260,12 @@
             for ac_func in bind_textdomain_codeset
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7877: checking for $ac_func" >&5
+echo "configure:8264: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7882 "configure"
+#line 8269 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -7901,7 +8288,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:7905: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -7926,9 +8313,9 @@
 done
 
             echo $ac_n "checking for _nl_msg_cat_cntr""... $ac_c" 1>&6
-echo "configure:7930: checking for _nl_msg_cat_cntr" >&5
+echo "configure:8317: checking for _nl_msg_cat_cntr" >&5
       cat > conftest.$ac_ext <<EOF
-#line 7932 "configure"
+#line 8319 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 		extern int _nl_msg_cat_cntr;
@@ -7936,7 +8323,7 @@
 ++_nl_msg_cat_cntr;
 ; return 0; }
 EOF
-if { (eval echo configure:7940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8327: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
 #define HAVE_NL_MSG_CAT_CNTR 1
@@ -7959,17 +8346,17 @@
 
 ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
-echo "configure:7963: checking for dlfcn.h" >&5
+echo "configure:8350: checking for dlfcn.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7968 "configure"
+#line 8355 "configure"
 #include "confdefs.h"
 #include <dlfcn.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7973: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8360: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7990,17 +8377,17 @@
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "dl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dl.h""... $ac_c" 1>&6
-echo "configure:7994: checking for dl.h" >&5
+echo "configure:8381: checking for dl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7999 "configure"
+#line 8386 "configure"
 #include "confdefs.h"
 #include <dl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8004: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8391: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8029,9 +8416,9 @@
 EOF
 
   echo $ac_n "checking for dlopen()""... $ac_c" 1>&6
-echo "configure:8033: checking for dlopen()" >&5
+echo "configure:8420: checking for dlopen()" >&5
   cat > conftest.$ac_ext <<EOF
-#line 8035 "configure"
+#line 8422 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -8041,7 +8428,7 @@
       
 ; return 0; }
 EOF
-if { (eval echo configure:8045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8432: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6;
 	      cat >> confdefs.h <<\EOF
@@ -8054,11 +8441,11 @@
   rm -rf conftest*
   echo "$ac_t""no" 1>&6;
 	      echo $ac_n "checking for dlopen() in -ldl""... $ac_c" 1>&6
-echo "configure:8058: checking for dlopen() in -ldl" >&5
+echo "configure:8445: checking for dlopen() in -ldl" >&5
 	      olibs=$LIBS
 	      LIBS="$LIBS -ldl"
 	      cat > conftest.$ac_ext <<EOF
-#line 8062 "configure"
+#line 8449 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -8068,7 +8455,7 @@
 		 
 ; return 0; }
 EOF
-if { (eval echo configure:8072: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6;
 			  cat >> confdefs.h <<\EOF
@@ -8086,9 +8473,9 @@
 fi
 rm -f conftest*
       echo $ac_n "checking for dlsym()""... $ac_c" 1>&6
-echo "configure:8090: checking for dlsym()" >&5
+echo "configure:8477: checking for dlsym()" >&5
   cat > conftest.$ac_ext <<EOF
-#line 8092 "configure"
+#line 8479 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -8098,7 +8485,7 @@
       
 ; return 0; }
 EOF
-if { (eval echo configure:8102: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6;
 	      cat >> confdefs.h <<\EOF
@@ -8111,11 +8498,11 @@
   rm -rf conftest*
   echo "$ac_t""no" 1>&6;
 	      echo $ac_n "checking for dlsym() in -ldl""... $ac_c" 1>&6
-echo "configure:8115: checking for dlsym() in -ldl" >&5
+echo "configure:8502: checking for dlsym() in -ldl" >&5
 	      olibs=$LIBS
 	      LIBS="$LIBS -ldl"
 	      cat > conftest.$ac_ext <<EOF
-#line 8119 "configure"
+#line 8506 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -8125,7 +8512,7 @@
 		 
 ; return 0; }
 EOF
-if { (eval echo configure:8129: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6;
 			  cat >> confdefs.h <<\EOF
@@ -8148,9 +8535,9 @@
 EOF
 
   echo $ac_n "checking for shl_load()""... $ac_c" 1>&6
-echo "configure:8152: checking for shl_load()" >&5
+echo "configure:8539: checking for shl_load()" >&5
   cat > conftest.$ac_ext <<EOF
-#line 8154 "configure"
+#line 8541 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -8160,7 +8547,7 @@
      
 ; return 0; }
 EOF
-if { (eval echo configure:8164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6;
 	  cat >> confdefs.h <<\EOF
@@ -8173,11 +8560,11 @@
   rm -rf conftest*
   echo "$ac_t""no" 1>&6;
 	  echo $ac_n "checking for shl_load() in -ldld""... $ac_c" 1>&6
-echo "configure:8177: checking for shl_load() in -ldld" >&5
+echo "configure:8564: checking for shl_load() in -ldld" >&5
 	  olibs=$LIBS
 	  LIBS="$LIBS -ldld"
 	  cat > conftest.$ac_ext <<EOF
-#line 8181 "configure"
+#line 8568 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -8187,7 +8574,7 @@
 	     
 ; return 0; }
 EOF
-if { (eval echo configure:8191: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8578: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6;
 		  cat >> confdefs.h <<\EOF
@@ -8209,17 +8596,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8213: checking for $ac_hdr" >&5
+echo "configure:8600: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8218 "configure"
+#line 8605 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8223: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8610: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8256,7 +8643,7 @@
 if test "x$MACOSX" = "xyes" && test "x$CARBON" = "xyes" \
 	&& test "x$GUITYPE" != "xCARBONGUI"; then
   echo $ac_n "checking whether we need -framework Carbon""... $ac_c" 1>&6
-echo "configure:8260: checking whether we need -framework Carbon" >&5
+echo "configure:8647: checking whether we need -framework Carbon" >&5
     if test "x$enable_multibyte" = "xyes" || test "x$features" == "xbig" \
 	|| test "x$features" = "xhuge"; then
     LIBS="$LIBS -framework Carbon"
@@ -8454,6 +8841,14 @@
 s%@X_LIBS@%$X_LIBS%g
 s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g
 s%@X_LIB@%$X_LIB%g
+s%@MOC@%$MOC%g
+s%@KDE_CONFIG@%$KDE_CONFIG%g
+s%@KDE_LIBS@%$KDE_LIBS%g
+s%@KDE_INCLUDES@%$KDE_INCLUDES%g
+s%@KDE_PREFIX@%$KDE_PREFIX%g
+s%@QT_LIBS@%$QT_LIBS%g
+s%@QT_INCLUDES@%$QT_INCLUDES%g
+s%@ROOTQT@%$ROOTQT%g
 s%@GTK_CONFIG@%$GTK_CONFIG%g
 s%@GTK12_CONFIG@%$GTK12_CONFIG%g
 s%@PKG_CONFIG@%$PKG_CONFIG%g
diff --git a/src/config.h.in b/src/config.h.in
index bba2662..1c888f4 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -312,6 +312,9 @@
 /* Define if you use GTK and want GNOME support. */
 #undef FEAT_GUI_GNOME
 
+/* Define if you use KDE and want KDE Toolbar support. */
+#undef FEAT_KDETOOLBAR
+
 /* Define if GTK+ 2 is available. */
 #undef HAVE_GTK2
 
diff --git a/src/config.mk.in b/src/config.mk.in
index 0466499..b5af74b 100644
--- a/src/config.mk.in
+++ b/src/config.mk.in
@@ -124,6 +124,8 @@
 GUI_X_LIBS	= @GUI_X_LIBS@
 MOTIF_LIBNAME	= @MOTIF_LIBNAME@
 GTK_LIBNAME	= @GTK_LIBNAME@
+KDE_PREFIX	= @KDE_PREFIX@
+MOC             = @MOC@
 
 ### Any OS dependent extra source and object file
 OS_EXTRA_SRC	= @OS_EXTRA_SRC@
diff --git a/src/configure.in b/src/configure.in
index 2c23e06..1ebf82c 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -982,7 +982,7 @@
 
 AC_MSG_CHECKING(--enable-gui argument)
 AC_ARG_ENABLE(gui,
- [  --enable-gui[=OPTS]     X11 GUI [default=auto] [OPTS=auto/no/gtk/gtk2/gnome/gnome2/motif/athena/neXtaw/beos/photon/carbon]], , enable_gui="auto")
+ [  --enable-gui[=OPTS]     X11 GUI [default=auto] [OPTS=auto/no/gtk/gtk2/gnome/gnome2/kde/motif/athena/neXtaw/beos/photon/carbon]], , enable_gui="auto")
 
 dnl Canonicalize the --enable-gui= argument so that it can be easily compared.
 dnl Do not use character classes for portability with old tools.
@@ -1039,7 +1039,6 @@
 
 else
 
-
   case "$enable_gui_canon" in
     no|none)	AC_MSG_RESULT(no GUI support) ;;
     yes|""|auto)	AC_MSG_RESULT(yes/auto - automatic GUI support)
@@ -1050,6 +1049,8 @@
 		SKIP_ATHENA=
 		SKIP_NEXTAW=
 		SKIP_CARBON=;;
+    kde|Kde|KDE)	AC_MSG_RESULT(KDE 2.x or 3.x GUI support)
+    		SKIP_KDE=;;
     gtk)	AC_MSG_RESULT(GTK+ 1.x GUI support)
 		SKIP_GTK=;;
     gtk2)	AC_MSG_RESULT(GTK+ 2.x GUI support)
@@ -1073,6 +1074,17 @@
 
 fi
 
+if test "x$SKIP_KDE" != "xYES" -a "$enable_gui_canon" != "kde"; then
+    AC_MSG_CHECKING(whether or not to look for KDE)
+    AC_ARG_ENABLE(kde-check,
+	[  --enable-kde-check      If auto-select GUI, check for KDE [default=no]],
+	,enable_kde_check="no")
+    AC_MSG_RESULT($enable_kde_check);
+    if test "x$enable_kde_check" = "xno"; then
+       SKIP_KDE=YES
+    fi
+fi
+
 if test "x$SKIP_GTK" != "xYES" -a "$enable_gui_canon" != "gtk" -a "$enable_gui_canon" != "gtk2"; then
   AC_MSG_CHECKING(whether or not to look for GTK)
   AC_ARG_ENABLE(gtk-check,
@@ -1153,6 +1165,247 @@
   fi
 fi
 
+dnl ---------------------------------------------------------------------------
+dnl we use the kde-config script included in KDE since 2.x to check which
+dnl version of KDE, we'll use. We'll use additional args in configure to
+dnl obtain the QT directory (includes and libs) as qt does not give any
+dnl config script ! (shame on the trolls ! ;p)
+dnl ---------------------------------------------------------------------------
+
+if test -z "$SKIP_KDE"; then
+dnl ------------------
+dnl now, take care of QT
+dnl -----------------
+AC_ARG_WITH(qt-dir,
+						[  --with-qt-dir=DIR	Specify prefix of QT files],
+						[
+						 ROOTQT="$withval"
+						 MOC="$withval"/bin/moc
+						 QT_INCLUDES="$withval"/include
+						 QT_LIBS="$withval"/lib
+						 ])
+
+if test "x$ROOTQT" = "x"; then
+	if test -z "$QTDIR"; then
+	    dnl Find the Qt directory by looking for the "moc" program.
+	    dnl It's better than nothing.
+	    AC_PATH_PROG(MOC, moc, no)
+	    if text"x$MOC" = "x"; then
+		AC_MSG_ERROR(could not find Qt directory)
+	    else
+	      ROOTQT=`echo $MOC | sed 's+/bin/moc++'`
+	    fi
+	else
+		ROOTQT="$QTDIR"
+	fi
+fi
+MOC="$ROOTQT"/bin/moc
+QT_INCLUDES="$ROOTQT"/include
+QT_LIBS="$ROOTQT"/lib
+
+AC_ARG_WITH(qt-includes,
+						[  --with-qt-includes=DIR	Specify location of Qt headers],
+						[QT_INCLUDES="$withval"]
+						)
+
+AC_ARG_WITH(qt-libraries,
+						[  --with-qt-libs=DIR	Specify location of Qt libraries],
+						[QT_LIBS="$withval"]
+						)
+
+if test "x$QT_LIBS" = "x" ; then
+	QT_LIBS="$ROOTQT"/lib
+fi
+if test "x$QT_INCLUDES" = "x" ; then
+	QT_INCLUDES="$ROOTQT"/include
+fi
+dnl we should get QT's version from here and compare with what kde-config
+dnl says
+
+AC_MSG_CHECKING(whether or not to use a KDE Toolbar in KVim)
+AC_ARG_ENABLE(kde-toolbar,
+	[  --enable-kde-toolbar   if KDE GUI is selected, enable a KDE-look toolbar [default=no]],
+	, enable_kde_toolbar="no")
+if test "x$enable_kde_toolbar" != "xno"; then
+  AC_DEFINE(FEAT_KDETOOLBAR)
+fi
+AC_MSG_RESULT($enable_kde_toolbar);
+fi
+
+dnl -------------------
+dnl so, first, look up at the kde-config script
+dnl ------------------
+
+if test -z "$SKIP_KDE"; then
+AC_DEFUN(AM_PATH_KDE,
+[
+	if test "X$KDE_CONFIG" != "X"; then
+	  min_kde_version=ifelse([$1], ,2.0,[$1])
+	  AC_MSG_CHECKING(for KDE version >= $min_kde_version)
+	  no_kde=""
+	  if test "$KDE_CONFIG" = "no" ; then
+		no_kde=yes
+	  else
+		KDE_PREFIX=`$KDE_CONFIG $kde_config_args --prefix`
+		if test "x$KDE_LIBS" = "x"; then
+		  KDE_LIBS="$KDE_PREFIX/lib"
+		fi
+		if test "x$KDE_INCLUDES" = "x"; then
+			KDE_INCLUDES="$KDE_PREFIX/include"
+		fi
+		kde_major_version=`$KDE_CONFIG --version | grep KDE | \
+sed 's/KDE:\ //' | sed 's/\([[0-9]]*\).\([[0-9]]*.*\)/\1/'`
+		kde_minor_version=`$KDE_CONFIG --version | grep KDE | \
+sed 's/KDE:\ //' | sed 's/\([[0-9]]*\).\([[0-9]]*.*\)/\2/'`
+	
+		qt_major_version=`$KDE_CONFIG --version | grep Qt | sed -e \
+'s/Qt:\ //' | sed 's/\([[0-9]]*\).\([[0-9]]*.*\)/\1/'`
+		qt_minor_version=`$KDE_CONFIG --version | grep Qt | sed -e \
+'s/Qt:\ //' | sed 's/\([[0-9]]*\).\([[0-9]]*.*\)/\2/'`
+	
+		dnl maybe in a near future we'll get these ones : QT_PREFIX, QT_LIBS,
+		dnl QT_INCLUDES
+		dnl but for now we need configure options to get them ...
+		if test "x$enable-kdetest" = "xyes" ; then
+			ac_save_LIBS="$LIBS"
+			LIBS="$LIBS $KDE_LIBS"
+
+			dnl fake test
+			AC_TRY_RUN([
+#include <stdio.h>
+int
+main()
+{ return 0; }
+			],, no_kde=yes,[echo $ac_n "cross compiling KDE ? ? how can i remove that ? :)"])
+			LIBS="$ac_save_LIBS"
+		fi
+	fi
+	if test "x$no_kde" = x ; then
+	  AC_MSG_RESULT(found KDE $kde_major_version.$kde_minor_version)
+	  ifelse([$2], , :, [$2])
+	else
+	  AC_MSG_RESULT(no)
+	  KDE_LIBS=""
+	  ifelse([$3], , :, [$3])
+	fi
+else
+  AC_MSG_RESULT(no)
+  KDE_LIBS=""
+  ifelse([$3], , :, [$3])
+fi
+AC_SUBST(KDE_LIBS)
+AC_SUBST(KDE_INCLUDES)
+AC_SUBST(KDE_PREFIX)
+])
+
+dnl Check all the KDE stuff
+AC_MSG_CHECKING(--disable-rpath argument)
+AC_ARG_ENABLE(rpath,
+	[  --disable-rpath      Disable rpath.],
+	, enable_rpath="yes")
+if test "$enable_rpath" = "yes"; then
+	AC_MSG_RESULT(no)
+else
+	AC_MSG_RESULT(yes)
+fi
+
+AC_MSG_CHECKING(--with-kde-prefix argument)
+AC_ARG_WITH(kde-prefix,[  --with-kde-prefix=PFX	Prefix where KDE is installed (optional)],kde_config_prefix="$withval";
+AC_MSG_RESULT($kde_config_prefix), kde_config_prefix="";AC_MSG_RESULT(no))
+
+AC_ARG_WITH(kde-includes,
+						[  --with-kde-includes=DIR	Specify location of KDE headers],
+						[KDE_INCLUDES="$withval"]
+						)
+
+AC_ARG_WITH(kde-libraries,
+						[  --with-kde-libs=DIR	Specify location of KDE libraries],
+						[KDE_LIBS="$withval"]
+						)
+
+AC_MSG_CHECKING(--disable-kdetest argument)
+AC_ARG_ENABLE(kdetest,
+							[  --disable-kdetest	Do not try to compile and run a test KDE program],
+							enable_kdetest=yes)
+
+if test "x$enable_kdetest" = "xyes" ; then
+	AC_MSG_RESULT(kde test enabled)
+else
+	AC_MSG_RESULT(kde test disabled)
+fi
+
+if test "x$kde_config_prefix" != "x" ; then
+	kde_config_args=""
+	KDE_CONFIG=$kde_config_prefix/bin/kde-config
+fi
+
+if test "X$KDE_CONFIG" = "X"; then
+	AC_PATH_PROG(KDE_CONFIG, kde-config, no)
+else
+	AC_MSG_RESULT(Using KDE configuration program $KDE_CONFIG)
+fi
+
+if test "X$KDE_CONFIG" != "X" ; then
+	AM_PATH_KDE(2.0.0,
+							[GUI_LIB_LOC="-L$KDE_LIBS -lkdeui -lkdecore -lDCOP"
+							 GUI_INC_LOC="-I$KDE_INCLUDES"
+							 KDEDIR="$KDE_PREFIX"], )
+	if test "x$KDE_PREFIX" != "x"; then
+		AC_MSG_CHECKING(for QT version $qt_major_version.x)
+		if test "x$ROOTQT" != "x" ; then
+			GUI_INC_LOC="-I$QT_INCLUDES $GUI_INC_LOC"
+			if test $qt_major_version -lt 2; then
+				AC_MSG_ERROR(Your QT version is prior to 2.0; KDE 2.x and 3.x require at least QT 2)
+			fi
+			dnl hack for FreeBSD
+			if test "`(uname) 2>/dev/null`" = "FreeBSD"; then
+				CFLAGS="$CFLAGS -D_THREAD_SAFE"
+				CXXFLAGS="$CXXFLAGS -D_THREAD_SAFE"
+				GUI_LIB_LOC="$GUI_LIB_LOC -pthread"
+				LIBS="$LIBS -pthread"
+			fi
+
+			dnl check the version
+			if test "x$enable_rpath" = "xyes"; then
+				if test $qt_major_version = 2; then
+					GUI_LIB_LOC="-L$KDE_LIBS -lkfile -L$QT_LIBS -lqt $GUI_LIB_LOC \
+-Wl,--rpath -Wl,$KDE_LIBS -Wl,--rpath -Wl,$QT_LIBS"
+				else
+					GUI_LIB_LOC="-L$KDE_LIBS -lkio -L$QT_LIBS -lqt-mt $GUI_LIB_LOC \
+-Wl,--rpath -Wl,$KDE_LIBS -Wl,--rpath -Wl,$QT_LIBS"
+				fi
+			else
+				if test $qt_major_version = 2; then
+					GUI_LIB_LOC="-L$KDE_LIBS -lkfile -L$QT_LIBS -lqt $GUI_LIB_LOC"
+				else
+					GUI_LIB_LOC="-L$KDE_LIBS -lkio -L$QT_LIBS -lqt-mt $GUI_LIB_LOC"
+				fi
+			fi
+
+			dnl Remove "-I/usr/include " from GUI_*
+			GUI_INC_LOC="`echo $GUI_INC_LOC\ | sed 's%-I/usr/include %%'`"
+dnl			GUI_LIB_LOC="`echo $GUI_LIB_LOC\ | sed 's% -L/usr/lib%%'`"
+
+			AC_MSG_RESULT(found $qt_major_version.$qt_minor_version in $ROOTQT)
+			SKIP_GTK=YES
+			SKIP_ATHENA=YES
+			SKIP_MOTIF=YES
+			GUITYPE=KDE
+			AC_SUBST(KDE_PREFIX)
+			AC_SUBST(QT_LIBS)
+			AC_SUBST(QT_INCLUDES)
+			AC_SUBST(ROOTQT)
+			AC_SUBST(MOC)
+			AC_DEFINE(FEAT_GUI_KDE)
+		else
+			AC_MSG_ERROR(Detected QT version mismatched)
+		fi
+	else
+		AC_MSG_ERROR(Could not find KDE installation prefix)
+	fi
+fi
+fi
+
 if test "x$MACOSX" = "xyes" -a -z "$SKIP_CARBON" -a "x$CARBON" = "xyes"; then
   AC_MSG_CHECKING(for Carbon GUI)
   dnl already did this
@@ -1170,7 +1423,6 @@
   SKIP_CARBON=YES
 fi
 
-
 dnl
 dnl Get the cflags and libraries from the gtk-config script
 dnl
diff --git a/src/edit.c b/src/edit.c
index 7619a55..1adcda4 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -270,6 +270,23 @@
     ins_compl_clear();	    /* clear stuff for CTRL-X mode */
 #endif
 
+#ifdef FEAT_AUTOCMD
+    /*
+     * Trigger InsertEnter autocommands.  Do not do this for "r<CR>" or "grx".
+     */
+    if (cmdchar != 'r' && cmdchar != 'v')
+    {
+	if (cmdchar == 'R')
+	    ptr = (char_u *)"r";
+	else if (cmdchar == 'V')
+	    ptr = (char_u *)"v";
+	else
+	    ptr = (char_u *)"i";
+	set_vim_var_string(VV_INSERTMODE, ptr, 1);
+	apply_autocmds(EVENT_INSERTENTER, NULL, NULL, FALSE, curbuf);
+    }
+#endif
+
 #ifdef FEAT_MOUSE
     /*
      * When doing a paste with the middle mouse button, Insstart is set to
@@ -725,6 +742,12 @@
 		break;
 	    }
 #endif
+#ifdef FEAT_AUTOCMD
+	    set_vim_var_string(VV_INSERTMODE,
+			   (char_u *)((State & REPLACE_FLAG) ? "i" :
+				    replaceState == VREPLACE ? "v" : "r"), 1);
+	    apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, FALSE, curbuf);
+#endif
 	    if (State & REPLACE_FLAG)
 		State = INSERT | (State & LANGMAP);
 	    else
@@ -859,7 +882,14 @@
 		o_lnum = curwin->w_cursor.lnum;
 
 	    if (ins_esc(&count, cmdchar))
+	    {
+#ifdef FEAT_AUTOCMD
+		if (cmdchar != 'r' && cmdchar != 'v')
+		    apply_autocmds(EVENT_INSERTLEAVE, NULL, NULL,
+							       FALSE, curbuf);
+#endif
 		return (c == Ctrl_O);
+	    }
 	    continue;
 
 	/*
diff --git a/src/eval.c b/src/eval.c
index ce7bf09..5e40515 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -231,6 +231,7 @@
     {"throwpoint", sizeof("throwpoint") - 1, NULL, VAR_STRING, VV_RO},
     {"register", sizeof("register") - 1, NULL, VAR_STRING, VV_RO},
     {"cmdbang", sizeof("cmdbang") - 1, NULL, VAR_NUMBER, VV_RO},
+    {"insertmode", sizeof("insertmode") - 1, NULL, VAR_STRING, VV_RO},
 };
 
 static int eval0 __ARGS((char_u *arg,  VAR retvar, char_u **nextcmd, int evaluate));
@@ -4877,6 +4878,9 @@
 #ifdef FEAT_GUI_BEOS
 	"gui_beos",
 #endif
+#ifdef FEAT_GUI_KDE
+	"gui_kde",
+#endif
 #ifdef FEAT_GUI_GTK
 	"gui_gtk",
 # ifdef HAVE_GTK2
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 6713482..f9bd487 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -447,7 +447,13 @@
 	vim_free(q);
 	if (p == NULL)
 	    return FAIL;
-	bp->dbg_name = p;
+	if (*p != '*')
+	{
+	    bp->dbg_name = fix_fname(p);
+	    vim_free(p);
+	}
+	else
+	    bp->dbg_name = p;
 #ifdef MACOS_CLASSIC
 	if (bp->dbg_name != NULL)
 	    slash_n_colon_adjust(bp->dbg_name);
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index af8d3fc..27f4b9d 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -197,7 +197,7 @@
 #else
 # define ex_tearoff		ex_ni
 #endif
-#if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU)
+#if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_KDE) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU)
 static void	ex_popup __ARGS((exarg_T *eap));
 #else
 # define ex_popup		ex_ni
@@ -205,11 +205,11 @@
 #ifndef FEAT_GUI_MSWIN
 # define ex_simalt		ex_ni
 #endif
-#if !defined(FEAT_GUI_MSWIN) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF)
+#if !defined(FEAT_GUI_MSWIN) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF) && !defined(FEAT_GUI_KDE)
 # define gui_mch_find_dialog	ex_ni
 # define gui_mch_replace_dialog ex_ni
 #endif
-#ifndef FEAT_GUI_GTK
+#if !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_KDE)
 # define ex_helpfind		ex_ni
 #endif
 #ifndef FEAT_CSCOPE
@@ -258,7 +258,7 @@
 #else
 # define ex_wincmd	    ex_ni
 #endif
-#if defined(FEAT_GUI) || defined(UNIX) || defined(VMS)
+#if defined(FEAT_GUI) || defined(UNIX) || defined(VMS) || defined(MSWIN)
 static void	ex_winpos __ARGS((exarg_T *eap));
 #else
 # define ex_winpos	    ex_ni
@@ -6719,7 +6719,7 @@
 }
 #endif
 
-#if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU)
+#if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_KDE) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU)
     static void
 ex_popup(eap)
     exarg_T	*eap;
@@ -7108,7 +7108,7 @@
 }
 #endif
 
-#if defined(FEAT_GUI) || defined(UNIX) || defined(VMS)
+#if defined(FEAT_GUI) || defined(UNIX) || defined(VMS) || defined(MSWIN)
 /*
  * ":winpos".
  */
@@ -7122,8 +7122,12 @@
 
     if (*arg == NUL)
     {
-# ifdef FEAT_GUI
+# if defined(FEAT_GUI) || defined(MSWIN)
+#  ifdef FEAT_GUI
 	if (gui.in_use && gui_mch_get_winpos(&x, &y) != FAIL)
+#  else
+	if (mch_get_winpos(&x, &y) != FAIL)
+#  endif
 	{
 	    sprintf((char *)IObuff, _("Window position: X %d, Y %d"), x, y);
 	    msg(IObuff);
@@ -7155,6 +7159,10 @@
 #  ifdef HAVE_TGETENT
 	else
 #  endif
+# else
+#  ifdef MSWIN
+	    mch_set_winpos(x, y);
+#  endif
 # endif
 # ifdef HAVE_TGETENT
 	if (*T_CWP)
diff --git a/src/feature.h b/src/feature.h
index 725c071..8ebe94f 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -689,13 +689,16 @@
  *			always has it).  But only if menus are enabled.
  */
 #if defined(FEAT_NORMAL) && defined(FEAT_MENU) \
-	&& (defined(FEAT_GUI_GTK) \
+	&& (defined(FEAT_GUI_KDE) \
+		|| defined(FEAT_GUI_GTK) \
 		|| defined(FEAT_GUI_MSWIN) \
 		|| ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \
 			&& defined(HAVE_XPM)) \
 		|| defined(FEAT_GUI_PHOTON))
 # define FEAT_TOOLBAR
 #endif
+
+
 #if defined(FEAT_TOOLBAR) && !defined(FEAT_MENU)
 # define FEAT_MENU
 #endif
@@ -706,7 +709,7 @@
  * BROWSE_CURRBUF	Open file browser in the directory of the current
  *			buffer, instead of the current directory.
  */
-#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC))
+#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_KDE) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC))
 # define FEAT_BROWSE
 #endif
 #if defined(FEAT_NORMAL) && defined(FEAT_GUI_MSWIN)
@@ -724,7 +727,8 @@
 	|| defined(FEAT_GUI_GTK) \
 	|| defined(FEAT_GUI_PHOTON) \
 	|| defined(FEAT_GUI_MSWIN) \
-	|| defined(FEAT_GUI_MAC)
+	|| defined(FEAT_GUI_MAC) \
+	|| defined(FEAT_GUI_KDE)
 #  define FEAT_CON_DIALOG
 #  define FEAT_GUI_DIALOG
 # else
@@ -732,13 +736,13 @@
 # endif
 #endif
 #if !defined(FEAT_GUI_DIALOG) && (defined(FEAT_GUI_MOTIF) \
-	|| defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK))
+	|| defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE))
 /* need a dialog to show error messages when starting from the desktop */
 # define FEAT_GUI_DIALOG
 #endif
 #if defined(FEAT_GUI_DIALOG) && \
 	(defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \
-	 || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN) \
+	 || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)|| defined(FEAT_GUI_MSWIN) \
 	 || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC))
 # define FEAT_GUI_TEXTDIALOG
 #endif
@@ -931,7 +935,7 @@
  * +X11			Unix only.  Include code for xterm title saving and X
  *			clipboard.  Only works if HAVE_X11 is also defined.
  */
-#if defined(FEAT_NORMAL) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)
+#if (defined(FEAT_NORMAL) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA))
 # define WANT_X11
 #endif
 
@@ -1057,7 +1061,7 @@
 #  define MCH_CURSOR_SHAPE
 # endif
 # if defined(FEAT_GUI_W32) || defined(FEAT_GUI_W16) || defined(FEAT_GUI_MOTIF) \
-	|| defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) \
+	|| defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)\
 	|| defined(FEAT_GUI_PHOTON)
 #  define FEAT_MOUSESHAPE
 # endif
diff --git a/src/fileio.c b/src/fileio.c
index ce5ce41..92c1e98 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -6651,6 +6651,9 @@
     {"FocusLost",	EVENT_FOCUSLOST},
     {"FuncUndefined",	EVENT_FUNCUNDEFINED},
     {"GUIEnter",	EVENT_GUIENTER},
+    {"InsertChange",	EVENT_INSERTCHANGE},
+    {"InsertEnter",	EVENT_INSERTENTER},
+    {"InsertLeave",	EVENT_INSERTLEAVE},
     {"RemoteReply",	EVENT_REMOTEREPLY},
     {"StdinReadPost",	EVENT_STDINREADPOST},
     {"StdinReadPre",	EVENT_STDINREADPRE},
diff --git a/src/globals.h b/src/globals.h
index 6f53317..8a59f1c 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -722,6 +722,10 @@
 #endif /* FEAT_MBYTE */
 
 #ifdef FEAT_XIM
+# ifdef FEAT_GUI_KDE
+EXTERN colnr_T		preedit_start_col INIT(= MAXCOL);
+EXTERN char		*draw_feedback INIT(= NULL);
+# endif
 # ifdef FEAT_GUI_GTK
 #  ifdef HAVE_GTK2
 EXTERN GtkIMContext	*xic INIT(= NULL);
@@ -1112,6 +1116,10 @@
 EXTERN int	echo_wid_arg INIT(= FALSE);	/* --echo-wid argument */
 #endif
 
+#ifdef FEAT_GUI_KDE
+EXTERN int	echo_wid_arg INIT(= FALSE);
+# endif
+
 #ifdef FEAT_CLIENTSERVER
 EXTERN char_u	*serverName INIT(= NULL);	/* name of the server */
 EXTERN int	received_from_client INIT(= FALSE);	/* received text from
@@ -1321,7 +1329,7 @@
 #endif
 EXTERN char_u e_secure[]	INIT(=N_("E523: Not allowed here"));
 #if defined(AMIGA) || defined(MACOS) || defined(MSWIN) || defined(RISCOS) \
-	|| defined(UNIX) || defined(VMS)
+	|| defined(UNIX) || defined(VMS) || defined(OS2)
 EXTERN char_u e_screenmode[]	INIT(=N_("E359: Screen mode setting not supported"));
 #endif
 EXTERN char_u e_scroll[]	INIT(=N_("E49: Invalid scroll size"));
diff --git a/src/gui.c b/src/gui.c
index 3ffa225..c8930d8 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -97,7 +97,7 @@
 
     vim_free(old_term);
 
-#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
+#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_KDE)
     if (gui.in_use)
 	/* Display error messages in a dialog now. */
 	display_errors();
@@ -531,7 +531,7 @@
 	/* Our GUI can't do bidi. */
 	p_tbidi = FALSE;
 #endif
-#ifdef FEAT_GUI_GTK
+#if defined FEAT_GUI_GTK || defined FEAT_GUI_KDE
 	/* Give GTK+ a chance to put all widget's into place. */
 	gui_mch_update();
 	/* Now make sure the shell fits on the screen. */
@@ -575,7 +575,7 @@
     gui_mch_exit(rc);
 }
 
-#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_MSWIN) \
+#if defined(FEAT_GUI_KDE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_MSWIN) \
 	|| defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) || defined(PROTO)
 /*
  * Called when the GUI shell is closed by the user.  If there are no changed
@@ -1058,7 +1058,7 @@
     void
 gui_position_menu()
 {
-# if !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF)
+# if !defined(FEAT_GUI_KDE) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF)
     if (gui.menu_is_active && gui.in_use)
 	gui_mch_set_menu_pos(0, 0, gui.menu_width, gui.menu_height);
 # endif
@@ -1164,6 +1164,7 @@
     if (gui.menu_is_active)
 	base_height += gui.menu_height;
 # endif
+#ifndef FEAT_GUI_KDE
 # ifdef FEAT_TOOLBAR
     if (vim_strchr(p_go, GO_TOOLBAR) != NULL)
 #  if defined(FEAT_GUI_MSWIN) && defined(FEAT_TOOLBAR)
@@ -1172,6 +1173,7 @@
 	base_height += gui.toolbar_height;
 #  endif
 # endif
+#endif
 # ifdef FEAT_FOOTER
     if (vim_strchr(p_go, GO_FOOTER) != NULL)
 	base_height += gui.footer_height;
@@ -1680,7 +1682,7 @@
      * We need to make sure this is cleared since Athena doesn't tell us when
      * he is done dragging.  Do the same for GTK.
      */
-#if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK)
+#if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
     gui.dragged_sb = SBAR_NONE;
 #endif
 
@@ -2071,7 +2073,7 @@
     if (back != 0 && ((draw_flags & DRAW_BOLD) || (highlight_mask & HL_ITALIC)))
 	return FAIL;
 
-#if defined(RISCOS) || defined(HAVE_GTK2)
+#if defined(RISCOS) || defined(HAVE_GTK2) || defined(FEAT_GUI_KDE)
     /* If there's no italic font, then fake it.
      * For GTK2, we don't need a different font for italic style. */
     if (hl_mask_todo & HL_ITALIC)
@@ -2141,7 +2143,7 @@
 	    /* print the string so far if it's the last character or there is
 	     * a composing character. */
 	    if (i + cl >= len || (comping && i > start) || dowide
-#  if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+#  if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined (FEAT_GUI_KDE)
 		    || (cn > 1
 #   ifdef FEAT_XFONTSET
 			/* No fontset: At least draw char after wide char at
@@ -2173,8 +2175,9 @@
 		    start += cl;
 		}
 
-#  if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
-		/* No fontset: draw a space to fill the gap after a wide char */
+#  if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
+		/* No fontset: draw a space to fill the gap after a wide char
+		 * */
 		if (cn > 1 && (draw_flags & DRAW_TRANSP) == 0
 #   ifdef FEAT_XFONTSET
 			&& fontset == NOFONTSET
@@ -4056,8 +4059,9 @@
     if (*name == NUL)
 	return INVALCOLOR;
     t = gui_mch_get_color(name);
+
     if (t == INVALCOLOR
-#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
 	    && gui.in_use
 #endif
 	    )
@@ -4183,7 +4187,6 @@
 	add_to_input_buf(st, 8);
 	st[3] = (char_u)MOUSE_RELEASE;
 	add_to_input_buf(st, 8);
-
 #ifdef FEAT_GUI_GTK
 	/* Need to wake up the main loop */
 	if (gtk_main_level() > 0)
@@ -4301,7 +4304,7 @@
 }
 
 #if ((defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) \
-	|| defined(FEAT_GUI_PHOTON)) && defined(FEAT_TOOLBAR)) || defined(PROTO)
+	|| defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_KDE)) && defined(FEAT_TOOLBAR)) || defined(PROTO)
 /*
  * This is shared between Athena, Motif and GTK.
  */
@@ -4364,7 +4367,7 @@
 # endif
 #endif
 
-#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(PROTO)
+#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) || defined(FEAT_GUI_X11) || defined(PROTO)
     void
 display_errors()
 {
@@ -4410,7 +4413,7 @@
 
 #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MOTIF) \
 	|| defined(MSWIN_FIND_REPLACE) || defined(FEAT_SUN_WORKSHOP) \
-	|| defined(PROTO)
+	|| defined(PROTO) || defined(FEAT_GUI_KDE)
 /*
  * Update the current window and the screen.
  */
@@ -4428,7 +4431,7 @@
 #endif
 
 #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MOTIF) \
-	|| defined(MSWIN_FIND_REPLACE) || defined(PROTO)
+	|| defined(MSWIN_FIND_REPLACE) || defined(PROTO) || defined(FEAT_GUI_KDE)
 static void concat_esc __ARGS((garray_T *gap, char_u *text, int what));
 
 /*
diff --git a/src/gui.h b/src/gui.h
index 4357c46..02028f2 100644
--- a/src/gui.h
+++ b/src/gui.h
@@ -30,6 +30,23 @@
 # include "gui_beval.h"
 #endif
 
+#ifdef FEAT_GUI_KDE
+# include <X11/Intrinsic.h>
+
+/* used only as pointer to, so casting to int is ok */
+# ifdef __cplusplus
+class QScrollBar;
+class QPopupMenu;
+class QFont;
+class VimWidget;
+# else
+#  define QScrollBar int
+#  define QPopupMenu int
+#  define QFont int
+#  define VimWidget  int
+# endif
+#endif
+
 #ifdef FEAT_GUI_GTK
 # include <X11/Intrinsic.h>
 # include <gtk/gtk.h>
@@ -85,7 +102,7 @@
  * GUIs that support dropping files on a running Vim.
  */
 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MAC) \
-	|| defined(FEAT_GUI_BEOS) || defined(FEAT_GUI_GTK)
+	|| defined(FEAT_GUI_BEOS) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
 # define HAVE_DROP_FILE
 #endif
 
@@ -152,7 +169,7 @@
 #define DRAW_TRANSP		0x01	/* draw with transparant bg */
 #define DRAW_BOLD		0x02	/* draw bold text */
 #define DRAW_UNDERL		0x04	/* draw underline text */
-#if defined(RISCOS) || defined(HAVE_GTK2)
+#if defined(RISCOS) || defined(HAVE_GTK2) || defined (FEAT_GUI_KDE)
 # define DRAW_ITALIC		0x08	/* draw italic text */
 #endif
 #define DRAW_CURSOR		0x10	/* drawing block cursor (win32) */
@@ -171,7 +188,7 @@
 #endif
 #define TOOLBAR_BORDER_HEIGHT	12  /* room above+below buttons for MSWindows */
 
-#if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
+#if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) || defined(FEAT_GUI_X11)
 # define NO_CONSOLE_INPUT	/* use no_console_input() to check if there
 				   is no console input possible */
 #endif
@@ -195,6 +212,9 @@
     int		width;		/* Current width of scroll bar in cols */
 #endif
     int		status_height;	/* Height of status line */
+#ifdef FEAT_GUI_KDE
+    QScrollBar *w;
+#endif
 #ifdef FEAT_GUI_X11
     Widget	id;		/* Id of real scroll bar */
 #endif
@@ -231,6 +251,12 @@
 				   displays there is a tiny chance this is an
 				   actual color */
 
+#ifdef FEAT_GUI_KDE
+  typedef QFont		*GuiFont;
+  typedef QFont		*GuiFontset;
+# define NOFONT		(GuiFont)NULL
+# define NOFONTSET	(GuiFontset)NULL
+#endif
 #ifdef FEAT_GUI_GTK
 # ifdef HAVE_GTK2
   typedef PangoFontDescription	*GuiFont;       /* handle for a GUI font */
@@ -254,10 +280,12 @@
 #   define NOFONT	(GuiFont)0
 #   define NOFONTSET	(GuiFontset)0
 #  else
+#   if !defined(FEAT_GUI_KDE)
   typedef long_u	GuiFont;	/* handle for a GUI font */
   typedef long_u	GuiFontset;	/* handle for a GUI fontset */
 #   define NOFONT	(GuiFont)0
 #   define NOFONTSET	(GuiFontset)0
+#   endif
 #  endif
 # endif
 #endif
@@ -375,6 +403,13 @@
     Bool	color_approx;	    /* Some color was approximated */
 #endif
 
+#ifdef FEAT_GUI_KDE
+    VimWidget   *w;                 /* Vim widget */
+    Display     *dpy;               /* X display */
+    QFont	*current_font;
+    char_u	*fontname;	    /* font name from font selection dialog */
+#endif
+
 #ifdef FEAT_GUI_GTK
     int		visibility;	    /* Is shell partially/fully obscured? */
     GdkCursor	*blank_pointer;	    /* Blank pointer */
@@ -507,7 +542,7 @@
 }
 gui_win_pos_T;
 
-#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
+#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) \
 	|| defined(MSWIN_FIND_REPLACE)
 /*
  * Flags used to distinguish the different contexts in which the
diff --git a/src/gui_kde.cc b/src/gui_kde.cc
new file mode 100644
index 0000000..772e457
--- /dev/null
+++ b/src/gui_kde.cc
@@ -0,0 +1,587 @@
+/* vi:set ts=8 sts=0 sw=8:
+ *
+ * VIM - Vi IMproved		by Bram Moolenaar
+ *
+ * Do ":help uganda"  in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ */
+
+/*
+ * Porting to KDE(2) was done by
+ *
+ *  (C) 2000 by Thomas Capricelli <orzel@freehackers.org>
+ *
+ *  Please visit http://freehackers.org/kvim for other vim- or
+ *  kde-related coding.
+ *
+ *  $Id$
+ *
+ */
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <kmenubar.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+
+#include <qscrollbar.h>
+#include <qcursor.h>
+#include <qmessagebox.h>
+#include <qiconset.h>
+#include <qtextcodec.h>
+#include "gui_kde_widget.h"
+
+extern "C" {
+#include "vim.h"
+}
+
+#undef dbf
+#undef db
+#undef mputs
+
+#if 1
+#define dbf( format, args... ) { printf( "%s" " : " format "\n" , __FUNCTION__ , ## args ); fflush(stdout); }
+#define db()       { printf( "%s\n", __FUNCTION__ );fflush(stdout); }
+#else
+#define dbf(format, args... )
+#define db()
+#endif
+
+
+#ifdef FEAT_TOOLBAR
+#ifndef FEAT_KDETOOLBAR
+/*
+ * Icons used by the toolbar code.
+ *///{{{
+#include "../pixmaps/tb_new.xpm"
+#include "../pixmaps/tb_open.xpm"
+#include "../pixmaps/tb_close.xpm"
+#include "../pixmaps/tb_save.xpm"
+#include "../pixmaps/tb_print.xpm"
+#include "../pixmaps/tb_cut.xpm"
+#include "../pixmaps/tb_copy.xpm"
+#include "../pixmaps/tb_paste.xpm"
+#include "../pixmaps/tb_find.xpm"
+#include "../pixmaps/tb_find_next.xpm"
+#include "../pixmaps/tb_find_prev.xpm"
+#include "../pixmaps/tb_find_help.xpm"
+#include "../pixmaps/tb_exit.xpm"
+#include "../pixmaps/tb_undo.xpm"
+#include "../pixmaps/tb_redo.xpm"
+#include "../pixmaps/tb_help.xpm"
+#include "../pixmaps/tb_macro.xpm"
+#include "../pixmaps/tb_make.xpm"
+#include "../pixmaps/tb_save_all.xpm"
+#include "../pixmaps/tb_jump.xpm"
+#include "../pixmaps/tb_ctags.xpm"
+#include "../pixmaps/tb_load_session.xpm"
+#include "../pixmaps/tb_save_session.xpm"
+#include "../pixmaps/tb_new_session.xpm"
+#include "../pixmaps/tb_blank.xpm"
+#include "../pixmaps/tb_maximize.xpm"
+#include "../pixmaps/tb_split.xpm"
+#include "../pixmaps/tb_minimize.xpm"
+#include "../pixmaps/tb_shell.xpm"
+#include "../pixmaps/tb_replace.xpm"
+#include "../pixmaps/tb_vsplit.xpm"
+#include "../pixmaps/tb_maxwidth.xpm"
+#include "../pixmaps/tb_minwidth.xpm"
+//}}}
+/*
+ * These are the pixmaps used for the default buttons.
+ * Order must exactly match toolbar_names[] in menu.c!
+ *///{{{
+static char **(built_in_pixmaps[]) =
+{
+	tb_new_xpm,
+	tb_open_xpm,
+	tb_save_xpm,
+	tb_undo_xpm,
+	tb_redo_xpm,
+	tb_cut_xpm,
+	tb_copy_xpm,
+	tb_paste_xpm,
+	tb_print_xpm,
+	tb_help_xpm,
+	tb_find_xpm,
+	tb_save_all_xpm,
+	tb_save_session_xpm,
+	tb_new_session_xpm,
+	tb_load_session_xpm,
+	tb_macro_xpm,
+	tb_replace_xpm,
+	tb_close_xpm,
+	tb_maximize_xpm,
+	tb_minimize_xpm,
+	tb_split_xpm,
+	tb_shell_xpm,
+	tb_find_prev_xpm,
+	tb_find_next_xpm,
+	tb_find_help_xpm,
+	tb_make_xpm,
+	tb_jump_xpm,
+	tb_ctags_xpm,
+	tb_vsplit_xpm,
+	tb_maxwidth_xpm,
+	tb_minwidth_xpm,
+	tb_exit_xpm
+};//}}}
+#else
+const char *kdeicons[] = {
+	"filenew",
+	"fileopen",
+	"filesave",
+	"undo",
+	"redo",
+	"editcut",
+	"editcopy",
+	"editpaste",
+	"fileprint",
+	"contents2",
+	"filefind",
+	"save_all",
+	"fileexport",
+	"filenew",
+	"fileimport",
+	"run",
+	"edit",
+	"fileclose",
+	"",
+	"",
+	"split",
+	"openterm",
+	"previous",
+	"next",
+	"help",
+	"make",
+	"goto",
+	"run",
+	"vsplit",
+	"maxwidth",
+	"minwidth",
+	"quit"
+};
+#endif
+/*
+ * creates a blank pixmap using tb_blank
+ */
+	QPixmap
+pixmap_create_from_xpm(char **xpm)//{{{
+{
+	return(QPixmap((const char **)xpm));
+}//}}}
+
+/*
+ * creates a pixmap by using a built-in number
+ */
+	QPixmap
+pixmap_create_by_num(int pixmap_num)//{{{
+{
+#ifdef FEAT_KDETOOLBAR
+	if (pixmap_num >= 0 && (unsigned)pixmap_num < (sizeof(kdeicons)
+				/ sizeof(kdeicons[0])) - 1) {
+
+		KIconLoader *il = kapp->iconLoader(); //new KIconLoader();
+		QString icon;
+		icon=QString(kdeicons[pixmap_num]);
+		return il->loadIcon(icon,KIcon::MainToolbar);
+	}
+	return QPixmap();
+#else
+	if (pixmap_num >= 0 && (unsigned)pixmap_num < (sizeof(built_in_pixmaps)
+				/ sizeof(built_in_pixmaps[0])) - 1)
+		return pixmap_create_from_xpm(built_in_pixmaps[pixmap_num]);
+	else return QPixmap();
+#endif
+}//}}}
+
+/*
+ * Creates a pixmap by using the pixmap "name" found in 'runtimepath'/bitmaps/
+ */
+	QPixmap
+pixmap_create_by_dir(char_u *name)//{{{
+{
+	char_u full_pathname[MAXPATHL + 1];
+
+	if (gui_find_bitmap(name, full_pathname, "xpm") == OK) {
+		return QPixmap((const char *)full_pathname);
+	}
+	else return QPixmap();
+}//}}}
+
+
+	QPixmap
+pixmap_create_from_file(char_u *file)
+{
+	return QPixmap((const char*)file);
+}
+#endif
+
+	void
+gui_mch_add_menu(vimmenu_T * menu, int idx)//{{{
+{
+#ifdef FEAT_MENU
+	QPopupMenu *me;
+	vimmenu_T *parent = menu->parent;
+
+	if (menu_is_popup(menu->name)) {
+		menu->widget = new QPopupMenu(vmw , (const char *) menu->name);
+		QObject::connect( menu->widget, SIGNAL(activated(int)), vmw, SLOT(menu_activated(int)) );
+		return;
+	}
+
+	if (!menu_is_menubar(menu->name))
+		return;
+
+	if (parent) {
+		idx++; // for tearoffs to be first in menus
+		me = new QPopupMenu(parent->widget, (const char *) menu->name);
+		parent->widget->insertItem( QString((const char *)menu->name), me, (int)me, idx);
+	} else {
+		me = new QPopupMenu(vmw->menuBar() , (const char *) menu->name);
+		vmw->menuBar()->insertItem( QString((const char *)menu->name), me , (int) me, idx);
+	}
+
+	me->setCaption((const char*)( menu->dname  ));
+	if (vmw->have_tearoff) me->insertTearOffHandle(0,0);
+	QObject::connect( me, SIGNAL(activated(int)), vmw, SLOT(menu_activated(int)) );
+	menu->widget = me;
+#endif
+}//}}}
+
+
+	void
+gui_mch_add_menu_item(vimmenu_T * menu, int idx)//{{{
+{
+#ifdef FEAT_MENU
+	vimmenu_T *parent = menu->parent;
+#ifdef FEAT_TOOLBAR
+	if (menu_is_toolbar(parent->name)) {
+		QPixmap pix;
+		if ( menu_is_separator(menu->name) )
+		{
+			vmw->toolBar()->insertSeparator();
+			return;
+		}
+		if (menu->iconfile != NULL) {
+			pix = pixmap_create_from_file(menu->iconfile);
+		}
+		if (!menu->icon_builtin) {
+			pix = pixmap_create_by_dir(menu->name);
+		}
+		if (pix.isNull() && menu->iconidx >= 0) {
+			pix = pixmap_create_by_num(menu->iconidx);
+		}
+#ifndef FEAT_KDETOOLBAR
+		if (pix.isNull()) {
+			pix = pixmap_create_from_xpm(tb_blank_xpm);
+		}
+#endif
+		if (pix.isNull()) return; // failed
+		vmw->toolBar()->insertButton (
+				pix,
+				(int) menu , // id
+				true,
+				(char *) (menu->strings[MENU_INDEX_TIP]) , // tooltip or text
+				idx
+				);
+		menu->parent=parent;
+		return;
+	}
+#endif // FEAT_TOOLBAR
+
+	idx++;
+	if ( menu_is_separator(menu->name) ) {
+		parent->widget->insertSeparator();
+		return;
+	}
+	parent->widget->insertItem(QString((const char *)menu->name), (int)menu, idx );
+#endif
+}//}}}
+
+
+	void
+gui_mch_set_text_area_pos(int x, int y, int w, int h)//{{{
+{
+	int X = 0;
+	int Y = 0;
+	if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled()
+#if QT_VERSION>=300
+		       	&& !vmw->menuBar()->isTopLevelMenu()
+#endif
+			)
+		Y += vmw->menuBar()->height();
+#ifdef FEAT_TOOLBAR
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+			vmw->toolBar()->barPos()==KToolBar::Top)
+		Y += vmw->toolBar()->height();
+
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+			vmw->toolBar()->barPos()==KToolBar::Left)
+		X += vmw->toolBar()->width();
+#endif // FEAT_TOOLBAR
+
+	gui.w->setGeometry(x+X,y+Y,w,h);
+}//}}}
+
+
+#if defined(FEAT_MENU) || defined(PROTO)
+/*
+ * Enable or disable mnemonics for the toplevel menus.
+ */
+	void
+gui_gtk_set_mnemonics(int enable)//{{{ // TO BE REMOVED
+{
+}//}}}
+
+	void
+toggle_tearoffs(vimmenu_T *menu, int enable)//{{{
+{
+	while (menu != NULL) {
+		if (!menu_is_popup(menu->name)) {
+			if (menu->widget != 0) {
+				if (enable) menu->widget->insertTearOffHandle(0,0);
+				else menu->widget->removeItem(0);
+			}
+			toggle_tearoffs(menu->children, enable);
+		}
+		menu = menu->next;
+	}
+}//}}}
+
+	void
+gui_mch_toggle_tearoffs(int enable)//{{{
+{
+	vmw->have_tearoff=enable;
+	toggle_tearoffs(root_menu, enable);
+}//}}}
+#endif
+
+
+#if defined(FEAT_MENU) || defined(PROTO)
+/*
+ * Destroy the machine specific menu widget.
+ */
+	void
+gui_mch_destroy_menu(vimmenu_T * menu)//{{{
+{
+#ifdef FEAT_TOOLBAR
+	if (menu->parent && menu_is_toolbar(menu->parent->name)) {
+		vmw->toolBar()->removeItem( (int) menu );
+		return;
+	}
+#endif
+	if(menu->parent){
+		menu->parent->widget->removeItem((int)menu );
+	}
+	if (menu->widget){
+		delete menu->widget;
+	}
+	menu->widget = 0;
+}//}}}
+#endif /* FEAT_MENU */
+
+
+/*
+ * Scrollbar stuff.
+ */
+
+	void
+gui_mch_set_scrollbar_thumb(scrollbar_T * sb, long val, long size, long max)//{{{
+{
+	if (!sb->w) return;
+
+	sb->w->setRange(0, max+1-size);
+	sb->w->setValue(val);
+
+	sb->w->setLineStep(1);
+	sb->w->setPageStep(size);
+}//}}}
+
+	void
+gui_mch_set_scrollbar_pos(scrollbar_T * sb, int x, int y, int w, int h)//{{{
+{
+	if (!sb->w) return;
+	//we add the menubar and toolbar height/width
+	int X = 0;
+	int Y = 0;
+
+	if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled()
+#if QT_VERSION>=300
+		       	&& !vmw->menuBar()->isTopLevelMenu()
+#endif
+			)
+		Y += vmw->menuBar()->height();
+#ifdef FEAT_TOOLBAR
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+			vmw->toolBar()->barPos()==KToolBar::Top)
+		Y += vmw->toolBar()->height();
+
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+			vmw->toolBar()->barPos()==KToolBar::Left)
+		X += vmw->toolBar()->width();
+#endif //FEAT_TOOLBAR
+	if (sb->w->orientation() == Qt::Vertical) {
+		bool leftscroll=gui.which_scrollbars[SBAR_LEFT];
+		bool rightscroll=gui.which_scrollbars[SBAR_RIGHT];
+		if (x<20)  leftscroll=true;
+		else rightscroll=true;
+		if (x<20) sb->w->setGeometry(X,y+Y,w,h);
+		else sb->w->setGeometry(vmw->width()-w-1+X, y+Y,w,h);
+	} else {
+		sb->w->setGeometry(x+X,y+Y,w,h);
+	}
+}//}}}
+
+/* SBAR_VERT or SBAR_HORIZ */
+	void
+gui_mch_create_scrollbar(scrollbar_T * sb, int orient)//{{{
+{
+	sbpool->create(sb,orient);
+	if (orient==SBAR_VERT)
+		gui.scrollbar_width = sb->w->sizeHint().width();
+	else
+		gui.scrollbar_height = sb->w->sizeHint().height();
+}//}}}
+
+	void
+gui_mch_destroy_scrollbar(scrollbar_T * sb)//{{{
+{
+	sbpool->destroy(sb);
+}//}}}
+
+#if defined(FEAT_BROWSE) || defined(PROTO)
+/*
+ * Implementation of the file selector related stuff
+ */
+
+/*
+ * Put up a file requester.
+ * Returns the selected name in allocated memory, or NULL for Cancel.
+ * saving,			select file to write
+ * title			title for the window
+ * dflt				default name
+ * ext				not used (extension added)
+ * initdir			initial directory, NULL for current dir
+ * filter			not used (file name filter)
+ */
+/*ARGSUSED*/
+char_u *
+gui_mch_browse(int saving,//{{{
+		char_u * title,
+		char_u * dflt,
+		char_u * ext,
+		char_u * initdir,
+		char_u * filter)
+{
+	char * filt_glob;
+	if (filter != (char_u *) 0x0 ) {
+		filter = vim_strsave(filter);
+		strtok((char *) filter, "(");
+		filt_glob = strtok(0L, ")");
+	} else
+		filt_glob = (char *) filter;
+	
+	gui_mch_mousehide(FALSE);
+
+	QString s;
+	if (! saving)
+		s = KFileDialog::getOpenFileName( (char *) initdir, (char *) filt_glob, vmw, (char *) title );
+	else
+		s = KFileDialog::getSaveFileName( );
+	
+	if (filter)
+		vim_free(filter);
+
+	if (s.isNull())
+		return NULL;
+	QCString unistring = vmw->codec->fromUnicode(s);
+	char_u * s2 = (char_u *)(const char*)unistring;
+	if (s2)
+		s2 = vim_strsave( s2 );
+
+	return s2;
+}//}}}
+
+#endif	/* FEAT_BROWSE */
+
+#ifdef FEAT_GUI_DIALOG
+
+/* ARGSUSED */
+int
+gui_mch_dialog(int type,		/* type of dialog *///{{{
+		char_u * title,		/* title of dialog */
+		char_u * message,	/* message text */
+		char_u * buttons,	/* names of buttons */
+		int def_but,		/* default button */
+		char_u *textfield)
+{
+	gui_mch_mousehide(FALSE);
+	VimDialog vd(type, title, message, buttons, def_but,textfield);
+	int ret = vd.exec();
+	return ret;
+}//}}}
+
+
+#endif	/* FEAT_GUI_DIALOG */
+
+#if defined(FEAT_MENU) || defined(PROTO)
+	void
+gui_mch_show_popupmenu(vimmenu_T * menu)//{{{
+{
+	menu->widget->popup(QCursor::pos());
+}//}}}
+
+void
+gui_make_popup (char_u *pathname) {//{{{
+	vimmenu_T *menu = gui_find_menu(pathname);
+
+	if (menu != NULL) {
+		menu->widget->popup(QCursor::pos());
+	}
+}//}}}
+#endif
+
+
+
+/* Find and Replace implementations */
+	void
+gui_mch_find_dialog(exarg_T * eap)//{{{
+{
+	// char_u* entry_text;
+	//int exact_word=FALSE;
+	//    entry_text = get_find_dialog_text(eap->arg,&exact_word);
+
+	vmw->finddlg->setCaseSensitive(true);
+
+	/*    if(entry_text!=NULL) {
+	      vmw->finddlg->setText(QString((char*)entry_text));
+	// exact match should go there, hopefully KDE old KEdFind/KEdReplace will be replaced in KDE 4 as pple wanted KDE 3's Find/Replace to be kept
+	}*/ // Don't use it, KDE keeps old search in memory and vim give \\Csearch, which is difficult to handle
+	//   vim_free(entry_text);
+
+	vmw->finddlg->show();
+}//}}}
+
+	void
+gui_mch_replace_dialog(exarg_T * eap)//{{{
+{
+	//  char_u* entry_text;
+	//int exact_word=FALSE;
+
+	//    entry_text = get_find_dialog_text(eap->arg,&exact_word);
+
+	/*    if(entry_text!=NULL) {
+	      vmw->repldlg->setText(QString((char*)entry_text));
+	// exact match should go there, hopefully KDE old KEdFind/KEdReplace will be replaced in KDE 4 as pple wanted KDE 3's Find/Replace to be kept
+	}*/
+	//vim_free(entry_text);
+
+	vmw->repldlg->show();
+}//}}}
+
+	void
+ex_helpfind(exarg_T *eap)//{{{
+{
+	do_cmdline_cmd((char_u *)"emenu ToolBar.FindHelp");
+}//}}}
diff --git a/src/gui_kde_widget.cc b/src/gui_kde_widget.cc
new file mode 100644
index 0000000..c2e9e7c
--- /dev/null
+++ b/src/gui_kde_widget.cc
@@ -0,0 +1,1396 @@
+/* vi:set ts=8 sts=4 sw=4:
+ *
+ * VIM - Vi IMproved		by Bram Moolenaar
+ *
+ * Do ":help uganda"  in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ */
+
+/*
+ * Porting to KDE(2) was done by
+ *
+ *  (C) 2000 by Thomas Capricelli <orzel@freehackers.org>
+ *
+ *  Please visit http://freehackers.org/kvim for other vim- or
+ *  kde-related coding.
+ *
+ *  $Id$
+ *
+ */
+
+#include <assert.h>
+#include <qpainter.h>
+#include <qevent.h>
+#include <qpushbutton.h>
+#include <qscrollbar.h>
+#include <qlayout.h>
+#include <qclipboard.h>
+#include <qdragobject.h>
+#include <qstrlist.h>
+#include <qmenubar.h>
+#include <qtextcodec.h>
+#if QT_VERSION>=300
+#include <qptrlist.h>
+#include <ktip.h>
+#endif
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kaboutapplication.h>
+#include <dcopclient.h>
+#include <kaboutkde.h>
+#include <kbugreport.h>
+#include <kurldrag.h>
+#include <kmenubar.h>
+#include <ktoolbar.h>
+#include <kstandarddirs.h>
+#include "gui_kde_widget.h"
+#include <qxembed.h>
+
+extern "C" {
+#include "version.h"
+}
+
+// Pixmap for dialog
+#ifdef FEAT_GUI_DIALOG
+# include "../../pixmaps/alert.xpm"
+# include "../../pixmaps/error.xpm"
+# include "../../pixmaps/generic.xpm"
+# include "../../pixmaps/info.xpm"
+# include "../../pixmaps/quest.xpm"
+#endif
+
+/**
+ * Keycodes recognized by vim.
+ */
+struct special_key {//{{{
+    int qtkey;
+    char_u code0;
+    char_u code1;
+} special_keys[] =
+{
+    { Qt::Key_Up,		'k', 'u' },
+    { Qt::Key_Down,		'k', 'd' },
+    { Qt::Key_Left,		'k', 'l' },
+    { Qt::Key_Right,		'k', 'r' },
+    { Qt::Key_F1,		'k', '1' },
+    { Qt::Key_F2,		'k', '2' },
+    { Qt::Key_F3,		'k', '3' },
+    { Qt::Key_F4,		'k', '4' },
+    { Qt::Key_F5,		'k', '5' },
+    { Qt::Key_F6,		'k', '6' },
+    { Qt::Key_F7,		'k', '7' },
+    { Qt::Key_F8,		'k', '8' },
+    { Qt::Key_F9,		'k', '9' },
+    { Qt::Key_F10,		'k', ';' },
+    { Qt::Key_F11,		'F', '1' },
+    { Qt::Key_F12,		'F', '2' },
+    { Qt::Key_F13,		'F', '3' },
+    { Qt::Key_F14,		'F', '4' },
+    { Qt::Key_F15,		'F', '5' },
+    { Qt::Key_F16,		'F', '6' },
+    { Qt::Key_F17,		'F', '7' },
+    { Qt::Key_F18,		'F', '8' },
+    { Qt::Key_F19,		'F', '9' },
+    { Qt::Key_F20,		'F', 'A' },
+    { Qt::Key_F21,		'F', 'B' },
+    { Qt::Key_F22,		'F', 'C' },
+    { Qt::Key_F23,		'F', 'D' },
+    { Qt::Key_F24,		'F', 'E' },
+    { Qt::Key_F25,		'F', 'F' },
+    { Qt::Key_F26,		'F', 'G' },
+    { Qt::Key_F27,		'F', 'H' },
+    { Qt::Key_F28,		'F', 'I' },
+    { Qt::Key_F29,		'F', 'J' },
+    { Qt::Key_F30,		'F', 'K' },
+    { Qt::Key_F31,		'F', 'L' },
+    { Qt::Key_F32,		'F', 'M' },
+    { Qt::Key_F33,		'F', 'N' },
+    { Qt::Key_F34,		'F', 'O' },
+    { Qt::Key_F35,		'F', 'P' },
+    { Qt::Key_Help,		'%', '1' },
+    //    { Qt::Key_Undo,		'&', '8' }, <= hmmm ?
+    { Qt::Key_BackSpace,	'k', 'b' },
+    { Qt::Key_Insert,		KS_EXTRA, KE_KINS },
+    { Qt::Key_Delete,		KS_EXTRA, KE_KDEL },
+    { Qt::Key_Home,		'K', '1' },
+    { Qt::Key_End,		'K', '4' },
+    { Qt::Key_Prior,		'K', '3' },
+    { Qt::Key_Next,		'K', '5' },
+    { Qt::Key_Print,		'%', '9' },
+
+    { Qt::Key_Plus,	'K', '6'},
+    { Qt::Key_Minus,	'K', '7'},
+    { Qt::Key_Slash,	'K', '8'},
+    { Qt::Key_multiply,	'K', '9'},
+    { Qt::Key_Enter,	'K', 'A'},
+    { Qt::Key_Period,	'K', 'B'},
+
+    { Qt::Key_0,	'K', 'C'},
+    { Qt::Key_1,	'K', 'D'},
+    { Qt::Key_2,	'K', 'E'},
+    { Qt::Key_3,	'K', 'F'},
+    { Qt::Key_4,	'K', 'G'},
+    { Qt::Key_5,	'K', 'H'},
+    { Qt::Key_6,	'K', 'I'},
+    { Qt::Key_7,	'K', 'J'},
+    { Qt::Key_8,	'K', 'K'},
+    { Qt::Key_9,	'K', 'L'},
+    /* End of list marker: */
+    { 0, 0, 0 }
+};//}}}
+
+#ifdef FEAT_CLIENTSERVER
+typedef int (*QX11EventFilter) (XEvent*);
+extern QX11EventFilter qt_set_x11_event_filter (QX11EventFilter filter);
+static QX11EventFilter oldFilter = 0;
+static int kvim_x11_event_filter( XEvent* e);
+#endif
+void gui_keypress(QKeyEvent *e);
+
+/*
+ * Return OK if the key with the termcap name "name" is supported.
+ */
+    int
+gui_mch_haskey(char_u * name)//{{{
+{
+    for (int i=0; special_keys[i].qtkey != 0; i++)
+	if (name[0] == special_keys[i].code0 &&
+		name[1] == special_keys[i].code1)
+	    return OK;
+    return FAIL;
+}//}}}
+
+/*
+ * custom Frame for drawing ...
+ */
+void VimWidget::paintEvent( QPaintEvent *e)//{{{
+{
+    QRect r = e->rect();
+    gui_redraw(r.x(), r.y(), r.width(), r.height() );
+}//}}}
+
+void VimWidget::draw_string(int x, int y, QString s, int len, int flags)//{{{
+{
+    gui.current_font->setBold( flags & DRAW_BOLD );
+    gui.current_font->setUnderline( flags & DRAW_UNDERL );
+    gui.current_font->setItalic(flags & DRAW_ITALIC);
+    painter->setBackgroundMode( flags & DRAW_TRANSP ? Qt::TransparentMode : Qt::OpaqueMode);
+    painter->setFont( *(gui.current_font) );
+    painter->drawText( x, y, s, len);
+}//}}}
+
+void VimWidget::mousePressEvent(QMouseEvent *event)//{{{
+{
+    int button=0;
+    int modifiers=0;
+    ButtonState state = event->state();
+    ButtonState buttons = event->button();
+
+    //Look at button states
+    if(buttons & QMouseEvent::LeftButton) {
+	button|=MOUSE_LEFT;
+    }
+    if(buttons & QMouseEvent::RightButton) {
+	button|=MOUSE_RIGHT;
+    }
+    if(buttons & QMouseEvent::MidButton) {
+	button|=MOUSE_MIDDLE;
+    }
+    //Look for keyboard modifiers
+    if(state & QMouseEvent::ShiftButton) {
+	modifiers|=MOUSE_SHIFT;
+    }
+    if(state & QMouseEvent::ControlButton){
+	modifiers|=MOUSE_CTRL;
+    }
+    if(state & QMouseEvent::AltButton){
+	modifiers|=MOUSE_ALT;
+    }
+    gui_send_mouse_event(button,event->x(),event->y(),FALSE,modifiers);
+#if QT_VERSION>=300
+    QByteArray params;
+    QDataStream stream(params, IO_WriteOnly);
+    stream << kapp->dcopClient()->appId() << button << modifiers << gui.row << gui.col;
+    kapp->dcopClient()->emitDCOPSignal("mousePEvent(QCString,int,int,int,int)", params);
+#endif
+    event->accept();
+}//}}}
+
+#if defined(FEAT_SESSION)
+void VimMainWindow::saveGlobalProperties (KConfig *conf)
+{
+    //we write a mksession file to a file written in the user's ~/.kde/share/config/
+    //the name of the file in saved in 'conf'
+    //when restoring app, we source this file
+#if 0 //disabled for release
+    QString filename = KGlobal::dirs()->localkdedir() + KGlobal::dirs()->kde_default("config") + kapp->randomString(10);
+    QString cmd("mksession ");
+    cmd+=filename;
+    do_cmdline_cmd((char_u*)cmd.latin1());
+    conf->writePathEntry("sessionfile", filename);
+    conf->sync();
+#endif
+}
+
+void VimMainWindow::readGlobalProperties (KConfig *conf)
+{
+#if 0
+    QString filename = conf->readPathEntry("sessionfile");
+    if (filename.isNull()) return;
+    QString cmd("source ");
+    cmd+=filename;
+    do_cmdline_cmd((char_u*)cmd.latin1());
+#endif
+}
+#endif
+
+void VimMainWindow::wheelEvent (QWheelEvent *event)//{{{
+{
+    ButtonState state = event->state();
+    int button=0;
+    int modifiers=0;
+
+    if (event->delta()>0)
+	button|=MOUSE_4;
+    else button|=MOUSE_5;
+
+    if(state & ShiftButton)
+	modifiers|=MOUSE_SHIFT;
+    if(state & ControlButton)
+	modifiers|=MOUSE_CTRL;
+    if(state & AltButton)
+	modifiers|=MOUSE_ALT;
+
+    gui_send_mouse_event(button,event->x(),event->y(),FALSE,modifiers);
+#if QT_VERSION>=300
+    QByteArray params;
+    QDataStream stream(params, IO_WriteOnly);
+    stream << kapp->dcopClient()->appId() << button << modifiers << gui.row << gui.col;
+    kapp->dcopClient()->emitDCOPSignal("mouseWhlEvent(QCString, int, int,int,int)", params);
+#endif
+    event->accept();
+}//}}}
+
+void VimWidget::mouseDoubleClickEvent(QMouseEvent *event)//{{{
+{
+    ButtonState state = event->state();
+    ButtonState buttons = event->button();
+    int modifiers=0;
+    int button=0;
+
+    //Look at button states
+    if(buttons & LeftButton)
+	button|=MOUSE_LEFT;
+    if(buttons & RightButton)
+	button|=MOUSE_RIGHT;
+    if(buttons & MidButton)
+	button|=MOUSE_MIDDLE;
+
+    //Look for keyboard modifiers
+    if(state & ShiftButton)
+	modifiers|=MOUSE_SHIFT;
+    if(state & ControlButton)
+	modifiers|=MOUSE_CTRL;
+    if(state & AltButton)
+	modifiers|=MOUSE_ALT;
+
+    gui_send_mouse_event(button,event->x(),event->y(),TRUE,modifiers);
+#if QT_VERSION>=300
+    QByteArray params;
+    QDataStream stream(params, IO_WriteOnly);
+    stream << kapp->dcopClient()->appId() << button << modifiers << gui.row << gui.col;
+    kapp->dcopClient()->emitDCOPSignal("mouseDblClickEvent(QCString, int, int,int,int)", params);
+#endif
+    event->accept();
+}//}}}
+
+void VimWidget::mouseMoveEvent(QMouseEvent *event){//{{{
+    ButtonState state = event->state();
+    int modifiers=0;
+    int button=0;
+
+    gui_mch_mousehide(FALSE);
+
+    //Look at button states
+    //warning: we use state here, this is important !
+    if(state & QMouseEvent::LeftButton || state & QMouseEvent::RightButton || state & QMouseEvent::MidButton)
+	button|=MOUSE_DRAG;
+
+    //Look for keyboard modifiers
+    if(state & ShiftButton)
+	modifiers|=MOUSE_SHIFT;
+    if(state & ControlButton)
+	modifiers|=MOUSE_CTRL;
+    if(state & AltButton)
+	modifiers|=MOUSE_ALT;
+    if (button!=MOUSE_DRAG)
+	gui_mouse_moved(event->x(),event->y());
+    else
+	gui_send_mouse_event(MOUSE_DRAG,event->x(),event->y(),FALSE,modifiers);
+}//}}}
+
+void VimWidget::mouseReleaseEvent(QMouseEvent *event)//{{{
+{
+    ButtonState state = event->state();
+    int modifiers=0;
+
+    //Look for keyboard modifiers
+    if(state & ShiftButton)
+	modifiers|=MOUSE_SHIFT;
+    if(state & ControlButton)
+	modifiers|=MOUSE_CTRL;
+    if(state & AltButton)
+	modifiers|=MOUSE_ALT;
+
+    gui_send_mouse_event(MOUSE_RELEASE,event->x(),event->y(),FALSE,modifiers);
+    event->accept();
+}//}}}
+
+/*
+ *  The main widget (everything but toolbar/menubar)
+ */
+    VimWidget::VimWidget( QWidget *parent, const char *name, WFlags f )//{{{
+:QWidget(parent, name, f)
+    ,DCOPObject("KVim")
+{
+    //to be able to show/hide the cursor when moving the mouse
+    setMouseTracking(true);
+    painter=new QPainter(this);
+
+    setKeyCompression(true);
+    setFocusPolicy( QWidget::StrongFocus );
+    setAcceptDrops(TRUE); // DND
+    blink_state = BLINK_NONE;
+    blink_on_time = 700;
+    blink_off_time = 400;
+    blink_wait_time = 250;
+    connect( &blink_timer, SIGNAL( timeout() ), SLOT( blink_cursor() ));
+    connect( &wait_timer, SIGNAL( timeout() ), SLOT ( wait_timeout() ));
+}//}}}
+
+void VimWidget::execNormal(QString command)//{{{
+{
+    QString cmd("execute 'normal ");
+    cmd+=command;
+    cmd+="'";
+    QCString unistring = vmw->codec->fromUnicode(cmd);
+    do_cmdline_cmd((char_u *)(const char*)unistring);
+    gui_update_screen();
+}//}}}
+
+void VimWidget::execInsert(QString command)//{{{
+{
+    QString cmd("execute 'normal i");
+    cmd+=command;
+    cmd+="'";
+    QCString unistring = vmw->codec->fromUnicode(cmd);
+    do_cmdline_cmd((char_u *)(const char*)unistring);
+    gui_update_screen();
+}//}}}
+
+void VimWidget::execRaw(QString command)//{{{
+{
+    QString cmd("execute '");
+    cmd+=command;
+    cmd+="'";
+    QCString unistring = vmw->codec->fromUnicode(cmd);
+    do_cmdline_cmd((char_u *)(const char*)unistring);
+    gui_update_screen();
+}//}}}
+
+void VimWidget::execCmd(QString command)//{{{
+{
+    QCString unistring = vmw->codec->fromUnicode(command);
+    do_cmdline_cmd((char_u *)(const char*)unistring);
+    gui_update_screen();
+}//}}}
+
+QString VimWidget::eval(QString expr)//{{{
+{
+#ifdef FEAT_EVAL
+    QCString unistring = vmw->codec->fromUnicode(expr);
+    QString val((const char *)eval_to_string((char_u *)(const char*)unistring,NULL));
+    return val;
+#else
+    return QString::null;
+#endif
+}//}}}
+
+void VimWidget::wait(long wtime)//{{{
+{
+    if ( wait_timer.isActive() ) wait_timer.stop();
+    wait_done = false;
+    wait_timer.start( wtime, true);
+}//}}}
+
+void VimWidget::wait_timeout() //{{{
+{
+    wait_done = true;
+}//}}}
+
+void VimWidget::dragEnterEvent (QDragEnterEvent *e)//{{{
+{
+#if (defined(FEAT_WINDOWS) && defined(HAVE_DROP_FILE)) || defined(PROTO)
+    e->accept(QUriDrag::canDecode(e));
+#else
+    e->ignore();
+#endif
+}//}}}
+
+void VimWidget::dropEvent (QDropEvent *e) // {{{
+{
+#if (defined(FEAT_WINDOWS) && defined(HAVE_DROP_FILE)) || defined(PROTO)
+    QStrList  urls;
+
+    char_u	**fnames;
+    int		redo_dirs = FALSE;
+    int		i;
+    int		n;
+    int		nfiles;
+    int		url = FALSE;
+
+    /* Count how many items there may be and normalize delimiters. */
+
+    if (QUriDrag::decode(e, urls)) {
+	n = urls.count();
+        fnames = (char_u **)lalloc((n+1) * sizeof(char_u *), TRUE);
+	nfiles = 0;
+#if QT_VERSION>=300
+	QPtrListIterator<char> it(urls);
+	for( ; it.current(); ++it ) {
+	    KURL u(*it);
+#else
+	    for (i=0;i<urls.count();++i) {
+		KURL u(urls.at(i));
+#endif
+		if ( !u.isLocalFile() )
+		    url = TRUE;
+		else {
+		    fnames[nfiles] = (char_u *)strdup((const char *)u.path());
+		    ++nfiles;
+		}
+	    }
+	    /* Real files (i.e. not http and not ftp) */
+	    if (url == FALSE)
+	    {
+		if (nfiles == 1)
+		{
+		    if (mch_isdir(fnames[0]))
+		    {
+			/* Handle dropping a directory on Vim. */
+			if (mch_chdir((char *)fnames[0]) == 0)
+			{
+			    free(fnames[0]);
+			    fnames[0] = NULL;
+			    redo_dirs = TRUE;
+			}
+		    }
+		} else {
+		    /* Ignore any directories */
+		    for (i = 0; i < nfiles; ++i)
+		    {
+			if (mch_isdir(fnames[i]))
+			{
+			    vim_free(fnames[i]);
+			    fnames[i] = NULL;
+			}
+		    }
+		}
+
+		if (0)
+		{
+		    /* Shift held down, change to first file's directory */
+		    if (fnames[0] != NULL && vim_chdirfile(fnames[0]) == OK)
+			redo_dirs = TRUE;
+		} else {
+		    char_u	dirname[MAXPATHL];
+		    char_u	*s;
+		    if (mch_dirname(dirname, MAXPATHL) == OK)
+			for (i = 0; i < nfiles; ++i)
+			    if (fnames[i] != NULL)
+			    {
+				s = shorten_fname(fnames[i], dirname);
+				if (s != NULL && (s = vim_strsave(s)) != NULL)
+				{
+				    vim_free(fnames[i]);
+				    fnames[i] = s;
+				}
+			    }
+		}
+	    }
+
+	    /* Handle the drop, :edit or :split to get to the file */
+	    handle_drop(nfiles, fnames, FALSE);
+
+	    if (redo_dirs)
+		shorten_fnames(TRUE);
+	}
+
+	/* Update the screen display */
+	update_screen(NOT_VALID);
+#ifdef FEAT_MENU
+	gui_update_menus(0);
+#endif
+	setcursor();
+	out_flush();
+	gui_update_cursor(FALSE, FALSE);
+	gui_mch_flush();
+#endif
+} // }}}
+
+void VimWidget::keyPressEvent( QKeyEvent *e ) // {{{
+{
+    gui_keypress(e);
+} // }}}
+
+void gui_keypress(QKeyEvent *e) { // {{{
+    int key = (int)e->key();
+    int modifiers = 0,i;
+    uchar string[256],string2[256];
+    uchar *s,*d;
+    Qt::ButtonState state = e->state();
+
+    QCString unistring = vmw->codec->fromUnicode(e->text());
+    if (unistring.length()>0)
+	strncpy((char*)string, (const char*)unistring,unistring.length());
+    string[unistring.length()] = 0;
+    int len=unistring.length();
+
+    // ignore certain keys
+    if (key == Qt::Key_Shift || key == Qt::Key_Alt || key == Qt::Key_Control || key == Qt::Key_Meta
+	    || key == Qt::Key_CapsLock || key == Qt::Key_NumLock || key == Qt::Key_ScrollLock ) {
+	e->ignore();
+	return;
+    }
+
+#ifdef FEAT_MBYTE
+    if (input_conv.vc_type != CONV_NONE)
+    {
+	mch_memmove(string2, string, len);
+	len = convert_input(string2, len, sizeof(string2));
+	s = string2;
+    }
+    else
+#endif
+	s = string;
+    d = string;
+    for (i = 0; i < len; ++i)
+    {
+	*d++ = s[i];
+	if (d[-1] == CSI && d + 2 < string + sizeof(string))
+	{
+	    /* Turn CSI into K_CSI. */
+	    *d++ = KS_EXTRA;
+	    *d++ = (int)KE_CSI;
+	}
+    }
+    len = d - string;
+
+
+    // change shift-tab (backtab) into S_TAB
+    if ( key == Qt::Key_BackTab && state & Qt::ShiftButton) {
+	key = Qt::Key_Tab;
+    }
+
+    // Change C-@ and C-2 in NUL ? Gtk does this
+    if ( (key == Qt::Key_2 || key == Qt::Key_At)
+	    && state & Qt::ControlButton ) {
+	string[0] = NUL;
+	len = 1;
+    }
+    else if (len == 0 && (key == Qt::Key_Space || key == Qt::Key_Tab))
+    {
+	/* When there are modifiers, these keys get zero length; we need the
+	 * original key here to be able to add a modifier below. */
+	string[0] = (key & 0xff);
+	len = 1;
+    }
+    /* Check for Alt/Meta key (Mod1Mask), but not for a BS, DEL or character
+     * that already has the 8th bit set.
+     * Don't do this for <S-M-Tab>, that should become K_S_TAB with ALT. */
+    if (len == 1
+	    && (key != Qt::Key_BackSpace && key != Qt::Key_Delete)
+	    && (string[0] & 0x80) == 0
+	    && (state & Qt::AltButton)
+	    && !(key == Qt::Key_Tab && (state & Qt::ShiftButton)))
+    {
+	string[0] |= 0x80;
+#ifdef FEAT_MBYTE
+	if (enc_utf8) // convert to utf-8
+	{
+	    string[1] = string[0] & 0xbf;
+	    string[0] = ((unsigned)string[0] >> 6) + 0xc0;
+	    if (string[1] == CSI)
+	    {
+		string[2] = KS_EXTRA;
+		string[3] = (int)KE_CSI;
+		len = 4;
+	    }
+	    else
+		len = 2;
+	}
+#endif
+    }
+
+    /* Check for special keys, making sure BS and DEL are recognised. */
+    if (len == 0 || key == Qt::Key_BackSpace || key == Qt::Key_Delete)
+    {
+	while (special_keys[i].qtkey != 0 && special_keys[i].qtkey != key ) i++;
+	if (special_keys[i].qtkey != 0) {
+		string[0] = CSI;
+		string[1] = special_keys[i].code0;
+		string[2] = special_keys[i].code1;
+		len = -3;
+	}
+/*
+	for (i = 0; special_keys[i].qtkey != 0 ; i++)
+	{
+	    if (special_keys[i].qtkey == key ) {
+		string[0] = CSI;
+		string[1] = special_keys[i].code0;
+		string[2] = special_keys[i].code1;
+		len = -3;
+		break;
+	    }
+	}*/
+    }
+
+    if (len == 0)   {
+	//no need to dump that, that's a QT problem, we can't do anything
+	//dbf("Unrecognised Key : %X %s", key, e->text().latin1());
+	e->ignore();
+	return;
+    }
+
+
+    /* Special keys (and a few others) may have modifiers */
+    if (len == -3 || key == Qt::Key_Space || key == Qt::Key_Tab ||
+	    key == Qt::Key_Return || key == Qt::Key_Enter ||
+	    key == Qt::Key_Escape) {
+
+	modifiers = 0;
+	if (state & Qt::ShiftButton) modifiers |= MOD_MASK_SHIFT;
+	if (state & Qt::ControlButton) modifiers |= MOD_MASK_CTRL;
+	if (state & Qt::AltButton) modifiers |= MOD_MASK_ALT;
+
+	/*
+	 * For some keys a shift modifier is translated into another key
+	 * code. Do we need to handle the case where len != 1 and
+	 * string[0] != CSI?
+	 */
+	if (len == -3)
+	    key = TO_SPECIAL(string[1], string[2]);
+	else
+	    key = string[0];
+
+	key = simplify_key(key, &modifiers);
+	if (key == CSI) key=K_CSI;
+
+	if (IS_SPECIAL(key)) {
+	    string[0] = CSI;
+	    string[1] = K_SECOND(key);
+	    string[2] = K_THIRD(key);
+	    len = 3;
+	} else {
+	    string[0] = key;
+	    len = 1;
+	}
+
+
+	if (modifiers!=0) {
+	    uchar string2[10];
+	    string2[0] = CSI;
+	    string2[1] = KS_MODIFIER;
+	    string2[2] = modifiers;
+	    add_to_input_buf(string2, 3);
+	}
+
+    } /* special keys */
+
+    if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts)
+		|| (string[0] == intr_char && intr_char != Ctrl_C)))
+    {
+	trash_input_buf();
+	got_int = TRUE;
+    }
+
+    add_to_input_buf(string, len);
+    if (p_mh) {
+	gui_mch_mousehide(TRUE);
+    }
+    //DCOP Embedding stuff
+    //if we are here then the user has type something in the window, thus we can easily imagine that :
+    // 1 - text has changed (emit textChanged())
+    // 2 - characters were interactively inserted (emit charactersInteractivelyInserted())
+    // 3 - cursor position has changed ( emit cursorPositionChanged() )
+    // 4 - selection has changed ? dunno yet //XXX
+    // 5 - undo changed too ? (each character typed in makes the undo changes anyway)
+    // conclusion : this makes a lot of things to send to the vim kpart, maybe too much
+    // for now i'll just send : keyboardEvent to the kpart with the event string as parameter,
+    // with current current position
+    // i'll do the same for mouseEvents
+#if QT_VERSION>=300
+    QByteArray params;
+    QDataStream stream(params, IO_WriteOnly);
+    stream << kapp->dcopClient()->appId() << unistring << gui.row << gui.col;
+    kapp->dcopClient()->emitDCOPSignal("keyboardEvent(QCString, QCString,int,int)", params);
+#endif
+    e->ignore();
+} // }}}
+
+#ifdef FEAT_CLIENTSERVER
+void VimWidget::serverActivate(WId id) //{{{
+{
+    if (serverName == NULL && serverDelayedStartName != NULL) {
+	commWindow = id;
+	(void)serverRegisterName(qt_xdisplay(), serverDelayedStartName);
+    } else {
+	serverChangeRegisteredWindow( qt_xdisplay(), id );
+    }
+}//}}}
+#endif
+
+#ifdef FEAT_XIM
+void VimWidget::imStartEvent(QIMEvent *e) {
+    e->accept();
+}
+
+void VimWidget::imEndEvent(QIMEvent *e) {
+    uchar string[256];
+
+    QCString unistring = vmw->codec->fromUnicode(e->text());
+    if (unistring.length()>0)
+	strncpy((char*)string, (const char*)unistring,unistring.length());
+    string[unistring.length()] = 0;
+    int len=unistring.length();
+
+    add_to_input_buf(string, len);
+    e->accept();
+}
+
+void VimWidget::imComposeEvent(QIMEvent *e) {
+    //i should do something here, displaying the text somewhere ... (status area ?)
+    e->accept();
+}
+#endif
+
+
+void VimMainWindow::lock()
+{
+    locked=true;
+}
+
+void VimMainWindow::unlock()
+{
+    locked=false;
+}
+
+bool VimMainWindow::isLocked()
+{
+    return locked;
+}
+
+// ->resize VimWidget if not locked
+//
+void VimMainWindow::resizeEvent ( QResizeEvent *e ) //{{{
+{
+    if ( vmw->isLocked() ) return;
+    //remove toolbar and menubar height
+    int height = e->size().height();
+    int width = e->size().width();
+
+    if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled()
+#if QT_VERSION>=300
+	    && !vmw->menuBar()->isTopLevelMenu()
+#endif
+	    )
+	height -= vmw->menuBar()->height();
+#ifdef FEAT_TOOLBAR
+    if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+	    (vmw->toolBar()->barPos()==KToolBar::Top ||
+	     vmw->toolBar()->barPos()==KToolBar::Bottom))
+	height -= vmw->toolBar()->height();
+
+    if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+	    (vmw->toolBar()->barPos()==KToolBar::Left ||
+	     vmw->toolBar()->barPos()==KToolBar::Right))
+	width -= vmw->toolBar()->width();
+#endif
+    height = ( ((int)(height/gui.char_height))*gui.char_height );
+    if (!vmw->isLocked()) gui_resize_shell(width,height);
+}//}}}
+
+void VimWidget::focusInEvent( QFocusEvent * fe ) // {{{
+{
+    gui_focus_change(true);
+
+    if (blink_state == BLINK_NONE)
+	gui_mch_start_blink();
+} // }}}
+
+void VimWidget::focusOutEvent( QFocusEvent * fe )//{{{
+{
+    gui_focus_change(false);
+
+    if (blink_state != BLINK_NONE)
+	gui_mch_stop_blink();
+}//}}}
+
+void VimWidget::set_blink_time( long wait, long on, long off)//{{{
+{
+    blink_wait_time = wait;
+    blink_on_time = on;
+    blink_off_time = off;
+}//}}}
+
+void VimWidget::start_cursor_blinking()//{{{
+{
+    if (blink_timer.isActive()) blink_timer.stop();
+
+    /* Only switch blinking on if none of the times is zero */
+    if (blink_wait_time && blink_on_time && blink_off_time && gui.in_focus) {
+	blink_state = BLINK_ON;
+	gui_update_cursor(TRUE, FALSE);
+	// The first blink appears after wait_time
+	blink_timer.start( blink_wait_time, true);
+    }
+}//}}}
+
+void VimWidget::blink_cursor()//{{{
+{
+    if (blink_state == BLINK_ON) {
+	// set cursor off
+	gui_undraw_cursor();
+	blink_state = BLINK_OFF;
+	blink_timer.start( blink_off_time, true);
+    } else {
+	// set cursor on
+	gui_update_cursor(TRUE, FALSE);
+	blink_state = BLINK_ON;
+	blink_timer.start( blink_on_time, true);
+    }
+}//}}}
+
+void VimWidget::stop_cursor_blinking()//{{{
+{
+    if (blink_timer.isActive()) blink_timer.stop();
+
+    if (blink_state == BLINK_OFF)
+	gui_update_cursor(TRUE, FALSE);
+
+    blink_state = BLINK_NONE;
+}//}}}
+
+void VimWidget::flash()//{{{
+{
+    QPainter p(this);
+
+    p.setRasterOp(Qt::XorROP);
+    p.fillRect(geometry(),QColor(0xFF,0xFF,0xFF));
+    p.flush();
+    //FIXME: Make this a little smarter. Maybe add a timer or something
+    usleep(19000);
+    p.fillRect(geometry(),QColor(0xFF,0xFF,0xFF));
+    p.flush();
+    p.end();
+}//}}}
+
+
+/*
+ *  The main Window
+ */
+    VimMainWindow::VimMainWindow ( const char *name , WFlags f)//{{{
+:KMainWindow(0L, name,f)
+{
+#ifdef FEAT_CLIENTSERVER
+    oldFilter = qt_set_x11_event_filter( kvim_x11_event_filter );
+#endif
+    if (echo_wid_arg== 1) {
+	fprintf(stderr, "WID: %ld\n", (long)winId());
+	fflush(stderr);
+    }
+
+    w = new VimWidget(this, "main vim widget");
+    gui.w = w;
+    setFocusProxy(w);
+    w->setFocus();
+    have_tearoff=0;
+
+    finddlg=new KEdFind (this,0,false);
+    repldlg=new KEdReplace (this,0,false);
+    QObject::connect( finddlg, SIGNAL(search()), this, SLOT(slotSearch()) );
+    QObject::connect( repldlg, SIGNAL(find()), this, SLOT(slotFind()) );
+    QObject::connect( repldlg, SIGNAL(replace()), this, SLOT(slotReplace()) );
+    QObject::connect( repldlg, SIGNAL(replaceAll()), this, SLOT(slotReplaceAll()) );
+
+#ifdef FEAT_TOOLBAR
+    connect(toolBar(), SIGNAL(clicked(int)), this, SLOT(menu_activated(int)));
+#endif
+#ifdef FEAT_CLIENTSERVER
+    w->serverActivate(winId());
+
+    if (serverName!=NULL)
+        kapp->dcopClient()->registerAs(QCString((const char*)serverName),false);
+    else if (serverDelayedStartName!=NULL)
+        kapp->dcopClient()->registerAs(QCString((const char*)serverDelayedStartName),false);
+    else if (argServerName!=NULL)
+        kapp->dcopClient()->registerAs(argServerName->utf8(),false);
+#else
+    if (argServerName!=NULL)
+        kapp->dcopClient()->registerAs(argServerName->utf8(),false);
+#endif
+    QXEmbed::initialize();
+
+}//{{{
+
+bool VimMainWindow::queryClose()//{{{
+{
+    gui_shell_closed();
+    return true;
+}//}}}
+
+bool VimMainWindow::queryExit()//{{{
+{
+    return true;
+}//}}}
+
+void VimMainWindow::menu_activated(int dx)//{{{
+{
+#ifdef FEAT_MENU
+    if (!dx) {	// tearoff
+	return;
+    }
+    gui_mch_set_foreground();
+    gui_menu_cb((VimMenu *) dx);
+#endif
+}//}}}
+
+
+void VimMainWindow::clipboard_selection_update(){//{{{
+    if(kapp->clipboard()->ownsSelection()) {
+	clip_own_selection(&clip_star);
+    } else {
+	clip_lose_selection(&clip_star);
+    }
+}//}}}
+
+void VimMainWindow::clipboard_data_update(){//{{{
+#if QT_VERSION>=300
+    if (kapp->clipboard()->ownsClipboard()) {
+	clip_own_selection(&clip_plus);
+    } else {
+	clip_lose_selection(&clip_plus);
+    }
+#else
+    if (kapp->clipboard()->ownsSelection()) {
+	clip_own_selection(&clip_star);
+    } else {
+	clip_lose_selection(&clip_star);
+    }
+#endif
+}//}}}
+
+void VimMainWindow::slotSearch()//{{{
+{
+    QString	find_text;
+    bool	direction_down = TRUE;
+    bool	casesensitive = TRUE;
+    int		flags = FRD_FINDNEXT;
+
+    find_text = finddlg->getText();
+    direction_down = !(finddlg->get_direction());
+    casesensitive = finddlg->case_sensitive();
+    //    if (casesensitive) find_text = "\\C" + find_text;
+    //    else find_text = "\\c" + find_text;
+    if (casesensitive) flags|=FRD_MATCH_CASE;
+    QCString unistring = vmw->codec->fromUnicode(find_text);
+    gui_do_findrepl(flags, (char_u *)(const char *)unistring, NULL,(int)direction_down);
+}//}}}
+
+void VimMainWindow::slotFind()//{{{
+{
+    QString	find_text;
+    bool	direction_down=TRUE;
+    bool	casesensitive = TRUE;
+    int		flags = FRD_R_FINDNEXT;
+
+    find_text=repldlg->getText();
+    direction_down = !(repldlg->get_direction());
+    casesensitive = repldlg->case_sensitive();
+    //    if (casesensitive) find_text = "\\C" + find_text;
+    //    else find_text = "\\c" + find_text;
+    if (casesensitive) flags|=FRD_MATCH_CASE;
+
+    QCString unistring = vmw->codec->fromUnicode(find_text);
+    gui_do_findrepl(flags, (char_u *)(const char *)unistring, NULL,(int)direction_down);
+}//}}}
+
+void VimMainWindow::slotReplace()//{{{
+{
+    QString	find_text;
+    QString     repl_text;
+    bool	direction_down=TRUE;
+    bool	casesensitive = TRUE;
+    int		flags = FRD_REPLACE;
+
+    find_text=repldlg->getText();
+    repl_text=repldlg->getReplaceText();
+    direction_down = !(repldlg->get_direction());
+    //if (casesensitive) find_text = "\\C" + find_text;
+    //else find_text = "\\c" + find_text;
+    if (casesensitive) flags|=FRD_MATCH_CASE;
+
+    QCString unistring = vmw->codec->fromUnicode(find_text);
+    QCString unistring2 = vmw->codec->fromUnicode(repl_text);
+    gui_do_findrepl(flags, (char_u *)(const char *)unistring,(char_u *)(const char*)unistring2,(int)direction_down);
+}//}}}
+
+void VimMainWindow::slotReplaceAll()//{{{
+{
+    QString	find_text;
+    QString     repl_text;
+    bool	direction_down=TRUE;
+    bool	casesensitive = TRUE;
+    int		flags = FRD_REPLACEALL;
+
+    find_text=repldlg->getText();
+    repl_text=repldlg->getReplaceText();
+    direction_down = !(repldlg->get_direction());
+    casesensitive = repldlg->case_sensitive();
+    //    if (casesensitive) find_text = "\\C" + find_text;
+    //    else find_text = "\\c" + find_text;
+    if (casesensitive) flags|=FRD_MATCH_CASE;
+    QCString unistring = vmw->codec->fromUnicode(find_text);
+    QCString unistring2 = vmw->codec->fromUnicode(repl_text);
+    gui_do_findrepl(flags, (char_u *)(const char *)unistring,(char_u *)(const char*)unistring2,(int)direction_down);
+}//}}}
+
+void VimMainWindow::showAboutKDE()
+{
+    KAboutKDE *kde = new KAboutKDE(this);
+    kde->show();
+}
+
+void VimMainWindow::showAboutApplication()//{{{
+{
+    KAboutData *aboutData = new KAboutData (
+	    "kvim"
+	    , I18N_NOOP("KVim")
+	    , VIM_VERSION_SHORT
+	    , I18N_NOOP("Vim in a KDE interface")
+	    , 0
+	    , "(c) Vim Team, \":help credits\" for more infos.\nType \":help iccf\" to see how you can help the children in Uganda"
+	    , 0l
+	    , "http://freehackers.org/kvim"
+	    , "kvim-dev@freenux.org"
+	    );
+
+    aboutData->addAuthor("Bram Moolenaar",
+	    I18N_NOOP("Main vim author"),
+	    "Bram@vim.org",
+	    "http://www.vim.org/");
+    aboutData->addAuthor("Thomas Capricelli",
+	    I18N_NOOP("KDE porting"),
+	    "orzel@freehackers.org",
+	    "http://orzel.freehackers.org");
+    aboutData->addAuthor("Philippe Fremy",
+	    I18N_NOOP("KDE porting"),
+	    "pfremy@chez.com",
+	    "http://www.freehackers.org/kvim");
+    aboutData->addAuthor("Mark Westcott",
+	    I18N_NOOP("Qtopia porting, maintainer of the Qtopia part"),
+	    "mark@houseoffish.org",
+	    "http://houseoffish.org");
+    aboutData->addAuthor("Mickael Marchand",
+	    I18N_NOOP("KDE porting, maintainer"),
+	    "marchand@kde.org",
+	    "http://freenux.org");
+    aboutData->addAuthor("Many other people",
+	    I18N_NOOP("type :help credits for more infos")
+	    );
+    aboutData->addCredit("Vince Negri",
+	    I18N_NOOP("Antialiasing support, Color fixes"),
+	    "vnegri@asl-electronics.co.uk");
+    aboutData->addCredit("Malte Starostik",
+	    I18N_NOOP("Patch for performance improvement"),
+	    "malte@kde.org");
+    aboutData->addCredit("Mark Stosberg",
+	    I18N_NOOP("Provided a FreeBSD box to debug KVim on BSD"),
+	    "mark@summersault.com"
+	    );
+    aboutData->addCredit("Henrik Skott",
+	    I18N_NOOP("Font patch when KDE not configured"),
+	    "henrik.skott@hem.utfors.se"
+	    );
+    aboutData->addCredit("Kailash Sethuraman",
+	    I18N_NOOP("NetBSD configure/compilation fixes")
+	    );
+    aboutData->setLicenseText(
+"KVim as an extension of Vim follows Vim license : \n\
+Vim is Charityware.  You can use and copy it as much as you like, but you are\n\
+encouraged to make a donation to orphans in Uganda.  Please read the file\n\
+runtime/doc/uganda.txt for details.\n\
+\n\
+There are no restrictions on distributing an unmodified copy of Vim.  Parts of\n\
+Vim may also be distributed, but this text must always be included.  You are\n\
+allowed to include executables that you made from the unmodified Vim sources,\n\
+your own usage examples and Vim scripts.\n\
+\n\
+If you distribute a modified version of Vim, you are encouraged to send the\n\
+maintainer a copy, including the source code.  Or make it available to the\n\
+maintainer through ftp; let him know where it can be found.  If the number of\n\
+changes is small (e.g., a modified Makefile) e-mailing the diffs will do.\n\
+When the maintainer asks for it (in any way) you must make your changes,\n\
+including source code, available to him.\n\
+\n\
+The maintainer reserves the right to include any changes in the official\n\
+version of Vim.  This is negotiable.  You are not allowed to distribute a\n\
+modified version of Vim when you are not willing to make the source code\n\
+available to the maintainer.\n\
+\n\
+The current maintainer is Bram Moolenaar <Bram@vim.org>.  If this changes, it\n\
+will be announced in appropriate places (most likely www.vim.org and\n\
+comp.editors).  When it is completely impossible to contact the maintainer,\n\
+the obligation to send him modified source code ceases.\n\
+\n\
+It is not allowed to remove these restrictions from the distribution of the\n\
+Vim sources or parts of it.  These restrictions may also be used for previous\n\
+Vim releases instead of the text that was included with it.");
+
+    KAboutApplication *about = new KAboutApplication(aboutData);
+    about->show();
+}//}}}
+
+void VimMainWindow::showTipOfTheDay() {
+#if QT_VERSION>=300
+    KTipDialog::showTip (vmw,QString::null,true);
+#endif
+}
+
+void VimMainWindow::buffersToolbar() {
+
+}
+
+void VimMainWindow::showBugReport() {
+    KBugReport *bug= new KBugReport(this,true);
+    bug->show();
+}
+/*
+ *   Vim Dialog
+ *
+ * Returns:
+ *  0: Cancel
+ *  1- : nb of the pressed button
+ */
+
+VimDialog::VimDialog (int type,		/* type of dialog *///{{{
+	char_u * title,		/* title of dialog */
+	char_u * message,	/* message text */
+	char_u * buttons,	/* names of buttons */
+	int def_but,		/* default button */
+	char_u *textfield )	/* input field */
+:QDialog(vmw, "vim generic dialog", true), // true is for "modal"
+    mapper(this, "dialog signal mapper")
+{
+    /*
+     * Create Icon
+     */
+    char ** icon_data;
+    switch (type) {
+	case VIM_GENERIC:
+	    icon_data = generic_xpm;
+	    break;
+	case VIM_ERROR:
+	    icon_data = error_xpm;
+	    break;
+	case VIM_WARNING:
+	    icon_data = alert_xpm;
+	    break;
+	case VIM_INFO:
+	    icon_data = info_xpm;
+	    break;
+	case VIM_QUESTION:
+	    icon_data = quest_xpm;
+	    break;
+	default:
+	    icon_data = generic_xpm;
+    };
+    QLabel * icon = new QLabel( this );
+    icon->setPixmap( QPixmap( (const char **) icon_data ) );
+    icon->setFixedSize( icon->sizeHint() );
+
+    QLabel * text = new QLabel( (const char *)message, this );
+    text->setAlignment( AlignHCenter | AlignVCenter | ExpandTabs );
+
+    QStringList buttonText = QStringList::split( DLG_BUTTON_SEP, (char *) buttons);
+    int butNb = buttonText.count();
+
+    /*
+     *  Layout
+     */
+
+    QVBoxLayout * vly = new QVBoxLayout( this, 5, 5 );
+    QHBoxLayout * hly1 = new QHBoxLayout( vly, 5);
+    hly1->addWidget( icon );
+    hly1->addWidget( text );
+    QHBoxLayout * hly3 = new QHBoxLayout ( vly , 5);
+    if (textfield!=NULL) {
+	entry = new QLineEdit((const char *)textfield,this);
+	entry->setText((const char *)textfield);
+	hly3->addWidget( entry );
+	ret=textfield;
+    } else entry=NULL;
+
+    QHBoxLayout * hly2 = new QHBoxLayout( vly, 15);
+    QString s;
+    QPushButton * pushButton = 0L;
+    for( int i=0; i<butNb; i++) {
+	s = buttonText[i];
+	pushButton = new QPushButton(s, this );
+	if (s.find('&') != -1) {
+	    pushButton->setAccel( s.at(s.find('&')+1).latin1() );
+	}
+
+	hly2->addWidget( pushButton );
+	if (i == def_but-1) {
+	    pushButton->setDefault( true );
+	    pushButton->setAutoDefault( true );
+	    setResult( i+1 );
+	}
+	connect(pushButton, SIGNAL(clicked()), &mapper, SLOT(map()));
+	mapper.setMapping(pushButton, i+1);
+    }
+    connect( &mapper, SIGNAL(mapped(int)), this, SLOT(done(int)));
+
+    setCaption((const char *) title);
+
+    vly->activate();
+}//}}}
+
+void VimDialog::done(int r) {
+    if (entry!=NULL) {
+        if (r) {
+	   QCString unistring=vmw->codec->fromUnicode(entry->text());
+	   STRCPY(ret,(const char*)unistring);
+	} else
+	    *ret=NUL;
+    }
+    QDialog::done(r);
+}
+
+/*
+ * ScrollBar pool handling
+ */
+SBPool::SBPool(void)//{{{
+    :mapper(this, "SBPool signal mapper")
+{
+    connect(&mapper, SIGNAL(mapped(int)), this, SLOT(sbUsed(int)));
+}//}}}
+
+
+void SBPool::create(GuiScrollbar * sb, int orient)//{{{
+{
+    switch(orient) {
+	case SBAR_HORIZ:
+	    sb->w = new QScrollBar(QScrollBar::Horizontal, vmw);
+	    break;
+	case SBAR_VERT:
+	    sb->w = new QScrollBar(QScrollBar::Vertical, vmw);
+	    break;
+	default:
+	    sb->w = 0;
+	    return;
+    }
+
+    connect(sb->w, SIGNAL(valueChanged(int)), &mapper, SLOT(map()));
+    mapper.setMapping(sb->w, (int)sb);
+}//}}}
+
+
+void SBPool::sbUsed(int who)//{{{
+{
+    GuiScrollbar *sb = (GuiScrollbar*)who;
+    gui_drag_scrollbar( sb, sb->w->value(), FALSE);
+}//}}}
+
+
+void SBPool::destroy(GuiScrollbar * sb)//{{{
+{
+    if (!sb->w) return;
+
+    delete sb->w;
+    sb->w = 0;
+}//}}}
+
+#ifdef FEAT_CLIENTSERVER
+static int kvim_x11_event_filter( XEvent* e)//{{{
+{
+    if (e->xproperty.type == PropertyNotify
+	    && e->xproperty.atom == commProperty
+	    && e->xproperty.window == commWindow
+	    && e->xproperty.state == PropertyNewValue ) {
+	serverEventProc(qt_xdisplay(), e);
+    }
+
+    if (oldFilter) return oldFilter( e );
+    return FALSE;
+}//}}}
+#endif
+
+//add some QT 3 fonts usefull functions
+#if QT_VERSION<300
+QString KVimUtils::toString(QFont *f)
+{
+    QStringList l;
+    l.append(f->family());
+    l.append(QString::number(f->pointSize()));
+    l.append(QString::number(f->pixelSize()));
+    l.append(QString::number((int)f->styleHint()));
+    l.append(QString::number(f->weight()));
+    l.append(QString::number((int)f->italic()));
+    l.append(QString::number((int)f->underline()));
+    l.append(QString::number((int)f->strikeOut()));
+    l.append(QString::number((int)f->fixedPitch()));
+    l.append(QString::number((int)f->rawMode()));
+    return l.join(",");
+}
+
+bool KVimUtils::fromString(QFont *f, QString descrip)
+{
+   QStringList l(QStringList::split(',', descrip));
+
+    int count = l.count();
+    if (count != 10 && count != 9) {
+        return FALSE;
+    }
+
+    f->setFamily(l[0]);
+    f->setPointSize(l[1].toInt());
+    if ( count == 9 ) {
+        f->setStyleHint((QFont::StyleHint) l[2].toInt());
+        f->setWeight(l[3].toInt());
+        f->setItalic(l[4].toInt());
+        f->setUnderline(l[5].toInt());
+        f->setStrikeOut(l[6].toInt());
+        f->setFixedPitch(l[7].toInt());
+        f->setRawMode(l[8].toInt());
+    } else {
+        f->setPixelSize(l[2].toInt());
+        f->setStyleHint((QFont::StyleHint) l[3].toInt());
+        f->setWeight(l[4].toInt());
+        f->setItalic(l[5].toInt());
+        f->setUnderline(l[6].toInt());
+        f->setStrikeOut(l[7].toInt());
+        f->setFixedPitch(l[8].toInt());
+        f->setRawMode(l[9].toInt());
+    }
+    return TRUE;
+}
+#endif
+
+QString KVimUtils::convertEncodingName(QString name)
+{
+    if (name.startsWith("ucs") || name.startsWith("utf-16")) return QString("utf16");
+    if (name=="cp950") return QString("Big5");
+    return QString();
+}
diff --git a/src/gui_kde_widget.h b/src/gui_kde_widget.h
new file mode 100644
index 0000000..f2e9c3f
--- /dev/null
+++ b/src/gui_kde_widget.h
@@ -0,0 +1,234 @@
+/* vi:set ts=8 sts=0 sw=8:
+ *
+ * VIM - Vi IMproved		by Bram Moolenaar
+ *
+ * Do ":help uganda"  in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ */
+
+/*
+ * Porting to KDE(2) was done by
+ *
+ *  (C) 2000 by Thomas Capricelli <orzel@freehackers.org>
+ *
+ *  Please visit http://freehackers.org/kvim for other vim- or
+ *  kde-related coding.
+ *
+ *  $Id$
+ *
+ */
+
+#ifndef GUI_KDE_WIDGET
+#define GUI_KDE_WIDGET
+
+#if 1
+#define dbf( format, args... ) { printf( "%s" " : " format "\n" , __FUNCTION__ , ## args ); fflush(stdout); }
+#define db()       { printf( "%s\n", __FUNCTION__ );fflush(stdout); }
+#else
+#define dbf(format, args... )
+#define db()
+#endif
+
+#define UNIX	    // prevent a warning : a symbol is defined twice in X and Qt
+
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qsignalmapper.h>
+#include <qtimer.h>
+#include <qmainwindow.h>
+#include <qapplication.h>
+#include <qevent.h>
+#include <qlineedit.h>
+#include <qpainter.h>
+#include <qwidget.h>
+#include <qpopupmenu.h>
+#include <klocale.h>
+#include <kapp.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <keditcl.h>
+#include <kaboutdata.h>
+#if (KDE_VERSION>=290)
+#include <kmainwindow.h>
+#else
+#include <ktmainwindow.h>
+#endif
+#include <kparts/part.h>
+#include <kurl.h>
+#include "kvim_iface.h"
+
+#undef UNIX	    // prevent a warning
+extern "C" {
+#include "vim.h"
+}
+
+class QPushButton;
+class QDialog;
+class QLineEdit;
+class QSignalMapper;
+class QPaintEvent;
+
+enum BlinkState {
+	BLINK_NONE,
+	BLINK_ON,
+	BLINK_OFF
+};
+
+class VimWidget : public QWidget, virtual public KVim
+{
+	Q_OBJECT
+
+public:
+	VimWidget( QWidget *parent=0, const char *name=0, WFlags f=0 );
+	virtual void paintEvent( QPaintEvent *);
+	void	draw_string(int x, int y, QString s, int len, int flags);
+
+	/** Init the blinking time */
+	void set_blink_time( long, long, long );
+	void start_cursor_blinking();
+	void stop_cursor_blinking();
+	void wait(long);
+#ifdef FEAT_CLIENTSERVER
+	void serverActivate(WId id);
+#endif
+	void flash();
+	
+	/** DCOP */
+	void execNormal(QString command);
+	void execInsert(QString command);
+	void execRaw(QString command);
+	void execCmd(QString command);
+	QString eval(QString expr);
+	
+	bool wait_done;
+	BlinkState blink_state;
+	QPainter *painter;
+	QPopupMenu *menu;
+
+protected:
+	virtual void keyPressEvent( QKeyEvent * );
+	virtual void mousePressEvent( QMouseEvent *);
+	virtual void mouseDoubleClickEvent( QMouseEvent *);
+	virtual void mouseReleaseEvent( QMouseEvent *);
+	virtual void mouseMoveEvent( QMouseEvent *);
+	virtual void focusInEvent( QFocusEvent * );
+	virtual void focusOutEvent( QFocusEvent * );
+	virtual void dragEnterEvent (QDragEnterEvent *);
+	virtual void dropEvent (QDropEvent *);
+#ifdef FEAT_XIM
+	virtual void imStartEvent ( QIMEvent * );
+	virtual void imEndEvent ( QIMEvent * );
+	virtual void imComposeEvent ( QIMEvent * );
+#endif
+
+	/* cursor blinking stuff */
+	QTimer blink_timer;
+	long blink_wait_time, blink_on_time, blink_off_time;
+
+	/* wait for input */
+	QTimer	wait_timer;
+
+public slots:
+	void    blink_cursor();
+	void	wait_timeout();
+};
+
+class VimMainWindow : public KMainWindow
+{
+	Q_OBJECT
+
+public:
+	VimMainWindow ( const char *name = 0L, WFlags f = WDestructiveClose );
+
+	/** called when the widget closes */
+//	bool close(bool alsoDelete);
+	VimWidget	*w;
+        KEdFind         *finddlg;
+        KEdReplace      *repldlg;
+	int		have_tearoff;
+	QTextCodec      *codec;
+
+public slots:
+	void    menu_activated(int dx);
+	void 	clipboard_selection_update();
+	void 	clipboard_data_update();
+        void    slotSearch();
+        void    slotFind();
+        void    slotReplace();
+        void    slotReplaceAll();
+	void    showAboutApplication();
+	void    showAboutKDE();
+	void    showBugReport();
+	void    showTipOfTheDay();
+	void    buffersToolbar();
+	bool    isLocked();
+	void    lock();
+	void    unlock();
+
+protected:
+	virtual void wheelEvent (QWheelEvent *);
+	virtual void resizeEvent ( QResizeEvent *e );
+
+#if defined(FEAT_SESSION)
+	void saveGlobalProperties (KConfig *conf);
+	void readGlobalProperties (KConfig *conf);
+#endif
+	bool queryClose();
+	bool queryExit();
+	bool locked;
+};
+
+
+class VimDialog : public QDialog
+{
+	Q_OBJECT
+public:
+	VimDialog (int type,		/* type of dialog */
+	       unsigned char * title,		/* title of dialog */
+	       unsigned char * message,	/* message text */
+	       unsigned char * buttons,	/* names of buttons */
+	       int def_but,		/* default button */
+	       char_u *textfield);		/* input text */
+private:
+	QSignalMapper	mapper;
+	QLineEdit	*entry;
+	char_u		*ret;
+	int		butNb;
+
+protected slots:
+	void done(int);
+};
+
+
+/*
+ * QScrollBar  pool
+ */
+struct GuiScrollbar;
+
+class SBPool : public QObject
+{
+	Q_OBJECT
+public:
+	SBPool(void);
+	void create(GuiScrollbar * sb, int orient);
+	void destroy(GuiScrollbar * sb);
+public slots:
+	void sbUsed(int who);
+private:
+	QSignalMapper mapper;
+};
+
+class KVimUtils {
+public:
+	static QString convertEncodingName(QString);
+#if QT_VERSION<300
+	static bool fromString(QFont*,QString);
+	static QString toString(QFont*);
+#endif
+};
+
+extern VimMainWindow	*vmw;
+extern SBPool		*sbpool;
+extern QString          *argServerName;
+
+#endif // GUI_KDE_WIDGET
diff --git a/src/gui_kde_x11.cc b/src/gui_kde_x11.cc
new file mode 100644
index 0000000..b3f3aa1
--- /dev/null
+++ b/src/gui_kde_x11.cc
@@ -0,0 +1,1307 @@
+/* vi:set ts=8 sts=4 sw=4:
+ *
+ * VIM - Vi IMproved		by Bram Moolenaar
+ *
+ * Do ":help uganda"  in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ */
+
+/*
+ * Porting to KDE(2) was done by
+ *
+ *  (C) 2000 by Thomas Capricelli <orzel@freehackers.org>
+ *
+ *  Please visit http://freehackers.org/kvim for other vim- or
+ *  kde-related coding.
+ *
+ *  $Id$
+ *
+ */
+
+#include <qscrollbar.h>
+#include <qcstring.h>
+#include <qdatetime.h>
+#include <qcursor.h>
+#include <qfontmetrics.h>
+#include <qpaintdevice.h>
+#include <qclipboard.h>
+#include <qregexp.h>
+#include <kaboutkde.h>
+#include <kiconloader.h>
+#include <kfontdialog.h>
+#include <kmessagebox.h>
+#include <dcopclient.h>
+#include <kwin.h>
+#include <kmenubar.h>
+#include <kconfig.h>
+#if (QT_VERSION>=300)
+#include <qnamespace.h>
+#include <ktip.h>
+#endif
+#include <qpopupmenu.h>
+#include <qpainter.h>
+#include <qtextcodec.h>
+#include <qfontmetrics.h>
+#include <qfont.h>
+
+
+#include "gui_kde_widget.h"
+
+
+extern "C" {
+#include "vim.h"
+#include "version.h"
+}
+
+#include <stdio.h>
+
+/*
+ * global variable for KDE, we can't put them in Gui, cause there are C++ types
+ */
+VimMainWindow	*vmw=0;
+SBPool		*sbpool=0;
+QString      *argServerName=0;
+
+#ifdef FEAT_MOUSESHAPE
+/* The last set mouse pointer shape is remembered, to be used when it goes
+ * from hidden to not hidden. */
+static int last_shape = 0;
+#endif
+
+/*
+ * Arguments handled by KDE internally.
+ */
+
+#if QT_VERSION>=300
+static int tip=0; // 1 no dialog, 0 use it if enabled in conf, 2 force the tip
+#endif
+static int reverse=0; // 0 bg : white, 1 : bg : black
+QString         *startfont;
+QSize           *startsize;
+static int gui_argc = 0;
+static char **gui_argv = NULL;
+
+/*
+ * Parse the GUI related command-line arguments.  Any arguments used are
+ * deleted from argv, and *argc is decremented accordingly.  This is called
+ * when vim is started, whether or not the GUI has been started.
+ */
+	void
+gui_mch_prepare(int *argc, char **argv)// {{{
+{
+	//copy args for KDE/Qt
+	gui_argc = 0;
+	//this one is not really good as all options are not for KDE/Qt ...
+	gui_argv = (char **)lalloc((long_u)(*argc * sizeof(char *)), FALSE);
+	if (gui_argv == NULL)
+	    return;
+	gui_argv[gui_argc++] = argv[0];
+
+	int found = 0;
+	for (int i = 1; i < *argc ; i++)
+	{
+		if (found!=2)
+		    found = 0;
+		else {
+		    found=0;
+		    //remove from the list of argv
+		    if (--*argc>i) {
+			mch_memmove(&argv[i], &argv[i + 1],
+				(*argc - i) * sizeof(char *));
+		    }
+		    i--;
+		    continue;
+		}
+	
+		if (strcmp(argv[i],"--servername")==0) {
+			argServerName = new QString(argv[i+1]); // to get the serverName now
+		}
+#if QT_VERSION>+300
+		if (strcmp(argv[i],"-tip")==0 ) {
+			tip=2;
+			found=1;
+		}
+		if (strcmp(argv[i],"-notip")==0 ) {
+			tip=1;
+			found=1;
+		}
+#endif
+		if (strcmp(argv[i],"-black")==0 ) {
+			reverse=1;
+			found=1;
+		}
+		/* replaced by -black */
+/*		if (strcmp(argv[i],"-rv")==0 ) {
+			reverse=1;
+			found=1;
+		}*/
+		if (strcmp(argv[i],"-font")==0 || strcmp(argv[i], "-fn")==0 ) {
+			startfont=new QString(argv[i+1]);
+			found=2;
+		}
+		if (strcmp(argv[i],"-geometry")==0 || strcmp (argv[i],"-geom")==0 ) {
+			found=2;
+			QString text(argv[i+1]);
+			QStringList list = QStringList::split(QChar('x'), text);
+			startsize = new QSize(list[0].toInt(),list[1].toInt());
+		}
+		if (strcmp (argv[i],"-display")==0 ) { //XXX: this does not work,
+							// too many -display options in main.c !
+							// ask Bram ...
+			gui_argv[gui_argc++] = strdup("--display");
+			gui_argv[gui_argc++] = argv[i+1];
+			found=0;
+		}
+		if (strcmp (argv[i],"--display")==0 ) {
+			gui_argv[gui_argc++] = argv[i];
+			gui_argv[gui_argc++] = argv[i+1];
+			found=2;
+		}
+		//KDE/Qt options with no args
+		if (strcmp(argv[i],"--help-kde")==0 || strcmp (argv[i],"--help-qt")==0
+			|| strcmp(argv[i], "--help-all")==0
+			|| strcmp(argv[i], "--reverse")==0
+			|| strcmp(argv[i], "--author")==0
+//			|| strcmp(argv[i], "--version")==0 //disabled we need these for kcmvim
+//			|| strcmp(argv[i], "-v")==0
+			|| strcmp(argv[i], "--license")==0
+			|| strcmp(argv[i], "--cmap")==0
+			|| strcmp(argv[i], "--nograb")==0
+			|| strcmp(argv[i], "--dograb")==0
+			|| strcmp(argv[i], "--sync")==0
+			|| strcmp(argv[i], "--noxim")==0
+			|| strcmp(argv[i], "--nocrashhandler")==0
+			|| strcmp(argv[i], "--waitforwm")==0
+		 ) {
+			gui_argv[gui_argc++] = argv[i];
+			found=1;
+		}
+		//this outputs KDE and Vim versions :)
+		if (strcmp(argv[i],"--version")==0
+			|| strcmp (argv[i],"-v")==0
+		) {
+			gui_argv[gui_argc++] = argv[i];
+		}
+	
+
+		//KDE/Qt options with one arg
+		if ( strcmp(argv[i],"--session")==0
+		    || strcmp(argv[i],"--ncols")==0
+		    || strcmp(argv[i],"--bg")==0
+		    || strcmp(argv[i],"--background")==0
+		    || strcmp(argv[i],"--fg")==0
+		    || strcmp(argv[i],"--foreground")==0
+		    || strcmp(argv[i],"--btn")==0
+		    || strcmp(argv[i],"--name")==0
+		    || strcmp(argv[i],"--title")==0
+		    || strcmp(argv[i],"--inputstyle")==0
+		    || strcmp(argv[i],"--im")==0
+		    || strcmp(argv[i],"--caption")==0
+		    || strcmp(argv[i],"--icon")==0
+		    || strcmp(argv[i],"--miniicon")==0
+		    || strcmp(argv[i],"--config")==0
+		    || strcmp(argv[i],"--dcopserver")==0
+		    || strcmp(argv[i],"--style")==0
+		    || strcmp(argv[i],"--geometry")==0
+		    || strcmp(argv[i],"--smkey")==0
+		    || strcmp(argv[i],"-smkey")==0
+		    || strcmp(argv[i],"-session")==0
+		 ) {
+			gui_argv[gui_argc++] = argv[i];
+			gui_argv[gui_argc++] = argv[i+1];
+			found=2;
+		}
+	
+		//remove from the list of argv
+		if (found >= 1 && --*argc>i) {
+			mch_memmove(&argv[i], &argv[i + 1],
+					(*argc - i) * sizeof(char *));
+			i--;
+		}
+	}
+	KCmdLineArgs::init( gui_argc,gui_argv,"kvim", I18N_NOOP("Vim inside KDE"),VIM_VERSION_SHORT);
+}// }}}
+
+/****************************************************************************
+ * Focus handlers:
+ */
+
+/*
+ * Initialises time intervals for the cursor blinking
+ */
+	void
+gui_mch_set_blinking(long waittime, long on, long off)//{{{
+{
+	gui.w->set_blink_time( waittime, on, off );
+}//}}}
+
+/*
+ * Stop the cursor blinking.  Show the cursor if it wasn't shown.
+ */
+	void
+gui_mch_stop_blink()//{{{
+{
+	gui.w->stop_cursor_blinking();
+}//}}}
+
+/*
+ * Start the cursor blinking.  If it was already blinking, this restarts the
+ * waiting time and shows the cursor.
+ */
+	void
+gui_mch_start_blink()//{{{
+{
+	gui.w->start_cursor_blinking();
+}//}}}
+
+/*
+ * Check if the GUI can be started.  Called before gvimrc is sourced.
+ * Return OK or FAIL.
+ */
+	int
+gui_mch_init_check(void)//{{{
+{
+	gui.dpy = qt_xdisplay();
+	return OK;
+}//}}}
+
+/*
+ * Initialise the X GUI.  Create all the windows, set up all the call-backs etc.
+ * Returns OK for success, FAIL when the GUI can't be started.
+ */
+	int
+gui_mch_init()//{{{
+{
+	(void) new KApplication();
+	KApplication::kApplication()->dcopClient()->registerAs(KApplication::kApplication()->name(),false);
+//    dbf("%s %s",KGlobal::locale()->language().latin1(),KLocale::defaultLanguage().latin1());
+
+	vmw = new VimMainWindow("KVim",0);
+	vmw->setFrameBorderWidth(0);
+	kapp->setMainWidget(vmw);
+	kapp->setTopWidget(vmw);
+
+	sbpool = new SBPool;
+
+#if QT_VERSION>=300
+	vmw->connect(kapp->clipboard(),SIGNAL(selectionChanged()),vmw,SLOT(clipboard_selection_update()));
+#endif
+	vmw->connect(kapp->clipboard(),SIGNAL(dataChanged()),vmw,SLOT(clipboard_data_update()));
+	clip_lose_selection(&clip_plus);
+	clip_lose_selection(&clip_star);
+
+	gui.in_focus = FALSE; // will be updated
+
+	if (reverse) {
+		gui.def_norm_pixel = gui_get_color((char_u *)"White");
+		gui.def_back_pixel = gui_get_color((char_u *)"Black");
+#if QT_VERSION>=300
+		gui.w->setEraseColor ( QColor(Qt::black) );
+#else
+		gui.w->setBackgroundColor ( QColor(Qt::black) );
+#endif
+	} else {
+		gui.def_norm_pixel = gui_get_color((char_u *)"Black");
+		gui.def_back_pixel = gui_get_color((char_u *)"White");
+#if QT_VERSION>=300
+		gui.w->setEraseColor ( QColor(Qt::white) );
+#else
+		gui.w->setBackgroundColor ( QColor(Qt::white) );
+#endif
+	}
+
+	gui.norm_pixel = gui.def_norm_pixel;
+	gui.back_pixel = gui.def_back_pixel;
+
+	gui.border_width  = 1;
+	gui.border_offset = 1;//gui.border_width;
+	gui.scrollbar_width=SB_DEFAULT_WIDTH;
+	gui.scrollbar_height=SB_DEFAULT_WIDTH;
+
+	//gui.menu_height=vmw->menuBar()->height()+1;
+	//gui.toolbar_height=vmw->toolBar()->height();
+
+	return OK;
+}//}}}
+
+
+/*
+ * Called when the foreground or background color has been changed.
+ */
+	void
+gui_mch_new_colors()//{{{
+{
+	QColor rgb;
+	rgb.setRgb(gui.back_pixel);
+#if QT_VERSION>=300
+	gui.w->setEraseColor(rgb);
+#else
+	gui.w->setBackgroundColor(rgb);
+#endif
+}//}}}
+
+/*
+ * Open the GUI window which was created by a call to gui_mch_init().
+ */
+	int
+gui_mch_open()//{{{
+{
+        gui.dpy=qt_xdisplay();
+	set_normal_colors();
+
+	/* Check that none of the colors are the same as the background color */
+	gui_check_colors();
+
+	/* Get the colors for the highlight groups (gui_check_colors() might have
+	 * changed them).
+	 */
+	highlight_gui_started();    /* re-init colors and fonts */
+#ifdef FEAT_MENU
+	vmw->w->menu = new QPopupMenu(vmw);
+
+#if QT_VERSION>=300
+	vmw->w->menu->insertItem(SmallIcon("ktip"), i18n("&Tip of the day..."), vmw, SLOT(showTipOfTheDay()));
+	vmw->w->menu->insertSeparator();
+#endif
+	if (vmw->have_tearoff) vmw->w->menu->insertTearOffHandle(0,0);
+	vmw->w->menu->insertItem(i18n("&Report Bug ..."), vmw, SLOT(showBugReport()));
+	vmw->w->menu->insertSeparator();
+	vmw->w->menu->insertItem(SmallIcon("kvim"), i18n("&About KVim..."), vmw, SLOT(showAboutApplication()));
+	vmw->w->menu->insertItem(SmallIcon("about_kde"), i18n("About &KDE..."), vmw, SLOT(showAboutKDE()));
+	vmw->menuBar()->insertItem("&KVim", vmw->w->menu);
+#endif
+	if (startfont!=NULL)
+	    gui_mch_init_font((char_u*)startfont->latin1(),0);
+	
+	if (startsize!=NULL)
+	    vmw->resize(startsize->width(), startsize->height());
+
+	gui_mch_update_codec();
+
+	if (kapp->isRestored())
+	    if (KMainWindow::canBeRestored(1))
+		vmw->restore(1);
+	
+	vmw->show();
+#if QT_VERSION>=300
+	if (tip==2) KTipDialog::showTip (vmw,QString::null,true);
+	else if (tip==0) KTipDialog::showTip (vmw);
+#endif
+
+	return OK;
+}//}}}
+
+	void
+gui_mch_exit(int rc)//{{{
+{
+	kapp->quit();
+}//}}}
+
+/*
+ * Get the position of the top left corner of the window.
+ */
+	int
+gui_mch_get_winpos(int *x, int *y)//{{{
+{
+	*x = vmw->x();
+	*y = vmw->y();
+	return OK;
+}//}}}
+
+/*
+ * Set the position of the top left corner of the window to the given
+ * coordinates.
+ */
+	void
+gui_mch_set_winpos(int x, int y)//{{{
+{
+	vmw->move(x,y);
+}//}}}
+
+/*
+ * Set the windows size.
+ * ->resize VimWidget
+ * ->resize vmw (block any events generated from here)
+ */
+void
+gui_mch_set_shellsize(int width, int height,//{{{
+		int min_width, int min_height,
+		int base_width, int base_height)
+{
+	//resize VimWidget
+	vmw->w->resize(width,height);
+
+	//resize vmw
+	int vheight, vwidth;
+	vheight = height;
+	vwidth = width;
+
+	if (gui.which_scrollbars[SBAR_LEFT]) vwidth+=gui.scrollbar_width;
+	if (gui.which_scrollbars[SBAR_RIGHT]) vwidth+=gui.scrollbar_width;
+	if (gui.which_scrollbars[SBAR_BOTTOM]) vheight+=gui.scrollbar_height;
+
+	if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled()
+#if QT_VERSION>=300
+		&& !vmw->menuBar()->isTopLevelMenu()
+#endif
+		)
+	    vheight += vmw->menuBar()->height();
+#ifdef FEAT_TOOLBAR
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+		(vmw->toolBar()->barPos()==KToolBar::Top ||
+		 vmw->toolBar()->barPos()==KToolBar::Bottom))
+	    vheight += vmw->toolBar()->height();
+
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+		(vmw->toolBar()->barPos()==KToolBar::Left ||
+		 vmw->toolBar()->barPos()==KToolBar::Right))
+	    vwidth += vmw->toolBar()->width();
+#endif
+	vmw->lock();
+	vmw->resize(vwidth,vheight);
+	gui_mch_update();
+	//size should be nearly perfect, update baseSize and sizeIncrement
+	vmw->setBaseSize(base_width,vmw->menuBar()->height()+1+vmw->toolBar()->height()+gui.char_height*2);
+	vmw->setSizeIncrement( ( ( int )( gui.char_width/2 )*2 ),gui.char_height);
+	vmw->unlock();
+}//}}}
+
+
+/*
+ * The screen size is used to make sure the initial window doesn't get bigger
+ * then the screen.  This subtracts some room for menubar, toolbar and window
+ * decorations.
+ */
+	void
+gui_mch_get_screen_dimensions(int *screen_w, int *screen_h)//{{{
+{
+	*screen_w = kapp->desktop()->width();
+	*screen_h = kapp->desktop()->height();
+}//}}}
+
+#if defined(FEAT_MENU) || defined(PROTO)
+	void
+gui_mch_enable_menu(int showit)//{{{
+{
+	if (showit)
+		vmw->menuBar()->show();
+	else
+		vmw->menuBar()->hide();
+	vmw->resize(vmw->width(),vmw->height());
+}//}}}
+#endif
+
+
+#if defined(FEAT_TOOLBAR) || defined(PROTO)
+	void
+gui_mch_show_toolbar(int showit)//{{{
+{
+	if (showit)
+		vmw->toolBar()->show();
+	else
+		vmw->toolBar()->hide();
+	vmw->resize(vmw->width(),vmw->height());
+}//}}}
+#endif
+
+/*
+ * Put up a font dialog and return the selected font name in allocated memory.
+ * "oldval" is the previous value.
+ * Return NULL when cancelled.
+ */
+
+char_u *gui_mch_font_dialog (char_u *oldval)//{{{
+{
+	QFont myFont( vmw->w->font() );
+	if (gui.fontname) {
+		gui.fontname=NULL;
+	}
+	int result = KFontDialog::getFont( myFont, true );
+	if ( result != KFontDialog::Accepted ) {
+		return NULL;
+	}
+//	myFont.setFixedPitch(true);
+#if QT_VERSION>=300
+	QString n = myFont.toString();
+#else
+	QString n = KVimUtils::toString(&myFont);
+#endif
+	n.replace(QRegExp(","),"/");
+	gui.fontname = (char_u *)strdup((const char *)n);
+	n.replace(QRegExp(" "),"\\ ");
+	n=QString("To set this font as your default font for KVim, edit your ~/.gvimrc file and add the following lines : \nif has(\"gui_kde\")\nset guifont=")+n+QString("\nendif");// \n OR \n use the control center of KDE and choose the correct fixed font");
+
+	//display a message box which explains how to save your font settings
+	KMessageBox::information(vmw, n,"Font Selection", "kvimselectfont");
+
+	return vim_strsave(gui.fontname);
+}//}}}
+
+/*
+ * Initialise vim to use the font with the given name.
+ * Return FAIL if the font could not be loaded, OK otherwise.
+ */
+	int
+gui_mch_init_font(char_u * font_name, int fontset)//{{{
+{
+	QString fontname;
+	GuiFont font=NULL;
+	
+	if (font_name==NULL) {
+#if 0
+#if QT_VERSION>=300
+		KConfig *base = KGlobal::config();
+#else
+		KConfigBase *base = KGlobal::config();
+#endif
+		base->setGroup("General");
+		if(!base->hasKey("fixed")) {
+			KMessageBox::error(KApplication::kApplication()->mainWidget(),"Cannot load default fixed font\n\nConfigure fonts in KDE Control Center.\n(Just click 'Choose...', 'OK' and then 'Apply')");
+			return FAIL;
+		}
+#if QT_VERSION>=300
+		QString f = base->readEntry("fixed");
+#else
+		QFont ft = base->readFontEntry("fixed", NULL);
+		QString f = KVimUtils::toString(&ft);
+#endif
+		font_name = (char_u*)strdup(f.latin1()); //latin1 ?
+#else
+		font_name = (char_u*)strdup("misc-fixed/10/-1/5/50/0/0/0/1/0");
+#endif
+	}
+	fontname = (const char *)font_name;
+/*	fontname.replace(QRegExp("/"),",");
+	font = new QFont();
+	font->fromString( fontname );
+*/
+	gui_mch_free_font(gui.norm_font);
+#ifdef FEAT_XFONTSET
+	gui_mch_free_fontset(gui.fontset);
+	if (fontset)
+	    font = gui_mch_get_fontset(font_name,TRUE,TRUE);
+#endif
+	if (font == NULL) {
+	    font = gui_mch_get_font(font_name,FALSE);
+	    gui.norm_font = font;
+#ifdef FEAT_XFONTSET
+	    gui.fontset=NOFONTSET;
+#endif
+	}
+#ifdef FEAT_XFONTSET
+	else {
+	    gui.fontset=font;
+	    gui.norm_font=NOFONT;
+	}
+#endif
+
+	if (font == NULL)
+		return FAIL;
+
+	if (fontname.contains('*') && fontname.contains('-'))
+		return FAIL;
+
+	QFontMetrics f(*font);
+	gui.char_width  = f.maxWidth();
+	gui.char_height = f.height()+p_linespace;
+	gui.char_ascent = f.ascent()+p_linespace/2;
+	
+	//check values, just to make sure and avoid a crash
+	if (gui.char_width<=0) gui.char_width=8;
+	if (gui.char_height<=0) gui.char_height=1;
+
+	hl_set_font_name(font_name);
+
+	return OK;
+}//}}}
+
+	GuiFont
+gui_mch_get_font(char_u * name, int report_error)//{{{
+{
+	QString fontname((const char *)name);
+	if (!gui.in_use || name == NULL)
+		return NOFONT;
+	if (fontname.contains('*') && fontname.contains('-'))
+		return NOFONT; // XFLD names not allowed anymore
+	QFont *myFont = new QFont();
+	fontname.replace(QRegExp("/"),",");
+//	myFont->setRawMode(TRUE);
+
+#if QT_VERSION>=300
+	myFont->fromString(fontname);
+#else
+	KVimUtils::fromString(myFont,fontname);
+#endif
+	myFont->setFixedPitch(true);
+	if (!myFont->fixedPitch()) dbf("Non fixed-width font");
+	return (GuiFont) myFont;
+}//}}}
+
+/*
+ * Set the current text font.
+ * Since we create all GC on demand, we use just gui.current_font to
+ * indicate the desired current font.
+ */
+	void
+gui_mch_set_font(GuiFont font)//{{{
+{
+	gui.current_font=font;
+	gui.w->painter->setFont( *(gui.current_font) );
+}//}}}
+
+/*
+ * If a font is not going to be used, free its structure.
+ */
+	void
+gui_mch_free_font(GuiFont font)//{{{
+{
+    if (font)
+	delete font; // this is a QFont , we can delete it :)
+}//}}}
+
+GuiFontset gui_mch_get_fontset (char_u *name, int report_error, int fixed_width)
+{
+    return (GuiFontset)gui_mch_get_font(name,report_error);
+}
+
+void gui_mch_set_fontset (GuiFontset fontset)
+{
+    gui_mch_set_font((GuiFont)fontset);
+}
+
+void gui_mch_free_fontset (GuiFontset fontset)
+{
+    if (fontset)
+	delete fontset;
+}
+
+void gui_mch_settitle (char_u *title, char_u *icon)//{{{
+{
+	if (!gui.in_use)		/* can't do this when GUI not running */
+	    return;
+	vmw->setPlainCaption((const char *)title);
+	QPixmap p((const char *)icon);
+	vmw->setIcon(p); //FIXME
+}//}}}
+
+/*
+ * Return the Pixel value (color) for the given color name.  This routine was
+ * pretty much taken from example code in the Silicon Graphics OSF/Motif
+ * Programmer's Guide.
+ * Return -1 for error.
+ */
+	guicolor_T
+gui_mch_get_color(char_u * name)//{{{
+{
+	int i;
+	static char *(vimnames[][2]) =
+	{
+		/* A number of colors that some X11 systems don't have */
+		{"LightRed", "#FFA0A0"},
+		{"LightGreen", "#80FF80"},
+		{"LightMagenta", "#FFA0FF"},
+		{"DarkCyan", "#008080"},
+		{"DarkBlue", "#0000C0"},
+		{"DarkRed", "#C00000"},
+		{"DarkMagenta", "#C000C0"},
+		{"DarkGrey", "#C0C0C0"},
+		{NULL, NULL}
+	};
+
+	if (!gui.in_use)		/* can't do this when GUI not running */
+		return (guicolor_T)(-1);
+
+	QColor _color((const char *)name);
+
+
+	if (_color.isValid()) {
+		//return (_color.red() << 16) +  ((_color.green() << 8)) + (_color.blue());
+		return _color.rgb();
+		//return (guicolor_T) _color.pixel();
+	}
+
+	/* add a few builtin names */
+	for (i = 0;; ++i) {
+		if (vimnames[i][0] == NULL)
+			return (guicolor_T)(-1);
+		if (STRICMP(name, vimnames[i][0]) == 0) {
+			name = (char_u *) vimnames[i][1];
+			return gui_mch_get_color(name);
+		}
+	}
+
+	return (guicolor_T)(-1); // dead code, should not be reached..
+}//}}}
+
+/*
+ * Set the current text foreground color.
+ */
+	void
+gui_mch_set_fg_color(guicolor_T color)//{{{
+{
+	QColor rgb;
+	rgb.setRgb(color);
+	gui.w->painter->setPen( rgb );
+}//}}}
+
+/*
+ * Set the current text background color.
+ */
+	void
+gui_mch_set_bg_color(guicolor_T color)//{{{
+{
+	QColor rgb;
+	rgb.setRgb(color);
+	gui.w->painter->setBackgroundColor(rgb);
+}//}}}
+
+/*
+ * Use the blank mouse pointer or not.
+ *
+ * hide: TRUE = use blank ptr, FALSE = use parent ptr
+ */
+	void
+gui_mch_mousehide(int hide)//{{{
+{
+	if (hide == gui.pointer_hidden) return;
+	//#ifdef FEAT_MOUSESHAPE
+	//	if( !hide) mch_set_mouse_shape(last_shape);
+	//#else
+# if (QT_VERSION<300)
+	gui.w->setCursor((hide)?BlankCursor:ArrowCursor);
+# else
+	gui.w->setCursor((hide)?Qt::BlankCursor:Qt::ArrowCursor);
+# endif
+	//#endif
+	gui.pointer_hidden = hide;
+}//}}}
+
+	void
+gui_mch_update_codec()
+{
+#ifdef FEAT_MBYTE
+	if (!gui.in_use) return;
+	vmw->codec = QTextCodec::codecForName((const char *)p_enc);
+	if (vmw->codec==NULL)
+	    vmw->codec = QTextCodec::codecForName(KVimUtils::convertEncodingName(QString((const char*)p_enc)));
+	if (vmw->codec==NULL)
+	    vmw->codec = QTextCodec::codecForLocale();
+#else
+        vmw->codec = QTextCodec::codecForLocale();
+#endif
+	if (vmw->codec==NULL)
+	    vmw->codec = QTextCodec::codecForName("ISO-8859-1"); //fallback
+}
+
+	void
+gui_mch_draw_string(int row, int col, char_u * s, int len, int flags)//{{{
+{
+	QString text = vmw->codec->toUnicode((const char *)s,len);
+	gui.w->draw_string( TEXT_X(col), TEXT_Y(row), text, text.length(), flags );
+}//}}}
+
+#if defined(FEAT_TITLE) || defined(PROTO)
+/*
+ * Return the text window-id and display.  Only required for X-based GUI's
+ */
+	int
+gui_get_x11_windis(Window * win, Display ** dis)//{{{
+{
+	*win = /*vmw*/gui.w->winId();
+	*dis = qt_xdisplay();
+	return OK;
+}//}}}
+#endif
+
+	void
+gui_mch_beep()//{{{
+{
+	kapp->beep();
+}//}}}
+
+	void
+gui_mch_flash(int msec)//{{{
+{
+	gui.w->flash();
+}//}}}
+
+/*
+ * Invert a rectangle from row r, column c, for nr rows and nc columns.
+ */
+	void
+gui_mch_invert_rectangle(int r, int c, int nr, int nc)//{{{
+{
+	bitBlt (
+			gui.w,
+			FILL_X(c), FILL_Y(r),
+			gui.w,
+			FILL_X(c), FILL_Y(r),
+			(nc) * gui.char_width,
+			(nr) * gui.char_height,
+			Qt::NotROP,	    // raster Operation
+			true );		    // ignoreMask
+}//}}}
+
+/*
+ * Iconify the GUI window.
+ */
+	void
+gui_mch_iconify()//{{{
+{
+	vmw->showMinimized();
+}//}}}
+
+/*
+ * Draw a cursor without focus.
+ */
+	void
+gui_mch_draw_hollow_cursor(guicolor_T color)//{{{
+{
+	QPainter p(gui.w);
+	p.setPen( color );
+
+	p.drawRect(FILL_X(gui.col), FILL_Y(gui.row), gui.char_width - 1, gui.char_height - 1 );
+
+	p.end();
+}//}}}
+
+/*
+ * Draw part of a cursor, "w" pixels wide, and "h" pixels high, using
+ * color "color".
+ */
+	void
+gui_mch_draw_part_cursor(int w, int h, guicolor_T color)//{{{
+{
+	QPainter p(gui.w);
+	p.setPen( color );
+	p.fillRect(
+			FILL_X(gui.col),
+			FILL_Y(gui.row) + gui.char_height - h +1,
+			w, h-2, QColor( color, color));
+	p.drawRect(FILL_X(gui.col),FILL_Y(gui.row) + gui.char_height - h + (int)p_linespace / 2,
+			w, h - (int)p_linespace );
+
+}//}}}
+
+
+/*
+ * Catch up with any queued X11 events.  This may put keyboard input into the
+ * input buffer, call resize call-backs, trigger timers etc.  If there is
+ * nothing in the X11 event queue (& no timers pending), then we return
+ * immediately.
+ */
+	void
+gui_mch_update()//{{{
+{
+	kapp->processEvents();
+}//}}}
+
+
+/*
+ * GUI input routine called by gui_wait_for_chars().  Waits for a character
+ * from the keyboard.
+ *  wtime == -1     Wait forever.
+ *  wtime == 0      This should never happen.
+ *  wtime > 0       Wait wtime milliseconds for a character.
+ * Returns OK if a character was found to be available within the given time,
+ * or FAIL otherwise.
+ */
+	int
+gui_mch_wait_for_chars(long wtime)//{{{
+{
+	// malte@kde.org's  gift to KVim ;), thanks to him :) for this hard to find bug
+	if (wtime>0) {
+		gui.w->wait( wtime );
+		while ( vim_is_input_buf_empty() && !gui.w->wait_done )
+			kapp->processOneEvent();
+		return vim_is_input_buf_empty() ? FAIL : OK;
+	} else
+		while (vim_is_input_buf_empty() ) {
+			kapp->processOneEvent();
+		}
+
+	return OK;
+}//}}}
+
+
+/****************************************************************************
+ * Output drawing routines.
+ ****************************************************************************/
+
+
+/* Flush any output to the screen */
+	void
+gui_mch_flush()//{{{
+{
+	kapp->flushX();
+}//}}}
+
+/*
+ * Clear a rectangular region of the screen from text pos (row1, col1) to
+ * (row2, col2) inclusive.
+ */
+	void
+gui_mch_clear_block(int row1, int col1, int row2, int col2)//{{{
+{
+	gui.w->erase (FILL_X(col1), FILL_Y(row1),
+			(col2 - col1 + 1) * gui.char_width+ (col2 == Columns - 1),
+			(row2 - row1 + 1) * gui.char_height );
+}//}}}
+
+	void
+gui_mch_clear_all(void)//{{{
+{
+	gui.w->erase();
+}//}}}
+
+
+/*
+ * Delete the given number of lines from the given row, scrolling up any
+ * text further down within the scroll region.
+ */
+	void
+gui_mch_delete_lines(int row, int num_lines)//{{{
+{
+	if (num_lines <= 0)
+		return;
+
+	if (row + num_lines > gui.scroll_region_bot) {
+		/* Scrolled out of region, just blank the lines out */
+		gui_clear_block(row, gui.scroll_region_left, gui.scroll_region_bot, gui.scroll_region_right);
+	} else {
+		bitBlt (
+				gui.w,
+				FILL_X(gui.scroll_region_left), FILL_Y(row),
+				gui.w,
+				FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines),
+				gui.char_width * (gui.scroll_region_right -gui.scroll_region_left + 1) + 1,
+				gui.char_height * (gui.scroll_region_bot - row - num_lines + 1),
+				Qt::CopyROP,	    // raster Operation
+				true );		    // ignoreMask
+
+		/* Update gui.cursor_row if the cursor scrolled or copied over */
+		if (gui.cursor_row >= row) {
+			if (gui.cursor_row < row + num_lines)
+				gui.cursor_is_valid = FALSE;
+			else if (gui.cursor_row <= gui.scroll_region_bot)
+				gui.cursor_row -= num_lines;
+		}
+
+		gui_clear_block(gui.scroll_region_bot - num_lines + 1, gui.scroll_region_left,
+				gui.scroll_region_bot, gui.scroll_region_right);
+
+	}
+}//}}}
+
+/*
+ * Insert the given number of lines before the given row, scrolling down any
+ * following text within the scroll region.
+ */
+	void
+gui_mch_insert_lines(int row, int num_lines)//{{{
+{
+	if (num_lines <= 0)
+		return;
+
+	if (row + num_lines > gui.scroll_region_bot) {
+		/* Scrolled out of region, just blank the lines out */
+		gui_clear_block(row, gui.scroll_region_left, gui.scroll_region_bot, gui.scroll_region_right - 1);
+	} else {
+		bitBlt (
+				gui.w,
+				FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines),
+				gui.w,
+				FILL_X(gui.scroll_region_left), FILL_Y(row),
+				gui.char_width * ( gui.scroll_region_right - gui.scroll_region_left + 1 ) + 1,
+				gui.char_height * (gui.scroll_region_bot - row - num_lines + 1),
+				Qt::CopyROP,	    // raster Operation
+				true );		    // ignoreMask
+
+		/* Update gui.cursor_row if the cursor scrolled or copied over */
+		if (gui.cursor_row >= gui.row) {
+			if (gui.cursor_row <= gui.scroll_region_bot - num_lines)
+				gui.cursor_row += num_lines;
+			else if (gui.cursor_row <= gui.scroll_region_bot)
+				gui.cursor_is_valid = FALSE;
+		}
+
+		gui_clear_block(row, gui.scroll_region_left, row + num_lines - 1, gui.scroll_region_right);
+	}
+}//}}}
+
+/*
+ * X Selection stuff, for cutting and pasting text to other windows.
+ */
+	void
+clip_mch_request_selection(VimClipboard *cbd)//{{{
+{
+#if QT_VERSION>=300
+	if (cbd==&clip_star) kapp->clipboard()->setSelectionMode(true);
+#endif
+	QString selection = kapp->clipboard()->text();
+
+	QCString unistring = vmw->codec->fromUnicode(selection);
+	clip_yank_selection(MCHAR,(char_u *)(const char*)unistring,(long) unistring.length(),cbd);
+#if QT_VERSION>=300
+	if (cbd==&clip_star) kapp->clipboard()->setSelectionMode(false);
+#endif
+}//}}}
+
+	void
+clip_mch_lose_selection(VimClipboard *cbd)//{{{
+{
+	//Don't need to do anything here
+	gui_mch_update();
+}//}}}
+
+/*
+ * Check whatever we allready own the selection.
+ */
+	int
+clip_mch_own_selection(VimClipboard *cbd)//{{{
+{
+	if (kapp->clipboard()->ownsSelection())
+	    return OK;
+	else {
+#if QT_VERSION>=300
+	    kapp->clipboard()->setSelectionMode(true);
+#endif
+	    return OK;
+	}
+}//}}}
+
+/*
+ * Send the current selection to the clipboard.
+ */
+void
+clip_mch_set_selection(VimClipboard *cbd){//{{{
+	char_u *data;
+	long_u length;
+
+	clip_get_selection(cbd);
+	if(clip_convert_selection(&data,&length,cbd)<0) return;
+
+	QString selection((const char *) data);
+	//We must turncate the string because it is not
+	// null terminated
+	selection.truncate((uint) length);
+
+#if QT_VERSION>=300
+	if (cbd==&clip_star) kapp->clipboard()->setSelectionMode(true);
+#endif
+	kapp->clipboard()->setText(selection);
+#if QT_VERSION>=300
+	kapp->clipboard()->setSelectionMode(false);
+#endif
+}//}}}
+
+
+#if defined(FEAT_MENU) || defined(PROTO)
+/*
+ * Make a menu item appear either active or not active (grey or not grey).
+ */
+	void
+gui_mch_menu_grey(vimmenu_T * menu, int grey)//{{{
+{
+	if ( !menu || !menu->parent || !menu->parent->widget ) return;
+	menu->parent->widget->setItemEnabled((int)menu, !grey);
+	gui_mch_update();
+}//}}}
+
+/*
+ * Make menu item hidden or not hidden.
+ */
+	void
+gui_mch_menu_hidden(vimmenu_T * menu, int hidden)//{{{
+{
+	//FIXME: cannot be fixed AFAIK
+	gui_mch_menu_grey(menu,hidden); // it's hard to remove an item in a QPopupMenu
+}//}}}
+
+/*
+ * This is called after setting all the menus to grey/hidden or not.
+ */
+	void
+gui_mch_draw_menubar()//{{{
+{
+	// nothing to do under kde
+}//}}}
+#endif
+
+/*
+ * Scrollbar stuff.
+ */
+	void
+gui_mch_enable_scrollbar(scrollbar_T * sb, int flag)//{{{
+{
+	if (!sb->w) return;
+	int width = gui.w->width();
+	int height = gui.w->height();
+	int neww = vmw->width();
+	int newh = vmw->height();
+
+	if (gui.which_scrollbars[SBAR_LEFT]) width += gui.scrollbar_width;
+	if (gui.which_scrollbars[SBAR_RIGHT]) width += gui.scrollbar_width;
+	if (gui.which_scrollbars[SBAR_BOTTOM]) height += gui.scrollbar_height;
+	
+	if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled()
+#if QT_VERSION>=300
+		&& !vmw->menuBar()->isTopLevelMenu()
+#endif
+		)
+	    height += vmw->menuBar()->height();
+#ifdef FEAT_TOOLBAR
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+		(vmw->toolBar()->barPos()==KToolBar::Top ||
+		 vmw->toolBar()->barPos()==KToolBar::Bottom))
+	    height += vmw->toolBar()->height();
+
+	if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+		(vmw->toolBar()->barPos()==KToolBar::Left ||
+		 vmw->toolBar()->barPos()==KToolBar::Right))
+	    width += vmw->toolBar()->width();
+#endif
+	if ( abs(vmw->width() - width)>5 && (sb->type==SBAR_LEFT || sb->type==SBAR_RIGHT) )
+	    neww=width;
+	if (abs(vmw->height() - height)>5 && (sb->type==SBAR_BOTTOM) )
+	    newh=height;
+
+	if (flag)
+	    sb->w->show();
+	else
+	    sb->w->hide();
+	gui_mch_update();
+	vmw->lock();
+	vmw->resize(neww,newh);
+	vmw->unlock();
+	gui_mch_update();
+}//}}}
+
+/*
+ * Return the RGB value of a pixel as "#RRGGBB".
+ */
+	long_u
+gui_mch_get_rgb(guicolor_T pixel)//{{{
+{
+//	QColor c(pixel,pixel);
+//	return (c.red() << 16) +  ((c.green() << 8)) + (c.blue());
+	return pixel; // funny no ? it looks like with Qt we can always use directly the rgb value (i hope i don't break colors again ;p)
+}//}}}
+
+/*
+ * Get current y mouse coordinate in text window.
+ * Return -1 when unknown.
+ */
+	int
+gui_mch_get_mouse_x(void)//{{{
+{
+	return vmw->mapFromGlobal( QCursor::pos() ).x();
+}//}}}
+
+	int
+gui_mch_get_mouse_y(void)//{{{
+{
+	return vmw->mapFromGlobal( QCursor::pos() ).y();
+}//}}}
+
+	void
+gui_mch_setmouse(int x, int y)//{{{
+{
+	QCursor::setPos( vmw->mapToGlobal( QPoint(x,y)) );
+}//}}}
+
+#if defined(FEAT_MOUSESHAPE) || defined(PROTO)
+#if QT_VERSION>=300
+static int mshape_ids[] = {//{{{
+	Qt::ArrowCursor,		/* arrow */
+	Qt::BlankCursor,		/* blank */
+	Qt::IbeamCursor,		/* beam */
+	Qt::SizeVerCursor,		/* updown */
+	Qt::SplitHCursor,		/* udsizing */
+	Qt::SizeHorCursor,		/* leftright */
+	Qt::SizeHorCursor,		/* lrsizing */
+	Qt::WaitCursor,		/* busy */
+	Qt::ForbiddenCursor,	/* no */
+	Qt::CrossCursor,		/* crosshair */
+	Qt::PointingHandCursor,	/* hand1 */
+	Qt::PointingHandCursor,	/* hand2 */
+	Qt::ArrowCursor,		/* pencil */
+	Qt::WhatsThisCursor,	/* question */
+	Qt::ArrowCursor,		/* right-arrow */
+	Qt::UpArrowCursor,		/* up-arrow */
+	Qt::ArrowCursor		/* last one */
+};//}}}
+#else
+static int mshape_ids[] = {//{{{
+	ArrowCursor,		/* arrow */
+	BlankCursor,		/* blank */
+	IbeamCursor,		/* beam */
+	SizeVerCursor,		/* updown */
+	SplitHCursor,		/* udsizing */
+	SizeHorCursor,		/* leftright */
+	SizeHorCursor,		/* lrsizing */
+	WaitCursor,			/* busy */
+	ForbiddenCursor,		/* no */
+	CrossCursor,		/* crosshair */
+	PointingHandCursor,		/* hand1 */
+	PointingHandCursor,		/* hand2 */
+	ArrowCursor,		/* pencil */
+	ArrowCursor,		/* question */
+	ArrowCursor,		/* right-arrow */
+	UpArrowCursor,		/* up-arrow */
+	ArrowCursor			/* last one */
+};//}}}
+#endif
+
+	void
+mch_set_mouse_shape (int shape)//{{{
+{
+	int		   id;
+
+	if (shape == MSHAPE_HIDE || gui.pointer_hidden)
+#if QT_VERSION>=300
+		gui.w->setCursor(Qt::BlankCursor);
+#else
+		gui.w->setCursor(BlankCursor);
+#endif
+	else
+	{
+		if (shape >= MSHAPE_NUMBERED)
+		{
+			id = shape - MSHAPE_NUMBERED;
+			/*		if (id >= GDK_NUM_GLYPHS)
+					id = GDK_LEFT_PTR;
+					else
+					id &= ~1;*/	/* they are always even (why?) */
+			id &= -1;
+		}
+		else
+			id = mshape_ids[shape];
+
+		gui.w->setCursor(id);
+	}
+	if (shape != MSHAPE_HIDE)
+		last_shape = shape;
+}//}}}
+#endif
+
+	int
+gui_mch_adjust_charsize ()//{{{
+{
+	QFont f(*(gui.current_font));
+	QFontMetrics fm (f);
+	gui.char_height = fm.height() + p_linespace;
+	//gui.char_height = fm.ascent() + fm.descent() + p_linespace;
+	gui.char_ascent = fm.ascent() + p_linespace/2;
+
+	return OK;
+}//}}}
+
+	void
+gui_mch_set_foreground ()//{{{
+{
+	KWin::setActiveWindow(vmw->winId());
+}//}}}
+
+
+
diff --git a/src/kvim_iface.h b/src/kvim_iface.h
new file mode 100644
index 0000000..1084bc2
--- /dev/null
+++ b/src/kvim_iface.h
@@ -0,0 +1,19 @@
+#ifndef KVIM_IFACE
+#define KVIM_IFACE
+
+#include <dcopobject.h>
+
+class KVim : virtual public DCOPObject
+{
+	K_DCOP
+public:
+
+k_dcop:
+	virtual void execInsert(QString command)=0;
+	virtual void execNormal(QString command)=0;
+	virtual void execRaw(QString command)=0;
+	virtual void execCmd(QString command)=0;
+	virtual QString eval(QString expr)=0;
+};
+
+#endif
diff --git a/src/main.c b/src/main.c
index 91854bf..5fd8339 100644
--- a/src/main.c
+++ b/src/main.c
@@ -259,7 +259,7 @@
 	    break;
 # ifdef FEAT_XCLIPBOARD
 	else if (STRICMP(argv[i], "-display") == 0
-#  ifdef FEAT_GUI_GTK
+#  if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
 		|| STRICMP(argv[i], "--display") == 0
 #  endif
 		)
@@ -442,7 +442,7 @@
 	++initstr;
     }
 
-    if (TOLOWER_ASC(initstr[0]) == 'g')
+    if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k')
     {
 	main_start_gui();
 #ifdef FEAT_GUI
@@ -1087,7 +1087,7 @@
 #ifdef ALWAYS_USE_GUI
     gui.starting = TRUE;
 #else
-# if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+# if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
     /*
      * Check if the GUI can be started.  Reset gui.starting if not.
      * Don't know about other systems, stay on the safe side and don't check.
@@ -1170,7 +1170,7 @@
      * For GTK we can't be sure, but when started from the desktop it doesn't
      * make sense to try using a terminal.
      */
-#if defined(ALWAYS_USE_GUI) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+#if defined(ALWAYS_USE_GUI) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
     if (gui.starting
 # ifdef FEAT_GUI_GTK
 	    && !isatty(2)
@@ -2614,6 +2614,17 @@
 # endif
     main_msg(_("--socketid <xid>\tOpen Vim inside another GTK widget"));
 #endif
+#ifdef FEAT_GUI_KDE
+    mch_msg(_("\nArguments recognised by kvim (KDE version):\n"));
+    main_msg(_("-black\t\tUse reverse video"));
+#if QT_VERSION>=300
+    main_msg(_("-tip\t\t\tDisplay the tip dialog on startup"));
+    main_msg(_("-notip\t\tDisable the tip dialog"));
+#endif
+    main_msg(_("-font <font>\t\tUse <font> for normal text (also: -fn)"));
+    main_msg(_("-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"));
+    main_msg(_("--display <display>\tRun vim on <display>"));
+#endif
 #ifdef FEAT_GUI_W32
     main_msg(_("-P <parent title>\tOpen Vim inside parent application"));
 #endif
diff --git a/src/mbyte.c b/src/mbyte.c
index 699316d..db7c652 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -690,6 +690,11 @@
     apply_autocmds(EVENT_ENCODINGCHANGED, NULL, (char_u *)"", FALSE, curbuf);
 #endif
 
+#ifdef FEAT_GUI_KDE
+    if (gui.in_use)
+	gui_mch_update_codec();
+#endif
+
     return NULL;
 }
 
@@ -3976,7 +3981,7 @@
 # endif
 #endif
 
-#if defined(FEAT_GUI_GTK) || defined(PROTO)
+#if defined(FEAT_GUI_GTK) || defined(PROTO) || defined(FEAT_GUI_KDE)
 static int	preedit_buf_len = 0;
 static int	xim_can_preediting INIT(= FALSE);	/* XIM in showmode() */
 static int	xim_input_style;
@@ -4112,7 +4117,7 @@
     /* If 'imdisable' is set, XIM is never active. */
     if (p_imdisable)
 	active = FALSE;
-#ifndef FEAT_GUI_GTK
+#if !defined (FEAT_GUI_GTK) && !defined (FEAT_GUI_KDE)
     else if (input_style & XIMPreeditPosition)
 	/* There is a problem in switching XIM off when preediting is used,
 	 * and it is not clear how this can be solved.  For now, keep XIM on
@@ -4386,6 +4391,8 @@
 	    gdk_ic_set_attr(xic, attr, (GdkICAttributesType)attrmask);
     }
 #else /* FEAT_GUI_GTK */
+# ifdef FEAT_GUI_KDE
+# else
     {
 	XVaNestedList attr_list;
 	XRectangle spot_area;
@@ -4432,6 +4439,7 @@
 	    XFree(attr_list);
 	}
     }
+# endif /* FEAT_GUI_KDE */
 #endif /* FEAT_GUI_GTK */
 }
 
@@ -4485,6 +4493,8 @@
     }
 # endif
 #else
+# ifdef FEAT_GUI_KDE
+# else
     {
 	XVaNestedList preedit_list = 0, status_list = 0, list = 0;
 	XRectangle pre_area, status_area;
@@ -4576,6 +4586,7 @@
 	if (preedit_list)
 	    XFree(preedit_list);
     }
+# endif /* FEAT_GUI_KDE */
 #endif
 }
 
@@ -5350,6 +5361,8 @@
 #ifdef FEAT_GUI_GTK
     if (xim_input_style & (int)GDK_IM_STATUS_AREA)
 	return gui.char_height;
+#elif defined FEAT_GUI_KDE
+#warning FIXME
 #else
     if (status_area_enabled)
 	return gui.char_height;
diff --git a/src/menu.c b/src/menu.c
index 052910f..fc8411f 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -96,7 +96,7 @@
     char_u	*arg;
     char_u	*p;
     int		i;
-#if defined(FEAT_GUI) && !defined(FEAT_GUI_GTK)
+#if defined(FEAT_GUI) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_KDE)
     int		old_menu_height;
 # if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_W16)
     int		old_toolbar_height;
@@ -320,7 +320,7 @@
 	EMSG(_(e_trailing));
 	goto theend;
     }
-#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON))
+#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) || defined(FEAT_GUI_PHOTON))
     old_menu_height = gui.menu_height;
 # if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_W16)
     old_toolbar_height = gui.toolbar_height;
@@ -437,7 +437,7 @@
 	vim_free(map_buf);
     }
 
-#if defined(FEAT_GUI) && !defined(FEAT_GUI_GTK)
+#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE))
     /* If the menubar height changed, resize the window */
     if (gui.in_use
 	    && (gui.menu_height != old_menu_height
@@ -1843,7 +1843,7 @@
     }
 }
 
-#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
+#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) \
     || defined(FEAT_GUI_PHOTON) || defined(PROTO)
 /*
  * Check if a key is used as a mnemonic for a toplevel menu.
@@ -2174,6 +2174,7 @@
 }
 
 #if defined(FEAT_GUI_MSWIN) \
+	|| (defined(FEAT_GUI_KDE) && defined(FEAT_MENU)) \
 	|| (defined(FEAT_GUI_GTK) && defined(FEAT_MENU)) \
 	|| defined(FEAT_BEVAL_TIP) || defined(PROTO)
 /*
diff --git a/src/misc1.c b/src/misc1.c
index 6c5cb6a..6330110 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -4055,7 +4055,7 @@
 
 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
 	|| defined(FEAT_SESSION) || defined(MSWIN) \
-	|| (defined(FEAT_GUI_GTK) \
+	|| ((defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)) \
 			    && (defined(FEAT_WINDOWS) || defined(FEAT_DND))) \
 	|| defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
 	|| defined(PROTO)
diff --git a/src/misc2.c b/src/misc2.c
index 55c44a8..3678947 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2668,8 +2668,8 @@
 }
 
 #if defined(FEAT_SESSION) || defined(MSWIN) || defined(FEAT_GUI_MAC) \
-	|| (defined(FEAT_GUI_GTK) \
-			    && (defined(FEAT_WINDOWS) || defined(FEAT_DND))) \
+	|| ((defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)) \
+			&& ( defined(FEAT_WINDOWS) || defined(FEAT_DND)) ) \
 	|| defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
 	|| defined(PROTO)
 /*
diff --git a/src/normal.c b/src/normal.c
index 222e475..8fb8c02 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -2357,7 +2357,7 @@
 	     * NOTE: Ignore right button down and drag mouse events.
 	     * Windows only shows the popup menu on the button up event.
 	     */
-#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON)
+#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_KDE)
 	    if (!is_click)
 		return FALSE;
 #endif
@@ -2365,7 +2365,7 @@
 	    if (is_click || is_drag)
 		return FALSE;
 #endif
-#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
+#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) \
 	    || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \
 	    || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON)
 	    if (gui.in_use)
diff --git a/src/option.c b/src/option.c
index fcbddea..948018d 100644
--- a/src/option.c
+++ b/src/option.c
@@ -1019,14 +1019,14 @@
 #endif
 				    },
     {"guiheadroom", "ghr",  P_NUM|P_VI_DEF,
-#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
+#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_KDE)
 			    (char_u *)&p_ghr, PV_NONE,
 #else
 			    (char_u *)NULL, PV_NONE,
 #endif
 			    {(char_u *)50L, (char_u *)0L}},
     {"guioptions",  "go",   P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST,
-#if defined(FEAT_GUI)
+#if defined(FEAT_GUI) || defined(FEAT_GUI_KDE)
 			    (char_u *)&p_go, PV_NONE,
 # if defined(UNIX) && !defined(MACOS)
 			    {(char_u *)"agimrLtT", (char_u *)0L}
@@ -1112,7 +1112,7 @@
 			    (char_u *)&p_ic, PV_NONE,
 			    {(char_u *)FALSE, (char_u *)0L}},
     {"imactivatekey","imak",P_STRING|P_VI_DEF,
-#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+#if defined(FEAT_XIM) && (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE))
 			    (char_u *)&p_imak, PV_NONE,
 #else
 			    (char_u *)NULL, PV_NONE,
@@ -4906,7 +4906,7 @@
     }
 #endif
 
-#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+#if defined(FEAT_XIM) && ( defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) )
     else if (varp == &p_imak)
     {
 	if (gui.in_use && !im_xim_isvalid_imactivate())
@@ -5163,7 +5163,7 @@
 	if (gui.in_use)
 	{
 	    p = p_guifont;
-# ifdef FEAT_GUI_GTK
+# if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
 	    /*
 	     * Put up a font dialog and let the user select a new value.
 	     * If this is cancelled go back to the old value but don't
diff --git a/src/option.h b/src/option.h
index 1d2b83c..7e04190 100644
--- a/src/option.h
+++ b/src/option.h
@@ -466,7 +466,7 @@
 # endif
 EXTERN int	p_guipty;	/* 'guipty' */
 #endif
-#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
+#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_KDE)
 EXTERN long	p_ghr;		/* 'guiheadroom' */
 #endif
 #ifdef CURSOR_SHAPE
@@ -512,7 +512,7 @@
 EXTERN char_u	*p_iconstring;	/* 'iconstring' */
 #endif
 EXTERN int	p_ic;		/* 'ignorecase' */
-#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+#if defined(FEAT_XIM) && (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE))
 EXTERN char_u	*p_imak;	/* 'imactivatekey' */
 #endif
 #ifdef USE_IM_CONTROL
@@ -773,7 +773,7 @@
 EXTERN long	p_verbose;	/* 'verbose' */
 EXTERN int	p_warn;		/* 'warn' */
 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(LINT) \
-	|| defined (FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON)
+	|| defined (FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_KDE)
 #define FEAT_WAK
 EXTERN char_u	*p_wak;		/* 'winaltkeys' */
 #endif
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 97803a8..d199f3e 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -155,12 +155,7 @@
 #ifdef FEAT_GUI
 extern HWND s_hwnd;
 #else
-# if (defined(FEAT_PRINTER) && !defined(FEAT_POSTSCRIPT)) \
-	|| defined(FEAT_CLIENTSERVER) \
-	|| (defined(FEAT_EVAL) && !defined(FEAT_GUI))
-#  define HAVE_GETCONSOLEHWND
 static HWND s_hwnd = 0;	    /* console window handle, set by GetConsoleHwnd() */
-# endif
 #endif
 
 extern int WSInitialized;
@@ -1537,7 +1532,7 @@
 
 #endif //_DEBUG
 
-#ifdef HAVE_GETCONSOLEHWND
+#if !defined(FEAT_GUI) || defined(PROTO)
 # if defined(FEAT_TITLE) && defined(WIN3264)
 extern HWND g_hWnd;	/* This is in os_win32.c. */
 # endif
@@ -1580,6 +1575,32 @@
 
     SetConsoleTitle(pszOldWindowTitle);
 }
+
+/*
+ * Console implementation of ":winpos".
+ */
+    int
+mch_get_winpos(int *x, int *y)
+{
+    RECT  rect;
+
+    GetConsoleHwnd();
+    GetWindowRect(s_hwnd, &rect);
+    *x = rect.left;
+    *y = rect.top;
+    return OK;
+}
+
+/*
+ * Console implementation of ":winpos x y".
+ */
+    void
+mch_set_winpos(int x, int y)
+{
+    GetConsoleHwnd();
+    SetWindowPos(s_hwnd, NULL, x, y, 0, 0,
+		 SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
+}
 #endif
 
 #if (defined(FEAT_PRINTER) && !defined(FEAT_POSTSCRIPT)) || defined(PROTO)
diff --git a/src/os_unix.c b/src/os_unix.c
index b59d8ff..597ca3d 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -1222,6 +1222,13 @@
     Display	*dpy;
     XErrorEvent	*error_event;
 {
+    /* KDE sometimes produces X error that we want to ignore */
+#if defined(FEAT_GUI_KDE)
+    XGetErrorText(dpy, error_event->error_code, (char *)IObuff, IOSIZE);
+    STRCAT(IObuff, "\nVim: Got X error but we continue...\n");
+    fprintf(stderr, IObuff);
+    return 0;
+#else
     XGetErrorText(dpy, error_event->error_code, (char *)IObuff, IOSIZE);
     STRCAT(IObuff, _("\nVim: Got X error\n"));
 
@@ -1231,6 +1238,7 @@
     preserve_exit();		    /* preserve files and exit */
 
     return 0;		/* NOTREACHED */
+#endif
 }
 
 /*
@@ -1371,7 +1379,7 @@
 	did_set_error_handler = TRUE;
     }
 
-#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
     if (gui.in_use)
     {
 	/*
@@ -1798,7 +1806,10 @@
      * Note: if "t_TS" is set, title is set with escape sequence rather
      *	     than x11 calls, because the x11 calls don't always work
      */
-
+#ifdef FEAT_GUI_KDE
+    /* dont know why but KDE needs this one as we don't go through the next function... */
+    gui_mch_settitle(title, icon);
+#endif
     if ((type || *T_TS != NUL) && title != NULL)
     {
 	if (oldtitle == NULL
diff --git a/src/os_unixx.h b/src/os_unixx.h
index 9f4f7eb..abed14d 100644
--- a/src/os_unixx.h
+++ b/src/os_unixx.h
@@ -92,6 +92,12 @@
 # if defined(HAVE_LIMITS_H) && !defined(_LIMITS_H)
 #  include <limits.h>		/* for SYS_NMLN (Sinix 5.41 / Unix SysV.4) */
 # endif
+
+/* Define SYS_NMLN ourselves if it still isn't defined (for CrayT3E). */
+# ifndef SYS_NMLN
+#  define SYS_NMLN 32
+# endif
+
 # include <sys/systeminfo.h>	/* for sysinfo */
 #endif
 
diff --git a/src/proto.h b/src/proto.h
index d89c847..2471bb6 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -20,7 +20,7 @@
  * Machine-dependent routines.
  */
 /* avoid errors in function prototypes */
-# if !defined(FEAT_X11) && !defined(FEAT_GUI_GTK)
+# if !defined(FEAT_X11) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_KDE)
 #  define Display int
 #  define Widget int
 # endif
@@ -180,6 +180,10 @@
 #  ifdef FEAT_GUI_W32
 #   include "gui_w32.pro"
 #  endif
+#  ifdef FEAT_GUI_KDE
+#   include "gui_kde.pro"
+#   include "gui_kde_x11.pro"
+#  endif
 #  ifdef FEAT_GUI_GTK
 #   include "gui_gtk.pro"
 #   include "gui_gtk_x11.pro"
diff --git a/src/proto/gui_kde.pro b/src/proto/gui_kde.pro
new file mode 100644
index 0000000..3a52fa7
--- /dev/null
+++ b/src/proto/gui_kde.pro
@@ -0,0 +1,19 @@
+/* gui_kde.c */
+void gui_mch_add_menu __ARGS((vimmenu_T *menu, int idx));
+void gui_mch_add_menu_item __ARGS((vimmenu_T *menu, int idx));
+void gui_mch_set_text_area_pos __ARGS((int x, int y, int w, int h));
+void gui_gtk_set_mnemonics __ARGS((int enable));
+void gui_mch_toggle_tearoffs __ARGS((int enable));
+void gui_mch_destroy_menu __ARGS((vimmenu_T *menu));
+void gui_mch_set_scrollbar_thumb __ARGS((scrollbar_T *sb, long val, long size, long max));
+void gui_mch_set_scrollbar_pos __ARGS((scrollbar_T *sb, int x, int y, int w, int h));
+void gui_mch_create_scrollbar __ARGS((scrollbar_T *sb, int orient));
+void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb));
+char_u *gui_mch_browse __ARGS((int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter));
+int gui_mch_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield));
+void gui_mch_show_popupmenu __ARGS((vimmenu_T *menu));
+void gui_mch_find_dialog __ARGS((exarg_T *eap));
+void gui_mch_replace_dialog __ARGS((exarg_T *eap));
+void ex_helpfind __ARGS((exarg_T *eap));
+void gui_make_popup __ARGS((char_u *path_name));
+/* vim: set ft=c : */
diff --git a/src/proto/gui_kde_x11.pro b/src/proto/gui_kde_x11.pro
new file mode 100644
index 0000000..7d968d9
--- /dev/null
+++ b/src/proto/gui_kde_x11.pro
@@ -0,0 +1,62 @@
+/* gui_kde_x11.c */
+void gui_mch_prepare __ARGS((int *argc, char **argv));
+void gui_mch_set_blinking __ARGS((long waittime, long on, long off));
+void gui_mch_stop_blink __ARGS((void));
+void gui_mch_start_blink __ARGS((void));
+int gui_mch_init_check __ARGS((void));
+int gui_mch_init __ARGS((void));
+void gui_mch_new_colors __ARGS((void));
+int gui_mch_open __ARGS((void));
+void gui_mch_exit __ARGS((int rc));
+int gui_mch_get_winpos __ARGS((int *x, int *y));
+void gui_mch_set_winpos __ARGS((int x, int y));
+void gui_mch_set_shellsize __ARGS((int width, int height, int min_width, int min_height, int base_width, int base_height));
+void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h));
+void gui_mch_enable_menu __ARGS((int flag));
+void gui_mch_show_toolbar __ARGS((int showit));
+int gui_mch_adjust_charsize __ARGS((void));
+GuiFontset gui_mch_get_fontset __ARGS((char_u *name, int report_error, int fixed_width));
+int gui_mch_init_font __ARGS((char_u *font_name, int fontset));
+GuiFont gui_mch_get_font __ARGS((char_u *name, int report_error));
+void gui_mch_set_font __ARGS((GuiFont font));
+void gui_mch_set_fontset __ARGS((GuiFontset fontset));
+void gui_mch_free_font __ARGS((GuiFont font));
+void gui_mch_free_fontset __ARGS((GuiFontset fontset));
+guicolor_T gui_mch_get_color __ARGS((char_u *name));
+void gui_mch_set_fg_color __ARGS((guicolor_T color));
+void gui_mch_set_bg_color __ARGS((guicolor_T color));
+void gui_mch_draw_string __ARGS((int row, int col, char_u *s, int len, int flags));
+int gui_mch_haskey __ARGS((char_u *name));
+int gui_get_x11_windis __ARGS((Window *win, Display **dis));
+void gui_mch_beep __ARGS((void));
+void gui_mch_flash __ARGS((int msec));
+void gui_mch_invert_rectangle __ARGS((int r, int c, int nr, int nc));
+void gui_mch_iconify __ARGS((void));
+void gui_mch_set_foreground __ARGS((void));
+void gui_mch_draw_hollow_cursor __ARGS((guicolor_T color));
+void gui_mch_draw_part_cursor __ARGS((int w, int h, guicolor_T color));
+void gui_mch_update __ARGS((void));
+int gui_mch_wait_for_chars __ARGS((long wtime));
+void gui_mch_flush __ARGS((void));
+void gui_mch_clear_block __ARGS((int row1, int col1, int row2, int col2));
+void gui_mch_clear_all __ARGS((void));
+void gui_mch_delete_lines __ARGS((int row, int num_lines));
+void gui_mch_insert_lines __ARGS((int row, int num_lines));
+void clip_mch_request_selection __ARGS((VimClipboard *cbd));
+void clip_mch_lose_selection __ARGS((VimClipboard *cbd));
+int clip_mch_own_selection __ARGS((VimClipboard *cbd));
+void clip_mch_set_selection __ARGS((VimClipboard *cbd));
+void gui_mch_menu_grey __ARGS((vimmenu_T *menu, int grey));
+void gui_mch_menu_hidden __ARGS((vimmenu_T *menu, int hidden));
+void gui_mch_draw_menubar __ARGS((void));
+void gui_mch_enable_scrollbar __ARGS((scrollbar_T *sb, int flag));
+long_u gui_mch_get_rgb __ARGS((guicolor_T pixel));
+int gui_mch_get_mouse_x __ARGS((void));
+int gui_mch_get_mouse_y __ARGS((void));
+void gui_mch_setmouse __ARGS((int x, int y));
+void gui_mch_mousehide __ARGS((int hide));
+void mch_set_mouse_shape __ARGS((int shape));
+char_u *gui_mch_font_dialog __ARGS((char_u *oldval));
+void gui_mch_settitle __ARGS((char_u *title,char_u *icon));
+void gui_mch_update_codec __ARGS((void));
+/* vim: set ft=c : */
diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro
index cbe2af7..899018b 100644
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -17,7 +17,9 @@
 void adjust_cursor_col __ARGS((void));
 int leftcol_changed __ARGS((void));
 void vim_mem_profile_dump __ARGS((void));
+#ifndef __cplusplus
 char_u *alloc __ARGS((unsigned size));
+#endif
 char_u *alloc_clear __ARGS((unsigned size));
 char_u *alloc_check __ARGS((unsigned size));
 char_u *lalloc_clear __ARGS((long_u size, int message));
diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro
index b4612f0..c9e495d 100644
--- a/src/proto/os_mswin.pro
+++ b/src/proto/os_mswin.pro
@@ -33,6 +33,8 @@
 void clip_mch_request_selection __ARGS((VimClipboard *cbd));
 void clip_mch_set_selection __ARGS((VimClipboard *cbd));
 void DumpPutS __ARGS((const char *psz));
+int mch_get_winpos __ARGS((int *x, int *y));
+void mch_set_winpos __ARGS((int x, int y));
 void mch_print_cleanup __ARGS((void));
 int mch_print_init __ARGS((prt_settings_T *psettings, char_u *jobname, int forceit));
 int mch_print_begin __ARGS((prt_settings_T *psettings));
diff --git a/src/screen.c b/src/screen.c
index 594c424..8a5b421 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2594,7 +2594,7 @@
 #endif
 #define WL_LINE		WL_SBR + 1	/* text in the line */
     int		draw_state = WL_START;	/* what to draw next */
-#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+#if defined(FEAT_XIM) && (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE))
     int		feedback_col = 0;
     int		feedback_old_attr = -1;
 #endif
@@ -3785,7 +3785,7 @@
 		&& (search_attr == 0 || char_attr != search_attr))
 	    char_attr = extra_attr;
 
-#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+#if defined(FEAT_XIM) && (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE))
 	/* XIM don't send preedit_start and preedit_end, but they send
 	 * preedit_changed and commit.  Thus Vim can't set "im_is_active", use
 	 * im_is_preediting() here. */
diff --git a/src/structs.h b/src/structs.h
index 0edd729..9e6d4e2 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1751,6 +1751,9 @@
     Widget	id;		    /* Manage this to enable item */
     Widget	submenu_id;	    /* If this is submenu, add children here */
 #endif
+#ifdef FEAT_GUI_KDE
+    QPopupMenu *widget;
+#endif
 #ifdef FEAT_GUI_GTK
     GtkWidget	*id;		    /* Manage this to enable item */
     GtkWidget	*submenu_id;	    /* If this is submenu, add children here */
diff --git a/src/ui.c b/src/ui.c
index ebbf85d..47ff80e 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1511,7 +1511,7 @@
 }
 #endif
 
-#if defined(FEAT_GUI_GTK) || defined(PROTO)
+#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE) || defined(PROTO)
     int
 vim_used_in_input_buf()
 {
@@ -1593,7 +1593,7 @@
 }
 #endif
 
-#if (defined(FEAT_XIM) && defined(FEAT_GUI_GTK)) \
+#if (defined(FEAT_XIM) && (defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE))) \
 	|| (defined(FEAT_MBYTE) && defined(FEAT_MBYTE_IME)) \
 	|| defined(PROTO)
 /*
@@ -2876,7 +2876,7 @@
 }
 #endif
 
-#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined (FEAT_GUI_MAC) \
+#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined (FEAT_GUI_MAC) || defined (FEAT_GUI_KDE) \
 	|| defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \
 	|| defined(FEAT_GUI_PHOTON) || defined(PROTO)
 /*
diff --git a/src/version.c b/src/version.c
index 0129343..a51550f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -859,6 +859,10 @@
 #	 else
 #	  if defined (MACOS)
     MSG_PUTS(_("with (classic) GUI."));
+#	   else
+#	    ifdef FEAT_GUI_KDE
+    MSG_PUTS(_("with KDE GUI."));
+#          endif
 #	  endif
 #	 endif
 #	endif
diff --git a/src/version.h b/src/version.h
index 2d98d28..5799d9c 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2004 June 7)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2004 June 7, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2004 June 30)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2004 June 30, compiled "
diff --git a/src/vim.h b/src/vim.h
index c348201..d196688 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -88,7 +88,8 @@
     || defined(FEAT_GUI_W16) \
     || defined(FEAT_GUI_BEOS) \
     || defined(FEAT_GUI_AMIGA) \
-    || defined(FEAT_GUI_PHOTON)
+    || defined(FEAT_GUI_PHOTON) \
+    || defined(FEAT_GUI_KDE)
 # ifndef FEAT_GUI
 #  define FEAT_GUI
 # endif
@@ -212,7 +213,15 @@
 # define __PARMS(x) __ARGS(x)
 #endif
 
-#if defined(UNIX) && !defined(MACOS_X) /* MACOS_X doesn't yet support osdef.h */
+/* if we're compiling in C++ (currently only KVim), the system
+ * headers must have the correct prototypes or nothing will build.
+ * conversely, our prototypes might clash due to throw() specifiers and
+ * cause compilation failures even though the headers are correct.  for
+ * a concrete example, gcc-3.2 enforces exception specifications, and
+ * glibc-2.2.5 has them in their system headers.
+ */
+#if !defined(__cplusplus) && defined(UNIX) \
+  && !defined(MACOS_X) /* MACOS_X doesn't yet support osdef.h */
 # include "auto/osdef.h"	/* bring missing declarations in */
 #endif
 
@@ -1022,6 +1031,9 @@
     EVENT_FOCUSGAINED,		/* got the focus */
     EVENT_FOCUSLOST,		/* lost the focus to another app */
     EVENT_GUIENTER,		/* after starting the GUI */
+    EVENT_INSERTCHANGE,		/* when changing Insert/Replace mode */
+    EVENT_INSERTENTER,		/* when entering Insert mode */
+    EVENT_INSERTLEAVE,		/* when leaving Insert mode */
     EVENT_STDINREADPOST,	/* after reading from stdin */
     EVENT_STDINREADPRE,		/* before reading from stdin */
     EVENT_SYNTAX,		/* syntax selected */
@@ -1473,7 +1485,8 @@
 #define VV_THROWPOINT	30
 #define VV_REG		31
 #define VV_CMDBANG	32
-#define VV_LEN		33	/* number of v: vars */
+#define VV_INSERTMODE	33
+#define VV_LEN		34	/* number of v: vars */
 
 #ifdef FEAT_CLIPBOARD
 
@@ -1572,7 +1585,7 @@
  * been seen at that stage.  But it must be before globals.h, where error_ga
  * is declared. */
 #if !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_X11) \
-	&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MAC)
+	&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_KDE) && !defined(FEAT_GUI_MAC)
 # define mch_errmsg(str)	fprintf(stderr, "%s", (str))
 # define display_errors()	fflush(stderr)
 # define mch_msg(str)		printf("%s", (str))
