]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkfilechooserutils.c
label: Fix memleak
[~andy/gtk] / gtk / gtkfilechooserutils.c
index c7f34550ccc23afb5c0d4033a281b546f08b3fe4..43148aa9c34654a9f33749f6b70978e18d213d51 100644 (file)
@@ -14,9 +14,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
@@ -25,7 +23,7 @@
 #include "gtkfilesystem.h"
 #include "gtktypebuiltins.h"
 #include "gtkintl.h"
-#include "gtkalias.h"
+
 
 static gboolean       delegate_set_current_folder     (GtkFileChooser    *chooser,
                                                       GFile             *file,
@@ -90,9 +88,6 @@ _gtk_file_chooser_install_properties (GObjectClass *klass)
   g_object_class_override_property (klass,
                                    GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET,
                                    "extra-widget");
-  g_object_class_override_property (klass,
-                                   GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND,
-                                   "file-system-backend");
   g_object_class_override_property (klass,
                                    GTK_FILE_CHOOSER_PROP_FILTER,
                                    "filter");
@@ -117,6 +112,9 @@ _gtk_file_chooser_install_properties (GObjectClass *klass)
   g_object_class_override_property (klass,
                                    GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION,
                                    "do-overwrite-confirmation");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_CREATE_FOLDERS,
+                                   "create-folders");
 }
 
 /**
@@ -207,14 +205,14 @@ delegate_select_file (GtkFileChooser    *chooser,
                      GFile             *file,
                      GError           **error)
 {
-  return _gtk_file_chooser_select_file (get_delegate (chooser), file, error);
+  return gtk_file_chooser_select_file (get_delegate (chooser), file, error);
 }
 
 static void
 delegate_unselect_file (GtkFileChooser *chooser,
                        GFile          *file)
 {
-  _gtk_file_chooser_unselect_file (get_delegate (chooser), file);
+  gtk_file_chooser_unselect_file (get_delegate (chooser), file);
 }
 
 static void
@@ -232,13 +230,13 @@ delegate_unselect_all (GtkFileChooser *chooser)
 static GSList *
 delegate_get_files (GtkFileChooser *chooser)
 {
-  return _gtk_file_chooser_get_files (get_delegate (chooser));
+  return gtk_file_chooser_get_files (get_delegate (chooser));
 }
 
 static GFile *
 delegate_get_preview_file (GtkFileChooser *chooser)
 {
-  return _gtk_file_chooser_get_preview_file (get_delegate (chooser));
+  return gtk_file_chooser_get_preview_file (get_delegate (chooser));
 }
 
 static GtkFileSystem *
@@ -286,7 +284,7 @@ delegate_remove_shortcut_folder (GtkFileChooser  *chooser,
 static GSList *
 delegate_list_shortcut_folders (GtkFileChooser *chooser)
 {
-  return gtk_file_chooser_list_shortcut_folders (get_delegate (chooser));
+  return _gtk_file_chooser_list_shortcut_folder_files (get_delegate (chooser));
 }
 
 static gboolean
@@ -294,13 +292,13 @@ delegate_set_current_folder (GtkFileChooser  *chooser,
                             GFile           *file,
                             GError         **error)
 {
-  return _gtk_file_chooser_set_current_folder_file (get_delegate (chooser), file, error);
+  return gtk_file_chooser_set_current_folder_file (get_delegate (chooser), file, error);
 }
 
 static GFile *
 delegate_get_current_folder (GtkFileChooser *chooser)
 {
-  return _gtk_file_chooser_get_current_folder_file (get_delegate (chooser));
+  return gtk_file_chooser_get_current_folder_file (get_delegate (chooser));
 }
 
 static void
@@ -360,3 +358,86 @@ delegate_confirm_overwrite (GtkFileChooser    *chooser,
   g_signal_emit_by_name (data, "confirm-overwrite", &conf);
   return conf;
 }
+
+static GFile *
+get_parent_for_uri (const char *uri)
+{
+  GFile *file;
+  GFile *parent;
+
+  file = g_file_new_for_uri (uri);
+  parent = g_file_get_parent (file);
+
+  g_object_unref (file);
+  return parent;
+       
+}
+
+/* Extracts the parent folders out of the supplied list of GtkRecentInfo* items, and returns
+ * a list of GFile* for those unique parents.
+ */
+GList *
+_gtk_file_chooser_extract_recent_folders (GList *infos)
+{
+  GList *l;
+  GList *result;
+  GHashTable *folders;
+
+  result = NULL;
+
+  folders = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal);
+
+  for (l = infos; l; l = l->next)
+    {
+      GtkRecentInfo *info = l->data;
+      const char *uri;
+      GFile *parent;
+
+      uri = gtk_recent_info_get_uri (info);
+      parent = get_parent_for_uri (uri);
+
+      if (parent)
+       {
+         if (!g_hash_table_lookup (folders, parent))
+           {
+             g_hash_table_insert (folders, parent, (gpointer) 1);
+             result = g_list_prepend (result, g_object_ref (parent));
+           }
+
+         g_object_unref (parent);
+       }
+    }
+
+  result = g_list_reverse (result);
+
+  g_hash_table_destroy (folders);
+
+  return result;
+}
+
+GSettings *
+_gtk_file_chooser_get_settings_for_widget (GtkWidget *widget)
+{
+  static GQuark file_chooser_settings_quark = 0;
+  GtkSettings *gtksettings;
+  GSettings *settings;
+
+  if (G_UNLIKELY (file_chooser_settings_quark == 0))
+    file_chooser_settings_quark = g_quark_from_static_string ("-gtk-file-chooser-settings");
+
+  gtksettings = gtk_widget_get_settings (widget);
+  settings = g_object_get_qdata (G_OBJECT (gtksettings), file_chooser_settings_quark);
+
+  if (G_UNLIKELY (settings == NULL))
+    {
+      settings = g_settings_new ("org.gtk.Settings.FileChooser");
+      g_settings_delay (settings);
+
+      g_object_set_qdata_full (G_OBJECT (gtksettings),
+                               file_chooser_settings_quark,
+                               settings,
+                               g_object_unref);
+    }
+
+  return settings;
+}