diff --git a/gtk/gtkfilesystem.c b/gtk/gtkfilesystem.c index 05ab5a1ec2..8679bd232d 100644 --- a/gtk/gtkfilesystem.c +++ b/gtk/gtkfilesystem.c @@ -55,7 +55,6 @@ enum { }; enum { - BOOKMARKS_CHANGED, VOLUMES_CHANGED, FS_LAST_SIGNAL }; @@ -81,11 +80,6 @@ struct GtkFileSystemPrivate * of type GDrive, GVolume and GMount */ GSList *volumes; - - /* This list contains GtkFileSystemBookmark structs */ - GSList *bookmarks; - - GFileMonitor *bookmarks_monitor; }; struct AsyncFuncData @@ -99,24 +93,9 @@ struct AsyncFuncData gpointer data; }; -struct GtkFileSystemBookmark -{ - GFile *file; - gchar *label; -}; - G_DEFINE_TYPE (GtkFileSystem, _gtk_file_system, G_TYPE_OBJECT) -/* GtkFileSystemBookmark methods */ -void -_gtk_file_system_bookmark_free (GtkFileSystemBookmark *bookmark) -{ - g_object_unref (bookmark->file); - g_free (bookmark->label); - g_slice_free (GtkFileSystemBookmark, bookmark); -} - /* GtkFileSystem methods */ static void volumes_changed (GVolumeMonitor *volume_monitor, @@ -157,42 +136,12 @@ gtk_file_system_dispose (GObject *object) G_OBJECT_CLASS (_gtk_file_system_parent_class)->dispose (object); } -static void -gtk_file_system_finalize (GObject *object) -{ - GtkFileSystem *file_system = GTK_FILE_SYSTEM (object); - GtkFileSystemPrivate *priv = file_system->priv; - - DEBUG ("finalize"); - - if (priv->bookmarks_monitor) - g_object_unref (priv->bookmarks_monitor); - - if (priv->bookmarks) - { - g_slist_foreach (priv->bookmarks, (GFunc) _gtk_file_system_bookmark_free, NULL); - g_slist_free (priv->bookmarks); - } - - G_OBJECT_CLASS (_gtk_file_system_parent_class)->finalize (object); -} - static void _gtk_file_system_class_init (GtkFileSystemClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); object_class->dispose = gtk_file_system_dispose; - object_class->finalize = gtk_file_system_finalize; - - fs_signals[BOOKMARKS_CHANGED] = - g_signal_new ("bookmarks-changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkFileSystemClass, bookmarks_changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); fs_signals[VOLUMES_CHANGED] = g_signal_new ("volumes-changed", @@ -206,155 +155,6 @@ _gtk_file_system_class_init (GtkFileSystemClass *class) g_type_class_add_private (object_class, sizeof (GtkFileSystemPrivate)); } -static GFile * -get_legacy_bookmarks_file (void) -{ - GFile *file; - gchar *filename; - - filename = g_build_filename (g_get_home_dir (), ".gtk-bookmarks", NULL); - file = g_file_new_for_path (filename); - g_free (filename); - - return file; -} - -static GFile * -get_bookmarks_file (void) -{ - GFile *file; - gchar *filename; - - filename = g_build_filename (g_get_user_config_dir (), "gtk-3.0", "bookmarks", NULL); - file = g_file_new_for_path (filename); - g_free (filename); - - return file; -} - -static GSList * -read_bookmarks (GFile *file) -{ - gchar *contents; - gchar **lines, *space; - GSList *bookmarks = NULL; - gint i; - - if (!g_file_load_contents (file, NULL, &contents, - NULL, NULL, NULL)) - return NULL; - - lines = g_strsplit (contents, "\n", -1); - - for (i = 0; lines[i]; i++) - { - GtkFileSystemBookmark *bookmark; - - if (!*lines[i]) - continue; - - if (!g_utf8_validate (lines[i], -1, NULL)) - continue; - - bookmark = g_slice_new0 (GtkFileSystemBookmark); - - if ((space = strchr (lines[i], ' ')) != NULL) - { - space[0] = '\0'; - bookmark->label = g_strdup (space + 1); - } - - bookmark->file = g_file_new_for_uri (lines[i]); - bookmarks = g_slist_prepend (bookmarks, bookmark); - } - - bookmarks = g_slist_reverse (bookmarks); - g_strfreev (lines); - g_free (contents); - - return bookmarks; -} - -static void -save_bookmarks (GFile *bookmarks_file, - GSList *bookmarks) -{ - GError *error = NULL; - GString *contents; - GSList *l; - GFile *parent_file; - gchar *path; - - contents = g_string_new (""); - - for (l = bookmarks; l; l = l->next) - { - GtkFileSystemBookmark *bookmark = l->data; - gchar *uri; - - uri = g_file_get_uri (bookmark->file); - if (!uri) - continue; - - g_string_append (contents, uri); - - if (bookmark->label) - g_string_append_printf (contents, " %s", bookmark->label); - - g_string_append_c (contents, '\n'); - g_free (uri); - } - - parent_file = g_file_get_parent (bookmarks_file); - path = g_file_get_path (parent_file); - if (g_mkdir_with_parents (path, 0700) == 0) - { - if (!g_file_replace_contents (bookmarks_file, - contents->str, - strlen (contents->str), - NULL, FALSE, 0, NULL, - NULL, &error)) - { - g_critical ("%s", error->message); - g_error_free (error); - } - } - g_free (path); - g_object_unref (parent_file); - g_string_free (contents, TRUE); -} - -static void -bookmarks_file_changed (GFileMonitor *monitor, - GFile *file, - GFile *other_file, - GFileMonitorEvent event, - gpointer data) -{ - GtkFileSystem *file_system = GTK_FILE_SYSTEM (data); - GtkFileSystemPrivate *priv = file_system->priv; - - switch (event) - { - case G_FILE_MONITOR_EVENT_CHANGED: - case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: - case G_FILE_MONITOR_EVENT_CREATED: - case G_FILE_MONITOR_EVENT_DELETED: - g_slist_foreach (priv->bookmarks, (GFunc) _gtk_file_system_bookmark_free, NULL); - g_slist_free (priv->bookmarks); - - priv->bookmarks = read_bookmarks (file); - - gdk_threads_enter (); - g_signal_emit (data, fs_signals[BOOKMARKS_CHANGED], 0); - gdk_threads_leave (); - break; - default: - /* ignore at the moment */ - break; - } -} - static gboolean mount_referenced_by_volume_activation_root (GList *volumes, GMount *mount) { @@ -533,8 +333,6 @@ static void _gtk_file_system_init (GtkFileSystem *file_system) { GtkFileSystemPrivate *priv; - GFile *bookmarks_file; - GError *error = NULL; DEBUG ("init"); @@ -564,35 +362,6 @@ _gtk_file_system_init (GtkFileSystem *file_system) G_CALLBACK (volumes_changed), file_system); g_signal_connect (priv->volume_monitor, "drive-changed", G_CALLBACK (volumes_changed), file_system); - - /* Bookmarks */ - bookmarks_file = get_bookmarks_file (); - priv->bookmarks = read_bookmarks (bookmarks_file); - if (!priv->bookmarks) - { - GFile *legacy_bookmarks_file; - - /* Read the legacy one and write it to the new one */ - legacy_bookmarks_file = get_legacy_bookmarks_file (); - priv->bookmarks = read_bookmarks (legacy_bookmarks_file); - save_bookmarks (bookmarks_file, priv->bookmarks); - - g_object_unref (legacy_bookmarks_file); - } - - priv->bookmarks_monitor = g_file_monitor_file (bookmarks_file, - G_FILE_MONITOR_NONE, - NULL, &error); - if (error) - { - g_warning ("%s", error->message); - g_error_free (error); - } - else - g_signal_connect (priv->bookmarks_monitor, "changed", - G_CALLBACK (bookmarks_file_changed), file_system); - - g_object_unref (bookmarks_file); } /* GtkFileSystem public methods */ @@ -622,29 +391,6 @@ _gtk_file_system_list_volumes (GtkFileSystem *file_system) return list; } -GSList * -_gtk_file_system_list_bookmarks (GtkFileSystem *file_system) -{ - GtkFileSystemPrivate *priv = file_system->priv; - GSList *bookmarks, *files = NULL; - - DEBUG ("list_bookmarks"); - - bookmarks = priv->bookmarks; - - while (bookmarks) - { - GtkFileSystemBookmark *bookmark; - - bookmark = bookmarks->data; - bookmarks = bookmarks->next; - - files = g_slist_prepend (files, g_object_ref (bookmark->file)); - } - - return g_slist_reverse (files); -} - static void free_async_data (AsyncFuncData *async_data) { @@ -871,185 +617,6 @@ _gtk_file_system_mount_enclosing_volume (GtkFileSystem *file return cancellable; } -gboolean -_gtk_file_system_insert_bookmark (GtkFileSystem *file_system, - GFile *file, - gint position, - GError **error) -{ - GtkFileSystemPrivate *priv = file_system->priv; - GSList *bookmarks; - GtkFileSystemBookmark *bookmark; - gboolean result = TRUE; - GFile *bookmarks_file; - - bookmarks = priv->bookmarks; - - while (bookmarks) - { - bookmark = bookmarks->data; - bookmarks = bookmarks->next; - - if (g_file_equal (bookmark->file, file)) - { - /* File is already in bookmarks */ - result = FALSE; - break; - } - } - - if (!result) - { - gchar *uri = g_file_get_uri (file); - - g_set_error (error, - GTK_FILE_CHOOSER_ERROR, - GTK_FILE_CHOOSER_ERROR_ALREADY_EXISTS, - "%s already exists in the bookmarks list", - uri); - - g_free (uri); - - return FALSE; - } - - bookmark = g_slice_new0 (GtkFileSystemBookmark); - bookmark->file = g_object_ref (file); - - priv->bookmarks = g_slist_insert (priv->bookmarks, bookmark, position); - - bookmarks_file = get_bookmarks_file (); - save_bookmarks (bookmarks_file, priv->bookmarks); - g_object_unref (bookmarks_file); - - g_signal_emit (file_system, fs_signals[BOOKMARKS_CHANGED], 0); - - return TRUE; -} - -gboolean -_gtk_file_system_remove_bookmark (GtkFileSystem *file_system, - GFile *file, - GError **error) -{ - GtkFileSystemPrivate *priv = file_system->priv; - GtkFileSystemBookmark *bookmark; - GSList *bookmarks; - gboolean result = FALSE; - GFile *bookmarks_file; - - if (!priv->bookmarks) - return FALSE; - - bookmarks = priv->bookmarks; - - while (bookmarks) - { - bookmark = bookmarks->data; - - if (g_file_equal (bookmark->file, file)) - { - result = TRUE; - priv->bookmarks = g_slist_remove_link (priv->bookmarks, bookmarks); - _gtk_file_system_bookmark_free (bookmark); - g_slist_free_1 (bookmarks); - break; - } - - bookmarks = bookmarks->next; - } - - if (!result) - { - gchar *uri = g_file_get_uri (file); - - g_set_error (error, - GTK_FILE_CHOOSER_ERROR, - GTK_FILE_CHOOSER_ERROR_NONEXISTENT, - "%s does not exist in the bookmarks list", - uri); - - g_free (uri); - - return FALSE; - } - - bookmarks_file = get_bookmarks_file (); - save_bookmarks (bookmarks_file, priv->bookmarks); - g_object_unref (bookmarks_file); - - g_signal_emit (file_system, fs_signals[BOOKMARKS_CHANGED], 0); - - return TRUE; -} - -gchar * -_gtk_file_system_get_bookmark_label (GtkFileSystem *file_system, - GFile *file) -{ - GtkFileSystemPrivate *priv = file_system->priv; - GSList *bookmarks; - gchar *label = NULL; - - DEBUG ("get_bookmark_label"); - - bookmarks = priv->bookmarks; - - while (bookmarks) - { - GtkFileSystemBookmark *bookmark; - - bookmark = bookmarks->data; - bookmarks = bookmarks->next; - - if (g_file_equal (file, bookmark->file)) - { - label = g_strdup (bookmark->label); - break; - } - } - - return label; -} - -void -_gtk_file_system_set_bookmark_label (GtkFileSystem *file_system, - GFile *file, - const gchar *label) -{ - GtkFileSystemPrivate *priv = file_system->priv; - gboolean changed = FALSE; - GFile *bookmarks_file; - GSList *bookmarks; - - DEBUG ("set_bookmark_label"); - - bookmarks = priv->bookmarks; - - while (bookmarks) - { - GtkFileSystemBookmark *bookmark; - - bookmark = bookmarks->data; - bookmarks = bookmarks->next; - - if (g_file_equal (file, bookmark->file)) - { - g_free (bookmark->label); - bookmark->label = g_strdup (label); - changed = TRUE; - break; - } - } - - bookmarks_file = get_bookmarks_file (); - save_bookmarks (bookmarks_file, priv->bookmarks); - g_object_unref (bookmarks_file); - - if (changed) - g_signal_emit_by_name (file_system, "bookmarks-changed", 0); -} - GtkFileSystemVolume * _gtk_file_system_get_volume_for_file (GtkFileSystem *file_system, GFile *file) diff --git a/gtk/gtkfilesystem.h b/gtk/gtkfilesystem.h index 83e1f34d56..9bbc06d7a3 100644 --- a/gtk/gtkfilesystem.h +++ b/gtk/gtkfilesystem.h @@ -37,7 +37,6 @@ typedef struct GtkFileSystemClass GtkFileSystemClass; typedef struct GtkFileSystemVolume GtkFileSystemVolume; /* opaque struct */ -typedef struct GtkFileSystemBookmark GtkFileSystemBookmark; /* opaque struct */ struct GtkFileSystem @@ -51,7 +50,6 @@ struct GtkFileSystemClass { GObjectClass parent_class; - void (*bookmarks_changed) (GtkFileSystem *file_system); void (*volumes_changed) (GtkFileSystem *file_system); }; @@ -71,7 +69,6 @@ GType _gtk_file_system_get_type (void) G_GNUC_CONST; GtkFileSystem * _gtk_file_system_new (void); GSList * _gtk_file_system_list_volumes (GtkFileSystem *file_system); -GSList * _gtk_file_system_list_bookmarks (GtkFileSystem *file_system); GCancellable * _gtk_file_system_get_info (GtkFileSystem *file_system, GFile *file, @@ -89,20 +86,6 @@ GCancellable * _gtk_file_system_mount_enclosing_volume (GtkFileSystem GtkFileSystemVolumeMountCallback callback, gpointer data); -gboolean _gtk_file_system_insert_bookmark (GtkFileSystem *file_system, - GFile *file, - gint position, - GError **error); -gboolean _gtk_file_system_remove_bookmark (GtkFileSystem *file_system, - GFile *file, - GError **error); - -gchar * _gtk_file_system_get_bookmark_label (GtkFileSystem *file_system, - GFile *file); -void _gtk_file_system_set_bookmark_label (GtkFileSystem *file_system, - GFile *file, - const gchar *label); - GtkFileSystemVolume * _gtk_file_system_get_volume_for_file (GtkFileSystem *file_system, GFile *file); @@ -118,9 +101,6 @@ GdkPixbuf * _gtk_file_system_volume_render_icon (GtkFileSystemVol GtkFileSystemVolume *_gtk_file_system_volume_ref (GtkFileSystemVolume *volume); void _gtk_file_system_volume_unref (GtkFileSystemVolume *volume); -/* GtkFileSystemBookmark methods */ -void _gtk_file_system_bookmark_free (GtkFileSystemBookmark *bookmark); - /* GFileInfo helper functions */ GdkPixbuf * _gtk_file_info_render_icon (GFileInfo *info, GtkWidget *widget,