X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkrecentmanager.c;h=310efe077126223be5bb33dbbcedb2a548909a4d;hb=HEAD;hp=a674b5d982a5e5e5ef41cf1ec08038e009d6e876;hpb=e8be9ec01f8f3a6416d458acc49a973082de1213;p=~andy%2Fgtk diff --git a/gtk/gtkrecentmanager.c b/gtk/gtkrecentmanager.c index a674b5d98..310efe077 100644 --- a/gtk/gtkrecentmanager.c +++ b/gtk/gtkrecentmanager.c @@ -14,8 +14,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * License along with this library. If not, see . */ /** @@ -214,6 +213,7 @@ static void gtk_recent_manager_set_filename (GtkRecentManager *manag const gchar *filename); static void gtk_recent_manager_clamp_to_age (GtkRecentManager *manager, gint age); +static void gtk_recent_manager_enabled_changed (GtkRecentManager *manager); static void build_recent_items_list (GtkRecentManager *manager); @@ -281,7 +281,7 @@ gtk_recent_manager_class_init (GtkRecentManagerClass *klass) gobject_class->finalize = gtk_recent_manager_finalize; /** - * GtkRecentManager:filename + * GtkRecentManager:filename: * * The full path to the file to be used to store and read the recently * used resources list @@ -297,7 +297,7 @@ gtk_recent_manager_class_init (GtkRecentManagerClass *klass) (G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE))); /** - * GtkRecentManager:size + * GtkRecentManager:size: * * The size of the recently used resources list. * @@ -314,7 +314,7 @@ gtk_recent_manager_class_init (GtkRecentManagerClass *klass) G_PARAM_READABLE)); /** - * GtkRecentManager::changed + * GtkRecentManager::changed: * @recent_manager: the recent manager * * Emitted when the current recently used resources manager changes its @@ -341,6 +341,7 @@ static void gtk_recent_manager_init (GtkRecentManager *manager) { GtkRecentManagerPrivate *priv; + GtkSettings *settings; manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, GTK_TYPE_RECENT_MANAGER, @@ -349,6 +350,10 @@ gtk_recent_manager_init (GtkRecentManager *manager) priv->size = 0; priv->filename = NULL; + + settings = gtk_settings_get_default (); + g_signal_connect_swapped (settings, "notify::gtk-recent-files-enabled", + G_CALLBACK (gtk_recent_manager_enabled_changed), manager); } static void @@ -438,6 +443,13 @@ gtk_recent_manager_dispose (GObject *gobject) G_OBJECT_CLASS (gtk_recent_manager_parent_class)->dispose (gobject); } +static void +gtk_recent_manager_enabled_changed (GtkRecentManager *manager) +{ + manager->priv->is_dirty = TRUE; + gtk_recent_manager_changed (manager); +} + static void gtk_recent_manager_real_changed (GtkRecentManager *manager) { @@ -466,15 +478,20 @@ gtk_recent_manager_real_changed (GtkRecentManager *manager) { GtkSettings *settings = gtk_settings_get_default (); gint age = 30; + gboolean enabled; - g_object_get (G_OBJECT (settings), "gtk-recent-files-max-age", &age, NULL); - if (age > 0) - gtk_recent_manager_clamp_to_age (manager, age); - else if (age == 0) + g_object_get (G_OBJECT (settings), + "gtk-recent-files-max-age", &age, + "gtk-recent-files-enabled", &enabled, + NULL); + + if (age == 0 || !enabled) { g_bookmark_file_free (priv->recent_items); priv->recent_items = g_bookmark_file_new (); } + else if (age > 0) + gtk_recent_manager_clamp_to_age (manager, age); } write_error = NULL; @@ -540,6 +557,18 @@ gtk_recent_manager_monitor_changed (GFileMonitor *monitor, static gchar * get_default_filename (void) { + if (g_mkdir_with_parents (g_get_user_data_dir (), 0755) == -1) + { + int saved_errno = errno; + + g_critical ("Unable to create user data directory '%s' for storing " + "the recently used files list: %s", + g_get_user_data_dir (), + g_strerror (saved_errno)); + + return NULL; + } + return g_build_filename (g_get_user_data_dir (), GTK_RECENTLY_USED_FILE, NULL); @@ -729,7 +758,7 @@ gtk_recent_manager_add_item_query_info (GObject *source_object, GtkRecentManager *manager = user_data; GtkRecentData recent_data; GFileInfo *file_info; - gchar *uri; + gchar *uri, *basename; uri = g_file_get_uri (file); @@ -753,7 +782,11 @@ gtk_recent_manager_add_item_query_info (GObject *source_object, g_object_unref (file_info); } else - recent_data.mime_type = g_strdup (GTK_RECENT_DEFAULT_MIME); /* FIXME: maybe we should make up the MIME type from the filename's extension */ + { + basename = g_file_get_basename (file); + recent_data.mime_type = g_content_type_guess (basename, NULL, 0, NULL); + g_free (basename); + } recent_data.app_name = g_strdup (g_get_application_name ()); recent_data.app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL); @@ -860,6 +893,8 @@ gtk_recent_manager_add_full (GtkRecentManager *manager, const GtkRecentData *data) { GtkRecentManagerPrivate *priv; + GtkSettings *settings; + gboolean enabled; g_return_val_if_fail (GTK_IS_RECENT_MANAGER (manager), FALSE); g_return_val_if_fail (uri != NULL, FALSE); @@ -912,7 +947,12 @@ gtk_recent_manager_add_full (GtkRecentManager *manager, uri); return FALSE; } - + + settings = gtk_settings_get_default (); + g_object_get (G_OBJECT (settings), "gtk-recent-files-enabled", &enabled, NULL); + if (!enabled) + return TRUE; + priv = manager->priv; if (!priv->recent_items) @@ -1904,7 +1944,7 @@ get_icon_for_mime_type (const char *mime_type, return NULL; pixbuf = gtk_icon_info_load_icon (info, NULL); - gtk_icon_info_free (info); + g_object_unref (info); return pixbuf; }