]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkrecentmanager.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtkrecentmanager.c
index a674b5d982a5e5e5ef41cf1ec08038e009d6e876..310efe077126223be5bb33dbbcedb2a548909a4d 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
  */
 
 /**
@@ -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;
 }