Ethereal-dev: [Ethereal-dev] last_open_dir usage incorrect

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Gilbert Ramirez <gilramir@xxxxxxxxx>
Date: Mon, 09 Apr 2001 16:29:48 -0500
I noticed the following problem when using Ethereal with gtk+-1.2.9 on
Linux.
If I do a File|Open and then do a File|Save As, the directory shown
in the file-selection dialogue for "Save As" is the *parent*
directory of the directory from where I opened the file.


I don't remember this happening before. The following patch fixes
it by appending a "/" to the directory passed to the file section
dialogue, but does this happen for anyone that's using an earlier
version
of gtk+ ?

--gilbert
? debugdata.gz
? tcpdump_log
? http.cap
? small.cap
? test.grj
? dir.diff
? problems1.cap
? problems2.cap
? problems3.cap
Index: gtk/file_dlg.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/gtk/file_dlg.c,v
retrieving revision 1.36
diff -u -r1.36 gtk/file_dlg.c
--- gtk/file_dlg.c	2001/02/01 20:21:21	1.36
+++ gtk/file_dlg.c	2001/04/09 21:27:02
@@ -48,6 +48,7 @@
 #include "file_dlg.h"
 #include "dlg_utils.h"
 #include "util.h"
+#include "main.h"
 
 static void file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs);
 static void file_open_destroy_cb(GtkWidget *win, gpointer user_data);
@@ -92,7 +93,7 @@
   /* If we've opened a file, start out by showing the files in the directory
      in which that file resided. */
   if (last_open_dir)
-    gtk_file_selection_complete(GTK_FILE_SELECTION(file_open_w), last_open_dir);
+    gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_open_w), last_open_dir);
 
   resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
 		  "Enable name resolution", NULL);
@@ -165,9 +166,8 @@
   if (test_for_directory(cf_name) == EISDIR) {
 	/* It's a directory - set the file selection box to display that
 	   directory, don't try to open the directory as a capture file. */
-	g_free(last_open_dir);
-	last_open_dir = cf_name;
-	gtk_file_selection_complete(GTK_FILE_SELECTION(fs), last_open_dir);
+	set_last_open_dir(cf_name);
+	gtk_file_selection_set_filename(GTK_FILE_SELECTION(fs), last_open_dir);
     	return;
   }
 
@@ -218,24 +218,7 @@
      if any; we can write over cf_name, which is a good thing, given that
      "get_dirname()" does write over its argument. */
   s = get_dirname(cf_name);
-  if (s != NULL) {
-    /* Well, there is a directory in there... */
-    if (last_open_dir != NULL) {
-      /* ...and we already have one saved... */
-      if (strcmp(last_open_dir, s) != 0) {
-      	/* ...and it's not the same as this one, so free the old one
-	   and assign a copy of the new one to it. */
-	g_free(last_open_dir);
-	last_open_dir = g_strdup(s);
-      }
-    } else {
-      /* ...and we don't already have one saved, so just save this one. */
-      last_open_dir = g_strdup(s);
-    }
-  } else {
-    /* There was no directory in there. */
-    last_open_dir = NULL;
-  }
+  set_last_open_dir(s);
 
   g_free(cf_name);
 }
@@ -418,7 +401,7 @@
   /* If we've opened a file, start out by showing the files in the directory
      in which that file resided. */
   if (last_open_dir)
-    gtk_file_selection_complete(GTK_FILE_SELECTION(file_save_as_w), last_open_dir);
+    gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_save_as_w), last_open_dir);
 
   /* Connect the ok_button to file_save_as_ok_cb function and pass along a
      pointer to the file selection box widget */
Index: gtk/main.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/gtk/main.c,v
retrieving revision 1.189
diff -u -r1.189 gtk/main.c
--- gtk/main.c	2001/04/05 05:58:05	1.189
+++ gtk/main.c	2001/04/09 21:27:02
@@ -1287,8 +1287,7 @@
              good thing, given that "get_dirname()" does write over its
              argument. */
           s = get_dirname(cf_name);
-          if (s != NULL)
-            last_open_dir = s;
+	  set_last_open_dir(s);
         } else {
           if (rfcode != NULL)
             dfilter_free(rfcode);
@@ -1690,3 +1689,23 @@
   gtk_widget_show(top_level);
 }
 
+
+void
+set_last_open_dir(char *dirname)
+{
+	int len;
+
+	if (last_open_dir) {
+		g_free(last_open_dir);
+	}
+
+	if (dirname) {
+		len = strlen(dirname);
+		if (dirname[len-1] != '/') {
+			last_open_dir = g_strconcat(dirname, "/", NULL);
+		}
+	}
+	else {
+		last_open_dir = NULL;
+	}
+}
Index: gtk/main.h
===================================================================
RCS file: /usr/local/cvsroot/ethereal/gtk/main.h,v
retrieving revision 1.21
diff -u -r1.21 gtk/main.h
--- gtk/main.h	2001/03/02 23:10:12	1.21
+++ gtk/main.h	2001/04/09 21:27:02
@@ -65,5 +65,6 @@
 
 char *boldify(const char *);
 void set_fonts(GdkFont *regular, GdkFont *bold);
+void set_last_open_dir(char *dirname);
 
 #endif /* __MAIN_H__ */