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 */
