diff --git a/src/Makefile b/src/Makefile
index 375b598..33780d0 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -325,9 +325,7 @@
 # Uncomment one of these lines if you have that GUI but don't want to use it.
 # The automatic check will use another one that can be found.
 # Gnome is disabled by default, it may cause trouble.
-#CONF_OPT_GUI = --disable-gtk-check
 #CONF_OPT_GUI = --disable-gtk2-check
-#CONF_OPT_GUI = --enable-gnome-check
 #CONF_OPT_GUI = --enable-gnome2-check
 #CONF_OPT_GUI = --disable-motif-check
 #CONF_OPT_GUI = --disable-athena-check
@@ -339,6 +337,7 @@
 #
 # GTK versions that are known not to work 100% are rejected.
 # Use "--disable-gtktest" to accept them anyway.
+# Only GTK 2 is supported, for GTK 1 use Vim 7.2.
 #
 # GNOME means GTK with Gnome support.  If using GTK and --enable-gnome-check
 # is used then GNOME will automatically be used if it is found.  If you have
@@ -346,11 +345,8 @@
 # --enable-gui=gtk or leave out --enable-gnome-check.
 #
 # If the selected GUI isn't found, the GUI is disabled automatically
-#CONF_OPT_GUI = --enable-gui=gtk
-#CONF_OPT_GUI = --enable-gui=gtk --disable-gtktest
 #CONF_OPT_GUI = --enable-gui=gtk2
 #CONF_OPT_GUI = --enable-gui=gtk2 --disable-gtktest
-#CONF_OPT_GUI = --enable-gui=gnome
 #CONF_OPT_GUI = --enable-gui=gnome2
 #CONF_OPT_GUI = --enable-gui=gnome2 --disable-gtktest
 #CONF_OPT_GUI = --enable-gui=motif
@@ -396,8 +392,8 @@
 # RUBY
 # Uncomment this when you want to include the Ruby interface.
 # Note: you need the development package (e.g., ruby1.9.1-dev on Ubuntu).
-# CONF_OPT_RUBY = --enable-rubyinterp
-# CONF_OPT_RUBY = --enable-rubyinterp --with-ruby-command=ruby1.9.1
+#CONF_OPT_RUBY = --enable-rubyinterp
+#CONF_OPT_RUBY = --enable-rubyinterp --with-ruby-command=ruby1.9.1
 
 # MZSCHEME
 # Uncomment this when you want to include the MzScheme interface.
diff --git a/src/auto/configure b/src/auto/configure
index baeaebc..42e5ed3 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -607,7 +607,6 @@
 GUI_INC_LOC
 NARROW_PROTO
 MOTIF_LIBNAME
-GNOME_CONFIG
 GNOME_INCLUDEDIR
 GNOME_LIBDIR
 GNOME_LIBS
@@ -615,8 +614,6 @@
 GTK_LIBS
 GTK_CFLAGS
 PKG_CONFIG
-GTK12_CONFIG
-GTK_CONFIG
 X_LIB
 X_EXTRA_LIBS
 X_LIBS
@@ -765,15 +762,12 @@
 enable_fontset
 with_x
 enable_gui
-enable_gtk_check
 enable_gtk2_check
 enable_gnome_check
 enable_motif_check
 enable_athena_check
 enable_nextaw_check
 enable_carbon_check
-with_gtk_prefix
-with_gtk_exec_prefix
 enable_gtktest
 with_gnome_includes
 with_gnome_libs
@@ -1425,9 +1419,8 @@
   --enable-hangulinput    Include Hangul input support.
   --enable-xim            Include XIM input support.
   --enable-fontset        Include X fontset output support.
-  --enable-gui=OPTS     X11 GUI default=auto OPTS=auto/no/gtk/gtk2/gnome/gnome2/motif/athena/neXtaw/photon/carbon
-  --enable-gtk-check      If auto-select GUI, check for GTK default=yes
-  --enable-gtk2-check     If GTK GUI, check for GTK+ 2 default=yes
+  --enable-gui=OPTS     X11 GUI default=auto OPTS=auto/no/gtk2/gnome2/motif/athena/neXtaw/photon/carbon
+  --enable-gtk2-check     If auto-select GUI, check for GTK+ 2 default=yes
   --enable-gnome-check    If GTK GUI, check for GNOME default=no
   --enable-motif-check    If auto-select GUI, check for Motif default=yes
   --enable-athena-check   If auto-select GUI, check for Athena default=yes
@@ -1459,8 +1452,6 @@
   --with-tclsh=PATH       which tclsh to use (default: tclsh8.0)
   --with-ruby-command=RUBY  name of the Ruby command (default: ruby)
   --with-x                use the X Window System
-  --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)
-  --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)
   --with-gnome-includes=DIR Specify location of GNOME headers
   --with-gnome-libs=DIR   Specify location of GNOME libs
   --with-gnome            Specify prefix for GNOME files
@@ -4204,7 +4195,7 @@
 
 
     if test "x$CARBON" = "xyes"; then
-      if test -z "$with_x" -a "X$enable_gui" != Xmotif -a "X$enable_gui" != Xathena -a "X$enable_gui" != Xgtk -a "X$enable_gui" != Xgtk2; then
+      if test -z "$with_x" -a "X$enable_gui" != Xmotif -a "X$enable_gui" != Xathena -a "X$enable_gui" != Xgtk2; then
 	with_x=no
       fi
     fi
@@ -7004,7 +6995,6 @@
 enable_gui_canon=`echo "_$enable_gui" | \
 	sed 's/[ _+-]//g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
 
-SKIP_GTK=YES
 SKIP_GTK2=YES
 SKIP_GNOME=YES
 SKIP_MOTIF=YES
@@ -7055,28 +7045,18 @@
 $as_echo "no GUI support" >&6; } ;;
     yes|""|auto)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes/auto - automatic GUI support" >&5
 $as_echo "yes/auto - automatic GUI support" >&6; }
-		SKIP_GTK=
 		SKIP_GTK2=
 		SKIP_GNOME=
 		SKIP_MOTIF=
 		SKIP_ATHENA=
 		SKIP_NEXTAW=
 		SKIP_CARBON=;;
-    gtk)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: GTK+ 1.x GUI support" >&5
-$as_echo "GTK+ 1.x GUI support" >&6; }
-		SKIP_GTK=;;
     gtk2)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: GTK+ 2.x GUI support" >&5
 $as_echo "GTK+ 2.x GUI support" >&6; }
-		SKIP_GTK=
 		SKIP_GTK2=;;
-    gnome)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: GNOME 1.x GUI support" >&5
-$as_echo "GNOME 1.x GUI support" >&6; }
-		SKIP_GNOME=
-		SKIP_GTK=;;
     gnome2)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: GNOME 2.x GUI support" >&5
 $as_echo "GNOME 2.x GUI support" >&6; }
 		SKIP_GNOME=
-		SKIP_GTK=
 		SKIP_GTK2=;;
     motif)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Motif GUI support" >&5
 $as_echo "Motif GUI support" >&6; }
@@ -7093,24 +7073,6 @@
 
 fi
 
-if test "x$SKIP_GTK" != "xYES" -a "$enable_gui_canon" != "gtk" -a "$enable_gui_canon" != "gtk2"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether or not to look for GTK" >&5
-$as_echo_n "checking whether or not to look for GTK... " >&6; }
-  # Check whether --enable-gtk-check was given.
-if test "${enable_gtk_check+set}" = set; then :
-  enableval=$enable_gtk_check;
-else
-  enable_gtk_check="yes"
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_check" >&5
-$as_echo "$enable_gtk_check" >&6; }
-  if test "x$enable_gtk_check" = "xno"; then
-    SKIP_GTK=YES
-    SKIP_GNOME=YES
-  fi
-fi
-
 if test "x$SKIP_GTK2" != "xYES" -a "$enable_gui_canon" != "gtk2" \
 				-a "$enable_gui_canon" != "gnome2"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether or not to look for GTK+ 2" >&5
@@ -7126,11 +7088,11 @@
 $as_echo "$enable_gtk2_check" >&6; }
   if test "x$enable_gtk2_check" = "xno"; then
     SKIP_GTK2=YES
+    SKIP_GNOME=YES
   fi
 fi
 
-if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome" \
-				 -a "$enable_gui_canon" != "gnome2"; then
+if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome2"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether or not to look for GNOME" >&5
 $as_echo_n "checking whether or not to look for GNOME... " >&6; }
   # Check whether --enable-gnome-check was given.
@@ -7232,8 +7194,7 @@
 
     datadir='${prefix}/Vim.app/Contents/Resources'
 
-    SKIP_GTK=YES;
-  SKIP_GTK2=YES;
+    SKIP_GTK2=YES;
   SKIP_GNOME=YES;
   SKIP_MOTIF=YES;
   SKIP_ATHENA=YES;
@@ -7249,34 +7210,7 @@
 
 
 
-
-if test -z "$SKIP_GTK"; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking --with-gtk-prefix argument" >&5
-$as_echo_n "checking --with-gtk-prefix argument... " >&6; }
-
-# Check whether --with-gtk-prefix was given.
-if test "${with_gtk_prefix+set}" = set; then :
-  withval=$with_gtk_prefix; gtk_config_prefix="$withval"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gtk_config_prefix" >&5
-$as_echo "$gtk_config_prefix" >&6; }
-else
-  gtk_config_prefix=""; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking --with-gtk-exec-prefix argument" >&5
-$as_echo_n "checking --with-gtk-exec-prefix argument... " >&6; }
-
-# Check whether --with-gtk-exec-prefix was given.
-if test "${with_gtk_exec_prefix+set}" = set; then :
-  withval=$with_gtk_exec_prefix; gtk_config_exec_prefix="$withval"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gtk_config_prefix" >&5
-$as_echo "$gtk_config_prefix" >&6; }
-else
-  gtk_config_exec_prefix=""; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
+if test -z "$SKIP_GTK2"; then
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking --disable-gtktest argument" >&5
 $as_echo_n "checking --disable-gtktest argument... " >&6; }
@@ -7295,104 +7229,6 @@
 $as_echo "gtk test disabled" >&6; }
   fi
 
-  if test "x$gtk_config_prefix" != "x" ; then
-    gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
-    GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
-  fi
-  if test "x$gtk_config_exec_prefix" != "x" ; then
-    gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
-    GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
-  fi
-  if test "X$GTK_CONFIG" = "X"; then
-    # Extract the first word of "gtk-config", so it can be a program name with args.
-set dummy gtk-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_GTK_CONFIG+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $GTK_CONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_GTK_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no"
-  ;;
-esac
-fi
-GTK_CONFIG=$ac_cv_path_GTK_CONFIG
-if test -n "$GTK_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_CONFIG" >&5
-$as_echo "$GTK_CONFIG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    if test "X$GTK_CONFIG" = "Xno"; then
-            # Extract the first word of "gtk12-config", so it can be a program name with args.
-set dummy gtk12-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_GTK12_CONFIG+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $GTK12_CONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_GTK12_CONFIG="$GTK12_CONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_GTK12_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_GTK12_CONFIG" && ac_cv_path_GTK12_CONFIG="no"
-  ;;
-esac
-fi
-GTK12_CONFIG=$ac_cv_path_GTK12_CONFIG
-if test -n "$GTK12_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK12_CONFIG" >&5
-$as_echo "$GTK12_CONFIG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-      GTK_CONFIG="$GTK12_CONFIG"
-    fi
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using GTK configuration program $GTK_CONFIG" >&5
-$as_echo "Using GTK configuration program $GTK_CONFIG" >&6; }
-  fi
   if test "X$PKG_CONFIG" = "X"; then
     # Extract the first word of "pkg-config", so it can be a program name with args.
 set dummy pkg-config; ac_word=$2
@@ -7437,8 +7273,7 @@
 
   fi
 
-  if test "x$GTK_CONFIG:$PKG_CONFIG" != "xno:no"; then
-            if test "X$SKIP_GTK2" != "XYES"; then
+  if test "x$PKG_CONFIG" != "xno"; then
 
   if test "X$GTK_CONFIG" != "Xno" -o "X$PKG_CONFIG" != "Xno"; then
   {
@@ -7459,18 +7294,6 @@
       gtk_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
 	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
     }
-    elif test "X$GTK_CONFIG" != "Xno"; then
-    {
-      GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
-      GTK_LIBDIR=
-      GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
-      gtk_major_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
-      gtk_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
-      gtk_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
-    }
     else
       no_gtk=yes
     fi
@@ -7482,7 +7305,7 @@
       CFLAGS="$CFLAGS $GTK_CFLAGS"
       LIBS="$LIBS $GTK_LIBS"
 
-                              rm -f conf.gtktest
+                        rm -f conf.gtktest
       if test "$cross_compiling" = yes; then :
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
@@ -7544,8 +7367,8 @@
 $as_echo "found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&6; }
       fi
       GUI_LIB_LOC="$GTK_LIBDIR"
-		   GTK_LIBNAME="$GTK_LIBS"
-		  GUI_INC_LOC="$GTK_CFLAGS"
+		 GTK_LIBNAME="$GTK_LIBS"
+		GUI_INC_LOC="$GTK_CFLAGS"
     else
     {
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -7565,170 +7388,24 @@
 
   rm -f conf.gtktest
 
-      if test "x$GTK_CFLAGS" != "x"; then
-	SKIP_ATHENA=YES
-	SKIP_NEXTAW=YES
-	SKIP_MOTIF=YES
-	GUITYPE=GTK
+    if test "x$GTK_CFLAGS" != "x"; then
+      SKIP_ATHENA=YES
+      SKIP_NEXTAW=YES
+      SKIP_MOTIF=YES
+      GUITYPE=GTK
 
-      fi
-    fi
-
-                if test "x$GUITYPE" != "xGTK"; then
-      SKIP_GTK2=YES
-
-  if test "X$GTK_CONFIG" != "Xno" -o "X$PKG_CONFIG" != "Xno"; then
-  {
-    min_gtk_version=1.1.16
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK - version >= $min_gtk_version" >&5
-$as_echo_n "checking for GTK - version >= $min_gtk_version... " >&6; }
-    no_gtk=""
-    if (test "X$SKIP_GTK2" != "XYES" -a "X$PKG_CONFIG" != "Xno") \
-	  && $PKG_CONFIG --exists gtk+-2.0; then
-    {
-                        GTK_CFLAGS=`$PKG_CONFIG --cflags gtk+-2.0`
-      GTK_LIBDIR=`$PKG_CONFIG --libs-only-L gtk+-2.0`
-      GTK_LIBS=`$PKG_CONFIG --libs gtk+-2.0`
-      gtk_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
-      gtk_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
-      gtk_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
-    }
-    elif test "X$GTK_CONFIG" != "Xno"; then
-    {
-      GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
-      GTK_LIBDIR=
-      GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
-      gtk_major_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
-      gtk_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
-      gtk_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
-    }
-    else
-      no_gtk=yes
-    fi
-
-    if test "x$enable_gtktest" = "xyes" -a "x$no_gtk" = "x"; then
-    {
-      ac_save_CFLAGS="$CFLAGS"
-      ac_save_LIBS="$LIBS"
-      CFLAGS="$CFLAGS $GTK_CFLAGS"
-      LIBS="$LIBS $GTK_LIBS"
-
-                              rm -f conf.gtktest
-      if test "$cross_compiling" = yes; then :
-  echo $ac_n "cross compiling; assumed OK... $ac_c"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <gtk/gtk.h>
-#include <stdio.h>
-#if STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#endif
-
-int
-main ()
-{
-int major, minor, micro;
-char *tmp_version;
-
-system ("touch conf.gtktest");
-
-/* HP/UX 9 (%@#!) writes to sscanf strings */
-tmp_version = g_strdup("$min_gtk_version");
-if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
-   printf("%s, bad version string\n", "$min_gtk_version");
-   exit(1);
- }
-
-if ((gtk_major_version > major) ||
-    ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
-    ((gtk_major_version == major) && (gtk_minor_version == minor) &&
-				     (gtk_micro_version >= micro)))
-{
-    return 0;
-}
-return 1;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  no_gtk=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      CFLAGS="$ac_save_CFLAGS"
-      LIBS="$ac_save_LIBS"
-    }
-    fi
-    if test "x$no_gtk" = x ; then
-      if test "x$enable_gtktest" = "xyes"; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes; found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&5
-$as_echo "yes; found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&6; }
-      else
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&5
-$as_echo "found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&6; }
-      fi
-      GTK_LIBNAME="$GTK_LIBS"
-		  GUI_INC_LOC="$GTK_CFLAGS"
-    else
-    {
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-      GTK_CFLAGS=""
-      GTK_LIBS=""
-      :
-    }
-    fi
-  }
-  else
-    GTK_CFLAGS=""
-    GTK_LIBS=""
-    :
-  fi
-
-
-  rm -f conf.gtktest
-
-      if test "x$GTK_CFLAGS" != "x"; then
-	SKIP_ATHENA=YES
-	SKIP_NEXTAW=YES
-	SKIP_MOTIF=YES
-	GUITYPE=GTK
-
-      fi
     fi
   fi
-    if test "x$GUITYPE" = "xGTK"; then
-    if test "$gtk_major_version" = 1 -a "0$gtk_minor_version" -lt 2 \
-	 -o "$gtk_major_version" = 1 -a "$gtk_minor_version" = 2 -a "0$gtk_micro_version" -lt 3; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: this GTK version is old; version 1.2.3 or later is recommended" >&5
-$as_echo "this GTK version is old; version 1.2.3 or later is recommended" >&6; }
-    else
+  if test "x$GUITYPE" = "xGTK"; then
+    $as_echo "#define HAVE_GTK2 1" >>confdefs.h
+
+    if test "$gtk_minor_version" = 1 -a "0$gtk_micro_version" -ge 1 \
+	|| test "0$gtk_minor_version" -ge 2; then
+      $as_echo "#define HAVE_GTK_MULTIHEAD 1" >>confdefs.h
+
+    fi
+                if test -z "$SKIP_GNOME"; then
     {
-      if test "0$gtk_major_version" -ge 2; then
-	$as_echo "#define HAVE_GTK2 1" >>confdefs.h
-
-	if test "$gtk_minor_version" = 1 -a "0$gtk_micro_version" -ge 1 \
-		|| test "0$gtk_minor_version" -ge 2 \
-		|| test "0$gtk_major_version" -gt 2; then
-	  $as_echo "#define HAVE_GTK_MULTIHEAD 1" >>confdefs.h
-
-	fi
-      fi
-                        if test -z "$SKIP_GNOME"; then
-      {
 
 
 
@@ -7771,7 +7448,7 @@
 fi
 
 
-  if test "x$want_gnome" = xyes -a "0$gtk_major_version" -ge 2; then
+  if test "x$want_gnome" = xyes; then
   {
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgnomeui-2.0" >&5
 $as_echo_n "checking for libgnomeui-2.0... " >&6; }
@@ -7802,106 +7479,13 @@
       fi
     fi
   }
-  elif test "x$want_gnome" = xyes; then
-  {
-    # Extract the first word of "gnome-config", so it can be a program name with args.
-set dummy gnome-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_GNOME_CONFIG+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $GNOME_CONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_GNOME_CONFIG="$GNOME_CONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_GNOME_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_GNOME_CONFIG" && ac_cv_path_GNOME_CONFIG="no"
-  ;;
-esac
-fi
-GNOME_CONFIG=$ac_cv_path_GNOME_CONFIG
-if test -n "$GNOME_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNOME_CONFIG" >&5
-$as_echo "$GNOME_CONFIG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    if test "$GNOME_CONFIG" = "no"; then
-      no_gnome_config="yes"
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $GNOME_CONFIG works" >&5
-$as_echo_n "checking if $GNOME_CONFIG works... " >&6; }
-      if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-	GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome gnomeui`"
-	GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`"
-	GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`"
-	have_gnome=yes
-      else
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-	no_gnome_config="yes"
-      fi
-    fi
-
-    if test x$exec_prefix = xNONE; then
-      if test x$prefix = xNONE; then
-	gnome_prefix=$ac_default_prefix/lib
-      else
-	gnome_prefix=$prefix/lib
-      fi
-    else
-      gnome_prefix=`eval echo \`echo $libdir\``
-    fi
-
-    if test "$no_gnome_config" = "yes"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gnomeConf.sh file in $gnome_prefix" >&5
-$as_echo_n "checking for gnomeConf.sh file in $gnome_prefix... " >&6; }
-      if test -f $gnome_prefix/gnomeConf.sh; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-	echo "loading gnome configuration from" \
-	  "$gnome_prefix/gnomeConf.sh"
-	. $gnome_prefix/gnomeConf.sh
-	have_gnome=yes
-      else
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-	if test x = xfail; then
-	  as_fn_error "Could not find the gnomeConf.sh file that is generated by gnome-libs install" "$LINENO" 5
-	fi
-      fi
-    fi
-  }
   fi
 
-	if test x$have_gnome = xyes ; then
-	  $as_echo "#define FEAT_GUI_GNOME 1" >>confdefs.h
+      if test "x$have_gnome" = xyes ; then
+	$as_echo "#define FEAT_GUI_GNOME 1" >>confdefs.h
 
-	  GUI_INC_LOC="$GUI_INC_LOC $GNOME_INCLUDEDIR"
-	  GTK_LIBNAME="$GTK_LIBNAME $GNOME_LIBDIR $GNOME_LIBS"
-	fi
-      }
+	GUI_INC_LOC="$GUI_INC_LOC $GNOME_INCLUDEDIR"
+	GTK_LIBNAME="$GTK_LIBNAME $GNOME_LIBDIR $GNOME_LIBS"
       fi
     }
     fi
@@ -8467,7 +8051,7 @@
 $as_echo "no GUI selected; fontset has been disabled" >&6; }
   enable_fontset="no"
 fi
-if test "x$GUITYPE:$enable_fontset" = "xGTK:yes" -a "0$gtk_major_version" -ge 2; then
+if test "x$GUITYPE:$enable_fontset" = "xGTK:yes"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: GTK+ 2 GUI selected; fontset has been disabled" >&5
 $as_echo "GTK+ 2 GUI selected; fontset has been disabled" >&6; }
   enable_fontset="no"
diff --git a/src/configure.in b/src/configure.in
index f44cf0f..043eb32 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -183,7 +183,7 @@
     dnl or Motif, Athena or GTK GUI is used.
     AC_CHECK_HEADER(Carbon/Carbon.h, CARBON=yes)
     if test "x$CARBON" = "xyes"; then
-      if test -z "$with_x" -a "X$enable_gui" != Xmotif -a "X$enable_gui" != Xathena -a "X$enable_gui" != Xgtk -a "X$enable_gui" != Xgtk2; then
+      if test -z "$with_x" -a "X$enable_gui" != Xmotif -a "X$enable_gui" != Xathena -a "X$enable_gui" != Xgtk2; then
 	with_x=no
       fi
     fi
@@ -1156,7 +1156,6 @@
 	[  --enable-xim            Include XIM input support.],
 	AC_MSG_RESULT($enable_xim),
 	[enable_xim="auto"; AC_MSG_RESULT(defaulting to auto)])
-dnl defining FEAT_XIM is delayed, so that it can be disabled for older GTK
 
 AC_MSG_CHECKING(--enable-fontset argument)
 AC_ARG_ENABLE(fontset,
@@ -1296,7 +1295,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/photon/carbon]], , enable_gui="auto")
+ [  --enable-gui[=OPTS]     X11 GUI [default=auto] [OPTS=auto/no/gtk2/gnome2/motif/athena/neXtaw/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.
@@ -1304,7 +1303,6 @@
 	sed 's/[[ _+-]]//g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
 
 dnl Skip everything by default.
-SKIP_GTK=YES
 SKIP_GTK2=YES
 SKIP_GNOME=YES
 SKIP_MOTIF=YES
@@ -1343,24 +1341,16 @@
   case "$enable_gui_canon" in
     no|none)	AC_MSG_RESULT(no GUI support) ;;
     yes|""|auto)	AC_MSG_RESULT(yes/auto - automatic GUI support)
-		SKIP_GTK=
 		SKIP_GTK2=
 		SKIP_GNOME=
 		SKIP_MOTIF=
 		SKIP_ATHENA=
 		SKIP_NEXTAW=
 		SKIP_CARBON=;;
-    gtk)	AC_MSG_RESULT(GTK+ 1.x GUI support)
-		SKIP_GTK=;;
     gtk2)	AC_MSG_RESULT(GTK+ 2.x GUI support)
-		SKIP_GTK=
 		SKIP_GTK2=;;
-    gnome)	AC_MSG_RESULT(GNOME 1.x GUI support)
-		SKIP_GNOME=
-		SKIP_GTK=;;
     gnome2)	AC_MSG_RESULT(GNOME 2.x GUI support)
 		SKIP_GNOME=
-		SKIP_GTK=
 		SKIP_GTK2=;;
     motif)	AC_MSG_RESULT(Motif GUI support)
 		SKIP_MOTIF=;;
@@ -1373,32 +1363,20 @@
 
 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,
-	[  --enable-gtk-check      If auto-select GUI, check for GTK [default=yes]],
-	, enable_gtk_check="yes")
-  AC_MSG_RESULT($enable_gtk_check)
-  if test "x$enable_gtk_check" = "xno"; then
-    SKIP_GTK=YES
-    SKIP_GNOME=YES
-  fi
-fi
-
 if test "x$SKIP_GTK2" != "xYES" -a "$enable_gui_canon" != "gtk2" \
 				-a "$enable_gui_canon" != "gnome2"; then
   AC_MSG_CHECKING(whether or not to look for GTK+ 2)
   AC_ARG_ENABLE(gtk2-check,
-	[  --enable-gtk2-check     If GTK GUI, check for GTK+ 2 [default=yes]],
+	[  --enable-gtk2-check     If auto-select GUI, check for GTK+ 2 [default=yes]],
 	, enable_gtk2_check="yes")
   AC_MSG_RESULT($enable_gtk2_check)
   if test "x$enable_gtk2_check" = "xno"; then
     SKIP_GTK2=YES
+    SKIP_GNOME=YES
   fi
 fi
 
-if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome" \
-				 -a "$enable_gui_canon" != "gnome2"; then
+if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome2"; then
   AC_MSG_CHECKING(whether or not to look for GNOME)
   AC_ARG_ENABLE(gnome-check,
 	[  --enable-gnome-check    If GTK GUI, check for GNOME [default=no]],
@@ -1472,7 +1450,6 @@
   datadir='${prefix}/Vim.app/Contents/Resources'
 
   dnl skip everything else
-  SKIP_GTK=YES;
   SKIP_GTK2=YES;
   SKIP_GNOME=YES;
   SKIP_MOTIF=YES;
@@ -1482,12 +1459,8 @@
   SKIP_CARBON=YES
 fi
 
-dnl
-dnl Get the cflags and libraries from the gtk-config script
-dnl
-
 dnl define an autoconf function to check for a specified version of GTK, and
-dnl try to compile/link a GTK program.  this gets used once for GTK 1.1.16.
+dnl try to compile/link a GTK program.
 dnl
 dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
 dnl Test for GTK, and define GTK_CFLAGS, GTK_LIBDIR and GTK_LIBS
@@ -1496,7 +1469,7 @@
 [
   if test "X$GTK_CONFIG" != "Xno" -o "X$PKG_CONFIG" != "Xno"; then
   {
-    min_gtk_version=ifelse([$1], ,0.99.7,$1)
+    min_gtk_version=ifelse([$1], ,2.2.0,$1)
     AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
     no_gtk=""
     if (test "X$SKIP_GTK2" != "XYES" -a "X$PKG_CONFIG" != "Xno") \
@@ -1515,18 +1488,6 @@
       gtk_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
 	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
     }
-    elif test "X$GTK_CONFIG" != "Xno"; then
-    {
-      GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
-      GTK_LIBDIR=
-      GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
-      gtk_major_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
-      gtk_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
-      gtk_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
-	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
-    }
     else
       no_gtk=yes
     fi
@@ -1539,8 +1500,7 @@
       LIBS="$LIBS $GTK_LIBS"
 
       dnl
-      dnl Now check if the installed GTK is sufficiently new. (Also sanity
-      dnl checks the results of gtk-config to some extent
+      dnl Now check if the installed GTK is sufficiently new.
       dnl
       rm -f conf.gtktest
       AC_TRY_RUN([
@@ -1642,7 +1602,7 @@
     fi,
     want_gnome=yes)
 
-  if test "x$want_gnome" = xyes -a "0$gtk_major_version" -ge 2; then
+  if test "x$want_gnome" = xyes; then
   {
     AC_MSG_CHECKING(for libgnomeui-2.0)
     if $PKG_CONFIG --exists libgnomeui-2.0; then
@@ -1669,51 +1629,6 @@
       fi
     fi
   }
-  elif test "x$want_gnome" = xyes; then
-  {
-    AC_PATH_PROG(GNOME_CONFIG,gnome-config,no)
-    if test "$GNOME_CONFIG" = "no"; then
-      no_gnome_config="yes"
-    else
-      AC_MSG_CHECKING(if $GNOME_CONFIG works)
-      if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then
-	AC_MSG_RESULT(yes)
-	GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome gnomeui`"
-	GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`"
-	GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`"
-	$1
-      else
-	AC_MSG_RESULT(no)
-	no_gnome_config="yes"
-      fi
-    fi
-
-    if test x$exec_prefix = xNONE; then
-      if test x$prefix = xNONE; then
-	gnome_prefix=$ac_default_prefix/lib
-      else
-	gnome_prefix=$prefix/lib
-      fi
-    else
-      gnome_prefix=`eval echo \`echo $libdir\``
-    fi
-
-    if test "$no_gnome_config" = "yes"; then
-      AC_MSG_CHECKING(for gnomeConf.sh file in $gnome_prefix)
-      if test -f $gnome_prefix/gnomeConf.sh; then
-	AC_MSG_RESULT(found)
-	echo "loading gnome configuration from" \
-	  "$gnome_prefix/gnomeConf.sh"
-	. $gnome_prefix/gnomeConf.sh
-	$1
-      else
-	AC_MSG_RESULT(not found)
-	if test x$2 = xfail; then
-	  AC_MSG_ERROR(Could not find the gnomeConf.sh file that is generated by gnome-libs install)
-	fi
-      fi
-    fi
-  }
   fi
 ])
 
@@ -1723,21 +1638,9 @@
 
 
 dnl ---------------------------------------------------------------------------
-dnl Check for GTK.  First checks for gtk-config, cause it needs that to get the
-dnl correct compiler flags.  Then checks for GTK 1.1.16.  If that fails, then
-dnl it checks for 1.0.6.  If both fail, then continue on for Motif as before...
+dnl Check for GTK2.  If it fails, then continue on for Motif as before...
 dnl ---------------------------------------------------------------------------
-if test -z "$SKIP_GTK"; then
-
-  AC_MSG_CHECKING(--with-gtk-prefix argument)
-  AC_ARG_WITH(gtk-prefix,[  --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)],
-	gtk_config_prefix="$withval"; AC_MSG_RESULT($gtk_config_prefix),
-	gtk_config_prefix=""; AC_MSG_RESULT(no))
-
-  AC_MSG_CHECKING(--with-gtk-exec-prefix argument)
-  AC_ARG_WITH(gtk-exec-prefix,[  --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
-	gtk_config_exec_prefix="$withval"; AC_MSG_RESULT($gtk_config_prefix),
-	gtk_config_exec_prefix=""; AC_MSG_RESULT(no))
+if test -z "$SKIP_GTK2"; then
 
   AC_MSG_CHECKING(--disable-gtktest argument)
   AC_ARG_ENABLE(gtktest, [  --disable-gtktest       Do not try to compile and run a test GTK program],
@@ -1748,89 +1651,41 @@
     AC_MSG_RESULT(gtk test disabled)
   fi
 
-  if test "x$gtk_config_prefix" != "x" ; then
-    gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
-    GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
-  fi
-  if test "x$gtk_config_exec_prefix" != "x" ; then
-    gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
-    GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
-  fi
-  if test "X$GTK_CONFIG" = "X"; then
-    AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
-    if test "X$GTK_CONFIG" = "Xno"; then
-      dnl Some distributions call it gtk12-config, annoying!
-      AC_PATH_PROG(GTK12_CONFIG, gtk12-config, no)
-      GTK_CONFIG="$GTK12_CONFIG"
-    fi
-  else
-    AC_MSG_RESULT(Using GTK configuration program $GTK_CONFIG)
-  fi
   if test "X$PKG_CONFIG" = "X"; then
     AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
   fi
 
-  if test "x$GTK_CONFIG:$PKG_CONFIG" != "xno:no"; then
+  if test "x$PKG_CONFIG" != "xno"; then
     dnl First try finding version 2.2.0 or later.  The 2.0.x series has
     dnl problems (bold fonts, --remote doesn't work).
-    if test "X$SKIP_GTK2" != "XYES"; then
-      AM_PATH_GTK(2.2.0,
-		  [GUI_LIB_LOC="$GTK_LIBDIR"
-		   GTK_LIBNAME="$GTK_LIBS"
-		  GUI_INC_LOC="$GTK_CFLAGS"], )
-      if test "x$GTK_CFLAGS" != "x"; then
-	SKIP_ATHENA=YES
-	SKIP_NEXTAW=YES
-	SKIP_MOTIF=YES
-	GUITYPE=GTK
-	AC_SUBST(GTK_LIBNAME)
-      fi
-    fi
-
-    dnl If there is no 2.2.0 or later try the 1.x.x series.  We require at
-    dnl least GTK 1.1.16.  1.0.6 doesn't work.  1.1.1 to 1.1.15
-    dnl were test versions.
-    if test "x$GUITYPE" != "xGTK"; then
-      SKIP_GTK2=YES
-      AM_PATH_GTK(1.1.16,
-		  [GTK_LIBNAME="$GTK_LIBS"
-		  GUI_INC_LOC="$GTK_CFLAGS"], )
-      if test "x$GTK_CFLAGS" != "x"; then
-	SKIP_ATHENA=YES
-	SKIP_NEXTAW=YES
-	SKIP_MOTIF=YES
-	GUITYPE=GTK
-	AC_SUBST(GTK_LIBNAME)
-      fi
+    AM_PATH_GTK(2.2.0,
+		[GUI_LIB_LOC="$GTK_LIBDIR"
+		 GTK_LIBNAME="$GTK_LIBS"
+		GUI_INC_LOC="$GTK_CFLAGS"], )
+    if test "x$GTK_CFLAGS" != "x"; then
+      SKIP_ATHENA=YES
+      SKIP_NEXTAW=YES
+      SKIP_MOTIF=YES
+      GUITYPE=GTK
+      AC_SUBST(GTK_LIBNAME)
     fi
   fi
-  dnl Give a warning if GTK is older than 1.2.3
   if test "x$GUITYPE" = "xGTK"; then
-    if test "$gtk_major_version" = 1 -a "0$gtk_minor_version" -lt 2 \
-	 -o "$gtk_major_version" = 1 -a "$gtk_minor_version" = 2 -a "0$gtk_micro_version" -lt 3; then
-      AC_MSG_RESULT(this GTK version is old; version 1.2.3 or later is recommended)
-    else
+    AC_DEFINE(HAVE_GTK2)
+    if test "$gtk_minor_version" = 1 -a "0$gtk_micro_version" -ge 1 \
+	|| test "0$gtk_minor_version" -ge 2; then
+      AC_DEFINE(HAVE_GTK_MULTIHEAD)
+    fi
+    dnl
+    dnl if GTK exists, then check for GNOME.
+    dnl
+    if test -z "$SKIP_GNOME"; then
     {
-      if test "0$gtk_major_version" -ge 2; then
-	AC_DEFINE(HAVE_GTK2)
-	if test "$gtk_minor_version" = 1 -a "0$gtk_micro_version" -ge 1 \
-		|| test "0$gtk_minor_version" -ge 2 \
-		|| test "0$gtk_major_version" -gt 2; then
-	  AC_DEFINE(HAVE_GTK_MULTIHEAD)
-	fi
-      fi
-      dnl
-      dnl if GTK exists, and it's not the 1.0.x series, then check for GNOME.
-      dnl
-      if test -z "$SKIP_GNOME"; then
-      {
-	GNOME_INIT_HOOK([have_gnome=yes])
-	if test x$have_gnome = xyes ; then
-	  AC_DEFINE(FEAT_GUI_GNOME)
-	  GUI_INC_LOC="$GUI_INC_LOC $GNOME_INCLUDEDIR"
-	  GTK_LIBNAME="$GTK_LIBNAME $GNOME_LIBDIR $GNOME_LIBS"
-	fi
-      }
+      GNOME_INIT_HOOK([have_gnome=yes])
+      if test "x$have_gnome" = xyes ; then
+	AC_DEFINE(FEAT_GUI_GNOME)
+	GUI_INC_LOC="$GUI_INC_LOC $GNOME_INCLUDEDIR"
+	GTK_LIBNAME="$GTK_LIBNAME $GNOME_LIBDIR $GNOME_LIBS"
       fi
     }
     fi
@@ -2088,7 +1943,7 @@
   AC_MSG_RESULT(no GUI selected; fontset has been disabled)
   enable_fontset="no"
 fi
-if test "x$GUITYPE:$enable_fontset" = "xGTK:yes" -a "0$gtk_major_version" -ge 2; then
+if test "x$GUITYPE:$enable_fontset" = "xGTK:yes"; then
   AC_MSG_RESULT(GTK+ 2 GUI selected; fontset has been disabled)
   enable_fontset="no"
 fi
diff --git a/src/eval.c b/src/eval.c
index 7457677..bf33cdd 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -11813,9 +11813,7 @@
 #endif
 #ifdef FEAT_GUI_GTK
 	"gui_gtk",
-# ifdef HAVE_GTK2
 	"gui_gtk2",
-# endif
 #endif
 #ifdef FEAT_GUI_GNOME
 	"gui_gnome",
diff --git a/src/globals.h b/src/globals.h
index c9bfc1f..4192bd7 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -847,13 +847,7 @@
 
 #ifdef FEAT_XIM
 # ifdef FEAT_GUI_GTK
-#  ifdef HAVE_GTK2
 EXTERN GtkIMContext	*xic INIT(= NULL);
-#  else
-EXTERN GdkICAttr	*xic_attr INIT(= NULL);
-EXTERN GdkIC		*xic INIT(= NULL);
-EXTERN char		*draw_feedback INIT(= NULL);
-#  endif
 /*
  * Start and end column of the preedit area in virtual columns from the start
  * of the text line.  When there is no preedit area they are set to MAXCOL.
@@ -1402,7 +1396,7 @@
 	|| defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MSWIN)
 EXTERN char_u e_font[]		INIT(= N_("E235: Unknown font: %s"));
 #endif
-#if (defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)) && !defined(HAVE_GTK2)
+#if defined(FEAT_GUI_X11) && !defined(HAVE_GTK2)
 EXTERN char_u e_fontwidth[]	INIT(= N_("E236: Font \"%s\" is not fixed-width"));
 #endif
 EXTERN char_u e_internal[]	INIT(= N_("E473: Internal error"));
diff --git a/src/gui.c b/src/gui.c
index 33f7844..a774893 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -2261,7 +2261,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)
 		    || (cn > 1
 #   ifdef FEAT_XFONTSET
 			/* No fontset: At least draw char after wide char at
@@ -2293,7 +2293,7 @@
 		    start += cl;
 		}
 
-#  if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+#  if defined(FEAT_GUI_X11)
 		/* No fontset: draw a space to fill the gap after a wide char
 		 * */
 		if (cn > 1 && (draw_flags & DRAW_TRANSP) == 0
diff --git a/src/gui.h b/src/gui.h
index 875b5e4..d8223d3 100644
--- a/src/gui.h
+++ b/src/gui.h
@@ -235,13 +235,8 @@
 				   actual color */
 
 #ifdef FEAT_GUI_GTK
-# ifdef HAVE_GTK2
   typedef PangoFontDescription	*GuiFont;       /* handle for a GUI font */
   typedef PangoFontDescription  *GuiFontset;    /* handle for a GUI fontset */
-# else
-  typedef GdkFont	*GuiFont;	/* handle for a GUI font */
-  typedef GdkFont	*GuiFontset;	/* handle for a GUI fontset */
-# endif
 # define NOFONT		(GuiFont)NULL
 # define NOFONTSET	(GuiFontset)NULL
 #else
@@ -402,24 +397,15 @@
     GdkColor	*fgcolor;	    /* GDK-styled foreground color */
     GdkColor	*bgcolor;	    /* GDK-styled background color */
     GdkColor	*spcolor;	    /* GDK-styled special color */
-# ifndef HAVE_GTK2
-    GuiFont	current_font;
-# endif
     GdkGC	*text_gc;	    /* cached GC for normal text */
-# ifdef HAVE_GTK2
     PangoContext     *text_context; /* the context used for all text */
     PangoFont	     *ascii_font;   /* cached font for ASCII strings */
     PangoGlyphString *ascii_glyphs; /* cached code point -> glyph map */
-# endif
 # ifdef FEAT_GUI_TABLINE
     GtkWidget	*tabline;	    /* tab pages line handle */
 # endif
 
     GtkAccelGroup *accel_group;
-# ifndef HAVE_GTK2
-    GtkWidget	*fontdlg;	    /* font selection dialog window */
-    char_u	*fontname;	    /* font name from font selection dialog */
-# endif
     GtkWidget	*filedlg;	    /* file selection dialog */
     char_u	*browse_fname;	    /* file name from filedlg */
 #endif	/* FEAT_GUI_GTK */
diff --git a/src/gui_beval.c b/src/gui_beval.c
index 90bef8b..f9f7e00 100644
--- a/src/gui_beval.c
+++ b/src/gui_beval.c
@@ -157,9 +157,6 @@
 static void key_event __ARGS((BalloonEval *, unsigned, int));
 static gint timeout_cb __ARGS((gpointer));
 static gint balloon_expose_event_cb __ARGS((GtkWidget *, GdkEventExpose *, gpointer));
-# ifndef HAVE_GTK2
-static void balloon_draw_cb __ARGS((GtkWidget *, GdkRectangle *, gpointer));
-# endif
 #else
 static void addEventHandler __ARGS((Widget, BalloonEval *));
 static void removeEventHandler __ARGS((BalloonEval *));
@@ -534,9 +531,7 @@
 		cancelBalloon(beval);
 	    break;
 	case GDK_BUTTON_PRESS:
-# ifdef HAVE_GTK2
 	case GDK_SCROLL:
-# endif
 	    cancelBalloon(beval);
 	    break;
 	case GDK_KEY_PRESS:
@@ -676,25 +671,6 @@
     return FALSE; /* continue emission */
 }
 
-# ifndef HAVE_GTK2
-    static void
-balloon_draw_cb(GtkWidget *widget, GdkRectangle *area, gpointer data)
-{
-    GtkWidget	    *child;
-    GdkRectangle    child_area;
-
-    gtk_paint_flat_box(widget->style, widget->window,
-		       GTK_STATE_NORMAL, GTK_SHADOW_OUT,
-		       area, widget, "tooltip",
-		       0, 0, -1, -1);
-
-    child = GTK_BIN(widget)->child;
-
-    if (gtk_widget_intersect(child, area, &child_area))
-	gtk_widget_draw(child, &child_area);
-}
-# endif
-
 #else /* !FEAT_GUI_GTK */
 
     static void
@@ -913,15 +889,13 @@
 }
 
 #ifdef FEAT_GUI_GTK
-
-# ifdef HAVE_GTK2
 /*
  * Convert the string to UTF-8 if 'encoding' is not "utf-8".
  * Replace any non-printable characters and invalid bytes sequences with
  * "^X" or "<xx>" escapes, and apply SpecialKey highlighting to them.
  * TAB and NL are passed through unscathed.
  */
-#  define IS_NONPRINTABLE(c) (((c) < 0x20 && (c) != TAB && (c) != NL) \
+# define IS_NONPRINTABLE(c) (((c) < 0x20 && (c) != TAB && (c) != NL) \
 			      || (c) == DEL)
     static void
 set_printable_label_text(GtkLabel *label, char_u *text)
@@ -1059,8 +1033,7 @@
     gtk_label_set_attributes(label, attr_list);
     pango_attr_list_unref(attr_list);
 }
-#  undef IS_NONPRINTABLE
-# endif /* HAVE_GTK2 */
+# undef IS_NONPRINTABLE
 
 /*
  * Draw a balloon.
@@ -1077,9 +1050,7 @@
 	int		y;
 	int		x_offset = EVAL_OFFSET_X;
 	int		y_offset = EVAL_OFFSET_Y;
-# ifdef HAVE_GTK2
 	PangoLayout	*layout;
-# endif
 # ifdef HAVE_GTK_MULTIHEAD
 	GdkScreen	*screen;
 
@@ -1094,7 +1065,6 @@
 	gtk_widget_ensure_style(beval->balloonShell);
 	gtk_widget_ensure_style(beval->balloonLabel);
 
-# ifdef HAVE_GTK2
 	set_printable_label_text(GTK_LABEL(beval->balloonLabel), beval->msg);
 	/*
 	 * Dirty trick:  Enable wrapping mode on the label's layout behind its
@@ -1102,11 +1072,11 @@
 	 * builtin maximum value of about 65 Latin characters.
 	 */
 	layout = gtk_label_get_layout(GTK_LABEL(beval->balloonLabel));
-#  ifdef PANGO_WRAP_WORD_CHAR
+# ifdef PANGO_WRAP_WORD_CHAR
 	pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
-#  else
+# else
 	pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
-#  endif
+# endif
 	pango_layout_set_width(layout,
 		/* try to come up with some reasonable width */
 		PANGO_SCALE * CLAMP(gui.num_cols * gui.char_width,
@@ -1115,25 +1085,6 @@
 
 	/* Calculate the balloon's width and height. */
 	gtk_widget_size_request(beval->balloonShell, &requisition);
-# else
-	gtk_label_set_line_wrap(GTK_LABEL(beval->balloonLabel), FALSE);
-	gtk_label_set_text(GTK_LABEL(beval->balloonLabel),
-			   (const char *)beval->msg);
-
-	/* Calculate the balloon's width and height. */
-	gtk_widget_size_request(beval->balloonShell, &requisition);
-	/*
-	 * Unfortunately, the dirty trick used above to get around the builtin
-	 * maximum wrap width of GtkLabel doesn't work with GTK+ 1.  Thus if
-	 * and only if it's absolutely necessary to avoid drawing off-screen,
-	 * do enable wrapping now and recalculate the size request.
-	 */
-	if (requisition.width > screen_w)
-	{
-	    gtk_label_set_line_wrap(GTK_LABEL(beval->balloonLabel), TRUE);
-	    gtk_widget_size_request(beval->balloonShell, &requisition);
-	}
-# endif
 
 	/* Compute position of the balloon area */
 	gdk_window_get_origin(beval->target->window, &x, &y);
@@ -1196,10 +1147,6 @@
 
     gtk_signal_connect((GtkObject*)(beval->balloonShell), "expose_event",
 		       GTK_SIGNAL_FUNC(balloon_expose_event_cb), NULL);
-# ifndef HAVE_GTK2
-    gtk_signal_connect((GtkObject*)(beval->balloonShell), "draw",
-		       GTK_SIGNAL_FUNC(balloon_draw_cb), NULL);
-# endif
     beval->balloonLabel = gtk_label_new(NULL);
 
     gtk_label_set_line_wrap(GTK_LABEL(beval->balloonLabel), FALSE);
diff --git a/src/gui_gtk.c b/src/gui_gtk.c
index 6a657a3..52d75e4 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -62,53 +62,6 @@
 # include <gnome.h>
 #endif
 
-#if defined(FEAT_GUI_DIALOG) && !defined(HAVE_GTK2)
-# include "../pixmaps/alert.xpm"
-# include "../pixmaps/error.xpm"
-# include "../pixmaps/generic.xpm"
-# include "../pixmaps/info.xpm"
-# include "../pixmaps/quest.xpm"
-#endif
-
-#if defined(FEAT_TOOLBAR) && !defined(HAVE_GTK2)
-/*
- * 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"
-#endif /* FEAT_TOOLBAR && !HAVE_GTK2 */
-
 #ifdef FEAT_GUI_GTK
 # include <gdk/gdkkeysyms.h>
 # include <gdk/gdk.h>
@@ -137,11 +90,8 @@
 static void entry_activate_cb(GtkWidget *widget, gpointer data);
 static void entry_changed_cb(GtkWidget *entry, GtkWidget *dialog);
 static void find_replace_cb(GtkWidget *widget, gpointer data);
-#ifndef HAVE_GTK2
-static void gui_gtk_position_in_parent(GtkWidget *parent, GtkWidget *child, gui_win_pos_T where);
-#endif
 
-#if defined(FEAT_TOOLBAR) && defined(HAVE_GTK2)
+#if defined(FEAT_TOOLBAR)
 /*
  * Table from BuiltIn## icon indices to GTK+ stock IDs.  Order must exactly
  * match toolbar_names[] in menu.c!  All stock icons including the "vim-*"
@@ -298,9 +248,9 @@
 
     return TRUE;
 }
-#endif /* FEAT_TOOLBAR && HAVE_GTK2 */
+#endif /* FEAT_TOOLBAR */
 
-#if (defined(FEAT_TOOLBAR) && defined(HAVE_GTK2)) || defined(PROTO)
+#if defined(FEAT_TOOLBAR) || defined(PROTO)
 
     void
 gui_gtk_register_stock_icons(void)
@@ -330,20 +280,9 @@
     g_object_unref(factory);
 }
 
-#endif /* FEAT_TOOLBAR && HAVE_GTK2 */
+#endif /* FEAT_TOOLBAR */
 
 
-/*
- * Only use accelerators when gtk_menu_ensure_uline_accel_group() is
- * available, which is in version 1.2.1.  That was the first version where
- * accelerators properly worked (according to the change log).
- */
-#ifdef GTK_CHECK_VERSION
-# if GTK_CHECK_VERSION(1, 2, 1)
-#  define GTK_USE_ACCEL
-# endif
-#endif
-
 #if defined(FEAT_MENU) || defined(PROTO)
 
 /*
@@ -364,9 +303,7 @@
     char_u  *pdest;
     int	    n_underscores = 0;
 
-# ifdef HAVE_GTK2
     name = CONVERT_TO_UTF8(name);
-# endif
     if (name == NULL)
 	return NULL;
 
@@ -401,14 +338,10 @@
 	*pdest = NUL;
     }
 
-# ifdef HAVE_GTK2
     CONVERT_TO_UTF8_FREE(name);
-# endif
     return buf;
 }
 
-# ifdef HAVE_GTK2
-
     static void
 menu_item_new(vimmenu_T *menu, GtkWidget *parent_widget)
 {
@@ -445,96 +378,6 @@
     gtk_widget_show_all(menu->id);
 }
 
-# else /* !HAVE_GTK2 */
-
-/*
- * Create a highly customized menu item by hand instead of by using:
- *
- * gtk_menu_item_new_with_label(menu->dname);
- *
- * This is necessary, since there is no other way in GTK+ 1 to get the
- * not automatically parsed accelerator stuff right.
- */
-    static void
-menu_item_new(vimmenu_T *menu, GtkWidget *parent_widget)
-{
-    GtkWidget	*widget;
-    GtkWidget	*bin;
-    GtkWidget	*label;
-    char_u	*name;
-    guint	accel_key;
-
-    widget = gtk_widget_new(GTK_TYPE_MENU_ITEM,
-			    "GtkWidget::visible", TRUE,
-			    "GtkWidget::sensitive", TRUE,
-			    /* "GtkWidget::parent", parent->submenu_id, */
-			    NULL);
-    bin = gtk_widget_new(GTK_TYPE_HBOX,
-			 "GtkWidget::visible", TRUE,
-			 "GtkWidget::parent", widget,
-			 "GtkBox::spacing", 16,
-			 NULL);
-    label = gtk_widget_new(GTK_TYPE_ACCEL_LABEL,
-			   "GtkWidget::visible", TRUE,
-			   "GtkWidget::parent", bin,
-			   "GtkAccelLabel::accel_widget", widget,
-			   "GtkMisc::xalign", 0.0,
-			   NULL);
-    menu->label = label;
-
-    if (menu->actext)
-	gtk_widget_new(GTK_TYPE_LABEL,
-		       "GtkWidget::visible", TRUE,
-		       "GtkWidget::parent", bin,
-		       "GtkLabel::label", menu->actext,
-		       "GtkMisc::xalign", 1.0,
-			NULL);
-
-    /*
-     * Translate VIM accelerator tagging into GTK+'s.  Note that since GTK uses
-     * underscores as the accelerator key, we need to add an additional under-
-     * score for each understore that appears in the menu name.
-     */
-#  ifdef GTK_USE_ACCEL
-    name = translate_mnemonic_tag(menu->name,
-		(p_wak[0] != 'n' || !GTK_IS_MENU_BAR(parent_widget)));
-#  else
-    name = translate_mnemonic_tag(menu->name, FALSE);
-#  endif
-
-    /* let GTK do its thing */
-    accel_key = gtk_label_parse_uline(GTK_LABEL(label), (const char *)name);
-    vim_free(name);
-
-#  ifdef GTK_USE_ACCEL
-    /* Don't add accelator if 'winaltkeys' is "no". */
-    if (accel_key != GDK_VoidSymbol)
-    {
-	if (GTK_IS_MENU_BAR(parent_widget))
-	{
-	    if (*p_wak != 'n')
-		gtk_widget_add_accelerator(widget,
-			"activate_item",
-			gui.accel_group,
-			accel_key, GDK_MOD1_MASK,
-			(GtkAccelFlags)0);
-	}
-	else
-	{
-	    gtk_widget_add_accelerator(widget,
-		    "activate_item",
-		    gtk_menu_ensure_uline_accel_group(GTK_MENU(parent_widget)),
-		    accel_key, 0,
-		    (GtkAccelFlags)0);
-	}
-    }
-#  endif /* GTK_USE_ACCEL */
-
-    menu->id = widget;
-}
-
-# endif /* !HAVE_GTK2 */
-
     void
 gui_mch_add_menu(vimmenu_T *menu, int idx)
 {
@@ -562,18 +405,6 @@
 
     gtk_menu_shell_insert(GTK_MENU_SHELL(parent_widget), menu->id, idx);
 
-#ifndef HAVE_GTK2
-    /*
-     * The "Help" menu is a special case, and should be placed at the far
-     * right hand side of the menu-bar.  It's detected by its high priority.
-     *
-     * Right-aligning "Help" is considered bad UI design nowadays.
-     * Thus lets disable this for GTK+ 2 to match the environment.
-     */
-    if (parent == NULL && menu->priority >= 9999)
-	gtk_menu_item_right_justify(GTK_MENU_ITEM(menu->id));
-#endif
-
     menu->submenu_id = gtk_menu_new();
 
     gtk_menu_set_accel_group(GTK_MENU(menu->submenu_id), gui.accel_group);
@@ -590,117 +421,11 @@
 {
     gui_menu_cb((vimmenu_T *)data);
 
-# ifndef HAVE_GTK2
-    /* Work around a bug in GTK+ 1: we don't seem to get a focus-in
-     * event after clicking a menu item shown via :popup. */
-    if (!gui.in_focus)
-	gui_focus_change(TRUE);
-# endif
-
     /* make sure the menu action is taken immediately */
     if (gtk_main_level() > 0)
 	gtk_main_quit();
 }
 
-# if defined(FEAT_TOOLBAR) && !defined(HAVE_GTK2)
-/*
- * 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
-};
-
-/*
- * creates a blank pixmap using tb_blank
- */
-    static void
-pixmap_create_from_xpm(char **xpm, GdkPixmap **pixmap, GdkBitmap **mask)
-{
-    *pixmap = gdk_pixmap_colormap_create_from_xpm_d(
-	    NULL,
-	    gtk_widget_get_colormap(gui.mainwin),
-	    mask,
-	    NULL,
-	    xpm);
-}
-
-/*
- * creates a pixmap by using a built-in number
- */
-    static void
-pixmap_create_by_num(int pixmap_num, GdkPixmap **pixmap, GdkBitmap **mask)
-{
-    if (pixmap_num >= 0 && pixmap_num < (sizeof(built_in_pixmaps)
-					    / sizeof(built_in_pixmaps[0])))
-	pixmap_create_from_xpm(built_in_pixmaps[pixmap_num], pixmap, mask);
-}
-
-/*
- * Creates a pixmap by using the pixmap "name" found in 'runtimepath'/bitmaps/
- */
-    static void
-pixmap_create_by_dir(char_u *name, GdkPixmap **pixmap, GdkBitmap **mask)
-{
-    char_u full_pathname[MAXPATHL + 1];
-
-    if (gui_find_bitmap(name, full_pathname, "xpm") == OK)
-	*pixmap = gdk_pixmap_colormap_create_from_xpm(
-		NULL,
-		gtk_widget_get_colormap(gui.mainwin),
-		mask,
-		&gui.mainwin->style->bg[GTK_STATE_NORMAL],
-		(const char *)full_pathname);
-}
-
-/*
- * Creates a pixmap by using the pixmap "fname".
- */
-    static void
-pixmap_create_from_file(char_u *fname, GdkPixmap **pixmap, GdkBitmap **mask)
-{
-    *pixmap = gdk_pixmap_colormap_create_from_xpm(
-		NULL,
-		gtk_widget_get_colormap(gui.mainwin),
-		mask,
-		&gui.mainwin->style->bg[GTK_STATE_NORMAL],
-		(const char *)fname);
-}
-
-# endif /* FEAT_TOOLBAR && !HAVE_GTK2 */
-
     void
 gui_mch_add_menu_item(vimmenu_T *menu, int idx)
 {
@@ -723,7 +448,6 @@
 	}
 	else
 	{
-#  ifdef HAVE_GTK2
 	    char_u *text;
 	    char_u *tooltip;
 
@@ -750,39 +474,6 @@
 
 	    CONVERT_TO_UTF8_FREE(text);
 	    CONVERT_TO_UTF8_FREE(tooltip);
-
-#  else /* !HAVE_GTK2 */
-
-	    GdkPixmap *pixmap = NULL;
-	    GdkBitmap *mask = NULL;
-
-	    /* First try user specified bitmap, then builtin, the a blank. */
-	    if (menu->iconfile != NULL)
-	    {
-		char_u buf[MAXPATHL + 1];
-
-		gui_find_iconfile(menu->iconfile, buf, "xpm");
-		pixmap_create_from_file(buf, &pixmap, &mask);
-	    }
-	    if (pixmap == NULL && !menu->icon_builtin)
-		pixmap_create_by_dir(menu->name, &pixmap, &mask);
-	    if (pixmap == NULL && menu->iconidx >= 0)
-		pixmap_create_by_num(menu->iconidx, &pixmap, &mask);
-	    if (pixmap == NULL)
-		pixmap_create_from_xpm(tb_blank_xpm, &pixmap, &mask);
-	    if (pixmap == NULL)
-		return; /* should at least have blank pixmap, but if not... */
-
-	    menu->id = gtk_toolbar_insert_item(
-				    toolbar,
-				    (char *)(menu->dname),
-				    (char *)(menu->strings[MENU_INDEX_TIP]),
-				    (char *)(menu->dname),
-				    gtk_pixmap_new(pixmap, mask),
-				    GTK_SIGNAL_FUNC(menu_item_activate),
-				    (gpointer)menu,
-				    idx);
-#  endif /* !HAVE_GTK2 */
 	}
     }
     else
@@ -837,45 +528,16 @@
 {
     vimmenu_T	*menu;
     char_u	*name;
-# if !defined(HAVE_GTK2) && defined(GTK_USE_ACCEL)
-    guint	accel_key;
-# endif
 
     for (menu = root_menu; menu != NULL; menu = menu->next)
     {
 	if (menu->id == NULL)
 	    continue;
 
-# if defined(HAVE_GTK2)
 	name = translate_mnemonic_tag(menu->name, enable);
 	gtk_label_set_text_with_mnemonic(GTK_LABEL(menu->label),
 					 (const char *)name);
 	vim_free(name);
-# else
-#  if defined(GTK_USE_ACCEL)
-	name = translate_mnemonic_tag(menu->name, TRUE);
-	if (name != NULL)
-	{
-	    accel_key = gtk_label_parse_uline(GTK_LABEL(menu->label),
-					      (const char *)name);
-	    if (accel_key != GDK_VoidSymbol)
-		gtk_widget_remove_accelerator(menu->id, gui.accel_group,
-					      accel_key, GDK_MOD1_MASK);
-	    if (enable && accel_key != GDK_VoidSymbol)
-		gtk_widget_add_accelerator(menu->id, "activate_item",
-					   gui.accel_group,
-					   accel_key, GDK_MOD1_MASK,
-					   (GtkAccelFlags)0);
-	    vim_free(name);
-	}
-	if (!enable)
-	{
-	    name = translate_mnemonic_tag(menu->name, FALSE);
-	    gtk_label_parse_uline(GTK_LABEL(menu->label), (const char *)name);
-	    vim_free(name);
-	}
-#  endif
-# endif
     }
 }
 
@@ -903,58 +565,7 @@
 }
 #endif /* FEAT_MENU */
 
-
-#if defined(FEAT_TOOLBAR) && !defined(HAVE_GTK2)
-/*
- * Seems like there's a hole in the GTK Toolbar API: there's no provision for
- * removing an item from the toolbar.  Therefore I need to resort to going
- * really deeply into the internal widget structures.
- *
- * <danielk> I'm not sure the statement above is true -- at least with
- * GTK+ 2 one can just call gtk_widget_destroy() and be done with it.
- * It is true though that you couldn't remove space items before GTK+ 2
- * (without digging into the internals that is).  But the code below
- * doesn't seem to handle those either.  Well, it's obsolete anyway.
- */
-    static void
-toolbar_remove_item_by_text(GtkToolbar *tb, const char *text)
-{
-    GtkContainer *container;
-    GList *childl;
-    GtkToolbarChild *gtbc;
-
-    g_return_if_fail(tb != NULL);
-    g_return_if_fail(GTK_IS_TOOLBAR(tb));
-    container = GTK_CONTAINER(&tb->container);
-
-    for (childl = tb->children; childl; childl = childl->next)
-    {
-	gtbc = (GtkToolbarChild *)childl->data;
-
-	if (gtbc->type != GTK_TOOLBAR_CHILD_SPACE
-		&& strcmp(GTK_LABEL(gtbc->label)->label, text) == 0)
-	{
-	    gboolean was_visible;
-
-	    was_visible = GTK_WIDGET_VISIBLE(gtbc->widget);
-	    gtk_widget_unparent(gtbc->widget);
-
-	    tb->children = g_list_remove_link(tb->children, childl);
-	    g_free(gtbc);
-	    g_list_free(childl);
-	    tb->num_children--;
-
-	    if (was_visible && GTK_WIDGET_VISIBLE(container))
-		gtk_widget_queue_resize(GTK_WIDGET(container));
-
-	    break;
-	}
-    }
-}
-#endif /* FEAT_TOOLBAR && !HAVE_GTK2 */
-
-
-#if defined(FEAT_TOOLBAR) && defined(HAVE_GTK2)
+#if defined(FEAT_TOOLBAR)
     static int
 get_menu_position(vimmenu_T *menu)
 {
@@ -969,7 +580,7 @@
 
     return idx;
 }
-#endif /* FEAT_TOOLBAR && HAVE_GTK2 */
+#endif /* FEAT_TOOLBAR */
 
 
 #if defined(FEAT_TOOLBAR) || defined(PROTO)
@@ -981,18 +592,12 @@
     {
 	char_u *tooltip;
 
-# ifdef HAVE_GTK2
 	tooltip = CONVERT_TO_UTF8(menu->strings[MENU_INDEX_TIP]);
 	if (tooltip == NULL || utf_valid_string(tooltip, NULL))
 	    /* Only set the tooltip when it's valid utf-8. */
-# else
-	tooltip = menu->strings[MENU_INDEX_TIP];
-# endif
 	gtk_tooltips_set_tip(GTK_TOOLBAR(gui.toolbar)->tooltips,
 			     menu->id, (const char *)tooltip, NULL);
-# ifdef HAVE_GTK2
 	CONVERT_TO_UTF8_FREE(tooltip);
-# endif
     }
 }
 #endif /* FEAT_TOOLBAR */
@@ -1008,16 +613,11 @@
 # ifdef FEAT_TOOLBAR
     if (menu->parent != NULL && menu_is_toolbar(menu->parent->name))
     {
-#  ifdef HAVE_GTK2
 	if (menu_is_separator(menu->name))
 	    gtk_toolbar_remove_space(GTK_TOOLBAR(gui.toolbar),
 				     get_menu_position(menu));
 	else if (menu->id != NULL)
 	    gtk_widget_destroy(menu->id);
-#  else
-	toolbar_remove_item_by_text(GTK_TOOLBAR(gui.toolbar),
-				    (const char *)menu->dname);
-#  endif
     }
     else
 # endif /* FEAT_TOOLBAR */
@@ -1054,21 +654,11 @@
 	adjustment->page_increment = size < 3L ? 1L : size - 2L;
 	adjustment->step_increment = 1.0;
 
-#ifdef HAVE_GTK2
 	g_signal_handler_block(GTK_OBJECT(adjustment),
 						      (gulong)sb->handler_id);
-#else
-	gtk_signal_handler_block(GTK_OBJECT(adjustment),
-						       (guint)sb->handler_id);
-#endif
 	gtk_adjustment_changed(adjustment);
-#ifdef HAVE_GTK2
 	g_signal_handler_unblock(GTK_OBJECT(adjustment),
 						      (gulong)sb->handler_id);
-#else
-	gtk_signal_handler_unblock(GTK_OBJECT(adjustment),
-						       (guint)sb->handler_id);
-#endif
     }
 }
 
@@ -1108,7 +698,6 @@
      */
     if (sb != NULL)
     {
-#ifdef HAVE_GTK2
 	dragging = TRUE;
 
 	if (sb->wp != NULL)
@@ -1139,9 +728,6 @@
 		}
 	    }
 	}
-#else
-	dragging = (GTK_RANGE(sb->id)->scroll_type == GTK_SCROLL_NONE);
-#endif
     }
 
     gui_drag_scrollbar(sb, value, dragging);
@@ -1193,7 +779,7 @@
 /*
  * Implementation of the file selector related stuff
  */
-#if defined(HAVE_GTK2) && GTK_CHECK_VERSION(2,4,0)
+#if GTK_CHECK_VERSION(2,4,0)
 /* This has been disabled, because the GTK library rewrites
  * ~/.recently-used.xbel every time the main loop is quit.  For Vim that means
  * on just about any event. */
@@ -1271,9 +857,7 @@
 #endif
     char_u		dirbuf[MAXPATHL];
 
-# ifdef HAVE_GTK2
     title = CONVERT_TO_UTF8(title);
-# endif
 
     /* GTK has a bug, it only works with an absolute path. */
     if (initdir == NULL || *initdir == NUL)
@@ -1343,19 +927,13 @@
 
     gtk_file_selection_set_filename(GTK_FILE_SELECTION(gui.filedlg),
 						      (const gchar *)dirbuf);
-# ifndef HAVE_GTK2
-    gui_gtk_position_in_parent(GTK_WIDGET(gui.mainwin),
-				       GTK_WIDGET(gui.filedlg), VW_POS_MOUSE);
-# endif
 
     gtk_widget_show(gui.filedlg);
     while (gui.filedlg && GTK_WIDGET_DRAWABLE(gui.filedlg))
 	gtk_main_iteration_do(TRUE);
 #endif
 
-# ifdef HAVE_GTK2
     CONVERT_TO_UTF8_FREE(title);
-# endif
     if (gui.browse_fname == NULL)
 	return NULL;
 
@@ -1363,8 +941,6 @@
     return vim_strsave(shorten_fname1(gui.browse_fname));
 }
 
-#if defined(HAVE_GTK2) || defined(PROTO)
-
 /*
  * Put up a directory selector
  * Returns the selected name in allocated memory, or NULL for Cancel.
@@ -1428,544 +1004,11 @@
     return gui_mch_browse(0, title, NULL, NULL, initdir, NULL);
 # endif
 }
-#endif
 
 
 #endif	/* FEAT_BROWSE */
 
-#if defined(FEAT_GUI_DIALOG) && !defined(HAVE_GTK2)
-
-static char_u *dialog_textfield = NULL;
-static GtkWidget *dialog_textentry;
-
-    static void
-dlg_destroy(GtkWidget *dlg)
-{
-    if (dialog_textfield != NULL)
-    {
-	const char *text;
-
-	text = gtk_entry_get_text(GTK_ENTRY(dialog_textentry));
-	vim_strncpy(dialog_textfield, (char_u *)text, IOSIZE - 1);
-    }
-
-    /* Destroy the dialog, will break the waiting loop. */
-    gtk_widget_destroy(dlg);
-}
-
-# ifdef FEAT_GUI_GNOME
-    static int
-gui_gnome_dialog( int	type,
-		char_u	*title,
-		char_u	*message,
-		char_u	*buttons,
-		int	dfltbutton,
-		char_u	*textfield)
-{
-    GtkWidget	*dlg;
-    char	*gdtype;
-    char_u	*buttons_copy, *p, *next;
-    char	**buttons_list;
-    int		butcount, cur;
-
-    /* make a copy, so that we can insert NULs */
-    if ((buttons_copy = vim_strsave(buttons)) == NULL)
-	return -1;
-
-    /* determine exact number of buttons and allocate array to hold them */
-    for (butcount = 0, p = buttons; *p; p++)
-    {
-	if (*p == '\n')
-	    butcount++;
-    }
-    butcount++;
-    buttons_list = g_new0(char *, butcount + 1);
-
-    /* Add pixmap */
-    switch (type)
-    {
-    case VIM_ERROR:
-	gdtype = GNOME_MESSAGE_BOX_ERROR;
-	break;
-    case VIM_WARNING:
-	gdtype = GNOME_MESSAGE_BOX_WARNING;
-	break;
-    case VIM_INFO:
-	gdtype = GNOME_MESSAGE_BOX_INFO;
-	break;
-    case VIM_QUESTION:
-	gdtype = GNOME_MESSAGE_BOX_QUESTION;
-	break;
-    default:
-	gdtype = GNOME_MESSAGE_BOX_GENERIC;
-    };
-
-    p = buttons_copy;
-    for (cur = 0; cur < butcount; ++cur)
-    {
-	for (next = p; *next; ++next)
-	{
-	    if (*next == DLG_HOTKEY_CHAR)
-		STRMOVE(next, next + 1);
-	    if (*next == DLG_BUTTON_SEP)
-	    {
-		*next++ = NUL;
-		break;
-	    }
-	}
-
-	/* this should probably go into a table, but oh well */
-	if (g_strcasecmp((char *)p, "Ok") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_OK);
-	else if (g_strcasecmp((char *)p, "Cancel") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_CANCEL);
-	else if (g_strcasecmp((char *)p, "Yes") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_YES);
-	else if (g_strcasecmp((char *)p, "No") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_NO);
-	else if (g_strcasecmp((char *)p, "Close") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_CLOSE);
-	else if (g_strcasecmp((char *)p, "Help") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_HELP);
-	else if (g_strcasecmp((char *)p, "Apply") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_APPLY);
-#if 0
-	/*
-	 * these aren't really used that often anyway, but are listed here as
-	 * placeholders in case we need them.
-	 */
-	else if (g_strcasecmp((char *)p, "Next") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_NEXT);
-	else if (g_strcasecmp((char *)p, "Prev") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_PREV);
-	else if (g_strcasecmp((char *)p, "Up") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_UP);
-	else if (g_strcasecmp((char *)p, "Down") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_DOWN);
-	else if (g_strcasecmp((char *)p, "Font") == 0)
-	    buttons_list[cur] = g_strdup(GNOME_STOCK_BUTTON_FONT);
-#endif
-	else
-	    buttons_list[cur] = g_strdup((char *)p);
-
-	if (*next == NUL)
-	    break;
-
-	p = next;
-    }
-    vim_free(buttons_copy);
-
-    dlg = gnome_message_box_newv((const char *)message,
-				 (const char *)gdtype,
-				 (const char **)buttons_list);
-    for (cur = 0; cur < butcount; ++cur)
-	g_free(buttons_list[cur]);
-    g_free(buttons_list);
-
-    dialog_textfield = textfield;
-    if (textfield != NULL)
-    {
-	/* Add text entry field */
-	dialog_textentry = gtk_entry_new();
-	gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dlg)->vbox), dialog_textentry,
-			   TRUE, TRUE, 0);
-	gtk_entry_set_text(GTK_ENTRY(dialog_textentry),
-			   (const gchar *)textfield);
-	gtk_entry_select_region(GTK_ENTRY(dialog_textentry), 0,
-				STRLEN(textfield));
-	gtk_entry_set_max_length(GTK_ENTRY(dialog_textentry), IOSIZE - 1);
-	gtk_entry_set_position(GTK_ENTRY(dialog_textentry), STRLEN(textfield));
-	gtk_widget_show(dialog_textentry);
-	gtk_window_set_focus(GTK_WINDOW(dlg), dialog_textentry);
-    }
-
-    gtk_signal_connect_object(GTK_OBJECT(dlg), "destroy",
-			      GTK_SIGNAL_FUNC(dlg_destroy), GTK_OBJECT(dlg));
-    gnome_dialog_set_default(GNOME_DIALOG(dlg), dfltbutton + 1);
-    gui_gtk_position_in_parent(GTK_WIDGET(gui.mainwin),
-			       GTK_WIDGET(dlg), VW_POS_MOUSE);
-
-    return (1 + gnome_dialog_run_and_close(GNOME_DIALOG(dlg)));
-}
-
-# endif /* FEAT_GUI_GNOME */
-
-typedef struct _ButtonData
-{
-    int		*status;
-    int		index;
-    GtkWidget	*dialog;
-} ButtonData;
-
-typedef struct _CancelData
-{
-    int		*status;
-    int		ignore_enter;
-    GtkWidget	*dialog;
-} CancelData;
-
-    static void
-dlg_button_clicked(GtkWidget * widget, ButtonData *data)
-{
-    *(data->status) = data->index + 1;
-    dlg_destroy(data->dialog);
-}
-
-/*
- * This makes the Escape key equivalent to the cancel button.
- */
-    static int
-dlg_key_press_event(GtkWidget *widget, GdkEventKey *event, CancelData *data)
-{
-    /* Ignore hitting Enter (or Space) when there is no default button. */
-    if (data->ignore_enter && (event->keyval == GDK_Return
-						     || event->keyval == ' '))
-	return TRUE;
-    else    /* A different key was pressed, return to normal behavior */
-	data->ignore_enter = FALSE;
-
-    if (event->keyval != GDK_Escape && event->keyval != GDK_Return)
-	return FALSE;
-
-    /* The result value of 0 from a dialog is signaling cancelation.
-     * 1 means OK. */
-    *(data->status) = (event->keyval == GDK_Return);
-    dlg_destroy(data->dialog);
-
-    return TRUE;
-}
-
-/*
- * Callback function for when the dialog was destroyed by a window manager.
- */
-    static void
-dlg_destroy_cb(int *p)
-{
-    *p = TRUE;		/* set dialog_destroyed to break out of the loop */
-    if (gtk_main_level() > 0)
-	gtk_main_quit();
-}
-
-    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)	/* text for textfield or NULL */
-{
-    char_u	*names;
-    char_u	*p;
-    int		i;
-    int		butcount;
-    int		dialog_status = -1;
-    int		dialog_destroyed = FALSE;
-    int		vertical;
-
-    GtkWidget		*dialog;
-    GtkWidget		*frame;
-    GtkWidget		*vbox;
-    GtkWidget		*table;
-    GtkWidget		*dialogmessage;
-    GtkWidget		*action_area;
-    GtkWidget		*sub_area;
-    GtkWidget		*separator;
-    GtkAccelGroup	*accel_group;
-    GtkWidget		*pixmap;
-    GdkPixmap		*icon = NULL;
-    GdkBitmap		*mask = NULL;
-    char		**icon_data = NULL;
-
-    GtkWidget		**button;
-    ButtonData		*data;
-    CancelData		cancel_data;
-
-    /* if our pointer is currently hidden, then we should show it. */
-    gui_mch_mousehide(FALSE);
-
-# ifdef FEAT_GUI_GNOME
-    /* If Gnome is available, use it for the dialog. */
-    if (gtk_socket_id == 0)
-	return gui_gnome_dialog(type, title, message, buttons, def_but,
-								   textfield);
-# endif
-
-    if (title == NULL)
-	title = (char_u *)_("Vim dialog...");
-
-    if ((type < 0) || (type > VIM_LAST_TYPE))
-	type = VIM_GENERIC;
-
-    /* Check 'v' flag in 'guioptions': vertical button placement. */
-    vertical = (vim_strchr(p_go, GO_VERTICAL) != NULL);
-
-    dialog = gtk_window_new(GTK_WINDOW_DIALOG);
-    gtk_window_set_title(GTK_WINDOW(dialog), (const gchar *)title);
-    gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gui.mainwin));
-    gtk_widget_realize(dialog);
-    gdk_window_set_decorations(dialog->window, GDK_DECOR_BORDER);
-    gdk_window_set_functions(dialog->window, GDK_FUNC_MOVE);
-
-    cancel_data.status = &dialog_status;
-    cancel_data.dialog = dialog;
-    gtk_signal_connect_after(GTK_OBJECT(dialog), "key_press_event",
-		    GTK_SIGNAL_FUNC(dlg_key_press_event),
-		    (gpointer) &cancel_data);
-    /* Catch the destroy signal, otherwise we don't notice a window manager
-     * destroying the dialog window. */
-    gtk_signal_connect_object(GTK_OBJECT(dialog), "destroy",
-		    GTK_SIGNAL_FUNC(dlg_destroy_cb),
-		    (gpointer)&dialog_destroyed);
-
-    gtk_grab_add(dialog);
-
-    /* this makes it look beter on Motif style window managers */
-    frame = gtk_frame_new(NULL);
-    gtk_container_add(GTK_CONTAINER(dialog), frame);
-    gtk_widget_show(frame);
-
-    vbox = gtk_vbox_new(FALSE, 0);
-    gtk_container_add(GTK_CONTAINER(frame), vbox);
-    gtk_widget_show(vbox);
-
-    table = gtk_table_new(1, 3, FALSE);
-    gtk_table_set_row_spacings(GTK_TABLE(table), 4);
-    gtk_table_set_col_spacings(GTK_TABLE(table), 8);
-    gtk_container_border_width(GTK_CONTAINER(table), 4);
-    gtk_box_pack_start(GTK_BOX(vbox), table, 4, 4, 0);
-    gtk_widget_show(table);
-
-    /* Add pixmap */
-    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;
-    };
-    icon = gdk_pixmap_colormap_create_from_xpm_d(NULL,
-				     gtk_widget_get_colormap(dialog),
-				     &mask, NULL, icon_data);
-    if (icon)
-    {
-	pixmap = gtk_pixmap_new(icon, mask);
-	/* gtk_misc_set_alignment(GTK_MISC(pixmap), 0.5, 0.5); */
-	gtk_table_attach_defaults(GTK_TABLE(table), pixmap, 0, 1, 0, 1);
-	gtk_widget_show(pixmap);
-    }
-
-    /* Add label */
-    dialogmessage = gtk_label_new((const gchar *)message);
-    gtk_table_attach_defaults(GTK_TABLE(table), dialogmessage, 1, 2, 0, 1);
-    gtk_widget_show(dialogmessage);
-
-    dialog_textfield = textfield;
-    if (textfield != NULL)
-    {
-	/* Add text entry field */
-	dialog_textentry = gtk_entry_new();
-	gtk_widget_set_usize(dialog_textentry, 400, -2);
-	gtk_box_pack_start(GTK_BOX(vbox), dialog_textentry, TRUE, TRUE, 0);
-	gtk_entry_set_text(GTK_ENTRY(dialog_textentry),
-						    (const gchar *)textfield);
-	gtk_entry_select_region(GTK_ENTRY(dialog_textentry), 0,
-							   STRLEN(textfield));
-	gtk_entry_set_max_length(GTK_ENTRY(dialog_textentry), IOSIZE - 1);
-	gtk_entry_set_position(GTK_ENTRY(dialog_textentry), STRLEN(textfield));
-	gtk_widget_show(dialog_textentry);
-    }
-
-    /* Add box for buttons */
-    action_area = gtk_hbox_new(FALSE, 0);
-    gtk_container_border_width(GTK_CONTAINER(action_area), 4);
-    gtk_box_pack_end(GTK_BOX(vbox), action_area, FALSE, TRUE, 0);
-    gtk_widget_show(action_area);
-
-    /* Add a [vh]box in the hbox to center the buttons in the dialog. */
-    if (vertical)
-	sub_area = gtk_vbox_new(FALSE, 0);
-    else
-	sub_area = gtk_hbox_new(FALSE, 0);
-    gtk_container_set_border_width(GTK_CONTAINER(sub_area), 0);
-    gtk_box_pack_start(GTK_BOX(action_area), sub_area, TRUE, FALSE, 0);
-    gtk_widget_show(sub_area);
-
-    /*
-     * Create the buttons.
-     */
-
-    /*
-     * Translate the Vim accelerator character into an underscore for GTK+.
-     * Double underscores to keep them in the label.
-     */
-    /* count the number of underscores */
-    i = 1;
-    for (p = buttons; *p; ++p)
-	if (*p == '_')
-	    ++i;
-
-    /* make a copy of "buttons" with the translated characters */
-    names = alloc(STRLEN(buttons) + i);
-    if (names == NULL)
-	return -1;
-
-    p = names;
-    for (i = 0; buttons[i]; ++i)
-    {
-	if (buttons[i] == DLG_HOTKEY_CHAR)
-	    *p++ = '_';
-	else
-	{
-	    if (buttons[i] == '_')
-		*p++ = '_';
-	    *p++ = buttons[i];
-	}
-    }
-    *p = NUL;
-
-    /* Count the number of buttons and allocate button[] and data[]. */
-    butcount = 1;
-    for (p = names; *p; ++p)
-	if (*p == DLG_BUTTON_SEP)
-	    ++butcount;
-    button = (GtkWidget **)alloc((unsigned)(butcount * sizeof(GtkWidget *)));
-    data = (ButtonData *)alloc((unsigned)(butcount * sizeof(ButtonData)));
-    if (button == NULL || data == NULL)
-    {
-	vim_free(names);
-	vim_free(button);
-	vim_free(data);
-	return -1;
-    }
-
-    /* Attach the new accelerator group to the window. */
-    accel_group = gtk_accel_group_new();
-    gtk_accel_group_attach(accel_group, GTK_OBJECT(dialog));
-
-    p = names;
-    for (butcount = 0; *p; ++butcount)
-    {
-	char_u		*next;
-	GtkWidget	*label;
-# ifdef GTK_USE_ACCEL
-	guint		accel_key;
-# endif
-
-	/* Chunk out this single button. */
-	for (next = p; *next; ++next)
-	{
-	    if (*next == DLG_BUTTON_SEP)
-	    {
-		*next++ = NUL;
-		break;
-	    }
-	}
-
-	button[butcount] = gtk_button_new();
-	GTK_WIDGET_SET_FLAGS(button[butcount], GTK_CAN_DEFAULT);
-
-	label = gtk_accel_label_new("");
-	gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), dialog);
-
-# ifdef GTK_USE_ACCEL
-	accel_key = gtk_label_parse_uline(GTK_LABEL(label), (const gchar *)p);
-	/* Don't add accelator if 'winaltkeys' is "no". */
-	if (accel_key != GDK_VoidSymbol)
-	{
-	    gtk_widget_add_accelerator(button[butcount],
-		    "clicked",
-		    accel_group,
-		    accel_key, 0,
-		    (GtkAccelFlags)0);
-	}
-# else
-	(void)gtk_label_parse_uline(GTK_LABEL(label), (const gchar *)p);
-# endif
-
-	gtk_container_add(GTK_CONTAINER(button[butcount]), label);
-	gtk_widget_show_all(button[butcount]);
-
-	data[butcount].status = &dialog_status;
-	data[butcount].index = butcount;
-	data[butcount].dialog = dialog;
-	gtk_signal_connect(GTK_OBJECT(button[butcount]),
-			   (const char *)"clicked",
-			   GTK_SIGNAL_FUNC(dlg_button_clicked),
-			   (gpointer) &data[butcount]);
-
-	gtk_box_pack_start(GTK_BOX(sub_area), button[butcount],
-			   TRUE, FALSE, 0);
-	p = next;
-    }
-
-    vim_free(names);
-
-    cancel_data.ignore_enter = FALSE;
-    if (butcount > 0)
-    {
-	--def_but;		/* 1 is first button */
-	if (def_but >= butcount)
-	    def_but = -1;
-	if (def_but >= 0)
-	{
-	    gtk_widget_grab_focus(button[def_but]);
-	    gtk_widget_grab_default(button[def_but]);
-	}
-	else
-	    /* No default, ignore hitting Enter. */
-	    cancel_data.ignore_enter = TRUE;
-    }
-
-    if (textfield != NULL)
-	gtk_window_set_focus(GTK_WINDOW(dialog), dialog_textentry);
-
-    separator = gtk_hseparator_new();
-    gtk_box_pack_end(GTK_BOX(vbox), separator, FALSE, TRUE, 0);
-    gtk_widget_show(separator);
-
-    dialog_status = -1;
-
-    gui_gtk_position_in_parent(GTK_WIDGET(gui.mainwin),
-					    GTK_WIDGET(dialog), VW_POS_MOUSE);
-
-    gtk_widget_show(dialog);
-
-    /* loop here until the dialog goes away */
-    while (dialog_status == -1 && !dialog_destroyed
-					       && GTK_WIDGET_DRAWABLE(dialog))
-	gtk_main_iteration_do(TRUE);
-
-    if (dialog_status < 0)
-	dialog_status = 0;
-    if (dialog_status != 1 && textfield != NULL)
-	*textfield = NUL;	/* dialog was cancelled */
-
-    /* let the garbage collector know that we don't need it any longer */
-    gtk_accel_group_unref(accel_group);
-
-    vim_free(button);
-    vim_free(data);
-
-    return dialog_status;
-}
-
-#endif /* FEAT_GUI_DIALOG && !HAVE_GTK2 */
-
-
-#if (defined(FEAT_GUI_DIALOG) && defined(HAVE_GTK2)) || defined(PROTO)
+#if defined(FEAT_GUI_DIALOG) || defined(PROTO)
 
     static GtkWidget *
 create_message_dialog(int type, char_u *title, char_u *message)
@@ -2316,7 +1359,7 @@
     return response > 0 ? response : 0;
 }
 
-#endif /* FEAT_GUI_DIALOG && HAVE_GTK2 */
+#endif /* FEAT_GUI_DIALOG */
 
 
 #if defined(FEAT_MENU) || defined(PROTO)
@@ -2324,7 +1367,7 @@
     void
 gui_mch_show_popupmenu(vimmenu_T *menu)
 {
-# if defined(FEAT_XIM) && defined(HAVE_GTK2)
+# if defined(FEAT_XIM)
     /*
      * Append a submenu for selecting an input method.	This is
      * currently the only way to switch input methods at runtime.
@@ -2355,7 +1398,7 @@
 	g_object_set_data(G_OBJECT(menu->submenu_id),
 			  "vim-has-im-menu", GINT_TO_POINTER(TRUE));
     }
-# endif /* FEAT_XIM && HAVE_GTK2 */
+# endif /* FEAT_XIM */
 
     gtk_menu_popup(GTK_MENU(menu->submenu_id),
 		   NULL, NULL,
@@ -2377,9 +1420,7 @@
     static void
 popup_menu_position_func(GtkMenu *menu UNUSED,
 			 gint *x, gint *y,
-# ifdef HAVE_GTK2
 			 gboolean *push_in UNUSED,
-# endif
 			 gpointer user_data UNUSED)
 {
     gdk_window_get_origin(gui.drawarea->window, x, y);
@@ -2461,18 +1502,6 @@
 
 	return TRUE;
     }
-    /*
-     * What the **** is this for?  Disabled for GTK+ 2 because due to
-     * gtk_signal_connect_after() it doesn't have any effect anyway.
-     * (Fortunately.)
-     */
-#ifndef HAVE_GTK2
-    /* block traversal resulting from those keys */
-    if (event->keyval == GDK_Left
-	    || event->keyval == GDK_Right
-	    || event->keyval == GDK_space)
-	return TRUE;
-#endif
 
     /* It would be delightful if it where possible to do search history
      * operations on the K_UP and K_DOWN keys here.
@@ -2481,7 +1510,6 @@
     return FALSE;
 }
 
-#ifdef HAVE_GTK2
     static GtkWidget *
 create_image_button(const char *stock_id, const char *label)
 {
@@ -2529,14 +1557,10 @@
 
     return (const char *)*buffer;
 }
-#endif /* HAVE_GTK2 */
 
     static void
 find_replace_dialog_create(char_u *arg, int do_replace)
 {
-#ifndef HAVE_GTK2
-    GtkWidget	*frame;
-#endif
     GtkWidget	*hbox;		/* main top down box */
     GtkWidget	*actionarea;
     GtkWidget	*table;
@@ -2547,45 +1571,26 @@
     char_u	*entry_text;
     int		wword = FALSE;
     int		mcase = !p_ic;
-#ifdef HAVE_GTK2
     char_u	*conv_buffer = NULL;
 #   define CONV(message) convert_localized_message(&conv_buffer, (message))
-#else
-#   define CONV(message) (message)
-#endif
 
     frdp = (do_replace) ? (&repl_widgets) : (&find_widgets);
 
     /* Get the search string to use. */
     entry_text = get_find_dialog_text(arg, &wword, &mcase);
 
-#ifdef HAVE_GTK2
     if (entry_text != NULL && output_conv.vc_type != CONV_NONE)
     {
 	char_u *old_text = entry_text;
 	entry_text = string_convert(&output_conv, entry_text, NULL);
 	vim_free(old_text);
     }
-#endif
 
     /*
      * If the dialog already exists, just raise it.
      */
     if (frdp->dialog)
     {
-#ifndef HAVE_GTK2
-	/* always make the dialog appear where you want it even if the mainwin
-	 * has moved -- dbv */
-	gui_gtk_position_in_parent(GTK_WIDGET(gui.mainwin),
-				      GTK_WIDGET(frdp->dialog), VW_POS_MOUSE);
-	gui_gtk_synch_fonts();
-
-	if (!GTK_WIDGET_VISIBLE(frdp->dialog))
-	{
-	    gtk_widget_grab_focus(frdp->what);
-	    gtk_widget_show(frdp->dialog);
-	}
-#endif
 	if (entry_text != NULL)
 	{
 	    gtk_entry_set_text(GTK_ENTRY(frdp->what), (char *)entry_text);
@@ -2594,62 +1599,30 @@
 	    gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(frdp->mcase),
 							     (gboolean)mcase);
 	}
-#ifdef HAVE_GTK2
 	gtk_window_present(GTK_WINDOW(frdp->dialog));
-#else
-	gdk_window_raise(frdp->dialog->window);
-#endif
 	vim_free(entry_text);
 	return;
     }
 
-#ifdef HAVE_GTK2
     frdp->dialog = gtk_dialog_new();
     gtk_dialog_set_has_separator(GTK_DIALOG(frdp->dialog), FALSE);
     gtk_window_set_transient_for(GTK_WINDOW(frdp->dialog), GTK_WINDOW(gui.mainwin));
     gtk_window_set_destroy_with_parent(GTK_WINDOW(frdp->dialog), TRUE);
-#else
-    frdp->dialog = gtk_window_new(GTK_WINDOW_DIALOG);
-#endif
 
     if (do_replace)
     {
-#ifndef HAVE_GTK2
-	gtk_window_set_wmclass(GTK_WINDOW(frdp->dialog), "searchrepl", "gvim");
-#endif
 	gtk_window_set_title(GTK_WINDOW(frdp->dialog),
 			     CONV(_("VIM - Search and Replace...")));
     }
     else
     {
-#ifndef HAVE_GTK2
-	gtk_window_set_wmclass(GTK_WINDOW(frdp->dialog), "search", "gvim");
-#endif
 	gtk_window_set_title(GTK_WINDOW(frdp->dialog),
 			     CONV(_("VIM - Search...")));
     }
 
-#ifndef HAVE_GTK2 /* Utter crack.  Shudder. */
-    gtk_widget_realize(frdp->dialog);
-    gdk_window_set_decorations(frdp->dialog->window,
-	    GDK_DECOR_TITLE | GDK_DECOR_BORDER | GDK_DECOR_RESIZEH);
-    gdk_window_set_functions(frdp->dialog->window,
-	    GDK_FUNC_RESIZE | GDK_FUNC_MOVE);
-#endif
-
-#ifndef HAVE_GTK2
-    /* this makes it look better on Motif style window managers */
-    frame = gtk_frame_new(NULL);
-    gtk_container_add(GTK_CONTAINER(frdp->dialog), frame);
-#endif
-
     hbox = gtk_hbox_new(FALSE, 0);
-#ifdef HAVE_GTK2
     gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(frdp->dialog)->vbox), hbox);
-#else
-    gtk_container_add(GTK_CONTAINER(frame), hbox);
-#endif
 
     if (do_replace)
 	table = gtk_table_new(1024, 4, FALSE);
@@ -2747,30 +1720,16 @@
 			gtk_radio_button_group(GTK_RADIO_BUTTON(frdp->up)),
 			CONV(_("Down")));
     gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(frdp->down), TRUE);
-#ifdef HAVE_GTK2
     gtk_container_set_border_width(GTK_CONTAINER(vbox), 2);
-#endif
     gtk_box_pack_start(GTK_BOX(vbox), frdp->down, TRUE, TRUE, 0);
 
     /* vbox to hold the action buttons */
     actionarea = gtk_vbutton_box_new();
     gtk_container_border_width(GTK_CONTAINER(actionarea), 2);
-#ifndef HAVE_GTK2
-    if (do_replace)
-    {
-	gtk_button_box_set_layout(GTK_BUTTON_BOX(actionarea),
-				  GTK_BUTTONBOX_END);
-	gtk_button_box_set_spacing(GTK_BUTTON_BOX(actionarea), 0);
-    }
-#endif
     gtk_box_pack_end(GTK_BOX(hbox), actionarea, FALSE, FALSE, 0);
 
     /* 'Find Next' button */
-#ifdef HAVE_GTK2
     frdp->find = create_image_button(GTK_STOCK_FIND, _("Find Next"));
-#else
-    frdp->find = gtk_button_new_with_label(_("Find Next"));
-#endif
     gtk_widget_set_sensitive(frdp->find, sensitive);
 
     gtk_signal_connect(GTK_OBJECT(frdp->find), "clicked",
@@ -2785,11 +1744,7 @@
     if (do_replace)
     {
 	/* 'Replace' button */
-#ifdef HAVE_GTK2
 	frdp->replace = create_image_button(GTK_STOCK_CONVERT, _("Replace"));
-#else
-	frdp->replace = gtk_button_new_with_label(_("Replace"));
-#endif
 	gtk_widget_set_sensitive(frdp->replace, sensitive);
 	GTK_WIDGET_SET_FLAGS(frdp->replace, GTK_CAN_DEFAULT);
 	gtk_box_pack_start(GTK_BOX(actionarea), frdp->replace, FALSE, FALSE, 0);
@@ -2798,11 +1753,7 @@
 			   GINT_TO_POINTER(FRD_REPLACE));
 
 	/* 'Replace All' button */
-#ifdef HAVE_GTK2
 	frdp->all = create_image_button(GTK_STOCK_CONVERT, _("Replace All"));
-#else
-	frdp->all = gtk_button_new_with_label(_("Replace All"));
-#endif
 	gtk_widget_set_sensitive(frdp->all, sensitive);
 	GTK_WIDGET_SET_FLAGS(frdp->all, GTK_CAN_DEFAULT);
 	gtk_box_pack_start(GTK_BOX(actionarea), frdp->all, FALSE, FALSE, 0);
@@ -2812,11 +1763,7 @@
     }
 
     /* 'Cancel' button */
-#ifdef HAVE_GTK2
     tmp = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
-#else
-    tmp = gtk_button_new_with_label(_("Cancel"));
-#endif
     GTK_WIDGET_SET_FLAGS(tmp, GTK_CAN_DEFAULT);
     gtk_box_pack_end(GTK_BOX(actionarea), tmp, FALSE, FALSE, 0);
     gtk_signal_connect_object(GTK_OBJECT(tmp),
@@ -2827,36 +1774,15 @@
 			      GTK_OBJECT(frdp->dialog));
 
     tmp = gtk_vseparator_new();
-#ifdef HAVE_GTK2
     gtk_box_pack_end(GTK_BOX(hbox), tmp, FALSE, FALSE, 10);
-#else
-    gtk_box_pack_end(GTK_BOX(hbox), tmp, FALSE, TRUE, 0);
-#endif
 
-#ifndef HAVE_GTK2
-    gtk_widget_grab_focus(frdp->what);
-
-    /* show the frame and realize the frdp->dialog this gives us a window size
-     * request that we'll use to position the window within the boundary of
-     * the mainwin --dbv */
-    gtk_widget_show_all(frame);
-    gui_gtk_position_in_parent(GTK_WIDGET(gui.mainwin),
-				      GTK_WIDGET(frdp->dialog), VW_POS_MOUSE);
-    gui_gtk_synch_fonts();
-    gtk_widget_show_all(frdp->dialog);
-#endif
-
-#ifdef HAVE_GTK2
     /* Suppress automatic show of the unused action area */
     gtk_widget_hide(GTK_DIALOG(frdp->dialog)->action_area);
     gtk_widget_show_all(hbox);
     gtk_widget_show(frdp->dialog);
-#endif
 
     vim_free(entry_text);
-#ifdef HAVE_GTK2
     vim_free(conv_buffer);
-#endif
 #undef CONV
 }
 
@@ -2874,65 +1800,6 @@
 	find_replace_dialog_create(eap->arg, TRUE);
 }
 
-
-#if !defined(HAVE_GTK2) || defined(PROTO)
-/*
- * Synchronize all gui elements, which are dependant upon the
- * main text font used. Those are in esp. the find/replace dialogs.
- * If you don't understand why this should be needed, please try to
- * search for "pięść" in iso8859-2.
- *
- * (<danielk> I converted the comment above to UTF-8 to put
- *  a stopper to the encoding mess.  Forgive me :)
- *
- * Obsolete with GTK2.
- */
-    void
-gui_gtk_synch_fonts(void)
-{
-    SharedFindReplace *frdp;
-    int do_replace;
-
-    /* OK this loop is a bit tricky... */
-    for (do_replace = 0; do_replace <= 1; ++do_replace)
-    {
-	frdp = (do_replace) ? (&repl_widgets) : (&find_widgets);
-	if (frdp->dialog)
-	{
-	    GtkStyle *style;
-
-	    /* synch the font with whats used by the text itself */
-	    style = gtk_style_copy(gtk_widget_get_style(frdp->what));
-	    gdk_font_unref(style->font);
-# ifdef FEAT_XFONTSET
-	    if (gui.fontset != NOFONTSET)
-		style->font = gui.fontset;
-	    else
-# endif
-		style->font = gui.norm_font;
-	    gdk_font_ref(style->font);
-	    gtk_widget_set_style(frdp->what, style);
-	    gtk_style_unref(style);
-	    if (do_replace)
-	    {
-		style = gtk_style_copy(gtk_widget_get_style(frdp->with));
-		gdk_font_unref(style->font);
-# ifdef FEAT_XFONTSET
-		if (gui.fontset != NOFONTSET)
-		    style->font = gui.fontset;
-		else
-# endif
-		    style->font = gui.norm_font;
-		gdk_font_ref(style->font);
-		gtk_widget_set_style(frdp->with, style);
-		gtk_style_unref(style);
-	    }
-	}
-    }
-}
-#endif /* !HAVE_GTK2 */
-
-
 /*
  * Callback for actions of the find and replace dialogs
  */
@@ -2968,15 +1835,11 @@
     if (GTK_TOGGLE_BUTTON(sfr->mcase)->active)
 	flags |= FRD_MATCH_CASE;
 
-#ifdef HAVE_GTK2
     repl_text = CONVERT_FROM_UTF8(repl_text);
     find_text = CONVERT_FROM_UTF8(find_text);
-#endif
     rc = gui_do_findrepl(flags, find_text, repl_text, direction_down);
-#ifdef HAVE_GTK2
     CONVERT_FROM_UTF8_FREE(repl_text);
     CONVERT_FROM_UTF8_FREE(find_text);
-#endif
 
     if (rc && gtk_main_level() > 0)
 	gtk_main_quit(); /* make sure cmd will be handled immediately */
@@ -3035,83 +1898,3 @@
      * backwards compatibility anyway. */
     do_cmdline_cmd((char_u *)"emenu ToolBar.FindHelp");
 }
-
-#if !defined(HAVE_GTK2) || defined(PROTO) /* Crack crack crack.  Brrrr. */
-
-/*  gui_gtk_position_in_parent
- *
- *  this function causes a child window to be placed within the boundary of
- *  the parent (mainwin) window.
- *
- *  you can specify where the window will be positioned by the third argument
- *  (defined in gui.h):
- *	VW_POS_CENTER		at center of parent window
- *	VW_POS_MOUSE		center of child at mouse position
- *	VW_POS_TOP_CENTER	top of child at top of parent centered
- *				horizontally about the mouse.
- *
- *  NOTE: for this function to act as desired the child window must have a
- *	  window size requested.  this can be accomplished by packing/placing
- *	  child widgets onto a gtk_frame widget rather than the gtk_window
- *	  widget...
- *
- *  brent -- dbv
- */
-    static void
-gui_gtk_position_in_parent(
-	GtkWidget	*parent,
-	GtkWidget	*child,
-	gui_win_pos_T	where)
-{
-    GtkRequisition	c_size;
-    gint		xPm, yPm;
-    gint		xP, yP, wP, hP, pos_x, pos_y;
-
-    /* make sure the child widget is set up then get its size. */
-    gtk_widget_size_request(child, &c_size);
-
-    /* get origin and size of parent window */
-    gdk_window_get_origin((GdkWindow *)(parent->window), &xP, &yP);
-    gdk_window_get_size((GdkWindow *)(parent->window), &wP, &hP);
-
-    if (c_size.width > wP || c_size.height > hP)
-    {
-	/* doh! maybe the user should consider giving gVim a little more
-	 * screen real estate */
-	gtk_widget_set_uposition(child , xP + 2 , yP + 2);
-	return;
-    }
-
-    if (where == VW_POS_MOUSE)
-    {
-	/* position window at mouse pointer */
-	gtk_widget_get_pointer(parent, &xPm, &yPm);
-	pos_x = xP + xPm - (c_size.width) / 2;
-	pos_y = yP + yPm - (c_size.height) / 2;
-    }
-    else
-    {
-	/* set child x origin so it is in center of Vim window */
-	pos_x =  xP + (wP - c_size.width) / 2;
-
-	if (where == VW_POS_TOP_CENTER)
-	    pos_y = yP + 2;
-	else
-	    /* where == VW_POS_CENTER */
-	    pos_y = yP + (hP - c_size.height) / 2;
-    }
-
-    /* now, make sure the window will be inside the Vim window... */
-    if (pos_x < xP)
-	pos_x = xP + 2;
-    if (pos_y < yP)
-	pos_y = yP + 2;
-    if ((pos_x + c_size.width) > (wP + xP))
-	pos_x = xP + wP - c_size.width - 2;
-    /* Assume 'guiheadroom' indicates the title bar height... */
-    if ((pos_y + c_size.height + p_ghr / 2) > (hP + yP))
-
-    gtk_widget_set_uposition(child, pos_x, pos_y);
-}
-
-#endif /* !HAVE_GTK2 */
diff --git a/src/gui_gtk_f.c b/src/gui_gtk_f.c
index 2caded8..0eb5065 100644
--- a/src/gui_gtk_f.c
+++ b/src/gui_gtk_f.c
@@ -54,10 +54,6 @@
 				  GtkRequisition *requisition);
 static void gtk_form_size_allocate(GtkWidget *widget,
 				   GtkAllocation *allocation);
-#ifndef HAVE_GTK2  /* this isn't needed in gtk2 */
-static void gtk_form_draw(GtkWidget *widget,
-			  GdkRectangle *area);
-#endif
 static gint gtk_form_expose(GtkWidget *widget,
 			    GdkEventExpose *event);
 
@@ -172,27 +168,6 @@
     }
 }
 
-#if !defined(HAVE_GTK2) || defined(PROTO)
-    void
-gtk_form_set_size(GtkForm *form, guint width, guint height)
-{
-    g_return_if_fail(GTK_IS_FORM(form));
-
-    /* prevent useless calls */
-    if (form->width == width && form->height == height)
-	return;
-    form->width = width;
-    form->height = height;
-
-    /* signal the change */
-#ifdef HAVE_GTK2
-    gtk_widget_queue_resize(gtk_widget_get_parent(GTK_WIDGET(form)));
-#else
-    gtk_container_queue_resize(GTK_CONTAINER(GTK_WIDGET(form)->parent));
-#endif
-}
-#endif
-
     void
 gtk_form_freeze(GtkForm *form)
 {
@@ -211,11 +186,7 @@
 	if (!(--form->freeze_count))
 	{
 	    gtk_form_position_children(form);
-#ifdef HAVE_GTK2
 	    gtk_widget_queue_draw(GTK_WIDGET(form));
-#else
-	    gtk_widget_draw(GTK_WIDGET(form), NULL);
-#endif
 	}
     }
 }
@@ -259,9 +230,6 @@
     widget_class->map = gtk_form_map;
     widget_class->size_request = gtk_form_size_request;
     widget_class->size_allocate = gtk_form_size_allocate;
-#ifndef HAVE_GTK2 /* not needed for GTK2 */
-    widget_class->draw = gtk_form_draw;
-#endif
     widget_class->expose_event = gtk_form_expose;
 
     container_class->remove = gtk_form_remove;
@@ -421,37 +389,6 @@
 	 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
 }
 
-#ifndef HAVE_GTK2
-    static void
-gtk_form_draw(GtkWidget *widget, GdkRectangle *area)
-{
-    GtkForm		*form;
-    GList		*children;
-    GtkFormChild	*child;
-    GdkRectangle	child_area;
-
-    g_return_if_fail(GTK_IS_FORM(widget));
-
-    if (GTK_WIDGET_DRAWABLE(widget))
-    {
-	form = GTK_FORM(widget);
-
-	children = form->children;
-
-	while (children)
-	{
-	    child = children->data;
-
-	    if (GTK_WIDGET_DRAWABLE(child->widget)
-		    && gtk_widget_intersect(child->widget, area, &child_area))
-		gtk_widget_draw(child->widget, &child_area);
-
-	    children = children->next;
-	}
-    }
-}
-#endif /* !HAVE_GTK2 */
-
     static void
 gtk_form_size_request(GtkWidget *widget, GtkRequisition *requisition)
 {
@@ -536,7 +473,6 @@
 
     for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
     {
-#ifdef HAVE_GTK2
 	GtkFormChild	*formchild = tmp_list->data;
 	GtkWidget	*child	   = formchild->widget;
 	/*
@@ -557,12 +493,6 @@
 		gtk_widget_send_expose(child, (GdkEvent *)&child_event);
 	    }
 	}
-#else /* !HAVE_GTK2 */
-	GtkFormChild *child = tmp_list->data;
-
-	if (event->window == child->window)
-	    return gtk_widget_event(child->widget, (GdkEvent *) event);
-#endif /* !HAVE_GTK2 */
     }
 
     return FALSE;
@@ -854,28 +784,12 @@
     return GDK_FILTER_CONTINUE;
 }
 
-/* Routines to set the window gravity, and check whether it is
- * functional. Extra capabilities need to be added to GDK, so
- * we don't have to use Xlib here.
- */
     static void
 gtk_form_set_static_gravity(GdkWindow *window, gboolean use_static)
 {
-#ifdef HAVE_GTK2
     /* We don't check if static gravity is actually supported, because it
      * results in an annoying assertion error message. */
     gdk_window_set_static_gravities(window, use_static);
-#else
-    XSetWindowAttributes xattributes;
-
-    xattributes.win_gravity = (use_static) ? StaticGravity : NorthWestGravity;
-    xattributes.bit_gravity = (use_static) ? StaticGravity : NorthWestGravity;
-
-    XChangeWindowAttributes(GDK_WINDOW_XDISPLAY(window),
-			    GDK_WINDOW_XWINDOW(window),
-			    CWBitGravity | CWWinGravity,
-			    &xattributes);
-#endif
 }
 
     void
@@ -903,11 +817,7 @@
     event.width = widget->allocation.width;
     event.height = widget->allocation.height;
 
-#ifdef HAVE_GTK2
     gtk_main_do_event((GdkEvent*)&event);
-#else
-    gtk_widget_event(widget, (GdkEvent*)&event);
-#endif
 }
 
     static void
diff --git a/src/gui_gtk_f.h b/src/gui_gtk_f.h
index 767f88a..73b0024 100644
--- a/src/gui_gtk_f.h
+++ b/src/gui_gtk_f.h
@@ -62,7 +62,6 @@
 void gtk_form_move_resize(GtkForm * form, GtkWidget * widget,
 	gint x, gint y,
 	gint w, gint h);
-void gtk_form_set_size(GtkForm * form, guint width, guint height);
 
 /* These disable and enable moving and repainting respectively.  If you
  * want to update the layout's offsets but do not want it to repaint
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 5cbe9a3..23651bd 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -45,10 +45,8 @@
 # endif
 # include <gnome.h>
 # include "version.h"
-#  ifdef HAVE_GTK2
 /* missing prototype in bonobo-dock-item.h */
 extern void bonobo_dock_item_set_behavior(BonoboDockItem *dock_item, BonoboDockItemBehavior beh);
-#  endif
 #endif
 
 #if !defined(FEAT_GUI_GTK) && defined(PROTO)
@@ -124,10 +122,8 @@
 {
     {VIMENC_ATOM_NAME,	0, TARGET_VIMENC},
     {VIM_ATOM_NAME,	0, TARGET_VIM},
-#ifdef FEAT_MBYTE
     {"text/html",	0, TARGET_HTML},
     {"UTF8_STRING",	0, TARGET_UTF8_STRING},
-#endif
     {"COMPOUND_TEXT",	0, TARGET_COMPOUND_TEXT},
     {"TEXT",		0, TARGET_TEXT},
     {"STRING",		0, TARGET_STRING}
@@ -142,10 +138,8 @@
 static const GtkTargetEntry dnd_targets[] =
 {
     {"text/uri-list",	0, TARGET_TEXT_URI_LIST},
-# ifdef FEAT_MBYTE
     {"text/html",	0, TARGET_HTML},
     {"UTF8_STRING",	0, TARGET_UTF8_STRING},
-# endif
     {"STRING",		0, TARGET_STRING},
     {"text/plain",	0, TARGET_TEXT_PLAIN}
 };
@@ -153,22 +147,12 @@
 #endif
 
 
-#ifdef HAVE_GTK2
 /*
  * "Monospace" is a standard font alias that should be present
  * on all proper Pango/fontconfig installations.
  */
 # define DEFAULT_FONT	"Monospace 10"
 
-#else /* !HAVE_GTK2 */
-/*
- * This is the single only fixed width font in X11, which seems to be present
- * on all servers and available in all the variants we need.
- */
-# define DEFAULT_FONT	"-adobe-courier-medium-r-normal-*-14-*-*-*-m-*-*-*"
-
-#endif /* !HAVE_GTK2 */
-
 #if !(defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION))
 /*
  * Atoms used to communicate save-yourself from the X11 session manager. There
@@ -181,18 +165,10 @@
 /*
  * Atoms used to control/reference X11 selections.
  */
-#ifdef FEAT_MBYTE
 static GdkAtom html_atom = GDK_NONE;
 static GdkAtom utf8_string_atom = GDK_NONE;
-#endif
-#ifndef HAVE_GTK2
-static GdkAtom compound_text_atom = GDK_NONE;
-static GdkAtom text_atom = GDK_NONE;
-#endif
 static GdkAtom vim_atom = GDK_NONE;	/* Vim's own special selection format */
-#ifdef FEAT_MBYTE
 static GdkAtom vimenc_atom = GDK_NONE;	/* Vim's extended selection format */
-#endif
 
 /*
  * Keycodes recognized by vim.
@@ -348,23 +324,13 @@
     {"-fg",		ARG_FOREGROUND|ARG_HAS_VALUE},
     {"-foreground",	ARG_FOREGROUND|ARG_HAS_VALUE},
     {"-iconic",		ARG_ICONIC},
-#ifdef HAVE_GTK2
     {"--role",		ARG_ROLE|ARG_HAS_VALUE},
-#endif
 #ifdef FEAT_NETBEANS_INTG
     {"-nb",		ARG_NETBEANS},	      /* non-standard value format */
     {"-xrm",		ARG_XRM|ARG_HAS_VALUE},		/* not implemented */
     {"-mf",		ARG_MENUFONT|ARG_HAS_VALUE},	/* not implemented */
     {"-menufont",	ARG_MENUFONT|ARG_HAS_VALUE},	/* not implemented */
 #endif
-#if 0 /* not implemented; these arguments don't make sense for GTK+ */
-    {"-boldfont",	ARG_HAS_VALUE},
-    {"-italicfont",	ARG_HAS_VALUE},
-    {"-bw",		ARG_HAS_VALUE},
-    {"-borderwidth",	ARG_HAS_VALUE},
-    {"-sw",		ARG_HAS_VALUE},
-    {"-scrollbarwidth",	ARG_HAS_VALUE},
-#endif
     /* Arguments handled by GTK (and GNOME) internally. */
     {"--g-fatal-warnings",	ARG_FOR_GTK},
     {"--gdk-debug",		ARG_FOR_GTK|ARG_HAS_VALUE},
@@ -376,17 +342,9 @@
     {"--display",		ARG_FOR_GTK|ARG_HAS_VALUE|ARG_COMPAT_LONG},
     {"--name",			ARG_FOR_GTK|ARG_HAS_VALUE|ARG_COMPAT_LONG},
     {"--class",			ARG_FOR_GTK|ARG_HAS_VALUE|ARG_COMPAT_LONG},
-#ifdef HAVE_GTK2
     {"--screen",		ARG_FOR_GTK|ARG_HAS_VALUE},
     {"--gxid-host",		ARG_FOR_GTK|ARG_HAS_VALUE},
     {"--gxid-port",		ARG_FOR_GTK|ARG_HAS_VALUE},
-#else /* these don't seem to exist anymore */
-    {"--no-xshm",		ARG_FOR_GTK},
-    {"--xim-preedit",		ARG_FOR_GTK|ARG_HAS_VALUE},
-    {"--xim-status",		ARG_FOR_GTK|ARG_HAS_VALUE},
-    {"--gxid_host",		ARG_FOR_GTK|ARG_HAS_VALUE},
-    {"--gxid_port",		ARG_FOR_GTK|ARG_HAS_VALUE},
-#endif
 #ifdef FEAT_GUI_GNOME
     {"--load-modules",		ARG_FOR_GTK|ARG_HAS_VALUE},
     {"--sm-client-id",		ARG_FOR_GTK|ARG_HAS_VALUE},
@@ -412,9 +370,7 @@
 static int    gui_argc = 0;
 static char **gui_argv = NULL;
 
-#ifdef HAVE_GTK2
 static const char *role_argument = NULL;
-#endif
 #if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION)
 static const char *restart_command = NULL;
 static       char *abs_restart_command = NULL;
@@ -561,11 +517,9 @@
 		case ARG_ICONIC:
 		    found_iconic_arg = TRUE;
 		    break;
-#ifdef HAVE_GTK2
 		case ARG_ROLE:
 		    role_argument = value; /* used later in gui_mch_open() */
 		    break;
-#endif
 #ifdef FEAT_NETBEANS_INTG
 		case ARG_NETBEANS:
 		    gui.dofork = FALSE; /* don't fork() when starting GUI */
@@ -859,7 +813,6 @@
 }
 
 
-#ifdef HAVE_GTK2
 /*
  * Translate a GDK key value to UTF-8 independently of the current locale.
  * The output is written to string, which must have room for at least 6 bytes
@@ -935,7 +888,6 @@
 
     return len;
 }
-#endif /* HAVE_GTK2 */
 
     static int
 modifiers_gdk2vim(guint state)
@@ -981,14 +933,9 @@
 		GdkEventKey *event,
 		gpointer data UNUSED)
 {
-#ifdef HAVE_GTK2
-    /* 256 bytes is way over the top, but for safety let's reduce it only
-     * for GTK+ 2 where we know for sure how large the string might get.
+    /* For GTK+ 2 we know for sure how large the string might get.
      * (That is, up to 6 bytes + NUL + CSI escapes + safety measure.) */
     char_u	string[32], string2[32];
-#else
-    char_u	string[256], string2[256];
-#endif
     guint	key_sym;
     int		len;
     int		i;
@@ -1000,25 +947,6 @@
     clipboard_event_time = event->time;
     key_sym = event->keyval;
     state = event->state;
-#ifndef HAVE_GTK2 /* deprecated */
-    len = event->length;
-    g_assert(len <= sizeof(string));
-#endif
-
-#ifndef HAVE_GTK2
-    /*
-     * It appears as if we always want to consume a key-press (there currently
-     * aren't any 'return FALSE's), so we always do this: when running in a
-     * GtkPlug and not a window, we must prevent emission of the key_press
-     * EVENT from continuing (which is 'beyond' the level of stopping mere
-     * signals by returning FALSE), otherwise things like tab/cursor-keys are
-     * processed by the GtkPlug default handler, which moves input focus away
-     * from us!
-     * Note: This should no longer be necessary with GTK+ 2.
-     */
-    if (gtk_socket_id != 0)
-	gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
-#endif
 
 #ifdef FEAT_XIM
     if (xim_queue_key_press_event(event, TRUE))
@@ -1044,7 +972,6 @@
     else
 #endif
     {
-#ifdef HAVE_GTK2
 	len = keyval_to_string(key_sym, state, string2);
 
 	/* Careful: convert_input() doesn't handle the NUL character.
@@ -1053,19 +980,6 @@
 	    len = convert_input(string2, len, sizeof(string2));
 
 	s = string2;
-#else
-# ifdef FEAT_MBYTE
-	if (input_conv.vc_type != CONV_NONE)
-	{
-	    mch_memmove(string2, event->string, len);
-	    len = convert_input(string2, len, sizeof(string2));
-	    s = string2;
-	}
-	else
-# endif
-	    s = (char_u *)event->string;
-#endif
-
 	d = string;
 	for (i = 0; i < len; ++i)
 	{
@@ -1087,21 +1001,6 @@
 	state |= GDK_SHIFT_MASK;
     }
 
-#ifndef HAVE_GTK2 /* for GTK+ 2, we handle this in keyval_to_string() */
-    if ((key_sym == GDK_2 || key_sym == GDK_at) && (state & GDK_CONTROL_MASK))
-    {
-	string[0] = NUL;	/* CTRL-2 and CTRL-@ is NUL */
-	len = 1;
-    }
-    else if (len == 0 && (key_sym == GDK_space || key_sym == GDK_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_sym & 0xff);
-	len = 1;
-    }
-#endif
-
 #ifdef FEAT_MENU
     /* If there is a menu and 'wak' is "yes", or 'wak' is "menu" and the key
      * is a menu shortcut, we ignore everything with the ALT modifier. */
@@ -1111,13 +1010,9 @@
 		|| (*p_wak == 'm'
 		    && len == 1
 		    && gui_is_menu_shortcut(string[0]))))
-# ifdef HAVE_GTK2
 	/* For GTK2 we return false to signify that we haven't handled the
 	 * keypress, so that gtk will handle the mnemonic or accelerator. */
 	return FALSE;
-# else
-	return TRUE;
-# endif
 #endif
 
     /* Check for Alt/Meta key (Mod1Mask), but not for a BS, DEL or character
@@ -1134,14 +1029,11 @@
 	    && !(key_sym == GDK_BackSpace || key_sym == GDK_Delete)
 	    && (string[0] & 0x80) == 0
 	    && !(key_sym == GDK_Tab && (state & GDK_SHIFT_MASK))
-#ifdef FEAT_MBYTE
 	    && !enc_dbcs
-#endif
 	    )
     {
 	string[0] |= 0x80;
 	state &= ~GDK_MOD1_MASK;	/* don't use it again */
-#ifdef FEAT_MBYTE
 	if (enc_utf8) /* convert to utf-8 */
 	{
 	    string[1] = string[0] & 0xbf;
@@ -1155,7 +1047,6 @@
 	    else
 		len = 2;
 	}
-#endif
     }
 
     /* Check for special keys.	Also do this when len == 1 (key has an ASCII
@@ -1178,26 +1069,17 @@
     if (len == 0)   /* Unrecognized key */
 	return TRUE;
 
-#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) && !defined(HAVE_GTK2)
-    /* Cancel or type backspace. For GTK2, im_commit_cb() does the same. */
-    preedit_start_col = MAXCOL;
-    xim_changed_while_preediting = TRUE;
-#endif
-
     /* Special keys (and a few others) may have modifiers. Also when using a
      * double-byte encoding (can't set the 8th bit). */
     if (len == -3 || key_sym == GDK_space || key_sym == GDK_Tab
 	    || key_sym == GDK_Return || key_sym == GDK_Linefeed
 	    || key_sym == GDK_Escape || key_sym == GDK_KP_Tab
 	    || key_sym == GDK_ISO_Enter || key_sym == GDK_3270_Enter
-#ifdef FEAT_MBYTE
 	    || (enc_dbcs && len == 1 && ((state & GDK_MOD1_MASK)
-# ifdef GDK_SUPER_MASK
+#ifdef GDK_SUPER_MASK
 		    || (state & GDK_SUPER_MASK)
-# endif
-		    ))
 #endif
-	    )
+		    )))
     {
 	modifiers = modifiers_gdk2vim(state);
 
@@ -1254,7 +1136,7 @@
     return TRUE;
 }
 
-#if defined(FEAT_XIM) && defined(HAVE_GTK2)
+#if defined(FEAT_XIM)
     static gboolean
 key_release_event(GtkWidget *widget UNUSED,
 		  GdkEventKey *event,
@@ -1305,9 +1187,7 @@
     VimClipboard    *cbd;
     char_u	    *text;
     char_u	    *tmpbuf = NULL;
-#ifdef HAVE_GTK2
     guchar	    *tmpbuf_utf8 = NULL;
-#endif
     int		    len;
     int		    motion_type;
 
@@ -1337,7 +1217,6 @@
 	--len;
     }
 
-#ifdef FEAT_MBYTE
     else if (data->type == vimenc_atom)
     {
 	char_u		*enc;
@@ -1362,9 +1241,7 @@
 	    convert_setup(&conv, NULL, NULL);
 	}
     }
-#endif
 
-#ifdef HAVE_GTK2
     /* gtk_selection_data_get_text() handles all the nasty details
      * and targets and encodings etc.  This rocks so hard. */
     else
@@ -1401,51 +1278,6 @@
 		text = tmpbuf;
 	}
     }
-#else /* !HAVE_GTK2 */
-# ifdef FEAT_MBYTE
-    else if (data->type == utf8_string_atom)
-    {
-	vimconv_T conv;
-
-	conv.vc_type = CONV_NONE;
-	convert_setup(&conv, (char_u *)"utf-8", p_enc);
-
-	if (conv.vc_type != CONV_NONE)
-	{
-	    tmpbuf = string_convert(&conv, text, &len);
-	    convert_setup(&conv, NULL, NULL);
-	}
-	if (tmpbuf != NULL)
-	    text = tmpbuf;
-    }
-# endif
-    else if (data->type == compound_text_atom || data->type == text_atom)
-    {
-	char	    **list = NULL;
-	int	    count;
-	int	    i;
-	unsigned    tmplen = 0;
-
-	count = gdk_text_property_to_text_list(data->type, data->format,
-					       data->data, data->length,
-					       &list);
-	for (i = 0; i < count; ++i)
-	    tmplen += strlen(list[i]);
-
-	tmpbuf = alloc(tmplen + 1);
-	if (tmpbuf != NULL)
-	{
-	    tmpbuf[0] = NUL;
-	    for (i = 0; i < count; ++i)
-		STRCAT(tmpbuf, list[i]);
-	    text = tmpbuf;
-	    len  = tmplen;
-	}
-
-	if (list != NULL)
-	    gdk_free_text_list(list);
-    }
-#endif /* !HAVE_GTK2 */
 
     /* Chop off any traiing NUL bytes.  OpenOffice sends these. */
     while (len > 0 && text[len - 1] == NUL)
@@ -1454,9 +1286,7 @@
     clip_yank_selection(motion_type, text, (long)len, cbd);
     received_selection = RS_OK;
     vim_free(tmpbuf);
-#ifdef HAVE_GTK2
     g_free(tmpbuf_utf8);
-#endif
 
     if (gtk_main_level() > 0)
 	gtk_main_quit();
@@ -1490,11 +1320,9 @@
 	return;			/* Shouldn't ever happen */
 
     if (info != (guint)TARGET_STRING
-#ifdef FEAT_MBYTE
 	    && (!clip_html || info != (guint)TARGET_HTML)
 	    && info != (guint)TARGET_UTF8_STRING
 	    && info != (guint)TARGET_VIMENC
-#endif
 	    && info != (guint)TARGET_VIM
 	    && info != (guint)TARGET_COMPOUND_TEXT
 	    && info != (guint)TARGET_TEXT)
@@ -1526,7 +1354,6 @@
 	type = vim_atom;
     }
 
-#ifdef FEAT_MBYTE
     else if (info == (guint)TARGET_HTML)
     {
 	vimconv_T conv;
@@ -1578,9 +1405,7 @@
 	string = tmpbuf;
 	type = vimenc_atom;
     }
-#endif
 
-#ifdef HAVE_GTK2
     /* gtk_selection_data_set_text() handles everything for us.  This is
      * so easy and simple and cool, it'd be insane not to use it. */
     else
@@ -1602,50 +1427,6 @@
 	vim_free(string);
 	return;
     }
-#else /* !HAVE_GTK2 */
-# ifdef FEAT_MBYTE
-    else if (info == (guint)TARGET_UTF8_STRING)
-    {
-	vimconv_T conv;
-
-	conv.vc_type = CONV_NONE;
-	convert_setup(&conv, p_enc, (char_u *)"utf-8");
-
-	if (conv.vc_type != CONV_NONE)
-	{
-	    tmpbuf = string_convert(&conv, string, &length);
-	    convert_setup(&conv, NULL, NULL);
-	    vim_free(string);
-	    string = tmpbuf;
-	}
-	type = utf8_string_atom;
-    }
-# endif
-    else if (info == (guint)TARGET_COMPOUND_TEXT
-		|| info == (guint)TARGET_TEXT)
-    {
-	int format;
-
-	/* Copy the string to ensure NUL-termination */
-	tmpbuf = vim_strnsave(string, length);
-	vim_free(string);
-	if (tmpbuf != NULL)
-	{
-	    gdk_string_to_compound_text((const char *)tmpbuf,
-					&type, &format, &string, &length);
-	    vim_free(tmpbuf);
-	    selection_data->type = type;
-	    selection_data->format = format;
-	    gtk_selection_data_set(selection_data, type, format, string, length);
-	    gdk_free_compound_text(string);
-	}
-	return;
-    }
-    else
-    {
-	type = GDK_TARGET_STRING;
-    }
-#endif /* !HAVE_GTK2 */
 
     if (string != NULL)
     {
@@ -1664,12 +1445,6 @@
     int
 gui_mch_init_check(void)
 {
-#ifndef HAVE_GTK2
-    /* This is needed to make the locale handling consistent between the GUI
-     * and the rest of VIM. */
-    gtk_set_locale();
-#endif
-
 #ifdef FEAT_GUI_GNOME
     if (gtk_socket_id == 0)
 	using_gnome = 1;
@@ -1912,14 +1687,6 @@
     case 3:
 	button = MOUSE_RIGHT;
 	break;
-#ifndef HAVE_GTK2
-    case 4:
-	button = MOUSE_4;
-	break;
-    case 5:
-	button = MOUSE_5;
-	break;
-#endif
     default:
 	return FALSE;		/* Unknown button */
     }
@@ -1939,10 +1706,8 @@
     return TRUE;
 }
 
-#ifdef HAVE_GTK2
 /*
- * GTK+ 2 doesn't handle mouse buttons 4, 5, 6 and 7 the same way as GTK+ 1.
- * Instead, it abstracts scrolling via the new GdkEventScroll.
+ * GTK+ 2 abstracts scrolling via the GdkEventScroll.
  */
     static gboolean
 scroll_event(GtkWidget *widget,
@@ -1983,7 +1748,6 @@
 
     return TRUE;
 }
-#endif /* HAVE_GTK2 */
 
 
     static gint
@@ -2143,41 +1907,22 @@
     char_u  dropkey[6] = {CSI, KS_MODIFIER, 0, CSI, KS_EXTRA, (char_u)KE_DROP};
     char_u  *text;
     int	    len;
-# ifdef FEAT_MBYTE
     char_u  *tmpbuf = NULL;
-# endif
 
     text = data->data;
     len  = data->length;
 
-# ifdef FEAT_MBYTE
     if (data->type == utf8_string_atom)
     {
-#  ifdef HAVE_GTK2
 	if (input_conv.vc_type != CONV_NONE)
 	    tmpbuf = string_convert(&input_conv, text, &len);
-#  else
-	vimconv_T conv;
-
-	conv.vc_type = CONV_NONE;
-	convert_setup(&conv, (char_u *)"utf-8", p_enc);
-
-	if (conv.vc_type != CONV_NONE)
-	{
-	    tmpbuf = string_convert(&conv, text, &len);
-	    convert_setup(&conv, NULL, NULL);
-	}
-#  endif
 	if (tmpbuf != NULL)
 	    text = tmpbuf;
     }
-# endif /* FEAT_MBYTE */
 
     dnd_yank_drag_data(text, (long)len);
     gtk_drag_finish(context, TRUE, FALSE, time_); /* accept */
-# ifdef FEAT_MBYTE
     vim_free(tmpbuf);
-# endif
 
     dropkey[2] = modifiers_gdk2vim(state);
 
@@ -2407,10 +2152,8 @@
 	argv[i++] = restart_command;
 	argv[i++] = "-f";
 	argv[i++] = "-g";
-# ifdef HAVE_GTK2
 	argv[i++] = "--role";
 	argv[i++] = gtk_window_get_role(GTK_WINDOW(gui.mainwin));
-# endif
 	argv[i++] = "-S";
 	argv[i++] = session_file;
 	argv[i] = NULL;
@@ -2551,13 +2294,11 @@
     }
 }
 
-# ifdef HAVE_GTK2
 /*
  * Installing a global event filter seems to be the only way to catch
  * client messages of type WM_PROTOCOLS without overriding GDK's own
  * client message event filter.  Well, that's still better than trying
  * to guess what the GDK filter had done if it had been invoked instead
- * (This is what we did for GTK+ 1.2, see below).
  *
  * GTK2_FIXME:	This doesn't seem to work.  For some reason we never
  * receive WM_SAVE_YOURSELF even though everything is set up correctly.
@@ -2596,51 +2337,6 @@
 
     return GDK_FILTER_CONTINUE;
 }
-
-# else /* !HAVE_GTK2 */
-
-/*
- * GDK handler for X ClientMessage events.
- */
-    static GdkFilterReturn
-gdk_wm_protocols_filter(GdkXEvent *xev, GdkEvent *event, gpointer data)
-{
-    /* From example in gdkevents.c/gdk_wm_protocols_filter */
-    XEvent *xevent = (XEvent *)xev;
-
-    if (xevent != NULL)
-    {
-	if (xevent->xclient.data.l[0] == GET_X_ATOM(save_yourself_atom))
-	{
-	    out_flush();
-	    ml_sync_all(FALSE, FALSE);	    /* preserve all swap files */
-
-	    /* Set the window's WM_COMMAND property, to let the window manager
-	     * know we are done saving ourselves.  We don't want to be
-	     * restarted, thus set argv to NULL. */
-	    XSetCommand(GDK_WINDOW_XDISPLAY(gui.mainwin->window),
-			GDK_WINDOW_XWINDOW(gui.mainwin->window),
-			NULL, 0);
-	}
-	/*
-	 * Functionality from gdkevents.c/gdk_wm_protocols_filter;
-	 * Registering this filter apparently overrides the default GDK one,
-	 * so we need to perform its functionality.  There seems no way to
-	 * register for WM_PROTOCOLS, and only process the WM_SAVE_YOURSELF
-	 * bit; it's all or nothing.  Update: No, there is a way -- but it
-	 * only works with GTK+ 2 apparently.  See above.
-	 */
-	else if (xevent->xclient.data.l[0] == GET_X_ATOM(gdk_wm_delete_window))
-	{
-	    event->any.type = GDK_DELETE;
-	    return GDK_FILTER_TRANSLATE;
-	}
-    }
-
-    return GDK_FILTER_REMOVE;
-}
-# endif /* !HAVE_GTK2 */
-
 #endif /* !(FEAT_GUI_GNOME && FEAT_SESSION) */
 
 
@@ -2655,10 +2351,8 @@
 #ifdef magick
 # undef magick
 #endif
-#ifdef HAVE_GTK2
   /* A bit hackish, but avoids casting later and allows optimization */
 # define static static const
-#endif
 #define magick vim32x32
 #include "../runtime/vim32x32.xpm"
 #undef magick
@@ -2668,9 +2362,7 @@
 #define magick vim48x48
 #include "../runtime/vim48x48.xpm"
 #undef magick
-#ifdef HAVE_GTK2
 # undef static
-#endif
 
     /* When started with "--echo-wid" argument, write window ID on stdout. */
     if (echo_wid_arg)
@@ -2684,7 +2376,6 @@
 	/*
 	 * Add an icon to the main window. For fun and convenience of the user.
 	 */
-#ifdef HAVE_GTK2
 	GList *icons = NULL;
 
 	icons = g_list_prepend(icons, gdk_pixbuf_new_from_xpm_data(vim16x16));
@@ -2695,53 +2386,11 @@
 
 	g_list_foreach(icons, (GFunc)&g_object_unref, NULL);
 	g_list_free(icons);
-
-#else /* !HAVE_GTK2 */
-
-	GdkPixmap   *icon;
-	GdkBitmap   *icon_mask = NULL;
-	char	    **magick = vim32x32;
-	Display	    *xdisplay;
-	Window	    root_window;
-	XIconSize   *size;
-	int	    number_sizes;
-	/*
-	 * Adjust the icon to the preferences of the actual window manager.
-	 * This is once again a workaround for a deficiency in GTK+ 1.2.
-	 */
-	xdisplay = GDK_WINDOW_XDISPLAY(gui.mainwin->window);
-	root_window = XRootWindow(xdisplay, DefaultScreen(xdisplay));
-	if (XGetIconSizes(xdisplay, root_window, &size, &number_sizes))
-	{
-	    if (number_sizes > 0)
-	    {
-		if (size->max_height >= 48 && size->max_height >= 48)
-		    magick = vim48x48;
-		else if (size->max_height >= 32 && size->max_height >= 32)
-		    magick = vim32x32;
-		else if (size->max_height >= 16 && size->max_height >= 16)
-		    magick = vim16x16;
-	    }
-	    XFree(size);
-	}
-	icon = gdk_pixmap_create_from_xpm_d(gui.mainwin->window,
-					    &icon_mask, NULL, magick);
-	if (icon != NULL)
-	    /* Note: for some reason gdk_window_set_icon() doesn't acquire
-	     * a reference on the pixmap, thus we _have_ to leak it. */
-	    gdk_window_set_icon(gui.mainwin->window, NULL, icon, icon_mask);
-
-#endif /* !HAVE_GTK2 */
     }
 
 #if !(defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION))
     /* Register a handler for WM_SAVE_YOURSELF with GDK's low-level X I/F */
-# ifdef HAVE_GTK2
     gdk_window_add_filter(NULL, &global_event_filter, NULL);
-# else
-    gdk_add_client_message_filter(wm_protocols_atom,
-				  &gdk_wm_protocols_filter, NULL);
-# endif
 #endif
     /* Setup to indicate to the window manager that we want to catch the
      * WM_SAVE_YOURSELF event.	For GNOME, this connects to the session
@@ -2884,7 +2533,6 @@
 #ifdef FEAT_XIM
     im_shutdown();
 #endif
-#ifdef HAVE_GTK2
     if (gui.ascii_glyphs != NULL)
     {
 	pango_glyph_string_free(gui.ascii_glyphs);
@@ -2903,13 +2551,6 @@
 
     gdk_cursor_unref(gui.blank_pointer);
     gui.blank_pointer = NULL;
-#else
-    gdk_gc_unref(gui.text_gc);
-    gui.text_gc = NULL;
-
-    gdk_cursor_destroy(gui.blank_pointer);
-    gui.blank_pointer = NULL;
-#endif
 }
 
     static void
@@ -2942,7 +2583,6 @@
 #ifdef FEAT_GUI_GNOME
     if (using_gnome && widget != NULL)
     {
-# ifdef HAVE_GTK2
 	GtkWidget *parent;
 	BonoboDockItem *dockitem;
 
@@ -2958,16 +2598,6 @@
 		return 0;
 	    item_orientation = bonobo_dock_item_get_orientation(dockitem);
 	}
-# else
-	GnomeDockItem *dockitem;
-
-	widget	 = widget->parent;
-	dockitem = GNOME_DOCK_ITEM(widget);
-
-	if (dockitem == NULL || dockitem->is_floating)
-	    return 0;
-	item_orientation = gnome_dock_item_get_orientation(dockitem);
-# endif
     }
 #endif
     if (widget != NULL
@@ -3065,10 +2695,8 @@
 # ifdef FEAT_MENU
     height += tabline_height() * gui.char_height;
 # endif
-# ifdef HAVE_GTK2
     width  += get_menu_tool_width();
     height += get_menu_tool_height();
-# endif
 
     /* GtkSockets use GtkPlug's [gui,mainwin] min-size hints to determine
      * their actual widget size.  When we set our size ourselves (e.g.,
@@ -3106,16 +2734,11 @@
 	geometry.min_height  = min_height;
 	geometry_mask	     = GDK_HINT_BASE_SIZE|GDK_HINT_RESIZE_INC
 			       |GDK_HINT_MIN_SIZE;
-# ifdef HAVE_GTK2
 	/* Using gui.formwin as geometry widget doesn't work as expected
 	 * with GTK+ 2 -- dunno why.  Presumably all the resizing hacks
 	 * in Vim confuse GTK+. */
 	gtk_window_set_geometry_hints(GTK_WINDOW(gui.mainwin), gui.mainwin,
 				      &geometry, geometry_mask);
-# else
-	gtk_window_set_geometry_hints(GTK_WINDOW(gui.mainwin), gui.formwin,
-				      &geometry, geometry_mask);
-# endif
 	old_width       = width;
 	old_height      = height;
 	old_min_width   = min_width;
@@ -3127,7 +2750,6 @@
 
 #ifdef FEAT_TOOLBAR
 
-# ifdef HAVE_GTK2
 /*
  * This extra effort wouldn't be necessary if we only used stock icons in the
  * toolbar, as we do for all builtin icons.  But user-defined toolbar icons
@@ -3161,24 +2783,18 @@
 			      user_data);
     }
 }
-# endif /* HAVE_GTK2 */
 
     static void
 set_toolbar_style(GtkToolbar *toolbar)
 {
     GtkToolbarStyle style;
-# ifdef HAVE_GTK2
     GtkIconSize	    size;
     GtkIconSize	    oldsize;
-# endif
 
-# ifdef HAVE_GTK2
     if ((toolbar_flags & (TOOLBAR_TEXT | TOOLBAR_ICONS | TOOLBAR_HORIZ))
 		      == (TOOLBAR_TEXT | TOOLBAR_ICONS | TOOLBAR_HORIZ))
 	style = GTK_TOOLBAR_BOTH_HORIZ;
-    else
-# endif
-    if ((toolbar_flags & (TOOLBAR_TEXT | TOOLBAR_ICONS))
+    else if ((toolbar_flags & (TOOLBAR_TEXT | TOOLBAR_ICONS))
 		      == (TOOLBAR_TEXT | TOOLBAR_ICONS))
 	style = GTK_TOOLBAR_BOTH;
     else if (toolbar_flags & TOOLBAR_TEXT)
@@ -3189,7 +2805,6 @@
     gtk_toolbar_set_style(toolbar, style);
     gtk_toolbar_set_tooltips(toolbar, (toolbar_flags & TOOLBAR_TOOLTIPS) != 0);
 
-# ifdef HAVE_GTK2
     switch (tbis_flags)
     {
 	case TBIS_TINY:	    size = GTK_ICON_SIZE_MENU;		break;
@@ -3213,7 +2828,6 @@
 			      GINT_TO_POINTER((int)size));
     }
     gtk_toolbar_set_icon_size(toolbar, size);
-# endif
 }
 
 #endif /* FEAT_TOOLBAR */
@@ -3313,11 +2927,6 @@
 		if (send_tabline_event(x < 50 ? -1 : 0) && gtk_main_level() > 0)
 		    gtk_main_quit();
 	    }
-#ifndef HAVE_GTK2
-	    else
-		gtk_notebook_set_page(GTK_NOTEBOOK(gui.tabline),
-							    clicked_page - 1);
-#endif
 	}
     }
 
@@ -3342,10 +2951,6 @@
     }
 }
 
-#ifndef HAVE_GTK2
-static int showing_tabline = 0;
-#endif
-
 /*
  * Show or hide the tabline.
  */
@@ -3355,19 +2960,11 @@
     if (gui.tabline == NULL)
 	return;
 
-#ifdef HAVE_GTK2
-    /* gtk_notebook_get_show_tabs does not exist in gtk+-1.2.10 */
     if (!showit != !gtk_notebook_get_show_tabs(GTK_NOTEBOOK(gui.tabline)))
-#else
-    if (!showit != !showing_tabline)
-#endif
     {
 	/* Note: this may cause a resize event */
 	gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gui.tabline), showit);
 	update_window_manager_hints(0, 0);
-#ifndef HAVE_GTK2
-	showing_tabline = showit;
-#endif
 	if (showit)
 	    GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(gui.tabline), GTK_CAN_FOCUS);
     }
@@ -3382,13 +2979,7 @@
 gui_mch_showing_tabline(void)
 {
     return gui.tabline != NULL
-#ifdef HAVE_GTK2
-	    /* gtk_notebook_get_show_tabs does not exist in gtk+-1.2.10 */
-		     && gtk_notebook_get_show_tabs(GTK_NOTEBOOK(gui.tabline))
-#else
-		     && showing_tabline
-#endif
-		     ;
+		     && gtk_notebook_get_show_tabs(GTK_NOTEBOOK(gui.tabline));
 }
 
 /*
@@ -3496,14 +3087,12 @@
 
     for (i = 0; i < (int)N_SELECTION_TARGETS; ++i)
     {
-#ifdef FEAT_MBYTE
 	/* OpenOffice tries to use TARGET_HTML and fails when it doesn't
 	 * return something, instead of trying another target. Therefore only
 	 * offer TARGET_HTML when it works. */
 	if (!clip_html && selection_targets[i].info == TARGET_HTML)
 	    n_targets--;
 	else
-#endif
 	    targets[j++] = selection_targets[i];
     }
 
@@ -3529,11 +3118,9 @@
 
     for (i = 0; i < (int)N_DND_TARGETS; ++i)
     {
-#ifdef FEAT_MBYTE
 	if (!clip_html && selection_targets[i].info == TARGET_HTML)
 	    n_targets--;
 	else
-#endif
 	    targets[j++] = dnd_targets[i];
     }
 
@@ -3558,21 +3145,16 @@
      * exits on failure, but that's a non-issue because we already called
      * gtk_init_check() in gui_mch_init_check(). */
     if (using_gnome)
-# ifdef HAVE_GTK2
 	gnome_program_init(VIMPACKAGE, VIM_VERSION_SHORT,
 			   LIBGNOMEUI_MODULE, gui_argc, gui_argv, NULL);
-# else
-	gnome_init(VIMPACKAGE, VIM_VERSION_SHORT, gui_argc, gui_argv);
-# endif
 #endif
     vim_free(gui_argv);
     gui_argv = NULL;
 
-#ifdef HAVE_GTK2
-# if GLIB_CHECK_VERSION(2,1,3)
+#if GLIB_CHECK_VERSION(2,1,3)
     /* Set the human-readable application name */
     g_set_application_name("Vim");
-# endif
+#endif
     /*
      * Force UTF-8 output no matter what the value of 'encoding' is.
      * did_set_string_option() in option.c prohibits changing 'termencoding'
@@ -3580,14 +3162,13 @@
      */
     set_option_value((char_u *)"termencoding", 0L, (char_u *)"utf-8", 0);
 
-# ifdef FEAT_TOOLBAR
+#ifdef FEAT_TOOLBAR
     gui_gtk_register_stock_icons();
-# endif
+#endif
     /* FIXME: Need to install the classic icons and a gtkrc.classic file.
      * The hard part is deciding install locations and the Makefile magic. */
-# if 0
+#if 0
     gtk_rc_parse("gtkrc");
-# endif
 #endif
 
     /* Initialize values */
@@ -3602,14 +3183,8 @@
     gui.spcolor = g_new0(GdkColor, 1);
 
     /* Initialise atoms */
-#ifdef FEAT_MBYTE
     html_atom = gdk_atom_intern("text/html", FALSE);
     utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
-#endif
-#ifndef HAVE_GTK2
-    compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE);
-    text_atom = gdk_atom_intern("TEXT", FALSE);
-#endif
 
     /* Set default foreground and background colors. */
     gui.norm_pixel = gui.def_norm_pixel;
@@ -3657,15 +3232,10 @@
 
     gtk_widget_set_name(gui.mainwin, "vim-main-window");
 
-#ifdef HAVE_GTK2
     /* Create the PangoContext used for drawing all text. */
     gui.text_context = gtk_widget_create_pango_context(gui.mainwin);
     pango_context_set_base_dir(gui.text_context, PANGO_DIRECTION_LTR);
-#endif
 
-#ifndef HAVE_GTK2
-    gtk_window_set_policy(GTK_WINDOW(gui.mainwin), TRUE, TRUE, TRUE);
-#endif
     gtk_container_border_width(GTK_CONTAINER(gui.mainwin), 0);
     gtk_widget_add_events(gui.mainwin, GDK_VISIBILITY_NOTIFY_MASK);
 
@@ -3678,12 +3248,8 @@
     g_signal_connect(G_OBJECT(gui.mainwin), "screen_changed",
 		     G_CALLBACK(&mainwin_screen_changed_cb), NULL);
 #endif
-#ifdef HAVE_GTK2
     gui.accel_group = gtk_accel_group_new();
     gtk_window_add_accel_group(GTK_WINDOW(gui.mainwin), gui.accel_group);
-#else
-    gui.accel_group = gtk_accel_group_get_default();
-#endif
 
     /* A vertical box holds the menubar, toolbar and main text window. */
     vbox = gtk_vbox_new(FALSE, 0);
@@ -3691,7 +3257,7 @@
 #ifdef FEAT_GUI_GNOME
     if (using_gnome)
     {
-# if defined(HAVE_GTK2) && defined(FEAT_MENU)
+# if defined(FEAT_MENU)
 	/* automagically restore menubar/toolbar placement */
 	gnome_app_enable_layout_config(GNOME_APP(gui.mainwin), TRUE);
 # endif
@@ -3711,7 +3277,6 @@
     gui.menubar = gtk_menu_bar_new();
     gtk_widget_set_name(gui.menubar, "vim-menubar");
 
-# ifdef HAVE_GTK2
     /* Avoid that GTK takes <F10> away from us. */
     {
 	GtkSettings *gtk_settings;
@@ -3719,13 +3284,11 @@
 	gtk_settings = gtk_settings_get_for_screen(gdk_screen_get_default());
 	g_object_set(gtk_settings, "gtk-menu-bar-accel", NULL, NULL);
     }
-# endif
 
 
 # ifdef FEAT_GUI_GNOME
     if (using_gnome)
     {
-#  ifdef HAVE_GTK2
 	BonoboDockItem *dockitem;
 
 	gnome_app_set_menus(GNOME_APP(gui.mainwin), GTK_MENU_BAR(gui.menubar));
@@ -3736,21 +3299,6 @@
 		bonobo_dock_item_get_behavior(dockitem)
 				       | BONOBO_DOCK_ITEM_BEH_NEVER_FLOATING);
 	gui.menubar_h = GTK_WIDGET(dockitem);
-#  else
-	gui.menubar_h = gnome_dock_item_new("VimMainMenu",
-					    GNOME_DOCK_ITEM_BEH_EXCLUSIVE |
-					    GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL);
-	gtk_container_add(GTK_CONTAINER(gui.menubar_h), gui.menubar);
-
-	gnome_dock_add_item(GNOME_DOCK(GNOME_APP(gui.mainwin)->dock),
-			    GNOME_DOCK_ITEM(gui.menubar_h),
-			    GNOME_DOCK_TOP, /* placement */
-			    1,	/* band_num */
-			    0,	/* band_position */
-			    0,	/* offset */
-			    TRUE);
-	gtk_widget_show(gui.menubar);
-#  endif
     }
     else
 # endif	/* FEAT_GUI_GNOME */
@@ -3766,7 +3314,6 @@
     /*
      * Create the toolbar and handle
      */
-# ifdef HAVE_GTK2
     /* some aesthetics on the toolbar */
     gtk_rc_parse_string(
 	    "style \"vim-toolbar-style\" {\n"
@@ -3775,17 +3322,11 @@
 	    "widget \"*.vim-toolbar\" style \"vim-toolbar-style\"\n");
     gui.toolbar = gtk_toolbar_new();
     gtk_widget_set_name(gui.toolbar, "vim-toolbar");
-# else
-    gui.toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,
-				  GTK_TOOLBAR_ICONS);
-    gtk_toolbar_set_button_relief(GTK_TOOLBAR(gui.toolbar), GTK_RELIEF_NONE);
-# endif
     set_toolbar_style(GTK_TOOLBAR(gui.toolbar));
 
 # ifdef FEAT_GUI_GNOME
     if (using_gnome)
     {
-#  ifdef HAVE_GTK2
 	BonoboDockItem *dockitem;
 
 	gnome_app_set_toolbar(GNOME_APP(gui.mainwin), GTK_TOOLBAR(gui.toolbar));
@@ -3798,31 +3339,10 @@
 		bonobo_dock_item_get_behavior(dockitem)
 				       | BONOBO_DOCK_ITEM_BEH_NEVER_FLOATING);
 	gtk_container_set_border_width(GTK_CONTAINER(gui.toolbar), 0);
-#  else
-	GtkWidget *dockitem;
-
-	dockitem = gnome_dock_item_new("VimToolBar",
-				       GNOME_DOCK_ITEM_BEH_EXCLUSIVE);
-	gtk_container_add(GTK_CONTAINER(dockitem), GTK_WIDGET(gui.toolbar));
-	gui.toolbar_h = dockitem;
-
-	gnome_dock_add_item(GNOME_DOCK(GNOME_APP(gui.mainwin)->dock),
-			    GNOME_DOCK_ITEM(dockitem),
-			    GNOME_DOCK_TOP,	/* placement */
-			    1,	/* band_num */
-			    1,	/* band_position */
-			    0,	/* offset */
-			    TRUE);
-	gtk_container_border_width(GTK_CONTAINER(gui.toolbar), 2);
-	gtk_widget_show(gui.toolbar);
-#  endif
     }
     else
 # endif	/* FEAT_GUI_GNOME */
     {
-# ifndef HAVE_GTK2
-	gtk_container_border_width(GTK_CONTAINER(gui.toolbar), 1);
-# endif
 	if (vim_strchr(p_go, GO_TOOLBAR) != NULL
 		&& (toolbar_flags & (TOOLBAR_TEXT | TOOLBAR_ICONS)))
 	    gtk_widget_show(gui.toolbar);
@@ -3885,9 +3405,7 @@
 			  GDK_LEAVE_NOTIFY_MASK |
 			  GDK_BUTTON_PRESS_MASK |
 			  GDK_BUTTON_RELEASE_MASK |
-#ifdef HAVE_GTK2
 			  GDK_SCROLL_MASK |
-#endif
 			  GDK_KEY_PRESS_MASK |
 			  GDK_KEY_RELEASE_MASK |
 			  GDK_POINTER_MOTION_MASK |
@@ -3904,7 +3422,7 @@
 					    : GTK_OBJECT(gui.drawarea),
 		       "key_press_event",
 		       GTK_SIGNAL_FUNC(key_press_event), NULL);
-#if defined(FEAT_XIM) && defined(HAVE_GTK2)
+#if defined(FEAT_XIM)
     /* Also forward key release events for the benefit of GTK+ 2 input
      * modules.  Try CTRL-SHIFT-xdigits to enter a Unicode code point. */
     g_signal_connect((gtk_socket_id == 0) ? G_OBJECT(gui.mainwin)
@@ -3935,9 +3453,7 @@
      * Set clipboard specific atoms
      */
     vim_atom = gdk_atom_intern(VIM_ATOM_NAME, FALSE);
-#ifdef FEAT_MBYTE
     vimenc_atom = gdk_atom_intern(VIMENC_ATOM_NAME, FALSE);
-#endif
     clip_star.gtk_sel_atom = GDK_SELECTION_PRIMARY;
     clip_plus.gtk_sel_atom = gdk_atom_intern("CLIPBOARD", FALSE);
 
@@ -3994,10 +3510,8 @@
 		       GTK_SIGNAL_FUNC(button_press_event), NULL);
     gtk_signal_connect(GTK_OBJECT(gui.drawarea), "button_release_event",
 		       GTK_SIGNAL_FUNC(button_release_event), NULL);
-#ifdef HAVE_GTK2
     g_signal_connect(G_OBJECT(gui.drawarea), "scroll_event",
 		     G_CALLBACK(&scroll_event), NULL);
-#endif
 
     /*
      * Add selection handler functions.
@@ -4142,7 +3656,6 @@
     guint		pixel_width;
     guint		pixel_height;
 
-#ifdef HAVE_GTK2
     /*
      * Allow setting a window role on the command line, or invent one
      * if none was specified.  This is mainly useful for GNOME session
@@ -4165,14 +3678,9 @@
 	gtk_window_set_role(GTK_WINDOW(gui.mainwin), role);
 	g_free(role);
     }
-#endif
 
     if (gui_win_x != -1 && gui_win_y != -1)
-#ifdef HAVE_GTK2
 	gtk_window_move(GTK_WINDOW(gui.mainwin), gui_win_x, gui_win_y);
-#else
-	gtk_widget_set_uposition(gui.mainwin, gui_win_x, gui_win_y);
-#endif
 
     /* Determine user specified geometry, if present. */
     if (gui.geom != NULL)
@@ -4196,10 +3704,8 @@
 	pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width);
 	pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height);
 
-#ifdef HAVE_GTK2
 	pixel_width  += get_menu_tool_width();
 	pixel_height += get_menu_tool_height();
-#endif
 
 	if (mask & (XValue | YValue))
 	{
@@ -4211,11 +3717,7 @@
 		x += ww - pixel_width;
 	    if (mask & YNegative)
 		y += hh - pixel_height;
-#ifdef HAVE_GTK2
 	    gtk_window_move(GTK_WINDOW(gui.mainwin), x, y);
-#else
-	    gtk_widget_set_uposition(gui.mainwin, x, y);
-#endif
 	}
 	vim_free(gui.geom);
 	gui.geom = NULL;
@@ -4235,14 +3737,10 @@
 
     pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width);
     pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height);
-#ifdef HAVE_GTK2
     /* For GTK2 changing the size of the form widget doesn't cause window
      * resizing. */
     if (gtk_socket_id == 0)
 	gtk_window_resize(GTK_WINDOW(gui.mainwin), pixel_width, pixel_height);
-#else
-    gtk_form_set_size(GTK_FORM(gui.formwin), pixel_width, pixel_height);
-#endif
     update_window_manager_hints(0, 0);
 
     if (foreground_argument != NULL)
@@ -4305,18 +3803,13 @@
 		       GTK_SIGNAL_FUNC(drag_data_received_cb), NULL);
 #endif
 
-#ifdef HAVE_GTK2
 	/* With GTK+ 2, we need to iconify the window before calling show()
-	 * to avoid mapping the window for a short time.  This is just as one
-	 * would expect it to work, but it's different in GTK+ 1.  The funny
-	 * thing is that iconifying after show() _does_ work with GTK+ 1.
-	 * (BTW doing this in the "realize" handler makes no difference.) */
+	 * to avoid mapping the window for a short time. */
 	if (found_iconic_arg && gtk_socket_id == 0)
 	    gui_mch_iconify();
-#endif
 
     {
-#if defined(FEAT_GUI_GNOME) && defined(HAVE_GTK2) && defined(FEAT_MENU)
+#if defined(FEAT_GUI_GNOME) && defined(FEAT_MENU)
 	unsigned long menu_handler = 0;
 # ifdef FEAT_TOOLBAR
 	unsigned long tool_handler = 0;
@@ -4343,7 +3836,7 @@
 #endif
 	gtk_widget_show(gui.mainwin);
 
-#if defined(FEAT_GUI_GNOME) && defined(HAVE_GTK2) && defined(FEAT_MENU)
+#if defined(FEAT_GUI_GNOME) && defined(FEAT_MENU)
 	if (menu_handler != 0)
 	    g_signal_handler_disconnect(gui.menubar_h, menu_handler);
 # ifdef FEAT_TOOLBAR
@@ -4353,13 +3846,6 @@
 #endif
     }
 
-#ifndef HAVE_GTK2
-	/* With GTK+ 1, we need to iconify the window after calling show().
-	 * See the comment above for details. */
-	if (found_iconic_arg && gtk_socket_id == 0)
-	    gui_mch_iconify();
-#endif
-
     return OK;
 }
 
@@ -4380,13 +3866,7 @@
     int
 gui_mch_get_winpos(int *x, int *y)
 {
-#ifdef HAVE_GTK2
     gtk_window_get_position(GTK_WINDOW(gui.mainwin), x, y);
-#else
-    /* For some people this must be gdk_window_get_origin() for a correct
-     * result.	Where is the documentation! */
-    gdk_window_get_root_origin(gui.mainwin->window, x, y);
-#endif
     return OK;
 }
 
@@ -4397,14 +3877,9 @@
     void
 gui_mch_set_winpos(int x, int y)
 {
-#ifdef HAVE_GTK2
     gtk_window_move(GTK_WINDOW(gui.mainwin), x, y);
-#else
-    gdk_window_move(gui.mainwin->window, x, y);
-#endif
 }
 
-#ifdef HAVE_GTK2
 #if 0
 static int resize_idle_installed = FALSE;
 /*
@@ -4442,9 +3917,7 @@
     return FALSE; /* don't call me again */
 }
 #endif
-#endif /* HAVE_GTK2 */
 
-#if defined(HAVE_GTK2) || defined(PROTO)
 /*
  * Return TRUE if the main window is maximized.
  */
@@ -4465,7 +3938,6 @@
     if (gui.mainwin != NULL)
 	gtk_window_unmaximize(GTK_WINDOW(gui.mainwin));
 }
-#endif
 
 /*
  * Set the windows size.
@@ -4476,27 +3948,9 @@
 		      int base_width UNUSED, int base_height UNUSED,
 		      int direction UNUSED)
 {
-#ifndef HAVE_GTK2
-    /* Hack: When the form already is at the desired size, the window might
-     * have been resized with the mouse.  Force a resize by setting a
-     * different size first. */
-    if (GTK_FORM(gui.formwin)->width == width
-	    && GTK_FORM(gui.formwin)->height == height)
-    {
-	gtk_form_set_size(GTK_FORM(gui.formwin), width + 1, height + 1);
-	gui_mch_update();
-    }
-    gtk_form_set_size(GTK_FORM(gui.formwin), width, height);
-#endif
-
     /* give GTK+ a chance to put all widget's into place */
     gui_mch_update();
 
-#ifndef HAVE_GTK2
-    /* this will cause the proper resizement to happen too */
-    update_window_manager_hints(0, 0);
-
-#else
     /* this will cause the proper resizement to happen too */
     if (gtk_socket_id == 0)
 	update_window_manager_hints(0, 0);
@@ -4528,7 +3982,6 @@
      * on top, while the GUI expects to be the boss.
      */
     gui_mch_update();
-#endif
 }
 
 
@@ -4571,17 +4024,13 @@
     void
 gui_mch_settitle(char_u *title, char_u *icon UNUSED)
 {
-# ifdef HAVE_GTK2
     if (title != NULL && output_conv.vc_type != CONV_NONE)
 	title = string_convert(&output_conv, title, NULL);
-# endif
 
     gtk_window_set_title(GTK_WINDOW(gui.mainwin), (const char *)title);
 
-# ifdef HAVE_GTK2
     if (output_conv.vc_type != CONV_NONE)
 	vim_free(title);
-# endif
 }
 #endif /* FEAT_TITLE */
 
@@ -4642,48 +4091,6 @@
 }
 #endif /* FEAT_TOOLBAR */
 
-#ifndef HAVE_GTK2
-/*
- * Get a font structure for highlighting.
- * "cbdata" is a pointer to the global gui structure.
- */
-    static void
-font_sel_ok(GtkWidget *wgt, gpointer cbdata)
-{
-    gui_T *vw = (gui_T *)cbdata;
-    GtkFontSelectionDialog *fs = (GtkFontSelectionDialog *)vw->fontdlg;
-
-    if (vw->fontname)
-	g_free(vw->fontname);
-
-    vw->fontname = (char_u *)gtk_font_selection_dialog_get_font_name(fs);
-    gtk_widget_hide(vw->fontdlg);
-    if (gtk_main_level() > 0)
-	gtk_main_quit();
-}
-
-    static void
-font_sel_cancel(GtkWidget *wgt, gpointer cbdata)
-{
-    gui_T *vw = (gui_T *)cbdata;
-
-    gtk_widget_hide(vw->fontdlg);
-    if (gtk_main_level() > 0)
-	gtk_main_quit();
-}
-
-    static void
-font_sel_destroy(GtkWidget *wgt, gpointer cbdata)
-{
-    gui_T *vw = (gui_T *)cbdata;
-
-    vw->fontdlg = NULL;
-    if (gtk_main_level() > 0)
-	gtk_main_quit();
-}
-#endif /* !HAVE_GTK2 */
-
-#ifdef HAVE_GTK2
 /*
  * Check if a given font is a CJK font. This is done in a very crude manner. It
  * just see if U+04E00 for zh and ja and U+AC00 for ko are covered in a given
@@ -4726,7 +4133,6 @@
 
     return is_cjk;
 }
-#endif /* HAVE_GTK2 */
 
 /*
  * Adjust gui.char_height (after 'linespace' was changed).
@@ -4734,7 +4140,6 @@
     int
 gui_mch_adjust_charheight(void)
 {
-#ifdef HAVE_GTK2
     PangoFontMetrics	*metrics;
     int			ascent;
     int			descent;
@@ -4751,14 +4156,6 @@
     /* LINTED: avoid warning: bitwise operation on signed value */
     gui.char_ascent = PANGO_PIXELS(ascent + p_linespace * PANGO_SCALE / 2);
 
-#else /* !HAVE_GTK2 */
-
-    gui.char_height = gui.current_font->ascent + gui.current_font->descent
-								+ p_linespace;
-    gui.char_ascent = gui.current_font->ascent + p_linespace / 2;
-
-#endif /* !HAVE_GTK2 */
-
     /* A not-positive value of char_height may crash Vim.  Only happens
      * if 'linespace' is negative (which does make sense sometimes). */
     gui.char_ascent = MAX(gui.char_ascent, 0);
@@ -4767,106 +4164,6 @@
     return OK;
 }
 
-#if defined(FEAT_XFONTSET) || defined(PROTO)
-/*
- * Try to load the requested fontset.
- */
-    GuiFontset
-gui_mch_get_fontset(char_u *name, int report_error, int fixed_width)
-{
-    GdkFont *font;
-
-    if (!gui.in_use || name == NULL)
-	return NOFONT;
-
-    font = gdk_fontset_load((gchar *)name);
-
-    if (font == NULL)
-    {
-	if (report_error)
-	    EMSG2(_(e_fontset), name);
-	return NOFONT;
-    }
-    /* TODO: check if the font is fixed width. */
-
-    /* reference this font as being in use */
-    gdk_font_ref(font);
-
-    return (GuiFontset)font;
-}
-#endif /* FEAT_XFONTSET */
-
-#ifndef HAVE_GTK2
-/*
- * 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)
-{
-    char_u *fontname = NULL;
-
-    if (!gui.fontdlg)
-    {
-	GtkFontSelectionDialog	*fsd = NULL;
-
-	gui.fontdlg = gtk_font_selection_dialog_new(_("Font Selection"));
-	fsd = GTK_FONT_SELECTION_DIALOG(gui.fontdlg);
-	gtk_window_set_modal(GTK_WINDOW(gui.fontdlg), TRUE);
-	gtk_window_set_transient_for(GTK_WINDOW(gui.fontdlg),
-		GTK_WINDOW(gui.mainwin));
-	gtk_signal_connect(GTK_OBJECT(gui.fontdlg), "destroy",
-		GTK_SIGNAL_FUNC(font_sel_destroy), &gui);
-	gtk_signal_connect(GTK_OBJECT(fsd->ok_button), "clicked",
-		GTK_SIGNAL_FUNC(font_sel_ok), &gui);
-	gtk_signal_connect(GTK_OBJECT(fsd->cancel_button), "clicked",
-		GTK_SIGNAL_FUNC(font_sel_cancel), &gui);
-    }
-
-    if (oldval != NULL && *oldval != NUL)
-	gtk_font_selection_dialog_set_font_name(
-		GTK_FONT_SELECTION_DIALOG(gui.fontdlg), (char *)oldval);
-    else
-	gtk_font_selection_dialog_set_font_name(
-		GTK_FONT_SELECTION_DIALOG(gui.fontdlg), DEFAULT_FONT);
-
-    if (gui.fontname)
-    {
-	g_free(gui.fontname);
-	gui.fontname = NULL;
-    }
-    gtk_window_position(GTK_WINDOW(gui.fontdlg), GTK_WIN_POS_MOUSE);
-    gtk_widget_show(gui.fontdlg);
-    {
-	static gchar	*spacings[] = {"c", "m", NULL};
-
-	/* In GTK 1.2.3 this must be after the gtk_widget_show() call,
-	 * otherwise everything is blocked for ten seconds. */
-	gtk_font_selection_dialog_set_filter(
-		GTK_FONT_SELECTION_DIALOG(gui.fontdlg),
-		GTK_FONT_FILTER_BASE,
-		GTK_FONT_ALL, NULL, NULL,
-		NULL, NULL, spacings, NULL);
-    }
-
-    /* Wait for the font dialog to be closed. */
-    while (gui.fontdlg && GTK_WIDGET_DRAWABLE(gui.fontdlg))
-	gtk_main_iteration_do(TRUE);
-
-    if (gui.fontname != NULL)
-    {
-	/* Apparently some font names include a comma, need to escape that,
-	 * because in 'guifont' it separates names. */
-	fontname = vim_strsave_escaped(gui.fontname, (char_u *)",");
-	g_free(gui.fontname);
-	gui.fontname = NULL;
-    }
-    return fontname;
-}
-#endif /* !HAVE_GTK2 */
-
-#ifdef HAVE_GTK2
 /*
  * Put up a font dialog and return the selected font name in allocated memory.
  * "oldval" is the previous value.  Return NULL when cancelled.
@@ -4997,102 +4294,6 @@
     g_object_unref(plain_font);
 }
 
-#else /* !HAVE_GTK2 */
-
-/*
- * There is only one excuse I can give for the following attempt to manage font
- * styles:
- *
- * I HATE THE BRAIN DEAD WAY X11 IS HANDLING FONTS (--mdcki)
- * (Me too. --danielk)
- */
-    static void
-get_styled_font_variants(char_u * font_name)
-{
-    char	*chunk[32];
-    char	*sdup;
-    char	*tmp;
-    int		len, i;
-    GuiFont	*styled_font[3];
-
-    styled_font[0] = &gui.bold_font;
-    styled_font[1] = &gui.ital_font;
-    styled_font[2] = &gui.boldital_font;
-
-    /* First free whatever was previously there. */
-    for (i = 0; i < 3; ++i)
-	if (*styled_font[i])
-	{
-	    gdk_font_unref(*styled_font[i]);
-	    *styled_font[i] = NULL;
-	}
-
-    if ((sdup = g_strdup((const char *)font_name)) == NULL)
-	return;
-
-    /* split up the whole */
-    i = 0;
-    for (tmp = sdup; *tmp != '\0'; ++tmp)
-    {
-	if (*tmp == '-')
-	{
-	    *tmp = '\0';
-
-	    if (i == 32)
-		break;
-
-	    chunk[i] = tmp + 1;
-	    ++i;
-	}
-    }
-
-    if (i == 14)
-    {
-	GdkFont		*font = NULL;
-	const char	*bold_chunk[3]	    = { "bold", NULL,	"bold" };
-	const char	*italic_chunk[3]    = { NULL,	"o",	"o" };
-
-	/* font name was complete */
-	len = strlen((const char *)font_name) + 32;
-
-	for (i = 0; i < 3; ++i)
-	{
-	    char *styled_name;
-	    int j;
-
-	    styled_name = (char *)alloc(len);
-	    if (styled_name == NULL)
-	    {
-		g_free(sdup);
-		return;
-	    }
-
-	    *styled_name = '\0';
-
-	    for (j = 0; j < 14; ++j)
-	    {
-		strcat(styled_name, "-");
-		if (j == 2 && bold_chunk[i] != NULL)
-		    strcat(styled_name, bold_chunk[i]);
-		else if (j == 3 && italic_chunk[i] != NULL)
-		    strcat(styled_name, italic_chunk[i]);
-		else
-		    strcat(styled_name, chunk[j]);
-	    }
-
-	    font = gui_mch_get_font((char_u *)styled_name, FALSE);
-	    if (font != NULL)
-		*styled_font[i] = font;
-
-	    vim_free(styled_name);
-	}
-    }
-
-    g_free(sdup);
-}
-#endif /* !HAVE_GTK2 */
-
-#ifdef HAVE_GTK2
 static PangoEngineShape *default_shape_engine = NULL;
 
 /*
@@ -5162,7 +4363,6 @@
     g_list_free(item_list);
     pango_attr_list_unref(attr_list);
 }
-#endif /* HAVE_GTK2 */
 
 /*
  * Initialize Vim to use the font or fontset with the given name.
@@ -5171,7 +4371,6 @@
     int
 gui_mch_init_font(char_u *font_name, int fontset UNUSED)
 {
-#ifdef HAVE_GTK2
     PangoFontDescription    *font_desc;
     PangoLayout		    *layout;
     int			    width;
@@ -5248,94 +4447,6 @@
 	gui.wide_font = NULL;
     }
 
-#else /* !HAVE_GTK2 */
-
-    GdkFont	*font = NULL;
-
-# ifdef FEAT_XFONTSET
-    /* Try loading a fontset.  If this fails we try loading a normal font. */
-    if (fontset && font_name != NULL)
-	font = gui_mch_get_fontset(font_name, TRUE, TRUE);
-
-    if (font == NULL)
-# endif
-    {
-	/* If font_name is NULL, this means to use the default, which should
-	 * be present on all X11 servers. */
-	if (font_name == NULL)
-	    font_name = (char_u *)DEFAULT_FONT;
-	font = gui_mch_get_font(font_name, FALSE);
-    }
-
-    if (font == NULL)
-	return FAIL;
-
-    gui_mch_free_font(gui.norm_font);
-# ifdef FEAT_XFONTSET
-    gui_mch_free_fontset(gui.fontset);
-    if (font->type == GDK_FONT_FONTSET)
-    {
-	gui.norm_font = NOFONT;
-	gui.fontset = (GuiFontset)font;
-	/* Use two bytes, this works around the problem that the result would
-	 * be zero if no 8-bit font was found. */
-	gui.char_width = gdk_string_width(font, "xW") / 2;
-    }
-    else
-# endif
-    {
-	gui.norm_font = font;
-# ifdef FEAT_XFONTSET
-	gui.fontset = NOFONTSET;
-# endif
-	gui.char_width = ((XFontStruct *)
-				      GDK_FONT_XFONT(font))->max_bounds.width;
-    }
-
-    /* A zero width may cause a crash.	Happens for semi-invalid fontsets. */
-    if (gui.char_width <= 0)
-	gui.char_width = 8;
-
-    gui.char_height = font->ascent + font->descent + p_linespace;
-    gui.char_ascent = font->ascent + p_linespace / 2;
-
-    /* A not-positive value of char_height may crash Vim.  Only happens
-     * if 'linespace' is negative (which does make sense sometimes). */
-    gui.char_ascent = MAX(gui.char_ascent, 0);
-    gui.char_height = MAX(gui.char_height, gui.char_ascent + 1);
-
-    /* Set the fontname, which will be used for information purposes */
-    hl_set_font_name(font_name);
-
-    if (font->type != GDK_FONT_FONTSET)
-	get_styled_font_variants(font_name);
-
-    /* Synchronize the fonts used in user input dialogs, since otherwise
-     * search/replace will be esp. annoying in case of international font
-     * usage.
-     */
-    gui_gtk_synch_fonts();
-
-# ifdef FEAT_XIM
-    /* Adjust input management behaviour to the capabilities of the new
-     * fontset */
-    xim_decide_input_style();
-    if (xim_get_status_area_height())
-    {
-	/* Status area is required.  Just create the empty container so that
-	 * mainwin will allocate the extra space for status area. */
-	GtkWidget *alignment = gtk_alignment_new((gfloat)0.5, (gfloat)0.5,
-						    (gfloat)1.0, (gfloat)1.0);
-
-	gtk_widget_set_usize(alignment, 20, gui.char_height + 2);
-	gtk_box_pack_end(GTK_BOX(GTK_BIN(gui.mainwin)->child),
-			 alignment, FALSE, FALSE, 0);
-	gtk_widget_show(alignment);
-    }
-# endif
-#endif /* !HAVE_GTK2 */
-
-#ifdef HAVE_GTK2
     if (gui_mch_maximized())
     {
 	int w, h;
@@ -5348,7 +4459,6 @@
 	gui_resize_shell(w, h);
     }
     else
-#endif
     {
 	/* Preserve the logical dimensions of the screen. */
 	update_window_manager_hints(0, 0);
@@ -5364,17 +4474,12 @@
     GuiFont
 gui_mch_get_font(char_u *name, int report_error)
 {
-#ifdef HAVE_GTK2
     PangoFontDescription    *font;
-#else
-    GdkFont		    *font;
-#endif
 
     /* can't do this when GUI is not running */
     if (!gui.in_use || name == NULL)
 	return NULL;
 
-#ifdef HAVE_GTK2
     if (output_conv.vc_type != CONV_NONE)
     {
 	char_u *buf;
@@ -5409,9 +4514,6 @@
 	else
 	    g_object_unref(real_font);
     }
-#else
-    font = gdk_font_load((const gchar *)name);
-#endif
 
     if (font == NULL)
     {
@@ -5420,7 +4522,6 @@
 	return NULL;
     }
 
-#ifdef HAVE_GTK2
     /*
      * The fixed-width check has been disabled for GTK+ 2.  Rationale:
      *
@@ -5434,7 +4535,7 @@
      *	 - The font dialog displays all fonts unfiltered, and it's rather
      *	   annoying if 95% of the listed fonts produce an error message.
      */
-# if 0
+#if 0
     {
 	/* Check that this is a mono-spaced font.  Naturally, this is a bit
 	 * hackish -- fixed-width isn't really suitable for i18n text :/ */
@@ -5465,29 +4566,6 @@
 
 	g_object_unref(layout);
     }
-# endif
-#else /* !HAVE_GTK2 */
-    {
-	XFontStruct *xfont;
-
-	/* reference this font as being in use */
-	gdk_font_ref(font);
-
-	/* Check that this is a mono-spaced font.
-	 */
-	xfont = (XFontStruct *) GDK_FONT_XFONT(font);
-
-	if (xfont->max_bounds.width != xfont->min_bounds.width)
-	{
-	    gdk_font_unref(font);
-	    font = NULL;
-	}
-    }
-#endif /* !HAVE_GTK2 */
-
-#if !defined(HAVE_GTK2) || 0 /* disabled for GTK+ 2, see above */
-    if (font == NULL && report_error)
-	EMSG2(_(e_fontwidth), name);
 #endif
 
     return font;
@@ -5500,7 +4578,6 @@
     char_u *
 gui_mch_get_fontname(GuiFont font, char_u *name UNUSED)
 {
-# ifdef HAVE_GTK2
     if (font != NOFONT)
     {
 	char	*pangoname = pango_font_description_to_string(font);
@@ -5513,39 +4590,10 @@
 	    return s;
 	}
     }
-# else
-    /* Don't know how to get the name, return what we got. */
-    if (name != NULL)
-	return vim_strsave(name);
-# endif
     return NULL;
 }
 #endif
 
-#if !defined(HAVE_GTK2) || defined(PROTO)
-/*
- * 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;
-}
-#endif
-
-#if defined(FEAT_XFONTSET) || defined(PROTO)
-/*
- * Set the current text fontset.
- */
-    void
-gui_mch_set_fontset(GuiFontset fontset)
-{
-    gui.current_font = fontset;
-}
-#endif
-
 /*
  * If a font is not going to be used, free its structure.
  */
@@ -5553,26 +4601,9 @@
 gui_mch_free_font(GuiFont font)
 {
     if (font != NOFONT)
-#ifdef HAVE_GTK2
 	pango_font_description_free(font);
-#else
-	gdk_font_unref(font);
-#endif
 }
 
-#if defined(FEAT_XFONTSET) || defined(PROTO)
-/*
- * If a fontset is not going to be used, free its structure.
- */
-    void
-gui_mch_free_fontset(GuiFontset fontset)
-{
-    if (fontset != NOFONTSET)
-	gdk_font_unref(fontset);
-}
-#endif
-
-
 /*
  * 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
@@ -5626,47 +4657,10 @@
 
 	parsed = gdk_color_parse((const char *)name, &color);
 
-#ifndef HAVE_GTK2 /* ohh, lovely GTK+ 2, eases our pain :) */
-	/*
-	 * Since we have already called gtk_set_locale here the bugger
-	 * XParseColor will accept only explicit color names in the language
-	 * of the current locale.  However this will interfere with:
-	 * 1. Vim's global startup files
-	 * 2. Explicit color names in .vimrc
-	 *
-	 * Therefore we first try to parse the color in the current locale and
-	 * if it fails, we fall back to the portable "C" one.
-	 */
-	if (!parsed)
-	{
-	    char *current;
-
-	    current = setlocale(LC_ALL, NULL);
-	    if (current != NULL)
-	    {
-		char *saved;
-
-		saved = g_strdup(current);
-		setlocale(LC_ALL, "C");
-
-		parsed = gdk_color_parse((const gchar *)name, &color);
-
-		setlocale(LC_ALL, saved);
-		gtk_set_locale();
-
-		g_free(saved);
-	    }
-	}
-#endif /* !HAVE_GTK2 */
-
 	if (parsed)
 	{
-#ifdef HAVE_GTK2
 	    gdk_colormap_alloc_color(gtk_widget_get_colormap(gui.drawarea),
 				     &color, FALSE, TRUE);
-#else
-	    gdk_color_alloc(gtk_widget_get_colormap(gui.drawarea), &color);
-#endif
 	    return (guicolor_T)color.pixel;
 	}
 	/* add a few builtin names and try again */
@@ -5715,7 +4709,6 @@
     gui.spcolor->pixel = (unsigned long)color;
 }
 
-#ifdef HAVE_GTK2
 /*
  * Function-like convenience macro for the sake of efficiency.
  */
@@ -5892,8 +4885,6 @@
 			glyphs);
 }
 
-#endif /* HAVE_GTK2 */
-
 /*
  * Draw underline and undercurl at the bottom of the character cell.
  */
@@ -5930,7 +4921,6 @@
     }
 }
 
-#if defined(HAVE_GTK2) || defined(PROTO)
     int
 gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags)
 {
@@ -6200,129 +5190,6 @@
 
     return column_offset;
 }
-#endif /* HAVE_GTK2 */
-
-#if !defined(HAVE_GTK2) || defined(PROTO)
-    void
-gui_mch_draw_string(int row, int col, char_u *s, int len, int flags)
-{
-    static XChar2b	*buf = NULL;
-    static int		buflen = 0;
-    int			is_wide;
-    XChar2b		*text;
-    int			textlen;
-    XFontStruct		*xfont;
-    char_u		*p;
-# ifdef FEAT_MBYTE
-    unsigned		c;
-# endif
-    int			width;
-
-    if (gui.current_font == NULL || gui.drawarea->window == NULL)
-	return;
-
-    /*
-     * Yeah yeah apparently the font support in GTK+ 1.2 only cares for either:
-     * asians or 8-bit fonts. It is broken there, but no wonder the whole font
-     * stuff is broken in X11 in first place. And the internationalization API
-     * isn't something you would really like to use.
-     */
-
-    xfont = (XFontStruct *)((GdkFontPrivate*)gui.current_font)->xfont;
-    is_wide = ((xfont->min_byte1 != 0 || xfont->max_byte1 != 0)
-# ifdef FEAT_XFONTSET
-	    && gui.fontset == NOFONTSET
-# endif
-	    );
-
-    if (is_wide)
-    {
-	/* Convert a byte sequence to 16 bit characters for the Gdk functions.
-	 * Need a buffer for the 16 bit characters.  Keep it between calls,
-	 * because allocating it each time is slow. */
-	if (buflen < len)
-	{
-	    XtFree((char *)buf);
-	    buf = (XChar2b *)XtMalloc(len * sizeof(XChar2b));
-	    buflen = len;
-	}
-
-	p = s;
-	textlen = 0;
-	width = 0;
-	while (p < s + len)
-	{
-# ifdef FEAT_MBYTE
-	    if (enc_utf8)
-	    {
-		int pcc[MAX_MCO];
-
-		/* TODO: use the composing characters */
-		c = utfc_ptr2char_len(p, pcc, len - (p - s));
-		if (c >= 0x10000)	/* show chars > 0xffff as ? */
-		    c = 0xbf;
-		buf[textlen].byte1 = c >> 8;
-		buf[textlen].byte2 = c;
-		p += utfc_ptr2len_len(p, len - (p - s));
-		width += utf_char2cells(c);
-	    }
-	    else
-# endif
-	    {
-		buf[textlen].byte1 = '\0';	/* high eight bits */
-		buf[textlen].byte2 = *p;	/* low eight bits */
-		++p;
-		++width;
-	    }
-	    ++textlen;
-	}
-	text = buf;
-	textlen = textlen * 2;
-    }
-    else
-    {
-	text = (XChar2b *)s;
-	textlen = len;
-# ifdef FEAT_MBYTE
-	if (has_mbyte)
-	{
-	    width = 0;
-	    for (p = s; p < s + len; p += (*mb_ptr2len_len)(p, len - (p - s)))
-		width += (*mb_ptr2cells_len)(p, len - (p - s));
-	}
-	else
-# endif
-	    width = len;
-    }
-
-    if (!(flags & DRAW_TRANSP))
-    {
-	gdk_gc_set_foreground(gui.text_gc, gui.bgcolor);
-	gdk_draw_rectangle(gui.drawarea->window,
-			   gui.text_gc,
-			   TRUE,
-			   FILL_X(col), FILL_Y(row),
-			   width * gui.char_width, gui.char_height);
-    }
-    gdk_gc_set_foreground(gui.text_gc, gui.fgcolor);
-    gdk_draw_text(gui.drawarea->window,
-		  gui.current_font,
-		  gui.text_gc,
-		  TEXT_X(col), TEXT_Y(row),
-		  (const gchar *)text, textlen);
-
-    /* redraw the contents with an offset of 1 to emulate bold */
-    if (flags & DRAW_BOLD)
-	gdk_draw_text(gui.drawarea->window,
-		      gui.current_font,
-		      gui.text_gc,
-		      TEXT_X(col) + 1, TEXT_Y(row),
-		      (const gchar *)text, textlen);
-
-    /* Draw underline and undercurl. */
-    draw_under(flags, row, col, width);
-}
-#endif /* !HAVE_GTK2 */
 
 /*
  * Return OK if the key with the termcap name "name" is supported.
@@ -6340,7 +5207,6 @@
 }
 
 #if defined(FEAT_TITLE) \
-	|| (defined(FEAT_XIM) && !defined(HAVE_GTK2)) \
 	|| defined(PROTO)
 /*
  * Return the text window-id and display.  Only required for X-based GUI's
@@ -6471,13 +5337,7 @@
     void
 gui_mch_iconify(void)
 {
-#ifdef HAVE_GTK2
     gtk_window_iconify(GTK_WINDOW(gui.mainwin));
-#else
-    XIconifyWindow(GDK_WINDOW_XDISPLAY(gui.mainwin->window),
-		   GDK_WINDOW_XWINDOW(gui.mainwin->window),
-		   DefaultScreen(GDK_WINDOW_XDISPLAY(gui.mainwin->window)));
-#endif
 }
 
 #if defined(FEAT_EVAL) || defined(PROTO)
@@ -6487,11 +5347,7 @@
     void
 gui_mch_set_foreground(void)
 {
-# ifdef HAVE_GTK2
     gtk_window_present(GTK_WINDOW(gui.mainwin));
-# else
-    gdk_window_raise(gui.mainwin->window);
-# endif
 }
 #endif
 
@@ -6509,10 +5365,8 @@
     gui_mch_set_fg_color(color);
 
     gdk_gc_set_foreground(gui.text_gc, gui.fgcolor);
-#ifdef FEAT_MBYTE
     if (mb_lefthalve(gui.row, gui.col))
 	i = 2;
-#endif
     gdk_draw_rectangle(gui.drawarea->window, gui.text_gc,
 	    FALSE,
 	    FILL_X(gui.col), FILL_Y(gui.row),
@@ -6696,12 +5550,10 @@
 #else
     gdk_flush(); /* historical misnomer: calls XSync(), not XFlush() */
 #endif
-#ifdef HAVE_GTK2
     /* This happens to actually do what gui_mch_flush() is supposed to do,
      * according to the comment above. */
     if (gui.drawarea != NULL && gui.drawarea->window != NULL)
 	gdk_window_process_updates(gui.drawarea->window, FALSE);
-#endif
 }
 
 /*
@@ -6841,10 +5693,8 @@
 
     for (i = 0; i < N_SELECTION_TARGETS; ++i)
     {
-#ifdef FEAT_MBYTE
 	if (!clip_html && selection_targets[i].info == TARGET_HTML)
 	    continue;
-#endif
 	received_selection = RS_NONE;
 	target = gdk_atom_intern(selection_targets[i].target, FALSE);
 
@@ -6990,19 +5840,8 @@
 gui_mch_get_rgb(guicolor_T pixel)
 {
     GdkColor color;
-#ifndef HAVE_GTK2
-    GdkColorContext *cc;
-
-    cc = gdk_color_context_new(gtk_widget_get_visual(gui.drawarea),
-			       gtk_widget_get_colormap(gui.drawarea));
-    color.pixel = pixel;
-    gdk_color_context_query_color(cc, &color);
-
-    gdk_color_context_free(cc);
-#else
     gdk_colormap_query_color(gtk_widget_get_colormap(gui.drawarea),
 			     (unsigned long)pixel, &color);
-#endif
 
     return (((unsigned)color.red   & 0xff00) << 8)
 	 |  ((unsigned)color.green & 0xff00)
@@ -7138,8 +5977,6 @@
 # define SIGN_HEIGHT (gui.char_height)
 # define SIGN_ASPECT ((double)SIGN_HEIGHT / (double)SIGN_WIDTH)
 
-# ifdef HAVE_GTK2
-
     void
 gui_mch_drawsign(int row, int col, int typenr)
 {
@@ -7200,19 +6037,6 @@
 			   SIGN_WIDTH,
 			   SIGN_HEIGHT);
 
-#  if GTK_CHECK_VERSION(2,1,1)
-	gdk_draw_pixbuf(gui.drawarea->window,
-			NULL,
-			sign,
-			MAX(0, xoffset),
-			MAX(0, yoffset),
-			FILL_X(col) - MIN(0, xoffset),
-			FILL_Y(row) - MIN(0, yoffset),
-			MIN(width,  SIGN_WIDTH),
-			MIN(height, SIGN_HEIGHT),
-			GDK_RGB_DITHER_NORMAL,
-			0, 0);
-#  else
 	gdk_pixbuf_render_to_drawable_alpha(sign,
 					    gui.drawarea->window,
 					    MAX(0, xoffset),
@@ -7225,7 +6049,6 @@
 					    127,
 					    GDK_RGB_DITHER_NORMAL,
 					    0, 0);
-#  endif
 	if (need_scale)
 	    g_object_unref(sign);
     }
@@ -7272,115 +6095,4 @@
 	g_object_unref(sign);
 }
 
-# else /* !HAVE_GTK2 */
-
-typedef struct
-{
-    GdkPixmap *pixmap;
-    GdkBitmap *mask;
-}
-signicon_T;
-
-    void
-gui_mch_drawsign(int row, int col, int typenr)
-{
-    signicon_T *sign;
-
-    sign = (signicon_T *)sign_get_image(typenr);
-
-    if (sign != NULL && sign->pixmap != NULL
-	&& gui.drawarea != NULL && gui.drawarea->window != NULL)
-    {
-	int width;
-	int height;
-	int xoffset;
-	int yoffset;
-
-	gdk_window_get_size(sign->pixmap, &width, &height);
-
-	/* The origin is the upper-left corner of the pixmap.  Therefore
-	 * these offset may become negative if the pixmap is smaller than
-	 * the 2x1 cells reserved for the sign icon. */
-	xoffset = (width  - SIGN_WIDTH)  / 2;
-	yoffset = (height - SIGN_HEIGHT) / 2;
-
-	gdk_gc_set_foreground(gui.text_gc, gui.bgcolor);
-
-	gdk_draw_rectangle(gui.drawarea->window,
-			   gui.text_gc,
-			   TRUE,
-			   FILL_X(col),
-			   FILL_Y(row),
-			   SIGN_WIDTH,
-			   SIGN_HEIGHT);
-
-	/* Set the clip mask for bilevel transparency */
-	if (sign->mask != NULL)
-	{
-	    gdk_gc_set_clip_origin(gui.text_gc,
-				   FILL_X(col) - xoffset,
-				   FILL_Y(row) - yoffset);
-	    gdk_gc_set_clip_mask(gui.text_gc, sign->mask);
-	}
-
-	gdk_draw_pixmap(gui.drawarea->window,
-			gui.text_gc,
-			sign->pixmap,
-			MAX(0, xoffset),
-			MAX(0, yoffset),
-			FILL_X(col) - MIN(0, xoffset),
-			FILL_Y(row) - MIN(0, yoffset),
-			MIN(width,  SIGN_WIDTH),
-			MIN(height, SIGN_HEIGHT));
-
-	gdk_gc_set_clip_mask(gui.text_gc, NULL);
-    }
-}
-
-    void *
-gui_mch_register_sign(char_u *signfile)
-{
-    signicon_T *sign = NULL;
-
-    if (signfile[0] != NUL && signfile[0] != '-'
-	    && gui.drawarea != NULL && gui.drawarea->window != NULL)
-    {
-	sign = (signicon_T *)alloc(sizeof(signicon_T));
-
-	if (sign != NULL) /* NULL == OOM == "cannot really happen" */
-	{
-	    sign->mask = NULL;
-	    sign->pixmap = gdk_pixmap_colormap_create_from_xpm(
-		    gui.drawarea->window, NULL,
-		    &sign->mask, NULL,
-		    (const char *)signfile);
-
-	    if (sign->pixmap == NULL)
-	    {
-		vim_free(sign);
-		sign = NULL;
-		EMSG(_(e_signdata));
-	    }
-	}
-    }
-    return sign;
-}
-
-    void
-gui_mch_destroy_sign(void *sign)
-{
-    if (sign != NULL)
-    {
-	signicon_T *signicon = (signicon_T *)sign;
-
-	if (signicon->pixmap != NULL)
-	    gdk_pixmap_unref(signicon->pixmap);
-	if (signicon->mask != NULL)
-	    gdk_bitmap_unref(signicon->mask);
-
-	vim_free(signicon);
-    }
-}
-# endif /* !HAVE_GTK2 */
-
 #endif /* FEAT_SIGN_ICONS */
diff --git a/src/main.c b/src/main.c
index 1b2e6ee..2ca1ebe 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3233,9 +3233,7 @@
     main_msg(_("-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"));
     main_msg(_("-reverse\t\tUse reverse video (also: -rv)"));
     main_msg(_("-display <display>\tRun vim on <display> (also: --display)"));
-# ifdef HAVE_GTK2
     main_msg(_("--role <role>\tSet a unique role to identify the main window"));
-# endif
     main_msg(_("--socketid <xid>\tOpen Vim inside another GTK widget"));
 #endif
 #ifdef FEAT_GUI_W32
diff --git a/src/mbyte.c b/src/mbyte.c
index e4df00a..1eeede3 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -100,7 +100,7 @@
 #include <X11/Xlocale.h>
 #endif
 
-#if defined(FEAT_GUI_GTK) && defined(FEAT_XIM) && defined(HAVE_GTK2)
+#if defined(FEAT_GUI_GTK) && defined(FEAT_XIM)
 # include <gdk/gdkkeysyms.h>
 # ifdef WIN3264
 #  include <gdk/gdkwin32.h>
@@ -5068,147 +5068,6 @@
 static int	status_area_enabled = TRUE;
 #endif
 
-#ifdef FEAT_GUI_GTK
-# ifdef WIN3264
-#  include <gdk/gdkwin32.h>
-# else
-#  include <gdk/gdkx.h>
-# endif
-#else
-# ifdef PROTO
-/* Define a few things to be able to generate prototypes while not configured
- * for GTK. */
-#  define GSList int
-#  define gboolean int
-   typedef int GdkEvent;
-   typedef int GdkEventKey;
-#  define GdkIC int
-# endif
-#endif
-
-#if defined(FEAT_GUI_GTK) || defined(PROTO)
-static int	preedit_buf_len = 0;
-static int	xim_can_preediting INIT(= FALSE);	/* XIM in showmode() */
-static int	xim_input_style;
-#ifndef FEAT_GUI_GTK
-# define gboolean int
-#endif
-static gboolean	use_status_area = 0;
-
-static int im_xim_str2keycode __ARGS((unsigned int *code, unsigned int *state));
-static void im_xim_send_event_imactivate __ARGS((void));
-
-/*
- * Convert string to keycode and state for XKeyEvent.
- * When string is valid return OK, when invalid return FAIL.
- *
- * See 'imactivatekey' documentation for the format.
- */
-    static int
-im_xim_str2keycode(code, state)
-    unsigned int *code;
-    unsigned int *state;
-{
-    int		retval = OK;
-    int		len;
-    unsigned	keycode = 0, keystate = 0;
-    Window	window;
-    Display	*display;
-    char_u	*flag_end;
-    char_u	*str;
-
-    if (*p_imak != NUL)
-    {
-	len = STRLEN(p_imak);
-	for (flag_end = p_imak + len - 1;
-			    flag_end > p_imak && *flag_end != '-'; --flag_end)
-	    ;
-
-	/* Parse modifier keys */
-	for (str = p_imak; str < flag_end; ++str)
-	{
-	    switch (*str)
-	    {
-		case 's': case 'S':
-		    keystate |= ShiftMask;
-		    break;
-		case 'l': case 'L':
-		    keystate |= LockMask;
-		    break;
-		case 'c': case 'C':
-		    keystate |= ControlMask;
-		    break;
-		case '1':
-		    keystate |= Mod1Mask;
-		    break;
-		case '2':
-		    keystate |= Mod2Mask;
-		    break;
-		case '3':
-		    keystate |= Mod3Mask;
-		    break;
-		case '4':
-		    keystate |= Mod4Mask;
-		    break;
-		case '5':
-		    keystate |= Mod5Mask;
-		    break;
-		case '-':
-		    break;
-		default:
-		    retval = FAIL;
-	    }
-	}
-	if (*str == '-')
-	    ++str;
-
-	/* Get keycode from string. */
-	gui_get_x11_windis(&window, &display);
-	if (display)
-	    keycode = XKeysymToKeycode(display, XStringToKeysym((char *)str));
-	if (keycode == 0)
-	    retval = FAIL;
-
-	if (code != NULL)
-	    *code = keycode;
-	if (state != NULL)
-	    *state = keystate;
-    }
-    return retval;
-}
-
-    static void
-im_xim_send_event_imactivate()
-{
-    /* Force turn on preedit state by simulating keypress event.
-     * Keycode and state is specified by 'imactivatekey'.
-     */
-    XKeyEvent ev;
-
-    gui_get_x11_windis(&ev.window, &ev.display);
-    ev.root = RootWindow(ev.display, DefaultScreen(ev.display));
-    ev.subwindow = None;
-    ev.time = CurrentTime;
-    ev.x = 1;
-    ev.y = 1;
-    ev.x_root = 1;
-    ev.y_root = 1;
-    ev.same_screen = 1;
-    ev.type = KeyPress;
-    if (im_xim_str2keycode(&ev.keycode, &ev.state) == OK)
-	XSendEvent(ev.display, ev.window, 1, KeyPressMask, (XEvent*)&ev);
-}
-
-/*
- * Return TRUE if 'imactivatekey' has a valid value.
- */
-    int
-im_xim_isvalid_imactivate()
-{
-    return im_xim_str2keycode(NULL, NULL) == OK;
-}
-#endif /* FEAT_GUI_GTK */
-
 /*
  * Switch using XIM on/off.  This is used by the code that changes "State".
  */
@@ -5232,124 +5091,6 @@
 
     /* Remember the active state, it is needed when Vim gets keyboard focus. */
     xim_is_active = active;
-
-#ifdef FEAT_GUI_GTK
-    /* When 'imactivatekey' has valid key-string, try to control XIM preedit
-     * state.  When 'imactivatekey' has no or invalid string, try old XIM
-     * focus control.
-     */
-    if (*p_imak != NUL)
-    {
-	/* BASIC STRATEGY:
-	 * Destroy old Input Context (XIC), and create new one.  New XIC
-	 * would have a state of preedit that is off.  When argument:active
-	 * is false, that's all.  Else argument:active is true, send a key
-	 * event specified by 'imactivatekey' to activate XIM preedit state.
-	 */
-
-	xim_is_active = TRUE; /* Disable old XIM focus control */
-	/* If we can monitor preedit state with preedit callback functions,
-	 * try least creation of new XIC.
-	 */
-	if (xim_input_style & (int)GDK_IM_PREEDIT_CALLBACKS)
-	{
-	    if (xim_can_preediting && !active)
-	    {
-		/* Force turn off preedit state.  With some IM
-		 * implementations, we cannot turn off preedit state by
-		 * simulating keypress event.  It is why using such a method
-		 * that destroy old IC (input context), and create new one.
-		 * When create new IC, its preedit state is usually off.
-		 */
-		xim_reset();
-		xim_set_focus(FALSE);
-		gdk_ic_destroy(xic);
-		xim_init();
-		xim_can_preediting = FALSE;
-	    }
-	    else if (!xim_can_preediting && active)
-		im_xim_send_event_imactivate();
-	}
-	else
-	{
-	    /* First, force destroy old IC, and create new one.  It
-	     * simulates "turning off preedit state".
-	     */
-	    xim_set_focus(FALSE);
-	    gdk_ic_destroy(xic);
-	    xim_init();
-	    xim_can_preediting = FALSE;
-
-	    /* 2nd, when requested to activate IM, simulate this by sending
-	     * the event.
-	     */
-	    if (active)
-	    {
-		im_xim_send_event_imactivate();
-		xim_can_preediting = TRUE;
-	    }
-	}
-    }
-    else
-    {
-# ifndef XIMPreeditUnKnown
-	/* X11R5 doesn't have these, it looks safe enough to define here. */
-	typedef unsigned long XIMPreeditState;
-#  define XIMPreeditUnKnown	0L
-#  define XIMPreeditEnable	1L
-#  define XIMPreeditDisable	(1L<<1)
-#  define XNPreeditState	"preeditState"
-# endif
-	XIMPreeditState preedit_state = XIMPreeditUnKnown;
-	XVaNestedList preedit_attr;
-	XIC pxic;
-
-	preedit_attr = XVaCreateNestedList(0,
-				XNPreeditState, &preedit_state,
-				NULL);
-	pxic = ((GdkICPrivate *)xic)->xic;
-
-	if (!XGetICValues(pxic, XNPreeditAttributes, preedit_attr, NULL))
-	{
-	    XFree(preedit_attr);
-	    preedit_attr = XVaCreateNestedList(0,
-				XNPreeditState,
-				active ? XIMPreeditEnable : XIMPreeditDisable,
-				NULL);
-	    XSetICValues(pxic, XNPreeditAttributes, preedit_attr, NULL);
-	    xim_can_preediting = active;
-	    xim_is_active = active;
-	}
-	XFree(preedit_attr);
-    }
-    if (xim_input_style & XIMPreeditCallbacks)
-    {
-	preedit_buf_len = 0;
-	init_preedit_start_col();
-    }
-#else
-# if 0
-	/* When had tested kinput2 + canna + Athena GUI version with
-	 * 'imactivatekey' is "s-space", im_xim_send_event_imactivate() did not
-	 * work correctly.  It just inserted one space.  I don't know why we
-	 * couldn't switch state of XIM preediting.  This is reason why these
-	 * codes are commented out.
-	 */
-	/* First, force destroy old IC, and create new one.  It simulates
-	 * "turning off preedit state".
-	 */
-	xim_set_focus(FALSE);
-	XDestroyIC(xic);
-	xic = NULL;
-	xim_init();
-
-	/* 2nd, when requested to activate IM, simulate this by sending the
-	 * event.
-	 */
-	if (active)
-	    im_xim_send_event_imactivate();
-# endif
-#endif
     xim_set_preedit();
 }
 
@@ -5373,11 +5114,7 @@
 	if (!xim_has_focus)
 	{
 	    xim_has_focus = TRUE;
-#ifdef FEAT_GUI_GTK
-	    gdk_im_begin(xic, gui.drawarea->window);
-#else
 	    XSetICFocus(xic);
-#endif
 	}
     }
     else
@@ -5385,11 +5122,7 @@
 	if (xim_has_focus)
 	{
 	    xim_has_focus = FALSE;
-#ifdef FEAT_GUI_GTK
-	    gdk_im_end();
-#else
 	    XUnsetICFocus(xic);
-#endif
 	}
     }
 }
@@ -5413,135 +5146,50 @@
 
     xim_set_focus(TRUE);
 
-#ifdef FEAT_GUI_GTK
-    if (gdk_im_ready())
+    XVaNestedList attr_list;
+    XRectangle spot_area;
+    XPoint over_spot;
+    int line_space;
+
+    if (!xim_has_focus)
     {
-	int		attrmask;
-	GdkICAttr	*attr;
+	/* hide XIM cursor */
+	over_spot.x = 0;
+	over_spot.y = -100; /* arbitrary invisible position */
+	attr_list = (XVaNestedList) XVaCreateNestedList(0,
+							XNSpotLocation,
+							&over_spot,
+							NULL);
+	XSetICValues(xic, XNPreeditAttributes, attr_list, NULL);
+	XFree(attr_list);
+	return;
+    }
 
-	if (!xic_attr)
-	    return;
-
-	attr = xic_attr;
-	attrmask = 0;
-
-# ifdef FEAT_XFONTSET
-	if ((xim_input_style & (int)GDK_IM_PREEDIT_POSITION)
-		&& gui.fontset != NOFONTSET
-		&& gui.fontset->type == GDK_FONT_FONTSET)
-	{
-	    if (!xim_has_focus)
-	    {
-		if (attr->spot_location.y >= 0)
-		{
-		    attr->spot_location.x = 0;
-		    attr->spot_location.y = -100;
-		    attrmask |= (int)GDK_IC_SPOT_LOCATION;
-		}
-	    }
-	    else
-	    {
-		gint	width, height;
-
-		if (attr->spot_location.x != TEXT_X(gui.col)
-		    || attr->spot_location.y != TEXT_Y(gui.row))
-		{
-		    attr->spot_location.x = TEXT_X(gui.col);
-		    attr->spot_location.y = TEXT_Y(gui.row);
-		    attrmask |= (int)GDK_IC_SPOT_LOCATION;
-		}
-
-		gdk_window_get_size(gui.drawarea->window, &width, &height);
-		width -= 2 * gui.border_offset;
-		height -= 2 * gui.border_offset;
-		if (xim_input_style & (int)GDK_IM_STATUS_AREA)
-		    height -= gui.char_height;
-		if (attr->preedit_area.width != width
-		    || attr->preedit_area.height != height)
-		{
-		    attr->preedit_area.x = gui.border_offset;
-		    attr->preedit_area.y = gui.border_offset;
-		    attr->preedit_area.width = width;
-		    attr->preedit_area.height = height;
-		    attrmask |= (int)GDK_IC_PREEDIT_AREA;
-		}
-
-		if (attr->preedit_fontset != gui.current_font)
-		{
-		    attr->preedit_fontset = gui.current_font;
-		    attrmask |= (int)GDK_IC_PREEDIT_FONTSET;
-		}
-	    }
-	}
-# endif /* FEAT_XFONTSET */
-
+    if (input_style & XIMPreeditPosition)
+    {
 	if (xim_fg_color == INVALCOLOR)
 	{
 	    xim_fg_color = gui.def_norm_pixel;
 	    xim_bg_color = gui.def_back_pixel;
 	}
-	if (attr->preedit_foreground.pixel != xim_fg_color)
-	{
-	    attr->preedit_foreground.pixel = xim_fg_color;
-	    attrmask |= (int)GDK_IC_PREEDIT_FOREGROUND;
-	}
-	if (attr->preedit_background.pixel != xim_bg_color)
-	{
-	    attr->preedit_background.pixel = xim_bg_color;
-	    attrmask |= (int)GDK_IC_PREEDIT_BACKGROUND;
-	}
-
-	if (attrmask != 0)
-	    gdk_ic_set_attr(xic, attr, (GdkICAttributesType)attrmask);
+	over_spot.x = TEXT_X(gui.col);
+	over_spot.y = TEXT_Y(gui.row);
+	spot_area.x = 0;
+	spot_area.y = 0;
+	spot_area.height = gui.char_height * Rows;
+	spot_area.width  = gui.char_width * Columns;
+	line_space = gui.char_height;
+	attr_list = (XVaNestedList) XVaCreateNestedList(0,
+					XNSpotLocation, &over_spot,
+					XNForeground, (Pixel) xim_fg_color,
+					XNBackground, (Pixel) xim_bg_color,
+					XNArea, &spot_area,
+					XNLineSpace, line_space,
+					NULL);
+	if (XSetICValues(xic, XNPreeditAttributes, attr_list, NULL))
+	    EMSG(_("E284: Cannot set IC values"));
+	XFree(attr_list);
     }
-#else /* FEAT_GUI_GTK */
-    {
-	XVaNestedList attr_list;
-	XRectangle spot_area;
-	XPoint over_spot;
-	int line_space;
-
-	if (!xim_has_focus)
-	{
-	    /* hide XIM cursor */
-	    over_spot.x = 0;
-	    over_spot.y = -100; /* arbitrary invisible position */
-	    attr_list = (XVaNestedList) XVaCreateNestedList(0,
-							    XNSpotLocation,
-							    &over_spot,
-							    NULL);
-	    XSetICValues(xic, XNPreeditAttributes, attr_list, NULL);
-	    XFree(attr_list);
-	    return;
-	}
-
-	if (input_style & XIMPreeditPosition)
-	{
-	    if (xim_fg_color == INVALCOLOR)
-	    {
-		xim_fg_color = gui.def_norm_pixel;
-		xim_bg_color = gui.def_back_pixel;
-	    }
-	    over_spot.x = TEXT_X(gui.col);
-	    over_spot.y = TEXT_Y(gui.row);
-	    spot_area.x = 0;
-	    spot_area.y = 0;
-	    spot_area.height = gui.char_height * Rows;
-	    spot_area.width  = gui.char_width * Columns;
-	    line_space = gui.char_height;
-	    attr_list = (XVaNestedList) XVaCreateNestedList(0,
-					    XNSpotLocation, &over_spot,
-					    XNForeground, (Pixel) xim_fg_color,
-					    XNBackground, (Pixel) xim_bg_color,
-					    XNArea, &spot_area,
-					    XNLineSpace, line_space,
-					    NULL);
-	    if (XSetICValues(xic, XNPreeditAttributes, attr_list, NULL))
-		EMSG(_("E284: Cannot set IC values"));
-	    XFree(attr_list);
-	}
-    }
-#endif /* FEAT_GUI_GTK */
 }
 
 /*
@@ -5558,137 +5206,98 @@
     if (xic == NULL)
 	return;
 
-#ifdef FEAT_GUI_GTK
-# if defined(FEAT_XFONTSET)
-    if (use_status_area)
+    XVaNestedList preedit_list = 0, status_list = 0, list = 0;
+    XRectangle pre_area, status_area;
+
+    if (input_style & XIMStatusArea)
     {
-	GdkICAttr	*attr;
-	int		style;
-	gint		width, height;
-	GtkWidget	*widget;
-	int		attrmask;
-
-	if (!xic_attr)
-	    return;
-
-	attr = xic_attr;
-	attrmask = 0;
-	style = (int)gdk_ic_get_style(xic);
-	if ((style & (int)GDK_IM_STATUS_MASK) == (int)GDK_IM_STATUS_AREA)
+	if (input_style & XIMPreeditArea)
 	{
-	    if (gui.fontset != NOFONTSET
-		    && gui.fontset->type == GDK_FONT_FONTSET)
-	    {
-		widget = gui.mainwin;
-		gdk_window_get_size(widget->window, &width, &height);
+	    XRectangle *needed_rect;
 
-		attrmask |= (int)GDK_IC_STATUS_AREA;
-		attr->status_area.x = 0;
-		attr->status_area.y = height - gui.char_height - 1;
-		attr->status_area.width = width;
-		attr->status_area.height = gui.char_height;
-	    }
-	}
-	if (attrmask != 0)
-	    gdk_ic_set_attr(xic, attr, (GdkICAttributesType)attrmask);
-    }
-# endif
-#else
-    {
-	XVaNestedList preedit_list = 0, status_list = 0, list = 0;
-	XRectangle pre_area, status_area;
-
-	if (input_style & XIMStatusArea)
-	{
-	    if (input_style & XIMPreeditArea)
-	    {
-		XRectangle *needed_rect;
-
-		/* to get status_area width */
-		status_list = XVaCreateNestedList(0, XNAreaNeeded,
-						  &needed_rect, NULL);
-		XGetICValues(xic, XNStatusAttributes, status_list, NULL);
-		XFree(status_list);
-
-		status_area.width = needed_rect->width;
-	    }
-	    else
-		status_area.width = gui.char_width * Columns;
-
-	    status_area.x = 0;
-	    status_area.y = gui.char_height * Rows + gui.border_offset;
-	    if (gui.which_scrollbars[SBAR_BOTTOM])
-		status_area.y += gui.scrollbar_height;
-#ifdef FEAT_MENU
-	    if (gui.menu_is_active)
-		status_area.y += gui.menu_height;
-#endif
-	    status_area.height = gui.char_height;
-	    status_list = XVaCreateNestedList(0, XNArea, &status_area, NULL);
-	}
-	else
-	{
-	    status_area.x = 0;
-	    status_area.y = gui.char_height * Rows + gui.border_offset;
-	    if (gui.which_scrollbars[SBAR_BOTTOM])
-		status_area.y += gui.scrollbar_height;
-#ifdef FEAT_MENU
-	    if (gui.menu_is_active)
-		status_area.y += gui.menu_height;
-#endif
-	    status_area.width = 0;
-	    status_area.height = gui.char_height;
-	}
-
-	if (input_style & XIMPreeditArea)   /* off-the-spot */
-	{
-	    pre_area.x = status_area.x + status_area.width;
-	    pre_area.y = gui.char_height * Rows + gui.border_offset;
-	    pre_area.width = gui.char_width * Columns - pre_area.x;
-	    if (gui.which_scrollbars[SBAR_BOTTOM])
-		pre_area.y += gui.scrollbar_height;
-#ifdef FEAT_MENU
-	    if (gui.menu_is_active)
-		pre_area.y += gui.menu_height;
-#endif
-	    pre_area.height = gui.char_height;
-	    preedit_list = XVaCreateNestedList(0, XNArea, &pre_area, NULL);
-	}
-	else if (input_style & XIMPreeditPosition)   /* over-the-spot */
-	{
-	    pre_area.x = 0;
-	    pre_area.y = 0;
-	    pre_area.height = gui.char_height * Rows;
-	    pre_area.width = gui.char_width * Columns;
-	    preedit_list = XVaCreateNestedList(0, XNArea, &pre_area, NULL);
-	}
-
-	if (preedit_list && status_list)
-	    list = XVaCreateNestedList(0, XNPreeditAttributes, preedit_list,
-				       XNStatusAttributes, status_list, NULL);
-	else if (preedit_list)
-	    list = XVaCreateNestedList(0, XNPreeditAttributes, preedit_list,
-				       NULL);
-	else if (status_list)
-	    list = XVaCreateNestedList(0, XNStatusAttributes, status_list,
-				       NULL);
-	else
-	    list = NULL;
-
-	if (list)
-	{
-	    XSetICValues(xic, XNVaNestedList, list, NULL);
-	    XFree(list);
-	}
-	if (status_list)
+	    /* to get status_area width */
+	    status_list = XVaCreateNestedList(0, XNAreaNeeded,
+					      &needed_rect, NULL);
+	    XGetICValues(xic, XNStatusAttributes, status_list, NULL);
 	    XFree(status_list);
-	if (preedit_list)
-	    XFree(preedit_list);
-    }
+
+	    status_area.width = needed_rect->width;
+	}
+	else
+	    status_area.width = gui.char_width * Columns;
+
+	status_area.x = 0;
+	status_area.y = gui.char_height * Rows + gui.border_offset;
+	if (gui.which_scrollbars[SBAR_BOTTOM])
+	    status_area.y += gui.scrollbar_height;
+#ifdef FEAT_MENU
+	if (gui.menu_is_active)
+	    status_area.y += gui.menu_height;
 #endif
+	status_area.height = gui.char_height;
+	status_list = XVaCreateNestedList(0, XNArea, &status_area, NULL);
+    }
+    else
+    {
+	status_area.x = 0;
+	status_area.y = gui.char_height * Rows + gui.border_offset;
+	if (gui.which_scrollbars[SBAR_BOTTOM])
+	    status_area.y += gui.scrollbar_height;
+#ifdef FEAT_MENU
+	if (gui.menu_is_active)
+	    status_area.y += gui.menu_height;
+#endif
+	status_area.width = 0;
+	status_area.height = gui.char_height;
+    }
+
+    if (input_style & XIMPreeditArea)   /* off-the-spot */
+    {
+	pre_area.x = status_area.x + status_area.width;
+	pre_area.y = gui.char_height * Rows + gui.border_offset;
+	pre_area.width = gui.char_width * Columns - pre_area.x;
+	if (gui.which_scrollbars[SBAR_BOTTOM])
+	    pre_area.y += gui.scrollbar_height;
+#ifdef FEAT_MENU
+	if (gui.menu_is_active)
+	    pre_area.y += gui.menu_height;
+#endif
+	pre_area.height = gui.char_height;
+	preedit_list = XVaCreateNestedList(0, XNArea, &pre_area, NULL);
+    }
+    else if (input_style & XIMPreeditPosition)   /* over-the-spot */
+    {
+	pre_area.x = 0;
+	pre_area.y = 0;
+	pre_area.height = gui.char_height * Rows;
+	pre_area.width = gui.char_width * Columns;
+	preedit_list = XVaCreateNestedList(0, XNArea, &pre_area, NULL);
+    }
+
+    if (preedit_list && status_list)
+	list = XVaCreateNestedList(0, XNPreeditAttributes, preedit_list,
+				   XNStatusAttributes, status_list, NULL);
+    else if (preedit_list)
+	list = XVaCreateNestedList(0, XNPreeditAttributes, preedit_list,
+				   NULL);
+    else if (status_list)
+	list = XVaCreateNestedList(0, XNStatusAttributes, status_list,
+				   NULL);
+    else
+	list = NULL;
+
+    if (list)
+    {
+	XSetICValues(xic, XNVaNestedList, list, NULL);
+	XFree(list);
+    }
+    if (status_list)
+	XFree(status_list);
+    if (preedit_list)
+	XFree(preedit_list);
 }
 
-#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+#if defined(FEAT_GUI_X11)
 static char e_xim[] = N_("E285: Failed to create input context");
 #endif
 
@@ -5998,483 +5607,11 @@
 
 #endif /* FEAT_GUI_X11 */
 
-#if defined(FEAT_GUI_GTK) || defined(PROTO)
-
-# ifdef FEAT_XFONTSET
-static char e_overthespot[] = N_("E290: over-the-spot style requires fontset");
-# endif
-
-# ifdef PROTO
-typedef int GdkIC;
-# endif
-
-    void
-xim_decide_input_style()
-{
-    /* GDK_IM_STATUS_CALLBACKS was disabled, enabled it to allow Japanese
-     * OverTheSpot. */
-    int supported_style = (int)GDK_IM_PREEDIT_NONE |
-				 (int)GDK_IM_PREEDIT_NOTHING |
-				 (int)GDK_IM_PREEDIT_POSITION |
-				 (int)GDK_IM_PREEDIT_CALLBACKS |
-				 (int)GDK_IM_STATUS_CALLBACKS |
-				 (int)GDK_IM_STATUS_AREA |
-				 (int)GDK_IM_STATUS_NONE |
-				 (int)GDK_IM_STATUS_NOTHING;
-
-#ifdef XIM_DEBUG
-    xim_log("xim_decide_input_style()\n");
-#endif
-
-    if (!gdk_im_ready())
-	xim_input_style = 0;
-    else
-    {
-	if (gtk_major_version > 1
-		|| (gtk_major_version == 1
-		    && (gtk_minor_version > 2
-			|| (gtk_minor_version == 2 && gtk_micro_version >= 3))))
-	    use_status_area = TRUE;
-	else
-	{
-	    EMSG(_("E291: Your GTK+ is older than 1.2.3. Status area disabled"));
-	    use_status_area = FALSE;
-	}
-#ifdef FEAT_XFONTSET
-	if (gui.fontset == NOFONTSET || gui.fontset->type != GDK_FONT_FONTSET)
-#endif
-	    supported_style &= ~((int)GDK_IM_PREEDIT_POSITION
-						   | (int)GDK_IM_STATUS_AREA);
-	if (!use_status_area)
-	    supported_style &= ~(int)GDK_IM_STATUS_AREA;
-	xim_input_style = (int)gdk_im_decide_style((GdkIMStyle)supported_style);
-    }
-}
-
-    static void
-preedit_start_cbproc(XIC thexic UNUSED,
-	             XPointer client_data UNUSED,
-		     XPointer call_data UNUSED)
-{
-#ifdef XIM_DEBUG
-    xim_log("xim_decide_input_style()\n");
-#endif
-
-    draw_feedback = NULL;
-    xim_can_preediting = TRUE;
-    xim_has_preediting = TRUE;
-    gui_update_cursor(TRUE, FALSE);
-    if (showmode() > 0)
-    {
-	setcursor();
-	out_flush();
-    }
-}
-
-    static void
-xim_back_delete(int n)
-{
-    char_u str[3];
-
-    str[0] = CSI;
-    str[1] = 'k';
-    str[2] = 'b';
-    while (n-- > 0)
-	add_to_input_buf(str, 3);
-}
-
-static GSList *key_press_event_queue = NULL;
-static gboolean processing_queued_event = FALSE;
-
-    static void
-preedit_draw_cbproc(XIC thexic UNUSED,
-		    XPointer client_data UNUSED,
-		    XPointer call_data)
-{
-    XIMPreeditDrawCallbackStruct *draw_data;
-    XIMText	*text;
-    char	*src;
-    GSList	*event_queue;
-
-#ifdef XIM_DEBUG
-    xim_log("preedit_draw_cbproc()\n");
-#endif
-
-    draw_data = (XIMPreeditDrawCallbackStruct *) call_data;
-    text = (XIMText *) draw_data->text;
-
-    if ((text == NULL && draw_data->chg_length == preedit_buf_len)
-						      || preedit_buf_len == 0)
-    {
-	init_preedit_start_col();
-	vim_free(draw_feedback);
-	draw_feedback = NULL;
-    }
-    if (draw_data->chg_length > 0)
-    {
-	int bs_cnt;
-
-	if (draw_data->chg_length > preedit_buf_len)
-	    bs_cnt = preedit_buf_len;
-	else
-	    bs_cnt = draw_data->chg_length;
-	xim_back_delete(bs_cnt);
-	preedit_buf_len -= bs_cnt;
-    }
-    if (text != NULL)
-    {
-	int		len;
-#ifdef FEAT_MBYTE
-	char_u		*buf = NULL;
-	unsigned int	nfeedback = 0;
-#endif
-	char_u		*ptr;
-
-	src = text->string.multi_byte;
-	if (src != NULL && !text->encoding_is_wchar)
-	{
-	    len = strlen(src);
-	    ptr = (char_u *)src;
-	    /* Avoid the enter for decision */
-	    if (*ptr == '\n')
-		return;
-
-#ifdef FEAT_MBYTE
-	    if (input_conv.vc_type != CONV_NONE
-		    && (buf = string_convert(&input_conv,
-						 (char_u *)src, &len)) != NULL)
-	    {
-		/* Converted from 'termencoding' to 'encoding'. */
-		add_to_input_buf_csi(buf, len);
-		ptr = buf;
-	    }
-	    else
-#endif
-		add_to_input_buf_csi((char_u *)src, len);
-	    /* Add count of character to preedit_buf_len  */
-	    while (*ptr != NUL)
-	    {
-#ifdef FEAT_MBYTE
-		if (draw_data->text->feedback != NULL)
-		{
-		    if (draw_feedback == NULL)
-			draw_feedback = (char *)alloc(draw_data->chg_first
-							      + text->length);
-		    else
-			draw_feedback = vim_realloc(draw_feedback,
-					 draw_data->chg_first + text->length);
-		    if (draw_feedback != NULL)
-		    {
-			draw_feedback[nfeedback + draw_data->chg_first]
-				       = draw_data->text->feedback[nfeedback];
-			nfeedback++;
-		    }
-		}
-		if (has_mbyte)
-		    ptr += (*mb_ptr2len)(ptr);
-		else
-#endif
-		    ptr++;
-		preedit_buf_len++;
-	    }
-#ifdef FEAT_MBYTE
-	    vim_free(buf);
-#endif
-	    preedit_end_col = MAXCOL;
-	}
-    }
-    if (text != NULL || draw_data->chg_length > 0)
-    {
-	event_queue = key_press_event_queue;
-	processing_queued_event = TRUE;
-	while (event_queue != NULL && processing_queued_event)
-	{
-	    GdkEvent *ev = event_queue->data;
-
-	    gboolean *ret;
-	    gtk_signal_emit_by_name((GtkObject*)gui.mainwin, "key_press_event",
-								    ev, &ret);
-	    gdk_event_free(ev);
-	    event_queue = event_queue->next;
-	}
-	processing_queued_event = FALSE;
-	if (key_press_event_queue)
-	{
-	    g_slist_free(key_press_event_queue);
-	    key_press_event_queue = NULL;
-	}
-    }
-    if (gtk_main_level() > 0)
-	gtk_main_quit();
-}
-
-/*
- * Retrieve the highlighting attributes at column col in the preedit string.
- * Return -1 if not in preediting mode or if col is out of range.
- */
-    int
-im_get_feedback_attr(int col)
-{
-    if (draw_feedback != NULL && col < preedit_buf_len)
-    {
-	if (draw_feedback[col] & XIMReverse)
-	    return HL_INVERSE;
-	else if (draw_feedback[col] & XIMUnderline)
-	    return HL_UNDERLINE;
-	else
-	    return hl_attr(HLF_V);
-    }
-
-    return -1;
-}
-
-    static void
-preedit_caret_cbproc(XIC thexic UNUSED,
-		     XPointer client_data UNUSED,
-		     XPointer call_data UNUSED)
-{
-#ifdef XIM_DEBUG
-    xim_log("preedit_caret_cbproc()\n");
-#endif
-}
-
-    static void
-preedit_done_cbproc(XIC thexic UNUSED,
-		    XPointer client_data UNUSED,
-		    XPointer call_data UNUSED)
-{
-#ifdef XIM_DEBUG
-    xim_log("preedit_done_cbproc()\n");
-#endif
-
-    vim_free(draw_feedback);
-    draw_feedback = NULL;
-    xim_can_preediting = FALSE;
-    xim_has_preediting = FALSE;
-    gui_update_cursor(TRUE, FALSE);
-    if (showmode() > 0)
-    {
-	setcursor();
-	out_flush();
-    }
-}
-
-    void
-xim_reset(void)
-{
-    char *text;
-
-#ifdef XIM_DEBUG
-    xim_log("xim_reset()\n");
-#endif
-
-    if (xic != NULL)
-    {
-	text = XmbResetIC(((GdkICPrivate *)xic)->xic);
-	if (text != NULL && !(xim_input_style & (int)GDK_IM_PREEDIT_CALLBACKS))
-	    add_to_input_buf_csi((char_u *)text, strlen(text));
-	else
-	    preedit_buf_len = 0;
-	if (text != NULL)
-	    XFree(text);
-    }
-}
-
-    int
-xim_queue_key_press_event(GdkEventKey *event, int down UNUSED)
-{
-#ifdef XIM_DEBUG
-    xim_log("xim_queue_key_press_event()\n");
-#endif
-
-    if (preedit_buf_len <= 0)
-	return FALSE;
-    if (processing_queued_event)
-	processing_queued_event = FALSE;
-
-    key_press_event_queue = g_slist_append(key_press_event_queue,
-					   gdk_event_copy((GdkEvent *)event));
-    return TRUE;
-}
-
-    static void
-preedit_callback_setup(GdkIC *ic UNUSED)
-{
-    XIC xxic;
-    XVaNestedList preedit_attr;
-    XIMCallback preedit_start_cb;
-    XIMCallback preedit_draw_cb;
-    XIMCallback preedit_caret_cb;
-    XIMCallback preedit_done_cb;
-
-    xxic = ((GdkICPrivate*)xic)->xic;
-    preedit_start_cb.callback = (XIMProc)preedit_start_cbproc;
-    preedit_draw_cb.callback = (XIMProc)preedit_draw_cbproc;
-    preedit_caret_cb.callback = (XIMProc)preedit_caret_cbproc;
-    preedit_done_cb.callback = (XIMProc)preedit_done_cbproc;
-    preedit_attr
-	 = XVaCreateNestedList(0,
-			       XNPreeditStartCallback, &preedit_start_cb,
-			       XNPreeditDrawCallback, &preedit_draw_cb,
-			       XNPreeditCaretCallback, &preedit_caret_cb,
-			       XNPreeditDoneCallback, &preedit_done_cb,
-			       NULL);
-    XSetICValues(xxic, XNPreeditAttributes, preedit_attr, NULL);
-    XFree(preedit_attr);
-}
-
-    static void
-reset_state_setup(GdkIC *ic UNUSED)
-{
-#ifdef USE_X11R6_XIM
-    /* don't change the input context when we call reset */
-    XSetICValues(((GdkICPrivate *)ic)->xic, XNResetState, XIMPreserveState,
-									NULL);
-#endif
-}
-
-    void
-xim_init(void)
-{
-#ifdef XIM_DEBUG
-    xim_log("xim_init()\n");
-#endif
-
-    xic = NULL;
-    xic_attr = NULL;
-
-    if (!gdk_im_ready())
-    {
-	if (p_verbose > 0)
-	{
-	    verbose_enter();
-	    EMSG(_("E292: Input Method Server is not running"));
-	    verbose_leave();
-	}
-	return;
-    }
-    if ((xic_attr = gdk_ic_attr_new()) != NULL)
-    {
-#ifdef FEAT_XFONTSET
-	gint width, height;
-#endif
-	int		mask;
-	GdkColormap	*colormap;
-	GdkICAttr	*attr = xic_attr;
-	int		attrmask = (int)GDK_IC_ALL_REQ;
-	GtkWidget	*widget = gui.drawarea;
-
-	attr->style = (GdkIMStyle)xim_input_style;
-	attr->client_window = gui.mainwin->window;
-
-	if ((colormap = gtk_widget_get_colormap(widget)) !=
-	    gtk_widget_get_default_colormap())
-	{
-	    attrmask |= (int)GDK_IC_PREEDIT_COLORMAP;
-	    attr->preedit_colormap = colormap;
-	}
-	attrmask |= (int)GDK_IC_PREEDIT_FOREGROUND;
-	attrmask |= (int)GDK_IC_PREEDIT_BACKGROUND;
-	attr->preedit_foreground = widget->style->fg[GTK_STATE_NORMAL];
-	attr->preedit_background = widget->style->base[GTK_STATE_NORMAL];
-
-#ifdef FEAT_XFONTSET
-	if ((xim_input_style & (int)GDK_IM_PREEDIT_MASK)
-					      == (int)GDK_IM_PREEDIT_POSITION)
-	{
-	    if (gui.fontset == NOFONTSET
-		    || gui.fontset->type != GDK_FONT_FONTSET)
-	    {
-		EMSG(_(e_overthespot));
-	    }
-	    else
-	    {
-		gdk_window_get_size(widget->window, &width, &height);
-
-		attrmask |= (int)GDK_IC_PREEDIT_POSITION_REQ;
-		attr->spot_location.x = TEXT_X(0);
-		attr->spot_location.y = TEXT_Y(0);
-		attr->preedit_area.x = gui.border_offset;
-		attr->preedit_area.y = gui.border_offset;
-		attr->preedit_area.width = width - 2*gui.border_offset;
-		attr->preedit_area.height = height - 2*gui.border_offset;
-		attr->preedit_fontset = gui.fontset;
-	    }
-	}
-
-	if ((xim_input_style & (int)GDK_IM_STATUS_MASK)
-						   == (int)GDK_IM_STATUS_AREA)
-	{
-	    if (gui.fontset == NOFONTSET
-		    || gui.fontset->type != GDK_FONT_FONTSET)
-	    {
-		EMSG(_(e_overthespot));
-	    }
-	    else
-	    {
-		gdk_window_get_size(gui.mainwin->window, &width, &height);
-		attrmask |= (int)GDK_IC_STATUS_AREA_REQ;
-		attr->status_area.x = 0;
-		attr->status_area.y = height - gui.char_height - 1;
-		attr->status_area.width = width;
-		attr->status_area.height = gui.char_height;
-		attr->status_fontset = gui.fontset;
-	    }
-	}
-	else if ((xim_input_style & (int)GDK_IM_STATUS_MASK)
-					      == (int)GDK_IM_STATUS_CALLBACKS)
-	{
-	    /* FIXME */
-	}
-#endif
-
-	xic = gdk_ic_new(attr, (GdkICAttributesType)attrmask);
-
-	if (xic == NULL)
-	    EMSG(_(e_xim));
-	else
-	{
-	    mask = (int)gdk_window_get_events(widget->window);
-	    mask |= (int)gdk_ic_get_events(xic);
-	    gdk_window_set_events(widget->window, (GdkEventMask)mask);
-	    if (xim_input_style & (int)GDK_IM_PREEDIT_CALLBACKS)
-		preedit_callback_setup(xic);
-	    reset_state_setup(xic);
-	}
-    }
-}
-
-    void
-im_shutdown(void)
-{
-#ifdef XIM_DEBUG
-    xim_log("im_shutdown()\n");
-#endif
-
-    if (xic != NULL)
-    {
-	gdk_im_end();
-	gdk_ic_destroy(xic);
-	xic = NULL;
-    }
-    xim_is_active = FALSE;
-    xim_can_preediting = FALSE;
-    preedit_start_col = MAXCOL;
-    xim_has_preediting = FALSE;
-}
-
-#endif /* FEAT_GUI_GTK */
-
     int
 xim_get_status_area_height()
 {
-#ifdef FEAT_GUI_GTK
-    if (xim_input_style & (int)GDK_IM_STATUS_AREA)
-	return gui.char_height;
-#else
     if (status_area_enabled)
 	return gui.char_height;
-#endif
     return 0;
 }
 
@@ -6487,10 +5624,6 @@
     int
 im_get_status()
 {
-#  ifdef FEAT_GUI_GTK
-    if (xim_input_style & (int)GDK_IM_PREEDIT_CALLBACKS)
-	return xim_can_preediting;
-#  endif
     return xim_has_focus;
 }
 
diff --git a/src/option.c b/src/option.c
index ae3c539..1076884 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2582,7 +2582,7 @@
 			    {(char_u *)"icons,tooltips", (char_u *)0L}
 			    SCRIPTID_INIT},
 #endif
-#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
+#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK)
     {"toolbariconsize",	"tbis", P_STRING|P_VI_DEF,
 			    (char_u *)&p_tbis, PV_NONE,
 			    {(char_u *)"small", (char_u *)0L} SCRIPTID_INIT},
@@ -5152,7 +5152,7 @@
 #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32)
     (void)opt_strings_flags(p_toolbar, p_toolbar_values, &toolbar_flags, TRUE);
 #endif
-#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
+#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK)
     (void)opt_strings_flags(p_tbis, p_tbis_values, &tbis_flags, FALSE);
 #endif
 #ifdef FEAT_CMDWIN
@@ -5825,7 +5825,7 @@
 	    }
 	}
 
-# if defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
+# if defined(FEAT_GUI_GTK)
 	if (errmsg == NULL && varp == &p_tenc && gui.in_use)
 	{
 	    /* GTK+ 2 uses only a single encoding, and that is UTF-8. */
@@ -6602,7 +6602,7 @@
     }
 #endif
 
-#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
+#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK)
     /* 'toolbariconsize': GTK+ 2 only */
     else if (varp == &p_tbis)
     {
diff --git a/src/option.h b/src/option.h
index 489bdb2..08f1f4b 100644
--- a/src/option.h
+++ b/src/option.h
@@ -544,7 +544,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)
 EXTERN char_u	*p_imak;	/* 'imactivatekey' */
 #endif
 #ifdef USE_IM_CONTROL
@@ -790,7 +790,7 @@
 # define TOOLBAR_TOOLTIPS	0x04
 # define TOOLBAR_HORIZ		0x08
 #endif
-#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
+#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK)
 EXTERN char_u	*p_tbis;	/* 'toolbariconsize' */
 EXTERN unsigned tbis_flags;
 # ifdef IN_OPTION_C
diff --git a/src/os_unix.c b/src/os_unix.c
index 365e965..cb323c8 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -2991,7 +2991,6 @@
     }
 #  endif
 # endif
-    /* Don't close the display for GTK 1, it is done in exit(). */
 # if defined(FEAT_X11) && (!defined(FEAT_GUI_GTK) || defined(HAVE_GTK2))
     if (x11_display != NULL
 #  ifdef FEAT_XCLIPBOARD
diff --git a/src/proto/gui_gtk.pro b/src/proto/gui_gtk.pro
index 960d631..8b88358 100644
--- a/src/proto/gui_gtk.pro
+++ b/src/proto/gui_gtk.pro
@@ -18,6 +18,5 @@
 void gui_make_popup __ARGS((char_u *path_name, int mouse_pos));
 void gui_mch_find_dialog __ARGS((exarg_T *eap));
 void gui_mch_replace_dialog __ARGS((exarg_T *eap));
-void gui_gtk_synch_fonts __ARGS((void));
 void ex_helpfind __ARGS((exarg_T *eap));
 /* vim: set ft=c : */
diff --git a/src/proto/gui_gtk_x11.pro b/src/proto/gui_gtk_x11.pro
index d80ba82..2484082 100644
--- a/src/proto/gui_gtk_x11.pro
+++ b/src/proto/gui_gtk_x11.pro
@@ -26,21 +26,16 @@
 void gui_mch_enable_menu __ARGS((int showit));
 void gui_mch_show_toolbar __ARGS((int showit));
 int gui_mch_adjust_charheight __ARGS((void));
-GuiFontset gui_mch_get_fontset __ARGS((char_u *name, int report_error, int fixed_width));
 char_u *gui_mch_font_dialog __ARGS((char_u *oldval));
 int gui_mch_init_font __ARGS((char_u *font_name, int fontset));
 GuiFont gui_mch_get_font __ARGS((char_u *name, int report_error));
 char_u *gui_mch_get_fontname __ARGS((GuiFont font, char_u *name));
-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_set_sp_color __ARGS((guicolor_T color));
 int gui_gtk2_draw_string __ARGS((int row, int col, char_u *s, int len, int flags));
-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));
 Display *gui_mch_get_display __ARGS((void));
diff --git a/src/version.c b/src/version.c
index c002670..744a6d5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -916,17 +916,9 @@
 #else
 # ifdef FEAT_GUI_GTK
 #  ifdef FEAT_GUI_GNOME
-#   ifdef HAVE_GTK2
     MSG_PUTS(_("with GTK2-GNOME GUI."));
-#   else
-    MSG_PUTS(_("with GTK-GNOME GUI."));
-#   endif
 #  else
-#   ifdef HAVE_GTK2
     MSG_PUTS(_("with GTK2 GUI."));
-#   else
-    MSG_PUTS(_("with GTK GUI."));
-#   endif
 #  endif
 # else
 #  ifdef FEAT_GUI_MOTIF
