summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog24
-rw-r--r--ChangeLog.pre-2-1024
-rw-r--r--ChangeLog.pre-2-424
-rw-r--r--ChangeLog.pre-2-624
-rw-r--r--ChangeLog.pre-2-824
-rw-r--r--gtk/gtkfilechooserdialog.c2
-rw-r--r--gtk/gtkfilesystemunix.c332
7 files changed, 406 insertions, 48 deletions
diff --git a/ChangeLog b/ChangeLog
index f819d711df..d7df7e09e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
2004-01-30 Federico Mena Quintero <federico@ximian.com>
+ Fix #129872, based on a patch by Jan Arne Petersen
+ <jpetersen@uni-bonn.de>
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_list_bookmarks):
+ Implement.
+ (gtk_file_system_unix_add_bookmark): Implement.
+ (gtk_file_system_unix_remove_bookmark): Implement.
+
+2004-01-29 Federico Mena Quintero <federico@ximian.com>
+
+ Fixes #132693.
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_get_parent): Don't
+ use filename_from_path(). Also, check that the filename is
+ absolute.
+ (gtk_file_system_unix_get_folder): Likewise.
+ (gtk_file_system_unix_create_folder): Likewise.
+ (gtk_file_system_unix_make_path): Likewise.
+ (gtk_file_system_unix_parse): Likewise.
+ (gtk_file_folder_unix_get_info): Likewise.
+ (filename_from_path): Removed.
+
+2004-01-30 Federico Mena Quintero <federico@ximian.com>
+
* gtk/gtkcalendar.c (arrow_action): Remove C++ comment; reported
by Damien Carbery <damien.carbery@sun.com>. Fixes #132956.
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index f819d711df..d7df7e09e3 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,5 +1,29 @@
2004-01-30 Federico Mena Quintero <federico@ximian.com>
+ Fix #129872, based on a patch by Jan Arne Petersen
+ <jpetersen@uni-bonn.de>
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_list_bookmarks):
+ Implement.
+ (gtk_file_system_unix_add_bookmark): Implement.
+ (gtk_file_system_unix_remove_bookmark): Implement.
+
+2004-01-29 Federico Mena Quintero <federico@ximian.com>
+
+ Fixes #132693.
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_get_parent): Don't
+ use filename_from_path(). Also, check that the filename is
+ absolute.
+ (gtk_file_system_unix_get_folder): Likewise.
+ (gtk_file_system_unix_create_folder): Likewise.
+ (gtk_file_system_unix_make_path): Likewise.
+ (gtk_file_system_unix_parse): Likewise.
+ (gtk_file_folder_unix_get_info): Likewise.
+ (filename_from_path): Removed.
+
+2004-01-30 Federico Mena Quintero <federico@ximian.com>
+
* gtk/gtkcalendar.c (arrow_action): Remove C++ comment; reported
by Damien Carbery <damien.carbery@sun.com>. Fixes #132956.
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index f819d711df..d7df7e09e3 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,5 +1,29 @@
2004-01-30 Federico Mena Quintero <federico@ximian.com>
+ Fix #129872, based on a patch by Jan Arne Petersen
+ <jpetersen@uni-bonn.de>
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_list_bookmarks):
+ Implement.
+ (gtk_file_system_unix_add_bookmark): Implement.
+ (gtk_file_system_unix_remove_bookmark): Implement.
+
+2004-01-29 Federico Mena Quintero <federico@ximian.com>
+
+ Fixes #132693.
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_get_parent): Don't
+ use filename_from_path(). Also, check that the filename is
+ absolute.
+ (gtk_file_system_unix_get_folder): Likewise.
+ (gtk_file_system_unix_create_folder): Likewise.
+ (gtk_file_system_unix_make_path): Likewise.
+ (gtk_file_system_unix_parse): Likewise.
+ (gtk_file_folder_unix_get_info): Likewise.
+ (filename_from_path): Removed.
+
+2004-01-30 Federico Mena Quintero <federico@ximian.com>
+
* gtk/gtkcalendar.c (arrow_action): Remove C++ comment; reported
by Damien Carbery <damien.carbery@sun.com>. Fixes #132956.
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index f819d711df..d7df7e09e3 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,5 +1,29 @@
2004-01-30 Federico Mena Quintero <federico@ximian.com>
+ Fix #129872, based on a patch by Jan Arne Petersen
+ <jpetersen@uni-bonn.de>
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_list_bookmarks):
+ Implement.
+ (gtk_file_system_unix_add_bookmark): Implement.
+ (gtk_file_system_unix_remove_bookmark): Implement.
+
+2004-01-29 Federico Mena Quintero <federico@ximian.com>
+
+ Fixes #132693.
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_get_parent): Don't
+ use filename_from_path(). Also, check that the filename is
+ absolute.
+ (gtk_file_system_unix_get_folder): Likewise.
+ (gtk_file_system_unix_create_folder): Likewise.
+ (gtk_file_system_unix_make_path): Likewise.
+ (gtk_file_system_unix_parse): Likewise.
+ (gtk_file_folder_unix_get_info): Likewise.
+ (filename_from_path): Removed.
+
+2004-01-30 Federico Mena Quintero <federico@ximian.com>
+
* gtk/gtkcalendar.c (arrow_action): Remove C++ comment; reported
by Damien Carbery <damien.carbery@sun.com>. Fixes #132956.
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index f819d711df..d7df7e09e3 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,5 +1,29 @@
2004-01-30 Federico Mena Quintero <federico@ximian.com>
+ Fix #129872, based on a patch by Jan Arne Petersen
+ <jpetersen@uni-bonn.de>
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_list_bookmarks):
+ Implement.
+ (gtk_file_system_unix_add_bookmark): Implement.
+ (gtk_file_system_unix_remove_bookmark): Implement.
+
+2004-01-29 Federico Mena Quintero <federico@ximian.com>
+
+ Fixes #132693.
+
+ * gtk/gtkfilesystemunix.c (gtk_file_system_unix_get_parent): Don't
+ use filename_from_path(). Also, check that the filename is
+ absolute.
+ (gtk_file_system_unix_get_folder): Likewise.
+ (gtk_file_system_unix_create_folder): Likewise.
+ (gtk_file_system_unix_make_path): Likewise.
+ (gtk_file_system_unix_parse): Likewise.
+ (gtk_file_folder_unix_get_info): Likewise.
+ (filename_from_path): Removed.
+
+2004-01-30 Federico Mena Quintero <federico@ximian.com>
+
* gtk/gtkcalendar.c (arrow_action): Remove C++ comment; reported
by Damien Carbery <damien.carbery@sun.com>. Fixes #132956.
diff --git a/gtk/gtkfilechooserdialog.c b/gtk/gtkfilechooserdialog.c
index 91b09fd8b2..2067f076e2 100644
--- a/gtk/gtkfilechooserdialog.c
+++ b/gtk/gtkfilechooserdialog.c
@@ -148,7 +148,7 @@ gtk_file_chooser_dialog_constructor (GType type,
g_signal_connect (priv->widget, "file-activated",
G_CALLBACK (file_chooser_widget_file_activated), object);
-
+
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (object)->vbox), priv->widget, TRUE, TRUE, 0);
gtk_widget_show (priv->widget);
diff --git a/gtk/gtkfilesystemunix.c b/gtk/gtkfilesystemunix.c
index fd5e93d948..5b1ce7769a 100644
--- a/gtk/gtkfilesystemunix.c
+++ b/gtk/gtkfilesystemunix.c
@@ -31,6 +31,10 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
+#include <stdio.h>
+
+#define BOOKMARKS_FILENAME ".gtk-bookmarks"
+#define BOOKMARKS_TMP_FILENAME ".gtk-bookmarks-XXXXXX"
typedef struct _GtkFileSystemUnixClass GtkFileSystemUnixClass;
@@ -174,7 +178,6 @@ static gboolean gtk_file_folder_unix_list_children (GtkFileFolder *folder,
GSList **children,
GError **error);
-static gchar * filename_from_path (const GtkFilePath *path);
static GtkFilePath *filename_to_path (const gchar *filename);
static gboolean filename_is_root (const char *filename);
@@ -312,13 +315,14 @@ gtk_file_system_unix_get_folder (GtkFileSystem *file_system,
GError **error)
{
GtkFileFolderUnix *folder_unix;
- gchar *filename;
+ const char *filename;
- filename = filename_from_path (path);
+ filename = gtk_file_path_get_string (path);
g_return_val_if_fail (filename != NULL, NULL);
+ g_return_val_if_fail (g_path_is_absolute (filename), NULL);
folder_unix = g_object_new (GTK_TYPE_FILE_FOLDER_UNIX, NULL);
- folder_unix->filename = filename;
+ folder_unix->filename = g_strdup (filename);
folder_unix->types = types;
return GTK_FILE_FOLDER (folder_unix);
@@ -329,11 +333,12 @@ gtk_file_system_unix_create_folder (GtkFileSystem *file_system,
const GtkFilePath *path,
GError **error)
{
- gchar *filename;
+ const char *filename;
gboolean result;
- filename = filename_from_path (path);
+ filename = gtk_file_path_get_string (path);
g_return_val_if_fail (filename != NULL, FALSE);
+ g_return_val_if_fail (g_path_is_absolute (filename), FALSE);
result = mkdir (filename, 0777) == 0;
@@ -349,8 +354,6 @@ gtk_file_system_unix_create_folder (GtkFileSystem *file_system,
g_free (filename_utf8);
}
- g_free (filename);
-
return result;
}
@@ -468,7 +471,7 @@ static void
icon_theme_changed (GtkIconTheme *icon_theme)
{
GHashTable *cache;
-
+
/* Difference from the initial creation is that we don't
* reconnect the signal
*/
@@ -487,13 +490,13 @@ get_cached_icon (GtkWidget *widget,
GtkIconTheme *icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget));
GHashTable *cache = g_object_get_data (G_OBJECT (icon_theme), "gtk-file-icon-cache");
IconCacheElement *element;
-
+
if (!cache)
{
cache = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify)g_free,
(GDestroyNotify)icon_cache_element_free);
-
+
g_object_set_data_full (G_OBJECT (icon_theme), "gtk-file-icon-cache",
cache, (GDestroyNotify)g_hash_table_destroy);
g_signal_connect (icon_theme, "changed",
@@ -536,8 +539,11 @@ gtk_file_system_unix_get_parent (GtkFileSystem *file_system,
GtkFilePath **parent,
GError **error)
{
- gchar *filename = filename_from_path (path);
+ const char *filename;
+
+ filename = gtk_file_path_get_string (path);
g_return_val_if_fail (filename != NULL, FALSE);
+ g_return_val_if_fail (g_path_is_absolute (filename), FALSE);
if (filename_is_root (filename))
{
@@ -550,8 +556,6 @@ gtk_file_system_unix_get_parent (GtkFileSystem *file_system,
g_free (parent_filename);
}
- g_free (filename);
-
return TRUE;
}
@@ -561,14 +565,15 @@ gtk_file_system_unix_make_path (GtkFileSystem *file_system,
const gchar *display_name,
GError **error)
{
- gchar *base_filename;
+ const char *base_filename;
gchar *filename;
gchar *full_filename;
GError *tmp_error = NULL;
GtkFilePath *result;
- base_filename = filename_from_path (base_path);
+ base_filename = gtk_file_path_get_string (base_path);
g_return_val_if_fail (base_filename != NULL, NULL);
+ g_return_val_if_fail (g_path_is_absolute (base_filename), NULL);
filename = g_filename_from_utf8 (display_name, -1, NULL, NULL, &tmp_error);
if (!filename)
@@ -580,14 +585,12 @@ gtk_file_system_unix_make_path (GtkFileSystem *file_system,
tmp_error->message);
g_error_free (tmp_error);
- g_free (base_filename);
return NULL;
}
full_filename = g_build_filename (base_filename, filename, NULL);
result = filename_to_path (full_filename);
- g_free (base_filename);
g_free (filename);
g_free (full_filename);
@@ -675,12 +678,13 @@ gtk_file_system_unix_parse (GtkFileSystem *file_system,
gchar **file_part,
GError **error)
{
- char *base_filename;
+ const char *base_filename;
gchar *last_slash;
gboolean result = FALSE;
- base_filename = filename_from_path (base_path);
+ base_filename = gtk_file_path_get_string (base_path);
g_return_val_if_fail (base_filename != NULL, FALSE);
+ g_return_val_if_fail (g_path_is_absolute (base_filename), FALSE);
last_slash = strrchr (str, G_DIR_SEPARATOR);
if (!last_slash)
@@ -731,8 +735,6 @@ gtk_file_system_unix_parse (GtkFileSystem *file_system,
}
}
- g_free (base_filename);
-
return result;
}
@@ -793,7 +795,7 @@ gtk_file_system_unix_render_icon (GtkFileSystem *file_system,
if (icon_type != ICON_REGULAR)
{
const char *name;
-
+
switch (icon_type)
{
case ICON_BLOCK_DEVICE:
@@ -856,17 +858,205 @@ gtk_file_system_unix_render_icon (GtkFileSystem *file_system,
return get_cached_icon (widget, "gnome-fs-regular", pixel_size);
}
+static void
+bookmark_list_free (GSList *list)
+{
+ GSList *l;
+
+ for (l = list; l; l = l->next)
+ g_free (l->data);
+
+ g_slist_free (list);
+}
+
+/* Returns whether a URI is a local file:// */
static gboolean
-gtk_file_system_unix_add_bookmark (GtkFileSystem *file_system,
- const GtkFilePath *path,
- GError **error)
+is_local_uri (const char *uri)
{
- /* FIXME: Implement as a really simple ~/.gtk-bookmarks */
+ char *filename;
+ char *hostname;
+ gboolean result;
+
+ /* This is rather crude, but hey */
+ filename = g_filename_from_uri (uri, &hostname, NULL);
+
+ result = (filename && !hostname);
+
+ g_free (filename);
+ g_free (hostname);
+
+ return result;
+}
+
+static char *
+bookmark_get_filename (gboolean tmp_file)
+{
+ char *filename;
+
+ filename = g_build_filename (g_get_home_dir (),
+ tmp_file ? BOOKMARKS_TMP_FILENAME : BOOKMARKS_FILENAME,
+ NULL);
+ g_assert (filename != NULL);
+ return filename;
+}
+
+static gboolean
+bookmark_list_read (GSList **bookmarks, GError **error)
+{
+ gchar *filename;
+ gchar *contents;
+ gboolean result;
+
+ filename = bookmark_get_filename (FALSE);
+ *bookmarks = NULL;
+
+ if (g_file_get_contents (filename, &contents, NULL, error))
+ {
+ gchar **lines = g_strsplit (contents, "\n", -1);
+ int i;
+ GHashTable *table;
+
+ table = g_hash_table_new (g_str_hash, g_str_equal);
+
+ for (i = 0; lines[i]; i++)
+ {
+ if (lines[i][0] && !g_hash_table_lookup (table, lines[i]))
+ {
+ *bookmarks = g_slist_prepend (*bookmarks, g_strdup (lines[i]));
+ g_hash_table_insert (table, lines[i], lines[i]);
+ }
+ }
+
+ g_free (contents);
+ g_hash_table_destroy (table);
+ g_strfreev (lines);
+
+ *bookmarks = g_slist_reverse (*bookmarks);
+ result = TRUE;
+ }
+
+ g_free (filename);
+
+ return result;
+}
+
+static gboolean
+bookmark_list_write (GSList *bookmarks, GError **error)
+{
+ char *tmp_filename;
+ char *filename;
+ gboolean result = TRUE;
+ FILE *file;
+ int fd;
+ int saved_errno;
+
+ /* First, write a temporary file */
+
+ tmp_filename = bookmark_get_filename (TRUE);
+ filename = bookmark_get_filename (FALSE);
+
+ fd = g_mkstemp (tmp_filename);
+ if (fd == -1)
+ {
+ saved_errno = errno;
+ goto io_error;
+ }
+
+ if ((file = fdopen (fd, "w")) != NULL)
+ {
+ GSList *l;
+
+ for (l = bookmarks; l; l = l->next)
+ if (fputs (l->data, file) == EOF
+ || fputs ("\n", file) == EOF)
+ {
+ saved_errno = errno;
+ goto io_error;
+ }
+
+ if (fclose (file) == EOF)
+ {
+ saved_errno = errno;
+ goto io_error;
+ }
+
+ if (rename (tmp_filename, filename) == -1)
+ {
+ saved_errno = errno;
+ goto io_error;
+ }
+
+ result = TRUE;
+ goto out;
+ }
+ else
+ {
+ saved_errno = errno;
+
+ /* fdopen() failed, so we can't do much error checking here anyway */
+ close (fd);
+ }
+
+ io_error:
+
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_FAILED,
- _("This file system does not support bookmarks"));
- return FALSE;
+ _("Bookmark saving failed (%s)"),
+ g_strerror (saved_errno));
+ result = FALSE;
+
+ if (fd != -1)
+ unlink (tmp_filename); /* again, not much error checking we can do here */
+
+ out:
+
+ g_free (filename);
+ g_free (tmp_filename);
+
+ return result;
+}
+
+static gboolean
+gtk_file_system_unix_add_bookmark (GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GError **error)
+{
+ GSList *bookmarks;
+ GSList *l;
+ char *uri;
+ gboolean result;
+
+ if (!bookmark_list_read (&bookmarks, error))
+ return FALSE;
+
+ result = FALSE;
+
+ uri = gtk_file_system_unix_path_to_uri (file_system, path);
+
+ for (l = bookmarks; l; l = l->next)
+ {
+ const char *bookmark;
+
+ bookmark = l->data;
+ if (strcmp (bookmark, uri) == 0)
+ break;
+ }
+
+ if (!l)
+ {
+ bookmarks = g_slist_append (bookmarks, g_strdup (uri));
+ if (bookmark_list_write (bookmarks, error))
+ {
+ result = TRUE;
+ g_signal_emit_by_name (file_system, "bookmarks-changed", 0);
+ }
+ }
+
+ g_free (uri);
+ bookmark_list_free (bookmarks);
+
+ return result;
}
static gboolean
@@ -874,19 +1064,74 @@ gtk_file_system_unix_remove_bookmark (GtkFileSystem *file_system,
const GtkFilePath *path,
GError **error)
{
- /* FIXME: Implement as a really simple ~/.gtk-bookmarks */
- g_set_error (error,
- GTK_FILE_SYSTEM_ERROR,
- GTK_FILE_SYSTEM_ERROR_FAILED,
- _("This file system does not support bookmarks"));
- return FALSE;
+ GSList *bookmarks;
+ char *uri;
+ GSList *l;
+ gboolean result;
+
+ if (!bookmark_list_read (&bookmarks, error))
+ return FALSE;
+
+ result = FALSE;
+
+ uri = gtk_file_system_path_to_uri (file_system, path);
+
+ for (l = bookmarks; l; l = l->next)
+ {
+ const char *bookmark;
+
+ bookmark = l->data;
+ if (strcmp (bookmark, uri) == 0)
+ break;
+ }
+
+ if (l)
+ {
+ g_free (l->data);
+ bookmarks = g_slist_remove_link (bookmarks, l);
+ g_slist_free_1 (l);
+
+ if (bookmark_list_write (bookmarks, error))
+ result = TRUE;
+ }
+ else
+ result = TRUE;
+
+ g_free (uri);
+ bookmark_list_free (bookmarks);
+
+ if (result)
+ g_signal_emit_by_name (file_system, "bookmarks-changed", 0);
+
+ return result;
}
static GSList *
gtk_file_system_unix_list_bookmarks (GtkFileSystem *file_system)
{
- /* FIXME: Implement as a really simple ~/.gtk-bookmarks */
- return NULL;
+ GSList *bookmarks;
+ GSList *result;
+ GSList *l;
+
+ if (!bookmark_list_read (&bookmarks, NULL))
+ return NULL;
+
+ result = NULL;
+
+ for (l = bookmarks; l; l = l->next)
+ {
+ const char *name;
+
+ name = l->data;
+
+ if (is_local_uri (name))
+ result = g_slist_prepend (result, gtk_file_system_unix_uri_to_path (file_system, name));
+ }
+
+ bookmark_list_free (bookmarks);
+
+ result = g_slist_reverse (result);
+ return result;
}
/*
@@ -970,10 +1215,11 @@ gtk_file_folder_unix_get_info (GtkFileFolder *folder,
GtkFileFolderUnix *folder_unix = GTK_FILE_FOLDER_UNIX (folder);
GtkFileInfo *info;
gchar *dirname;
- gchar *filename;
+ const char *filename;
- filename = filename_from_path (path);
+ filename = gtk_file_path_get_string (path);
g_return_val_if_fail (filename != NULL, NULL);
+ g_return_val_if_fail (g_path_is_absolute (filename), NULL);
dirname = g_path_get_dirname (filename);
g_return_val_if_fail (strcmp (dirname, folder_unix->filename) == 0, NULL);
@@ -981,8 +1227,6 @@ gtk_file_folder_unix_get_info (GtkFileFolder *folder,
info = filename_get_info (filename, folder_unix->types, error);
- g_free (filename);
-
return info;
}
@@ -1113,12 +1357,6 @@ filename_get_info (const gchar *filename,
return info;
}
-static gchar *
-filename_from_path (const GtkFilePath *path)
-{
- return g_strdup (gtk_file_path_get_string (path));
-}
-
static GtkFilePath *
filename_to_path (const char *filename)
{