mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-18 09:00:34 +00:00
Fix file chooser refcounting issues
This was reported in bug 600992.
This commit is contained in:
parent
2036d9262e
commit
bf88eee131
@ -1586,7 +1586,7 @@ model_free_row_data (GtkFileChooserButton *button,
|
||||
g_object_unref (data);
|
||||
break;
|
||||
case ROW_TYPE_VOLUME:
|
||||
_gtk_file_system_volume_free (data);
|
||||
_gtk_file_system_volume_unref (data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1777,11 +1777,16 @@ model_add_volumes (GtkFileChooserButton *button,
|
||||
GFile *base_file;
|
||||
|
||||
base_file = _gtk_file_system_volume_get_root (volume);
|
||||
if (base_file != NULL && !g_file_is_native (base_file))
|
||||
if (base_file != NULL)
|
||||
{
|
||||
_gtk_file_system_volume_free (volume);
|
||||
if (!g_file_is_native (base_file))
|
||||
{
|
||||
g_object_unref (base_file);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
g_object_unref (base_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1796,7 +1801,7 @@ model_add_volumes (GtkFileChooserButton *button,
|
||||
ICON_COLUMN, pixbuf,
|
||||
DISPLAY_NAME_COLUMN, display_name,
|
||||
TYPE_COLUMN, ROW_TYPE_VOLUME,
|
||||
DATA_COLUMN, volume,
|
||||
DATA_COLUMN, _gtk_file_system_volume_ref (volume),
|
||||
IS_FOLDER_COLUMN, TRUE,
|
||||
-1);
|
||||
|
||||
@ -2334,7 +2339,7 @@ update_label_and_image (GtkFileChooserButton *button)
|
||||
if (base_file)
|
||||
g_object_unref (base_file);
|
||||
|
||||
_gtk_file_system_volume_free (volume);
|
||||
_gtk_file_system_volume_unref (volume);
|
||||
|
||||
if (label_text)
|
||||
goto out;
|
||||
|
@ -762,14 +762,12 @@ shortcuts_free_row_data (GtkFileChooserDefault *impl,
|
||||
GtkFileSystemVolume *volume;
|
||||
|
||||
volume = col_data;
|
||||
_gtk_file_system_volume_free (volume);
|
||||
_gtk_file_system_volume_unref (volume);
|
||||
}
|
||||
else
|
||||
if (shortcut_type == SHORTCUT_TYPE_FILE)
|
||||
{
|
||||
GFile *file;
|
||||
|
||||
g_assert (shortcut_type == SHORTCUT_TYPE_FILE);
|
||||
|
||||
file = col_data;
|
||||
g_object_unref (file);
|
||||
}
|
||||
@ -2015,7 +2013,14 @@ shortcuts_add_volumes (GtkFileChooserDefault *impl)
|
||||
}
|
||||
}
|
||||
|
||||
shortcuts_insert_file (impl, start_row + n, SHORTCUT_TYPE_VOLUME, volume, NULL, NULL, FALSE, SHORTCUTS_VOLUMES);
|
||||
shortcuts_insert_file (impl,
|
||||
start_row + n,
|
||||
SHORTCUT_TYPE_VOLUME,
|
||||
_gtk_file_system_volume_ref (volume),
|
||||
NULL,
|
||||
NULL,
|
||||
FALSE,
|
||||
SHORTCUTS_VOLUMES);
|
||||
n++;
|
||||
}
|
||||
|
||||
@ -3437,9 +3442,7 @@ shortcuts_query_tooltip_cb (GtkWidget *widget,
|
||||
if (shortcut_type == SHORTCUT_TYPE_SEPARATOR)
|
||||
return FALSE;
|
||||
else if (shortcut_type == SHORTCUT_TYPE_VOLUME)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else if (shortcut_type == SHORTCUT_TYPE_FILE)
|
||||
{
|
||||
GFile *file;
|
||||
@ -9770,6 +9773,9 @@ shortcuts_activate_mount_enclosing_volume (GCancellable *cancellable,
|
||||
_gtk_file_system_get_info (data->impl->file_system, data->file,
|
||||
"standard::type",
|
||||
shortcuts_activate_get_info_cb, data);
|
||||
|
||||
if (volume)
|
||||
_gtk_file_system_volume_unref (volume);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -468,6 +468,8 @@ get_volumes_list (GtkFileSystem *file_system)
|
||||
|
||||
priv->volumes = g_slist_prepend (priv->volumes, g_object_ref (drive));
|
||||
}
|
||||
|
||||
g_object_unref (drive);
|
||||
}
|
||||
|
||||
g_list_free (drives);
|
||||
@ -499,6 +501,8 @@ get_volumes_list (GtkFileSystem *file_system)
|
||||
/* see comment above in why we add an icon for a volume */
|
||||
priv->volumes = g_slist_prepend (priv->volumes, g_object_ref (volume));
|
||||
}
|
||||
|
||||
g_object_unref (volume);
|
||||
}
|
||||
|
||||
/* add mounts that has no volume (/etc/mtab mounts, ftp, sftp,...) */
|
||||
@ -520,11 +524,13 @@ get_volumes_list (GtkFileSystem *file_system)
|
||||
*/
|
||||
if (mount_referenced_by_volume_activation_root (volumes, mount))
|
||||
{
|
||||
g_object_unref (mount);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* show this mount */
|
||||
priv->volumes = g_slist_prepend (priv->volumes, g_object_ref (mount));
|
||||
g_object_unref (mount);
|
||||
}
|
||||
|
||||
g_list_free (volumes);
|
||||
@ -1025,6 +1031,8 @@ enclosing_volume_mount_cb (GObject *source_object,
|
||||
|
||||
if (error)
|
||||
g_error_free (error);
|
||||
|
||||
_gtk_file_system_volume_unref (volume);
|
||||
}
|
||||
|
||||
GCancellable *
|
||||
@ -1802,8 +1810,22 @@ _gtk_file_system_volume_render_icon (GtkFileSystemVolume *volume,
|
||||
return pixbuf;
|
||||
}
|
||||
|
||||
GtkFileSystemVolume *
|
||||
_gtk_file_system_volume_ref (GtkFileSystemVolume *volume)
|
||||
{
|
||||
if (IS_ROOT_VOLUME (volume))
|
||||
return volume;
|
||||
|
||||
if (G_IS_MOUNT (volume) ||
|
||||
G_IS_VOLUME (volume) ||
|
||||
G_IS_DRIVE (volume))
|
||||
g_object_ref (volume);
|
||||
|
||||
return volume;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_file_system_volume_free (GtkFileSystemVolume *volume)
|
||||
_gtk_file_system_volume_unref (GtkFileSystemVolume *volume)
|
||||
{
|
||||
/* Root volume doesn't need to be freed */
|
||||
if (IS_ROOT_VOLUME (volume))
|
||||
|
@ -162,7 +162,8 @@ GdkPixbuf * _gtk_file_system_volume_render_icon (GtkFileSystemVol
|
||||
gint icon_size,
|
||||
GError **error);
|
||||
|
||||
void _gtk_file_system_volume_free (GtkFileSystemVolume *volume);
|
||||
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);
|
||||
|
@ -1261,7 +1261,7 @@ set_button_image (GtkPathBar *path_bar,
|
||||
GTK_WIDGET (path_bar),
|
||||
path_bar->icon_size,
|
||||
NULL);
|
||||
_gtk_file_system_volume_free (volume);
|
||||
_gtk_file_system_volume_unref (volume);
|
||||
|
||||
gtk_image_set_from_pixbuf (GTK_IMAGE (button_data->image), path_bar->root_icon);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user