|
|
01a8e4 |
From a56e545824e0cdce4bbfbdf9fc54aa7405194cd9 Mon Sep 17 00:00:00 2001
|
|
|
01a8e4 |
From: Alexander Larsson <alexl@redhat.com>
|
|
|
01a8e4 |
Date: Thu, 21 Aug 2014 12:17:31 +0200
|
|
|
01a8e4 |
Subject: [PATCH] Fix crash when changing owner of file
|
|
|
01a8e4 |
|
|
|
01a8e4 |
Cherry picked commits from git master:
|
|
|
01a8e4 |
ab6aa9aca1c25c34e3f1aece63efbe05a2984397
|
|
|
01a8e4 |
bfa2d63249a1f5de986f7f1ad21d79920fa4947f
|
|
|
01a8e4 |
f7d1394a03e6d02cd5c67f9c85a142e33f14566f
|
|
|
01a8e4 |
|
|
|
01a8e4 |
https://bugzilla.redhat.com/show_bug.cgi?id=1090999
|
|
|
01a8e4 |
---
|
|
|
01a8e4 |
libnautilus-private/nautilus-file.c | 3 +-
|
|
|
01a8e4 |
src/nautilus-properties-window.c | 354 +++++++++++++++++-------------------
|
|
|
01a8e4 |
2 files changed, 164 insertions(+), 193 deletions(-)
|
|
|
01a8e4 |
|
|
|
01a8e4 |
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
|
|
|
01a8e4 |
index 5e837f6..efef296 100644
|
|
|
01a8e4 |
--- a/libnautilus-private/nautilus-file.c
|
|
|
01a8e4 |
+++ b/libnautilus-private/nautilus-file.c
|
|
|
01a8e4 |
@@ -5670,7 +5670,8 @@ nautilus_file_get_owner_as_string (NautilusFile *file, gboolean include_real_nam
|
|
|
01a8e4 |
return NULL;
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- if (file->details->uid == getuid ()) {
|
|
|
01a8e4 |
+ if (include_real_name &&
|
|
|
01a8e4 |
+ file->details->uid == getuid ()) {
|
|
|
01a8e4 |
/* Translators: "Me" is used to indicate the file is owned by me (the current user) */
|
|
|
01a8e4 |
user_name = g_strdup (_("Me"));
|
|
|
01a8e4 |
} else if (file->details->owner_real == NULL) {
|
|
|
01a8e4 |
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
|
|
|
01a8e4 |
index 6793b7a..7a81ddd 100644
|
|
|
01a8e4 |
--- a/src/nautilus-properties-window.c
|
|
|
01a8e4 |
+++ b/src/nautilus-properties-window.c
|
|
|
01a8e4 |
@@ -89,6 +89,22 @@
|
|
|
01a8e4 |
static GHashTable *windows;
|
|
|
01a8e4 |
static GHashTable *pending_lists;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
+typedef struct {
|
|
|
01a8e4 |
+ NautilusFile *file;
|
|
|
01a8e4 |
+ char *owner;
|
|
|
01a8e4 |
+ GtkWindow *window;
|
|
|
01a8e4 |
+ unsigned int timeout;
|
|
|
01a8e4 |
+ gboolean cancelled;
|
|
|
01a8e4 |
+} OwnerChange;
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+typedef struct {
|
|
|
01a8e4 |
+ NautilusFile *file;
|
|
|
01a8e4 |
+ char *group;
|
|
|
01a8e4 |
+ GtkWindow *window;
|
|
|
01a8e4 |
+ unsigned int timeout;
|
|
|
01a8e4 |
+ gboolean cancelled;
|
|
|
01a8e4 |
+} GroupChange;
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
struct NautilusPropertiesWindowDetails {
|
|
|
01a8e4 |
GList *original_files;
|
|
|
01a8e4 |
GList *target_files;
|
|
|
01a8e4 |
@@ -112,12 +128,8 @@ struct NautilusPropertiesWindowDetails {
|
|
|
01a8e4 |
guint update_directory_contents_timeout_id;
|
|
|
01a8e4 |
guint update_files_timeout_id;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- NautilusFile *group_change_file;
|
|
|
01a8e4 |
- char *group_change_group;
|
|
|
01a8e4 |
- unsigned int group_change_timeout;
|
|
|
01a8e4 |
- NautilusFile *owner_change_file;
|
|
|
01a8e4 |
- char *owner_change_owner;
|
|
|
01a8e4 |
- unsigned int owner_change_timeout;
|
|
|
01a8e4 |
+ GroupChange *group_change;
|
|
|
01a8e4 |
+ OwnerChange *owner_change;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
GList *permission_buttons;
|
|
|
01a8e4 |
GList *permission_combos;
|
|
|
01a8e4 |
@@ -208,8 +220,8 @@ static void properties_window_update (NautilusPropertiesWindow *win
|
|
|
01a8e4 |
GList *files);
|
|
|
01a8e4 |
static void is_directory_ready_callback (NautilusFile *file,
|
|
|
01a8e4 |
gpointer data);
|
|
|
01a8e4 |
-static void cancel_group_change_callback (NautilusPropertiesWindow *window);
|
|
|
01a8e4 |
-static void cancel_owner_change_callback (NautilusPropertiesWindow *window);
|
|
|
01a8e4 |
+static void cancel_group_change_callback (GroupChange *change);
|
|
|
01a8e4 |
+static void cancel_owner_change_callback (OwnerChange *change);
|
|
|
01a8e4 |
static void parent_widget_destroyed_callback (GtkWidget *widget,
|
|
|
01a8e4 |
gpointer callback_data);
|
|
|
01a8e4 |
static void select_image_button_callback (GtkWidget *widget,
|
|
|
01a8e4 |
@@ -1363,78 +1375,70 @@ attach_ellipsizing_value_field (NautilusPropertiesWindow *window,
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static void
|
|
|
01a8e4 |
+group_change_free (GroupChange *change)
|
|
|
01a8e4 |
+{
|
|
|
01a8e4 |
+ nautilus_file_unref (change->file);
|
|
|
01a8e4 |
+ g_free (change->group);
|
|
|
01a8e4 |
+ g_object_unref (change->window);
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+ g_free (change);
|
|
|
01a8e4 |
+}
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+static void
|
|
|
01a8e4 |
group_change_callback (NautilusFile *file,
|
|
|
01a8e4 |
GFile *res_loc,
|
|
|
01a8e4 |
GError *error,
|
|
|
01a8e4 |
- NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
+ GroupChange *change)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- char *group;
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
- g_assert (window->details->group_change_file == file);
|
|
|
01a8e4 |
+ NautilusPropertiesWindow *window;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- group = window->details->group_change_group;
|
|
|
01a8e4 |
- g_assert (group != NULL);
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_FILE (change->file));
|
|
|
01a8e4 |
+ g_assert (change->group != NULL);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- /* Report the error if it's an error. */
|
|
|
01a8e4 |
- eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, window);
|
|
|
01a8e4 |
- nautilus_report_error_setting_group (file, error, GTK_WINDOW (window));
|
|
|
01a8e4 |
+ if (!change->cancelled) {
|
|
|
01a8e4 |
+ /* Report the error if it's an error. */
|
|
|
01a8e4 |
+ eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, change);
|
|
|
01a8e4 |
+ nautilus_report_error_setting_group (change->file, error, change->window);
|
|
|
01a8e4 |
+ }
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- nautilus_file_unref (file);
|
|
|
01a8e4 |
- g_free (group);
|
|
|
01a8e4 |
+ window = NAUTILUS_PROPERTIES_WINDOW(change->window);
|
|
|
01a8e4 |
+ if (window->details->group_change == change) {
|
|
|
01a8e4 |
+ window->details->group_change = NULL;
|
|
|
01a8e4 |
+ }
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- window->details->group_change_file = NULL;
|
|
|
01a8e4 |
- window->details->group_change_group = NULL;
|
|
|
01a8e4 |
- g_object_unref (G_OBJECT (window));
|
|
|
01a8e4 |
+ group_change_free (change);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static void
|
|
|
01a8e4 |
-cancel_group_change_callback (NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
+cancel_group_change_callback (GroupChange *change)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- NautilusFile *file;
|
|
|
01a8e4 |
- char *group;
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_FILE (change->file));
|
|
|
01a8e4 |
+ g_assert (change->group != NULL);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- file = window->details->group_change_file;
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- group = window->details->group_change_group;
|
|
|
01a8e4 |
- g_assert (group != NULL);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- nautilus_file_cancel (file, (NautilusFileOperationCallback) group_change_callback, window);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- g_free (group);
|
|
|
01a8e4 |
- nautilus_file_unref (file);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- window->details->group_change_file = NULL;
|
|
|
01a8e4 |
- window->details->group_change_group = NULL;
|
|
|
01a8e4 |
- g_object_unref (window);
|
|
|
01a8e4 |
+ change->cancelled = TRUE;
|
|
|
01a8e4 |
+ nautilus_file_cancel (change->file, (NautilusFileOperationCallback) group_change_callback, change);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static gboolean
|
|
|
01a8e4 |
-schedule_group_change_timeout (NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
+schedule_group_change_timeout (GroupChange *change)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- NautilusFile *file;
|
|
|
01a8e4 |
- char *group;
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_FILE (change->file));
|
|
|
01a8e4 |
+ g_assert (change->group != NULL);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- file = window->details->group_change_file;
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- group = window->details->group_change_group;
|
|
|
01a8e4 |
- g_assert (group != NULL);
|
|
|
01a8e4 |
+ change->timeout = 0;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
eel_timed_wait_start
|
|
|
01a8e4 |
((EelCancelCallback) cancel_group_change_callback,
|
|
|
01a8e4 |
- window,
|
|
|
01a8e4 |
+ change,
|
|
|
01a8e4 |
_("Cancel Group Change?"),
|
|
|
01a8e4 |
- GTK_WINDOW (window));
|
|
|
01a8e4 |
+ change->window);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
nautilus_file_set_group
|
|
|
01a8e4 |
- (file, group,
|
|
|
01a8e4 |
- (NautilusFileOperationCallback) group_change_callback, window);
|
|
|
01a8e4 |
+ (change->file, change->group,
|
|
|
01a8e4 |
+ (NautilusFileOperationCallback) group_change_callback, change);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- window->details->group_change_timeout = 0;
|
|
|
01a8e4 |
return FALSE;
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
@@ -1443,55 +1447,45 @@ schedule_group_change (NautilusPropertiesWindow *window,
|
|
|
01a8e4 |
NautilusFile *file,
|
|
|
01a8e4 |
const char *group)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
+ GroupChange *change;
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
- g_assert (window->details->group_change_group == NULL);
|
|
|
01a8e4 |
- g_assert (window->details->group_change_file == NULL);
|
|
|
01a8e4 |
+ g_assert (window->details->group_change == NULL);
|
|
|
01a8e4 |
g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- window->details->group_change_file = nautilus_file_ref (file);
|
|
|
01a8e4 |
- window->details->group_change_group = g_strdup (group);
|
|
|
01a8e4 |
- g_object_ref (G_OBJECT (window));
|
|
|
01a8e4 |
- window->details->group_change_timeout =
|
|
|
01a8e4 |
+ change = g_new0 (GroupChange, 1);
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+ change->file = nautilus_file_ref (file);
|
|
|
01a8e4 |
+ change->group = g_strdup (group);
|
|
|
01a8e4 |
+ change->window = g_object_ref (G_OBJECT (window));
|
|
|
01a8e4 |
+ change->timeout =
|
|
|
01a8e4 |
g_timeout_add (CHOWN_CHGRP_TIMEOUT,
|
|
|
01a8e4 |
(GSourceFunc) schedule_group_change_timeout,
|
|
|
01a8e4 |
- window);
|
|
|
01a8e4 |
+ change);
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+ window->details->group_change = change;
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static void
|
|
|
01a8e4 |
unschedule_or_cancel_group_change (NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- NautilusFile *file;
|
|
|
01a8e4 |
- char *group;
|
|
|
01a8e4 |
+ GroupChange *change;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- file = window->details->group_change_file;
|
|
|
01a8e4 |
- group = window->details->group_change_group;
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- g_assert ((file == NULL && group == NULL) ||
|
|
|
01a8e4 |
- (file != NULL && group != NULL));
|
|
|
01a8e4 |
+ change = window->details->group_change;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- if (file != NULL) {
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- if (window->details->group_change_timeout == 0) {
|
|
|
01a8e4 |
- nautilus_file_cancel (file,
|
|
|
01a8e4 |
- (NautilusFileOperationCallback) group_change_callback, window);
|
|
|
01a8e4 |
- eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, window);
|
|
|
01a8e4 |
+ if (change != NULL) {
|
|
|
01a8e4 |
+ if (change->timeout == 0) {
|
|
|
01a8e4 |
+ /* The operation was started, cancel it and let the operation callback free the change */
|
|
|
01a8e4 |
+ cancel_group_change_callback (change);
|
|
|
01a8e4 |
+ eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, change);
|
|
|
01a8e4 |
+ } else {
|
|
|
01a8e4 |
+ g_source_remove (change->timeout);
|
|
|
01a8e4 |
+ group_change_free (change);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- nautilus_file_unref (file);
|
|
|
01a8e4 |
- g_free (group);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- window->details->group_change_file = NULL;
|
|
|
01a8e4 |
- window->details->group_change_group = NULL;
|
|
|
01a8e4 |
- g_object_unref (G_OBJECT (window));
|
|
|
01a8e4 |
- }
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- if (window->details->group_change_timeout > 0) {
|
|
|
01a8e4 |
- g_assert (file != NULL);
|
|
|
01a8e4 |
- g_source_remove (window->details->group_change_timeout);
|
|
|
01a8e4 |
- window->details->group_change_timeout = 0;
|
|
|
01a8e4 |
+ window->details->group_change = NULL;
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
@@ -1713,18 +1707,18 @@ combo_box_row_separator_func (GtkTreeModel *model,
|
|
|
01a8e4 |
static GtkComboBox *
|
|
|
01a8e4 |
attach_combo_box (GtkGrid *grid,
|
|
|
01a8e4 |
GtkWidget *sibling,
|
|
|
01a8e4 |
- gboolean two_columns)
|
|
|
01a8e4 |
+ gboolean three_columns)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
GtkWidget *combo_box;
|
|
|
01a8e4 |
GtkWidget *aligner;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- if (!two_columns) {
|
|
|
01a8e4 |
+ if (!three_columns) {
|
|
|
01a8e4 |
combo_box = gtk_combo_box_text_new ();
|
|
|
01a8e4 |
} else {
|
|
|
01a8e4 |
GtkTreeModel *model;
|
|
|
01a8e4 |
GtkCellRenderer *renderer;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING));
|
|
|
01a8e4 |
+ model = GTK_TREE_MODEL (gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING));
|
|
|
01a8e4 |
combo_box = gtk_combo_box_new_with_model (model);
|
|
|
01a8e4 |
g_object_unref (G_OBJECT (model));
|
|
|
01a8e4 |
|
|
|
01a8e4 |
@@ -1778,78 +1772,70 @@ attach_group_combo_box (GtkGrid *grid,
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static void
|
|
|
01a8e4 |
+owner_change_free (OwnerChange *change)
|
|
|
01a8e4 |
+{
|
|
|
01a8e4 |
+ nautilus_file_unref (change->file);
|
|
|
01a8e4 |
+ g_free (change->owner);
|
|
|
01a8e4 |
+ g_object_unref (change->window);
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+ g_free (change);
|
|
|
01a8e4 |
+}
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+static void
|
|
|
01a8e4 |
owner_change_callback (NautilusFile *file,
|
|
|
01a8e4 |
GFile *result_location,
|
|
|
01a8e4 |
GError *error,
|
|
|
01a8e4 |
- NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
+ OwnerChange *change)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- char *owner;
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
- g_assert (window->details->owner_change_file == file);
|
|
|
01a8e4 |
+ NautilusPropertiesWindow *window;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- owner = window->details->owner_change_owner;
|
|
|
01a8e4 |
- g_assert (owner != NULL);
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_FILE (change->file));
|
|
|
01a8e4 |
+ g_assert (change->owner != NULL);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- /* Report the error if it's an error. */
|
|
|
01a8e4 |
- eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, window);
|
|
|
01a8e4 |
- nautilus_report_error_setting_owner (file, error, GTK_WINDOW (window));
|
|
|
01a8e4 |
+ if (!change->cancelled) {
|
|
|
01a8e4 |
+ /* Report the error if it's an error. */
|
|
|
01a8e4 |
+ eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, change);
|
|
|
01a8e4 |
+ nautilus_report_error_setting_owner (file, error, change->window);
|
|
|
01a8e4 |
+ }
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- nautilus_file_unref (file);
|
|
|
01a8e4 |
- g_free (owner);
|
|
|
01a8e4 |
+ window = NAUTILUS_PROPERTIES_WINDOW(change->window);
|
|
|
01a8e4 |
+ if (window->details->owner_change == change) {
|
|
|
01a8e4 |
+ window->details->owner_change = NULL;
|
|
|
01a8e4 |
+ }
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- window->details->owner_change_file = NULL;
|
|
|
01a8e4 |
- window->details->owner_change_owner = NULL;
|
|
|
01a8e4 |
- g_object_unref (G_OBJECT (window));
|
|
|
01a8e4 |
+ owner_change_free (change);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static void
|
|
|
01a8e4 |
-cancel_owner_change_callback (NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
+cancel_owner_change_callback (OwnerChange *change)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- NautilusFile *file;
|
|
|
01a8e4 |
- char *owner;
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- file = window->details->owner_change_file;
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- owner = window->details->owner_change_owner;
|
|
|
01a8e4 |
- g_assert (owner != NULL);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- nautilus_file_cancel (file, (NautilusFileOperationCallback) owner_change_callback, window);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- nautilus_file_unref (file);
|
|
|
01a8e4 |
- g_free (owner);
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_FILE (change->file));
|
|
|
01a8e4 |
+ g_assert (change->owner != NULL);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- window->details->owner_change_file = NULL;
|
|
|
01a8e4 |
- window->details->owner_change_owner = NULL;
|
|
|
01a8e4 |
- g_object_unref (window);
|
|
|
01a8e4 |
+ change->cancelled = TRUE;
|
|
|
01a8e4 |
+ nautilus_file_cancel (change->file, (NautilusFileOperationCallback) owner_change_callback, change);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static gboolean
|
|
|
01a8e4 |
-schedule_owner_change_timeout (NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
+schedule_owner_change_timeout (OwnerChange *change)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- NautilusFile *file;
|
|
|
01a8e4 |
- char *owner;
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- file = window->details->owner_change_file;
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_FILE (change->file));
|
|
|
01a8e4 |
+ g_assert (change->owner != NULL);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- owner = window->details->owner_change_owner;
|
|
|
01a8e4 |
- g_assert (owner != NULL);
|
|
|
01a8e4 |
+ change->timeout = 0;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
eel_timed_wait_start
|
|
|
01a8e4 |
((EelCancelCallback) cancel_owner_change_callback,
|
|
|
01a8e4 |
- window,
|
|
|
01a8e4 |
+ change,
|
|
|
01a8e4 |
_("Cancel Owner Change?"),
|
|
|
01a8e4 |
- GTK_WINDOW (window));
|
|
|
01a8e4 |
+ change->window);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
nautilus_file_set_owner
|
|
|
01a8e4 |
- (file, owner,
|
|
|
01a8e4 |
- (NautilusFileOperationCallback) owner_change_callback, window);
|
|
|
01a8e4 |
+ (change->file, change->owner,
|
|
|
01a8e4 |
+ (NautilusFileOperationCallback) owner_change_callback, change);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- window->details->owner_change_timeout = 0;
|
|
|
01a8e4 |
return FALSE;
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
@@ -1858,55 +1844,47 @@ schedule_owner_change (NautilusPropertiesWindow *window,
|
|
|
01a8e4 |
NautilusFile *file,
|
|
|
01a8e4 |
const char *owner)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
+ OwnerChange *change;
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
- g_assert (window->details->owner_change_owner == NULL);
|
|
|
01a8e4 |
- g_assert (window->details->owner_change_file == NULL);
|
|
|
01a8e4 |
+ g_assert (window->details->owner_change == NULL);
|
|
|
01a8e4 |
g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- window->details->owner_change_file = nautilus_file_ref (file);
|
|
|
01a8e4 |
- window->details->owner_change_owner = g_strdup (owner);
|
|
|
01a8e4 |
- g_object_ref (G_OBJECT (window));
|
|
|
01a8e4 |
- window->details->owner_change_timeout =
|
|
|
01a8e4 |
+ change = g_new0 (OwnerChange, 1);
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+ change->file = nautilus_file_ref (file);
|
|
|
01a8e4 |
+ change->owner = g_strdup (owner);
|
|
|
01a8e4 |
+ change->window = g_object_ref (G_OBJECT (window));
|
|
|
01a8e4 |
+ change->timeout =
|
|
|
01a8e4 |
g_timeout_add (CHOWN_CHGRP_TIMEOUT,
|
|
|
01a8e4 |
(GSourceFunc) schedule_owner_change_timeout,
|
|
|
01a8e4 |
- window);
|
|
|
01a8e4 |
+ change);
|
|
|
01a8e4 |
+
|
|
|
01a8e4 |
+ window->details->owner_change = change;
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
static void
|
|
|
01a8e4 |
unschedule_or_cancel_owner_change (NautilusPropertiesWindow *window)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
- NautilusFile *file;
|
|
|
01a8e4 |
- char *owner;
|
|
|
01a8e4 |
+ OwnerChange *change;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- file = window->details->owner_change_file;
|
|
|
01a8e4 |
- owner = window->details->owner_change_owner;
|
|
|
01a8e4 |
+ change = window->details->owner_change;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- g_assert ((file == NULL && owner == NULL) ||
|
|
|
01a8e4 |
- (file != NULL && owner != NULL));
|
|
|
01a8e4 |
+ if (change != NULL) {
|
|
|
01a8e4 |
+ g_assert (NAUTILUS_IS_FILE (change->file));
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- if (file != NULL) {
|
|
|
01a8e4 |
- g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- if (window->details->owner_change_timeout == 0) {
|
|
|
01a8e4 |
- nautilus_file_cancel (file,
|
|
|
01a8e4 |
- (NautilusFileOperationCallback) owner_change_callback, window);
|
|
|
01a8e4 |
- eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, window);
|
|
|
01a8e4 |
+ if (change->timeout == 0) {
|
|
|
01a8e4 |
+ /* The operation was started, cancel it and let the operation callback free the change */
|
|
|
01a8e4 |
+ cancel_owner_change_callback (change);
|
|
|
01a8e4 |
+ eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, change);
|
|
|
01a8e4 |
+ } else {
|
|
|
01a8e4 |
+ g_source_remove (change->timeout);
|
|
|
01a8e4 |
+ owner_change_free (change);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- nautilus_file_unref (file);
|
|
|
01a8e4 |
- g_free (owner);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- window->details->owner_change_file = NULL;
|
|
|
01a8e4 |
- window->details->owner_change_owner = NULL;
|
|
|
01a8e4 |
- g_object_unref (G_OBJECT (window));
|
|
|
01a8e4 |
- }
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- if (window->details->owner_change_timeout > 0) {
|
|
|
01a8e4 |
- g_assert (file != NULL);
|
|
|
01a8e4 |
- g_source_remove (window->details->owner_change_timeout);
|
|
|
01a8e4 |
- window->details->owner_change_timeout = 0;
|
|
|
01a8e4 |
+ window->details->owner_change = NULL;
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
@@ -1914,20 +1892,15 @@ static void
|
|
|
01a8e4 |
changed_owner_callback (GtkComboBox *combo_box, NautilusFile* file)
|
|
|
01a8e4 |
{
|
|
|
01a8e4 |
NautilusPropertiesWindow *window;
|
|
|
01a8e4 |
- char *owner_text;
|
|
|
01a8e4 |
- char **name_array;
|
|
|
01a8e4 |
char *new_owner;
|
|
|
01a8e4 |
char *cur_owner;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
g_assert (GTK_IS_COMBO_BOX (combo_box));
|
|
|
01a8e4 |
g_assert (NAUTILUS_IS_FILE (file));
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- owner_text = combo_box_get_active_entry (combo_box, 0);
|
|
|
01a8e4 |
- if (! owner_text)
|
|
|
01a8e4 |
+ new_owner = combo_box_get_active_entry (combo_box, 2);
|
|
|
01a8e4 |
+ if (! new_owner)
|
|
|
01a8e4 |
return;
|
|
|
01a8e4 |
- name_array = g_strsplit (owner_text, " - ", 2);
|
|
|
01a8e4 |
- new_owner = name_array[0];
|
|
|
01a8e4 |
- g_free (owner_text);
|
|
|
01a8e4 |
cur_owner = nautilus_file_get_owner_name (file);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
if (strcmp (new_owner, cur_owner) != 0) {
|
|
|
01a8e4 |
@@ -1937,7 +1910,7 @@ changed_owner_callback (GtkComboBox *combo_box, NautilusFile* file)
|
|
|
01a8e4 |
unschedule_or_cancel_owner_change (window);
|
|
|
01a8e4 |
schedule_owner_change (window, file, new_owner);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
- g_strfreev (name_array);
|
|
|
01a8e4 |
+ g_free (new_owner);
|
|
|
01a8e4 |
g_free (cur_owner);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
@@ -1951,6 +1924,7 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
|
|
|
01a8e4 |
GtkTreeIter iter;
|
|
|
01a8e4 |
char *user_name;
|
|
|
01a8e4 |
char *owner_name;
|
|
|
01a8e4 |
+ char *nice_owner_name;
|
|
|
01a8e4 |
int user_index;
|
|
|
01a8e4 |
int owner_index;
|
|
|
01a8e4 |
char **name_array;
|
|
|
01a8e4 |
@@ -1980,7 +1954,7 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
|
|
|
01a8e4 |
user_name = (char *)node->data;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
name_array = g_strsplit (user_name, "\n", 2);
|
|
|
01a8e4 |
- if (name_array[1] != NULL) {
|
|
|
01a8e4 |
+ if (name_array[1] != NULL && *name_array[1] != 0) {
|
|
|
01a8e4 |
combo_text = g_strdup_printf ("%s - %s", name_array[0], name_array[1]);
|
|
|
01a8e4 |
} else {
|
|
|
01a8e4 |
combo_text = g_strdup (name_array[0]);
|
|
|
01a8e4 |
@@ -1990,6 +1964,7 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
|
|
|
01a8e4 |
gtk_list_store_set (store, &iter,
|
|
|
01a8e4 |
0, combo_text,
|
|
|
01a8e4 |
1, user_name,
|
|
|
01a8e4 |
+ 2, name_array[0],
|
|
|
01a8e4 |
-1);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
g_strfreev (name_array);
|
|
|
01a8e4 |
@@ -1997,8 +1972,9 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- owner_name = nautilus_file_get_string_attribute (file, "owner");
|
|
|
01a8e4 |
- owner_index = tree_model_get_entry_index (model, 0, owner_name);
|
|
|
01a8e4 |
+ owner_name = nautilus_file_get_owner_name (file);
|
|
|
01a8e4 |
+ owner_index = tree_model_get_entry_index (model, 2, owner_name);
|
|
|
01a8e4 |
+ nice_owner_name = nautilus_file_get_string_attribute (file, "owner");
|
|
|
01a8e4 |
|
|
|
01a8e4 |
/* If owner wasn't in list, we prepend it (with a separator).
|
|
|
01a8e4 |
* This can happen if the owner is an id with no matching
|
|
|
01a8e4 |
@@ -2011,30 +1987,24 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
|
|
|
01a8e4 |
gtk_list_store_set (store, &iter,
|
|
|
01a8e4 |
0, "-",
|
|
|
01a8e4 |
1, NULL,
|
|
|
01a8e4 |
+ 2, NULL,
|
|
|
01a8e4 |
-1);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
- name_array = g_strsplit (owner_name, " - ", 2);
|
|
|
01a8e4 |
- if (name_array[1] != NULL) {
|
|
|
01a8e4 |
- user_name = g_strdup_printf ("%s\n%s", name_array[0], name_array[1]);
|
|
|
01a8e4 |
- } else {
|
|
|
01a8e4 |
- user_name = g_strdup (name_array[0]);
|
|
|
01a8e4 |
- }
|
|
|
01a8e4 |
owner_index = 0;
|
|
|
01a8e4 |
|
|
|
01a8e4 |
gtk_list_store_prepend (store, &iter);
|
|
|
01a8e4 |
gtk_list_store_set (store, &iter,
|
|
|
01a8e4 |
- 0, owner_name,
|
|
|
01a8e4 |
- 1, user_name,
|
|
|
01a8e4 |
+ 0, nice_owner_name,
|
|
|
01a8e4 |
+ 1, owner_name,
|
|
|
01a8e4 |
+ 2, owner_name,
|
|
|
01a8e4 |
-1);
|
|
|
01a8e4 |
-
|
|
|
01a8e4 |
- g_free (user_name);
|
|
|
01a8e4 |
- g_strfreev (name_array);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
gtk_combo_box_set_active (combo_box, owner_index);
|
|
|
01a8e4 |
|
|
|
01a8e4 |
g_free (owner_name);
|
|
|
01a8e4 |
+ g_free (nice_owner_name);
|
|
|
01a8e4 |
g_list_free_full (users, g_free);
|
|
|
01a8e4 |
}
|
|
|
01a8e4 |
|
|
|
01a8e4 |
--
|
|
|
01a8e4 |
2.0.4
|
|
|
01a8e4 |
|