diff -pru dillo/src/browser.h dillo.new/src/browser.h
--- dillo/src/browser.h	Thu Dec 28 22:06:30 2000
+++ dillo.new/src/browser.h	Tue Apr 10 03:50:35 2001
@@ -90,12 +90,8 @@ struct _BrowserWindow
    /* widgets for dialog boxes off main window */
    GtkWidget *open_dialog_window;
    GtkWidget *open_dialog_entry;
-   GtkWidget *openfile_dialog_window;
+   GtkWidget *choosefile_dialog_window;
    GtkWidget *quit_dialog_window;
-   GtkWidget *save_dialog_window;
-   GtkWidget *save_dialog_entry;
-   GtkWidget *save_link_dialog_window;
-   GtkWidget *save_link_dialog_entry;
    GtkWidget *findtext_dialog_window;
    GtkWidget *findtext_dialog_entry;
 
diff -pru dillo/src/interface.c dillo.new/src/interface.c
--- dillo/src/interface.c	Sun Mar  4 16:21:34 2001
+++ dillo.new/src/interface.c	Tue Apr 10 05:43:05 2001
@@ -271,8 +271,8 @@ static gboolean Interface_quit(GtkWidget
    /* todo: should probably abort any open connections. */
    if (bw->open_dialog_window != NULL)
       gtk_widget_destroy(bw->open_dialog_window);
-   if (bw->openfile_dialog_window != NULL)
-      gtk_widget_destroy(bw->openfile_dialog_window);
+   if (bw->choosefile_dialog_window != NULL)
+      gtk_widget_destroy(bw->choosefile_dialog_window);
    if (bw->quit_dialog_window != NULL)
       gtk_widget_destroy(bw->quit_dialog_window);
    if (bw->findtext_dialog_window != NULL)
@@ -368,7 +368,6 @@ BrowserWindow *a_Interface_new_browser_w
 
    /* We use g_malloc0() to zero the memory */
    bw = g_malloc0(sizeof(BrowserWindow));
-   bw->save_dialog_window = NULL;
 
    a_List_add(browser_window, num_bw, sizeof(*browser_window), num_bw_max);
    browser_window[num_bw++] = bw;
@@ -560,7 +559,7 @@ BrowserWindow *a_Interface_new_browser_w
    /* Zero out a bunch of stuff in the bw struct. */
    bw->findtext_dialog_window = NULL;
    bw->open_dialog_window = NULL;
-   bw->openfile_dialog_window = NULL;
+   bw->choosefile_dialog_window = NULL;
    bw->quit_dialog_window = NULL;
    return bw;
 }
@@ -617,9 +616,11 @@ va_list argp;
 
 /*
  * hmm.. have to see where this is from
+ * Called from `destroy' callback in Interface_make_*_dialog
  */
 void Interface_destroy_window(GtkWidget *widget, GtkWidget **window)
 {
+   gtk_widget_destroy(*window);
    *window = NULL;
 }
 
@@ -650,6 +651,31 @@ void a_Interface_quit_all(void)
 #endif
 }
 
+/*
+ * Make a dialog for choosing files (by calling
+ * gtk_file_selection_*() calls)
+ * This can be used for saving, opening, or whatever, 
+ * just set the correct callbacks
+ */
+static void
+  Interface_make_choose_file_dialog(GtkWidget **DialogWindow, 
+				    char *WmName, char *WmClass, char *WTitle, 
+				    GtkSignalFunc B1CallBack, void *B1CbData)
+{
+   *DialogWindow = gtk_file_selection_new(WTitle);
+   gtk_window_set_modal(GTK_WINDOW(*DialogWindow), TRUE);
+   gtk_window_set_wmclass(GTK_WINDOW(*DialogWindow),
+			  WmName, WmClass);
+   
+   gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (*DialogWindow)); 
+   gtk_signal_connect(GTK_OBJECT(*DialogWindow), "destroy",
+		      (GtkSignalFunc) Interface_destroy_window, DialogWindow);
+   gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION (*DialogWindow)->ok_button),
+		      "clicked", (GtkSignalFunc) B1CallBack, B1CbData);
+   gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION (*DialogWindow)->cancel_button),
+		      "clicked", (GtkSignalFunc) Interface_destroy_window,
+		      DialogWindow);
+}
 
 /*
  * ?
@@ -664,12 +690,12 @@ static void
    g_print("openfile_ok_callback: %s\n", fn);
 #endif
    fn = gtk_file_selection_get_filename
-       (GTK_FILE_SELECTION(bw->openfile_dialog_window));
+       (GTK_FILE_SELECTION(bw->choosefile_dialog_window));
    if (strlen(fn) + 6 <= sizeof(url)) {
       sprintf(url, "file:%s", fn);
       a_Nav_push(bw, url);
    }
-   gtk_widget_destroy(bw->openfile_dialog_window);
+   gtk_widget_destroy(bw->choosefile_dialog_window);
 }
 
 
@@ -711,24 +737,17 @@ void a_Interface_entry_open_url(GtkWidge
  */
 void a_Interface_openfile_dialog(BrowserWindow *bw)
 {
-   if (!bw->openfile_dialog_window) {
-      bw->openfile_dialog_window = gtk_file_selection_new("Open File");
-      gtk_window_set_wmclass(GTK_WINDOW(bw->openfile_dialog_window),
-                             "openfile_dialog", "Dillo");
-      gtk_signal_connect(GTK_OBJECT(bw->openfile_dialog_window), "destroy",
-                         (GtkSignalFunc) Interface_destroy_window, &(bw->openfile_dialog_window));
-      gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION
-                                (bw->openfile_dialog_window)->ok_button),
-          "clicked", (GtkSignalFunc) Interface_openfile_ok_callback, bw);
-      gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(
-                                 bw->openfile_dialog_window)->cancel_button),
-                                "clicked", (GtkSignalFunc) gtk_widget_hide,
-                                GTK_OBJECT(bw->openfile_dialog_window));
+   if (!bw->choosefile_dialog_window) {
+      Interface_make_choose_file_dialog(&(bw->choosefile_dialog_window),
+					"openfile_dialog", "Dillo", "Dillo: Open File",
+					(GtkSignalFunc) Interface_openfile_ok_callback, 
+					(void *)bw);
    }
-   if (!GTK_WIDGET_VISIBLE(bw->openfile_dialog_window))
-      gtk_widget_show(bw->openfile_dialog_window);
+
+   if (!GTK_WIDGET_VISIBLE(bw->choosefile_dialog_window))
+      gtk_widget_show(bw->choosefile_dialog_window);
    else
-      gtk_widget_destroy(bw->openfile_dialog_window);
+      gtk_widget_destroy(bw->choosefile_dialog_window);
 }
 
 /*
@@ -842,15 +861,16 @@ void Interface_save_callback(int Op, Cac
 /*
  * Save current page to a local file
  */
-void Interface_entry_save_url(GtkWidget *widget, BrowserWindow *bw)
+void Interface_choosefile_save_url(GtkWidget *widget, BrowserWindow *bw)
 {
    const char *url, *name;
-   GtkEntry *entry, *entry_url;
+   GtkFileSelection *choosefile;
+   GtkEntry *entry_url;
    FILE *out;
 
-   entry = GTK_ENTRY(bw->save_dialog_entry);
+   choosefile = GTK_FILE_SELECTION(bw->choosefile_dialog_window);
    entry_url = GTK_ENTRY(bw->location);
-   name = gtk_entry_get_text(entry);
+   name = gtk_file_selection_get_filename(choosefile);
    url  = gtk_entry_get_text(entry_url);
 
    if ( strlen(name) && (out = fopen(name, "w")) != NULL ) {
@@ -862,19 +882,18 @@ void Interface_entry_save_url(GtkWidget 
       a_Cache_open_url(url, Interface_save_callback, Web);
    }
 
-   if (bw->save_dialog_window != NULL)
-      gtk_widget_destroy(bw->save_dialog_window);
+   gtk_widget_destroy(bw->choosefile_dialog_window);
 }
 
 /*
  * Save the link-URL to a local file
  */
-void Interface_entry_save_link(GtkWidget *widget, BrowserWindow *bw)
+void Interface_choosefile_save_link(GtkWidget *widget, BrowserWindow *bw)
 {
    const char *url, *name;
    FILE *out;
 
-   name = gtk_entry_get_text(GTK_ENTRY(bw->save_link_dialog_entry));
+   name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(bw->choosefile_dialog_window));
    url  = bw->menu_popup.info.url;
 
    if ( strlen(name) && (out = fopen(name, "w")) != NULL ) {
@@ -886,8 +905,7 @@ void Interface_entry_save_link(GtkWidget
       a_Cache_open_url(url, Interface_save_callback, Web);
    }
 
-   if (bw->save_link_dialog_window != NULL)
-      gtk_widget_destroy(bw->save_link_dialog_window);
+   gtk_widget_destroy(bw->choosefile_dialog_window);
 }
 
 /*
@@ -913,19 +931,21 @@ void a_Interface_save_dialog(GtkWidget *
 {
    char *SuggestedName;   /* Suggested save name */
 
-   if (!bw->save_dialog_window) {
+   if (!bw->choosefile_dialog_window) {
       SuggestedName =
          Interface_make_save_name(gtk_entry_get_text(GTK_ENTRY(bw->location)));
-      Interface_make_dialog(&(bw->save_dialog_window), "save_dialog", "Dillo",
-         "Dillo: Save URL as file", &(bw->save_dialog_entry), SuggestedName,
-         "OK", (GtkSignalFunc) Interface_entry_save_url, (void *)bw);
+      Interface_make_choose_file_dialog(&(bw->choosefile_dialog_window),
+           "save_dialog", "Dillo", "Dillo: Save URL as File...",
+           (GtkSignalFunc) Interface_choosefile_save_url, (void *)bw);
+      gtk_file_selection_set_filename(GTK_FILE_SELECTION(bw->choosefile_dialog_window), 
+				      SuggestedName);
       g_free(SuggestedName);
    }
 
-   if (!GTK_WIDGET_VISIBLE(bw->save_dialog_window))
-      gtk_widget_show(bw->save_dialog_window);
+   if (!GTK_WIDGET_VISIBLE(bw->choosefile_dialog_window))
+      gtk_widget_show(bw->choosefile_dialog_window);
    else
-      gtk_widget_hide(bw->save_dialog_window);
+      gtk_widget_destroy(bw->choosefile_dialog_window);
 }
 
 /*
@@ -935,19 +955,22 @@ void a_Interface_save_link_dialog(GtkWid
 {
    char *SuggestedName;   /* Suggested save name */
 
-   if (!bw->save_link_dialog_window) {
+   if (!bw->choosefile_dialog_window) {
       SuggestedName = Interface_make_save_name(bw->menu_popup.info.url);
-      Interface_make_dialog(&(bw->save_link_dialog_window),
-         "save_link_dialog", "Dillo", "Dillo: Save link as file",
-         &(bw->save_link_dialog_entry), SuggestedName,
-         "OK", (GtkSignalFunc) Interface_entry_save_link, (void *)bw);
+      Interface_make_choose_file_dialog(&(bw->choosefile_dialog_window),
+					"save_link_dialog", "Dillo", 
+					"Dillo: Save link as File...",
+					(GtkSignalFunc) Interface_choosefile_save_link, 
+					(void *)bw);
+      gtk_file_selection_set_filename(GTK_FILE_SELECTION(bw->choosefile_dialog_window), 
+				      SuggestedName);
       g_free(SuggestedName);
    }
 
-   if (!GTK_WIDGET_VISIBLE(bw->save_link_dialog_window))
-      gtk_widget_show(bw->save_link_dialog_window);
+   if (!GTK_WIDGET_VISIBLE(bw->choosefile_dialog_window))
+      gtk_widget_show(bw->choosefile_dialog_window);
    else
-      gtk_widget_hide(bw->save_link_dialog_window);
+      gtk_widget_hide(bw->choosefile_dialog_window);
 }
 
 /*

