--- /dev/null
+--- ../vim63b.orig/src/gui_gtk.c 2004-05-12 18:01:45.000000000 +0200
++++ src/gui_gtk.c 2004-05-19 19:26:19.000000000 +0200
+@@ -39,6 +39,16 @@
+
+ #include "vim.h"
+
++/* Check to see if we are able to use GtkFileChooser */
++#undef HAVE_FILECHOOSER
++
++#if defined(HAVE_GTK2)
++# if GTK_MINOR_VERSION >= 4
++# define HAVE_FILECHOOSER
++# endif
++#endif
++
++
+ #ifdef FEAT_GUI_GNOME
+ /* Gnome redefines _() and N_(). Grrr... */
+ # ifdef _
+@@ -1202,6 +1212,7 @@
+ * Implementation of the file selector related stuff
+ */
+
++#if !defined(HAVE_FILECHOOSER)
+ /*ARGSUSED*/
+ static void
+ browse_ok_cb(GtkWidget *widget, gpointer cbdata)
+@@ -1233,6 +1244,7 @@
+ if (gtk_main_level() > 0)
+ gtk_main_quit();
+ }
++#endif
+
+ /*ARGSUSED*/
+ static gboolean
+@@ -1270,7 +1282,11 @@
+ char_u *initdir,
+ char_u *filter)
+ {
++#if !defined(HAVE_FILECHOOSER)
+ GtkFileSelection *fs; /* shortcut */
++#else
++ GtkFileChooserDialog *fs;
++#endif
+ char_u dirbuf[MAXPATHL];
+ char_u *p;
+
+@@ -1280,6 +1296,7 @@
+
+ if (!gui.filedlg)
+ {
++#if !defined(HAVE_FILECHOOSER)
+ gui.filedlg = gtk_file_selection_new((const gchar *)title);
+ gtk_window_set_modal(GTK_WINDOW(gui.filedlg), TRUE);
+ gtk_window_set_transient_for(GTK_WINDOW(gui.filedlg),
+@@ -1296,6 +1313,26 @@
+ gtk_signal_connect_object(GTK_OBJECT(gui.filedlg),
+ "destroy", GTK_SIGNAL_FUNC(browse_destroy_cb),
+ GTK_OBJECT(gui.filedlg));
++#else
++ if(saving == 0)
++ gui.filedlg = gtk_file_chooser_dialog_new ((const gchar *)title,
++ GTK_WINDOW(gui.mainwin),
++ GTK_FILE_CHOOSER_ACTION_OPEN,
++ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
++ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
++ NULL);
++ else
++ gui.filedlg = gtk_file_chooser_dialog_new ((const gchar *)title,
++ GTK_WINDOW(gui.mainwin),
++ GTK_FILE_CHOOSER_ACTION_SAVE,
++ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
++ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
++ NULL);
++
++ gtk_window_set_modal(GTK_WINDOW(gui.filedlg), TRUE);
++ fs = GTK_FILE_CHOOSER_DIALOG(gui.filedlg);
++ gtk_container_border_width(GTK_CONTAINER(fs), 4);
++#endif
+ }
+ else
+ gtk_window_set_title(GTK_WINDOW(gui.filedlg), (const gchar *)title);
+@@ -1319,18 +1356,41 @@
+ if (dflt != NULL && *dflt != NUL
+ && STRLEN(dirbuf) + 2 + STRLEN(dflt) < MAXPATHL)
+ STRCAT(dirbuf, dflt);
+-
++#if !defined(HAVE_FILECHOOSER)
+ gtk_file_selection_set_filename(GTK_FILE_SELECTION(gui.filedlg),
+ (const gchar *)dirbuf);
++#else
++
++ if((dirbuf[STRLEN(dirbuf) - 1]) == '/')
++ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fs),
++ (const gchar *)dirbuf);
++ else
++ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fs),
++ (const gchar *)dirbuf);
++#endif
++
+ # ifndef HAVE_GTK2
+ gui_gtk_position_in_parent(GTK_WIDGET(gui.mainwin),
+ GTK_WIDGET(gui.filedlg), VW_POS_MOUSE);
+ # endif
+
++#if !defined(HAVE_FILECHOOSER)
+ gtk_widget_show(gui.filedlg);
+ while (gui.filedlg && GTK_WIDGET_DRAWABLE(gui.filedlg))
+ gtk_main_iteration_do(TRUE);
++#else
++ if (gui.browse_fname != NULL) {
++ g_free(gui.browse_fname);
++ gui.browse_fname = NULL;
++ }
++
++ if (gtk_dialog_run(GTK_DIALOG(fs)) == GTK_RESPONSE_ACCEPT)
++ gui.browse_fname = gtk_file_chooser_get_filename(
++ GTK_FILE_CHOOSER(fs));
+
++ gtk_widget_destroy(GTK_WIDGET(fs));
++ gui.filedlg = NULL;
++#endif
+ if (gui.browse_fname == NULL)
+ return NULL;
+