filebrowser: Don't leak GFiles

e2f792359a
This commit is contained in:
JosephMcc 2017-02-13 15:57:16 -08:00
parent fe9e6ac91c
commit fa31c65c2f
5 changed files with 116 additions and 67 deletions

View File

@ -323,37 +323,36 @@ set_item_message (WindowData *data,
XedFileBrowserStore *store; XedFileBrowserStore *store;
GFile *location; GFile *location;
guint flags = 0; guint flags = 0;
gchar *track_id;
store = xed_file_browser_widget_get_browser_store (data->widget); store = xed_file_browser_widget_get_browser_store (data->widget);
gtk_tree_model_get (GTK_TREE_MODEL (store), iter, gtk_tree_model_get (GTK_TREE_MODEL (store), iter,
XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location,
XED_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, XED_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags,
-1); -1);
if (!location) if (location)
{ {
return; gchar *track_id;
}
if (path && gtk_tree_path_get_depth (path) != 0) if (path && gtk_tree_path_get_depth (path) != 0)
{ {
track_id = track_row (data, store, path, location); track_id = track_row (data, store, path, location);
} }
else else
{ {
track_id = NULL; track_id = NULL;
} }
xed_message_set (message, "id", track_id, "location", location, NULL); xed_message_set (message, "id", track_id, "location", location, NULL);
if (xed_message_has_key (message, "is_directory")) if (xed_message_has_key (message, "is_directory"))
{ {
xed_message_set (message, "is_directory", FILE_IS_DIR (flags), NULL); xed_message_set (message, "is_directory", FILE_IS_DIR (flags), NULL);
}
g_free (track_id);
g_object_unref (location);
} }
g_free (track_id);
} }
static gboolean static gboolean
@ -387,6 +386,8 @@ custom_message_filter_func (XedFileBrowserWidget *widget,
xed_message_bus_send_message_sync (wdata->bus, data->message); xed_message_bus_send_message_sync (wdata->bus, data->message);
xed_message_get (data->message, "filter", &filter, NULL); xed_message_get (data->message, "filter", &filter, NULL);
g_object_unref (location);
return !filter; return !filter;
} }

View File

@ -349,9 +349,6 @@ on_action_open_terminal (GtkAction *action,
XedFileBrowserPlugin *plugin) XedFileBrowserPlugin *plugin)
{ {
XedFileBrowserPluginPrivate *priv = plugin->priv; XedFileBrowserPluginPrivate *priv = plugin->priv;
gchar *terminal;
gchar *local;
gchar *argv[2];
GFile *file; GFile *file;
GtkTreeIter iter; GtkTreeIter iter;
@ -366,29 +363,32 @@ on_action_open_terminal (GtkAction *action,
store = xed_file_browser_widget_get_browser_store (priv->tree_widget); store = xed_file_browser_widget_get_browser_store (priv->tree_widget);
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &file, -1); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &file, -1);
if (file == NULL) if (file)
{ {
return; gchar *terminal;
gchar *local;
gchar *argv[2];
terminal = get_terminal (plugin);
local = g_file_get_path (file);
argv[0] = terminal;
argv[1] = NULL;
g_spawn_async (local,
argv,
NULL,
G_SPAWN_SEARCH_PATH,
NULL,
NULL,
NULL,
NULL);
g_free (terminal);
g_free (local);
g_object_unref (file);
} }
terminal = get_terminal (plugin);
local = g_file_get_path (file);
argv[0] = terminal;
argv[1] = NULL;
g_spawn_async (local,
argv,
NULL,
G_SPAWN_SEARCH_PATH,
NULL,
NULL,
NULL,
NULL);
g_free (terminal);
g_free (local);
} }
static void static void
@ -400,7 +400,6 @@ on_selection_changed_cb (GtkTreeSelection *selection,
GtkTreeModel *model; GtkTreeModel *model;
GtkTreeIter iter; GtkTreeIter iter;
gboolean sensitive; gboolean sensitive;
GFile *location;
tree_view = GTK_TREE_VIEW (xed_file_browser_widget_get_browser_view (priv->tree_widget)); tree_view = GTK_TREE_VIEW (xed_file_browser_widget_get_browser_view (priv->tree_widget));
model = gtk_tree_view_get_model (tree_view); model = gtk_tree_view_get_model (tree_view);
@ -414,9 +413,19 @@ on_selection_changed_cb (GtkTreeSelection *selection,
if (sensitive) if (sensitive)
{ {
GFile *location;
gtk_tree_model_get (model, &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1); gtk_tree_model_get (model, &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1);
sensitive = g_file_has_uri_scheme (location, "file"); if (location)
{
sensitive = g_file_has_uri_scheme (location, "file");
g_object_unref (location);
}
else
{
sensitive = FALSE;
}
} }
gtk_action_set_sensitive (gtk_action_group_get_action (priv->single_selection_action_group, "OpenTerminal"), sensitive); gtk_action_set_sensitive (gtk_action_group_get_action (priv->single_selection_action_group, "OpenTerminal"), sensitive);
@ -927,11 +936,18 @@ get_filename_from_path (GtkTreeModel *model,
{ {
GtkTreeIter iter; GtkTreeIter iter;
GFile *location; GFile *location;
gchar *ret = NULL;
gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1); gtk_tree_model_get (model, &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1);
return xed_file_browser_utils_file_basename (location); if (location)
{
ret = xed_file_browser_utils_file_basename (location);
g_object_unref (location);
}
return ret;
} }
static gboolean static gboolean

View File

@ -1027,6 +1027,7 @@ xed_file_browser_store_drag_data_get (GtkTreeDragSource *drag_source,
ret = gtk_selection_data_set_uris (selection_data, uris); ret = gtk_selection_data_set_uris (selection_data, uris);
g_free (uris[0]); g_free (uris[0]);
g_object_unref (location);
return ret; return ret;
} }

View File

@ -165,7 +165,6 @@ row_expanded (GtkTreeView *tree_view,
GtkTreePath *path) GtkTreePath *path)
{ {
XedFileBrowserView *view = XED_FILE_BROWSER_VIEW (tree_view); XedFileBrowserView *view = XED_FILE_BROWSER_VIEW (tree_view);
GFile *location;
if (GTK_TREE_VIEW_CLASS (xed_file_browser_view_parent_class)->row_expanded) if (GTK_TREE_VIEW_CLASS (xed_file_browser_view_parent_class)->row_expanded)
{ {
@ -179,9 +178,16 @@ row_expanded (GtkTreeView *tree_view,
if (view->priv->restore_expand_state) if (view->priv->restore_expand_state)
{ {
GFile *location;
gtk_tree_model_get (view->priv->model, iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1); gtk_tree_model_get (view->priv->model, iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1);
add_expand_state (view, location); add_expand_state (view, location);
if (location)
{
g_object_unref (location);
}
} }
_xed_file_browser_store_iter_expanded (XED_FILE_BROWSER_STORE (view->priv->model), iter); _xed_file_browser_store_iter_expanded (XED_FILE_BROWSER_STORE (view->priv->model), iter);
@ -193,7 +199,6 @@ row_collapsed (GtkTreeView *tree_view,
GtkTreePath *path) GtkTreePath *path)
{ {
XedFileBrowserView *view = XED_FILE_BROWSER_VIEW (tree_view); XedFileBrowserView *view = XED_FILE_BROWSER_VIEW (tree_view);
GFile *location;
if (GTK_TREE_VIEW_CLASS (xed_file_browser_view_parent_class)->row_collapsed) if (GTK_TREE_VIEW_CLASS (xed_file_browser_view_parent_class)->row_collapsed)
{ {
@ -207,9 +212,16 @@ row_collapsed (GtkTreeView *tree_view,
if (view->priv->restore_expand_state) if (view->priv->restore_expand_state)
{ {
GFile *location;
gtk_tree_model_get (view->priv->model, iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1); gtk_tree_model_get (view->priv->model, iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1);
remove_expand_state (view, location); remove_expand_state (view, location);
if (location)
{
g_object_unref (location);
}
} }
_xed_file_browser_store_iter_collapsed (XED_FILE_BROWSER_STORE (view->priv->model), iter); _xed_file_browser_store_iter_collapsed (XED_FILE_BROWSER_STORE (view->priv->model), iter);
@ -747,7 +759,6 @@ fill_expand_state (XedFileBrowserView *view,
{ {
GtkTreePath * path; GtkTreePath * path;
GtkTreeIter child; GtkTreeIter child;
GFile *location;
if (!gtk_tree_model_iter_has_child (view->priv->model, iter)) if (!gtk_tree_model_iter_has_child (view->priv->model, iter))
{ {
@ -758,6 +769,8 @@ fill_expand_state (XedFileBrowserView *view,
if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), path)) if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), path))
{ {
GFile *location;
gtk_tree_model_get (view->priv->model, gtk_tree_model_get (view->priv->model,
iter, iter,
XED_FILE_BROWSER_STORE_COLUMN_LOCATION, XED_FILE_BROWSER_STORE_COLUMN_LOCATION,
@ -765,6 +778,11 @@ fill_expand_state (XedFileBrowserView *view,
-1); -1);
add_expand_state (view, location); add_expand_state (view, location);
if (location)
{
g_object_unref (location);
}
} }
if (gtk_tree_model_iter_children (view->priv->model, &child, iter)) if (gtk_tree_model_iter_children (view->priv->model, &child, iter))
@ -1269,7 +1287,6 @@ restore_expand_state (XedFileBrowserView *view,
GtkTreeIter *iter) GtkTreeIter *iter)
{ {
GFile *location; GFile *location;
GtkTreePath *path;
gtk_tree_model_get (GTK_TREE_MODEL (model), gtk_tree_model_get (GTK_TREE_MODEL (model),
iter, iter,
@ -1277,19 +1294,20 @@ restore_expand_state (XedFileBrowserView *view,
&location, &location,
-1); -1);
if (!location) if (location)
{ {
return; GtkTreePath *path;
path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), iter);
if (g_hash_table_lookup (view->priv->expand_state, location))
{
gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, FALSE);
}
gtk_tree_path_free (path);
g_object_unref (location);
} }
path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), iter);
if (g_hash_table_lookup (view->priv->expand_state, location))
{
gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, FALSE);
}
gtk_tree_path_free (path);
} }
static void static void

View File

@ -2493,6 +2493,11 @@ file_open (XedFileBrowserWidget *obj,
{ {
g_signal_emit (obj, signals[LOCATION_ACTIVATED], 0, location); g_signal_emit (obj, signals[LOCATION_ACTIVATED], 0, location);
} }
if (location)
{
g_object_unref (location);
}
} }
static gboolean static gboolean
@ -2526,6 +2531,7 @@ directory_open (XedFileBrowserWidget *obj,
} }
g_free (uri); g_free (uri);
g_object_unref (location);
} }
return result; return result;
@ -2577,11 +2583,6 @@ on_virtual_root_changed (XedFileBrowserStore *model,
XedFileBrowserWidget *obj) XedFileBrowserWidget *obj)
{ {
GtkTreeIter iter; GtkTreeIter iter;
GFile *location;
GtkTreeIter root;
GtkAction *action;
Location *loc;
GdkPixbuf *pixbuf;
if (gtk_tree_view_get_model (GTK_TREE_VIEW (obj->priv->treeview)) != GTK_TREE_MODEL (obj->priv->file_store)) if (gtk_tree_view_get_model (GTK_TREE_VIEW (obj->priv->treeview)) != GTK_TREE_MODEL (obj->priv->file_store))
{ {
@ -2590,12 +2591,20 @@ on_virtual_root_changed (XedFileBrowserStore *model,
if (xed_file_browser_store_get_iter_virtual_root (model, &iter)) if (xed_file_browser_store_get_iter_virtual_root (model, &iter))
{ {
GFile *location;
GtkTreeIter root;
gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1); gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, XED_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, -1);
if (xed_file_browser_store_get_iter_root (model, &root)) if (xed_file_browser_store_get_iter_root (model, &root))
{ {
GtkAction *action;
if (!obj->priv->changing_location) if (!obj->priv->changing_location)
{ {
Location *loc;
GdkPixbuf *pixbuf;
/* Remove all items from obj->priv->current_location on */ /* Remove all items from obj->priv->current_location on */
if (obj->priv->current_location) if (obj->priv->current_location)
{ {
@ -2632,7 +2641,6 @@ on_virtual_root_changed (XedFileBrowserStore *model,
{ {
g_object_unref (pixbuf); g_object_unref (pixbuf);
} }
} }
action = gtk_action_group_get_action (obj->priv->action_group, "DirectoryUp"); action = gtk_action_group_get_action (obj->priv->action_group, "DirectoryUp");
@ -2650,6 +2658,11 @@ on_virtual_root_changed (XedFileBrowserStore *model,
} }
check_current_item (obj, TRUE); check_current_item (obj, TRUE);
if (location)
{
g_object_unref (location);
}
} }
else else
{ {