[Xfce4-commits] <thunar:master> Make parts of the permissions chooser work with multiple files.
Nick Schermer
noreply at xfce.org
Sun Sep 16 20:16:08 CEST 2012
Updating branch refs/heads/master
to fac3514fb550c404fc275dc59330ff9afc490cb1 (commit)
from e0acf17367457f73676e78b4df90484a69711a7b (commit)
commit fac3514fb550c404fc275dc59330ff9afc490cb1
Author: Nick Schermer <nick at xfce.org>
Date: Thu Sep 13 20:45:19 2012 +0200
Make parts of the permissions chooser work with multiple files.
thunar/thunar-io-jobs.c | 30 ++---
thunar/thunar-io-jobs.h | 4 +-
thunar/thunar-permissions-chooser.c | 281 ++++++++++++++++++++++------------
thunar/thunar-permissions-chooser.h | 10 +-
thunar/thunar-properties-dialog.c | 13 +-
5 files changed, 207 insertions(+), 131 deletions(-)
diff --git a/thunar/thunar-io-jobs.c b/thunar/thunar-io-jobs.c
index 859bdef..a90ab69 100644
--- a/thunar/thunar-io-jobs.c
+++ b/thunar/thunar-io-jobs.c
@@ -958,25 +958,20 @@ retry_chown:
ThunarJob *
-thunar_io_jobs_change_group (GFile *file,
+thunar_io_jobs_change_group (GList *files,
guint32 gid,
gboolean recursive)
{
- GList file_list;
+ _thunar_return_val_if_fail (files != NULL, NULL);
- _thunar_return_val_if_fail (G_IS_FILE (file), NULL);
+ /* files are released when the list if destroyed */
+ g_list_foreach (files, (GFunc) g_object_ref, NULL);
- file_list.data = g_object_ref (file);
- file_list.next = NULL;
- file_list.prev = NULL;
-
return thunar_simple_job_launch (_thunar_io_jobs_chown, 4,
- THUNAR_TYPE_G_FILE_LIST, &file_list,
+ THUNAR_TYPE_G_FILE_LIST, files,
G_TYPE_INT, -1,
G_TYPE_INT, (gint) gid,
G_TYPE_BOOLEAN, recursive);
-
- g_object_unref (file_list.data);
}
@@ -1112,30 +1107,25 @@ retry_chown:
ThunarJob *
-thunar_io_jobs_change_mode (GFile *file,
+thunar_io_jobs_change_mode (GList *files,
ThunarFileMode dir_mask,
ThunarFileMode dir_mode,
ThunarFileMode file_mask,
ThunarFileMode file_mode,
gboolean recursive)
{
- GList file_list;
+ _thunar_return_val_if_fail (files != NULL, NULL);
- _thunar_return_val_if_fail (G_IS_FILE (file), NULL);
+ /* files are released when the list if destroyed */
+ g_list_foreach (files, (GFunc) g_object_ref, NULL);
- file_list.data = g_object_ref (file);
- file_list.next = NULL;
- file_list.prev = NULL;
-
return thunar_simple_job_launch (_thunar_io_jobs_chmod, 6,
- THUNAR_TYPE_G_FILE_LIST, &file_list,
+ THUNAR_TYPE_G_FILE_LIST, files,
THUNAR_TYPE_FILE_MODE, dir_mask,
THUNAR_TYPE_FILE_MODE, dir_mode,
THUNAR_TYPE_FILE_MODE, file_mask,
THUNAR_TYPE_FILE_MODE, file_mode,
G_TYPE_BOOLEAN, recursive);
-
- g_object_unref (file_list.data);
}
diff --git a/thunar/thunar-io-jobs.h b/thunar/thunar-io-jobs.h
index 5821c44..11d9c0d 100644
--- a/thunar/thunar-io-jobs.h
+++ b/thunar/thunar-io-jobs.h
@@ -38,10 +38,10 @@ ThunarJob *thunar_io_jobs_link_files (GList *source_file_list,
ThunarJob *thunar_io_jobs_trash_files (GList *file_list) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
ThunarJob *thunar_io_jobs_restore_files (GList *source_file_list,
GList *target_file_list) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-ThunarJob *thunar_io_jobs_change_group (GFile *file,
+ThunarJob *thunar_io_jobs_change_group (GList *files,
guint32 gid,
gboolean recursive) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-ThunarJob *thunar_io_jobs_change_mode (GFile *file,
+ThunarJob *thunar_io_jobs_change_mode (GList *files,
ThunarFileMode dir_mask,
ThunarFileMode dir_mode,
ThunarFileMode file_mask,
diff --git a/thunar/thunar-permissions-chooser.c b/thunar/thunar-permissions-chooser.c
index 576010f..692479e 100644
--- a/thunar/thunar-permissions-chooser.c
+++ b/thunar/thunar-permissions-chooser.c
@@ -58,7 +58,7 @@
enum
{
PROP_0,
- PROP_FILE,
+ PROP_FILES,
PROP_MUTABLE,
};
@@ -91,8 +91,7 @@ static void thunar_permissions_chooser_change_mode (ThunarP
ThunarFileMode file_mode);
static void thunar_permissions_chooser_access_changed (ThunarPermissionsChooser *chooser,
GtkWidget *combo);
-static void thunar_permissions_chooser_file_changed (ThunarPermissionsChooser *chooser,
- ThunarFile *file);
+static void thunar_permissions_chooser_file_changed (ThunarPermissionsChooser *chooser);
static void thunar_permissions_chooser_group_changed (ThunarPermissionsChooser *chooser,
GtkWidget *combo);
static void thunar_permissions_chooser_program_toggled (ThunarPermissionsChooser *chooser,
@@ -109,7 +108,7 @@ static void thunar_permissions_chooser_job_error (ThunarP
ThunarJob *job);
static void thunar_permissions_chooser_job_finished (ThunarPermissionsChooser *chooser,
ThunarJob *job);
-static void thunar_permissions_chooser_job_percent (ThunarPermissionsChooser *chooser,
+static void thunar_permissions_chooser_job_percent (ThunarPermissionsChooser *chooser,
gdouble percent,
ThunarJob *job);
static void thunar_permissions_chooser_job_start (ThunarPermissionsChooser *chooser,
@@ -130,7 +129,7 @@ struct _ThunarPermissionsChooser
{
GtkVBox __parent__;
- ThunarFile *file;
+ GList *files;
/* the main table widget, which contains everything but the job control stuff */
GtkWidget *table;
@@ -169,10 +168,10 @@ thunar_permissions_chooser_class_init (ThunarPermissionsChooserClass *klass)
* The #ThunarFile whose permissions will be edited/viewed.
**/
g_object_class_install_property (gobject_class,
- PROP_FILE,
- g_param_spec_object ("file", "file", "file",
- THUNAR_TYPE_FILE,
- EXO_PARAM_READWRITE));
+ PROP_FILES,
+ g_param_spec_boxed ("files", "files", "files",
+ THUNARX_TYPE_FILE_INFO_LIST,
+ EXO_PARAM_READWRITE));
/**
* ThunarPermissionsChooser:mutable:
@@ -209,14 +208,10 @@ thunar_permissions_chooser_init (ThunarPermissionsChooser *chooser)
/* allocate the store for the permission combos */
store = gtk_list_store_new (1, G_TYPE_STRING);
- gtk_list_store_append (store, &iter); /* 0000 */
- gtk_list_store_set (store, &iter, 0, _("None"), -1);
- gtk_list_store_append (store, &iter); /* 0002 */
- gtk_list_store_set (store, &iter, 0, _("Write only"), -1);
- gtk_list_store_append (store, &iter); /* 0004 */
- gtk_list_store_set (store, &iter, 0, _("Read only"), -1);
- gtk_list_store_append (store, &iter); /* 0006 */
- gtk_list_store_set (store, &iter, 0, _("Read & Write"), -1);
+ gtk_list_store_insert_with_values (store, &iter, 0, 0, _("None"), -1); /* 0000 */
+ gtk_list_store_insert_with_values (store, &iter, 1, 0, _("Write only"), -1); /* 0002 */
+ gtk_list_store_insert_with_values (store, &iter, 2, 0, _("Read only"), -1); /* 0004 */
+ gtk_list_store_insert_with_values (store, &iter, 3, 0, _("Read & Write"), -1); /* 0006 */
/* allocate the shared renderer for the various combo boxes */
renderer_text = gtk_cell_renderer_text_new ();
@@ -436,7 +431,7 @@ thunar_permissions_chooser_finalize (GObject *object)
}
/* drop the reference on the file (if any) */
- thunar_permissions_chooser_set_file (chooser, NULL);
+ thunar_permissions_chooser_set_files (chooser, NULL);
(*G_OBJECT_CLASS (thunar_permissions_chooser_parent_class)->finalize) (object);
}
@@ -450,15 +445,20 @@ thunar_permissions_chooser_get_property (GObject *object,
GParamSpec *pspec)
{
ThunarPermissionsChooser *chooser = THUNAR_PERMISSIONS_CHOOSER (object);
+ GList *lp;
switch (prop_id)
{
- case PROP_FILE:
- g_value_set_object (value, thunar_permissions_chooser_get_file (chooser));
+ case PROP_FILES:
+ g_value_set_boxed (value, thunar_permissions_chooser_get_files (chooser));
break;
case PROP_MUTABLE:
- g_value_set_boolean (value, (chooser->file != NULL) && thunar_file_is_chmodable (chooser->file));
+ for (lp = chooser->files; lp != NULL; lp = lp->next)
+ if (!thunar_file_is_chmodable (THUNAR_FILE (lp->data)))
+ break;
+
+ g_value_set_boolean (value, (chooser->files != NULL) && (lp == NULL));
break;
default:
@@ -479,8 +479,8 @@ thunar_permissions_chooser_set_property (GObject *object,
switch (prop_id)
{
- case PROP_FILE:
- thunar_permissions_chooser_set_file (chooser, g_value_get_object (value));
+ case PROP_FILES:
+ thunar_permissions_chooser_set_files (chooser, g_value_get_boxed (value));
break;
default:
@@ -597,6 +597,72 @@ thunar_permissions_chooser_ask_recursive (ThunarPermissionsChooser *chooser)
+static gboolean
+thunar_permissions_chooser_has_directory (ThunarPermissionsChooser *chooser)
+{
+ GList *lp;
+
+ for (lp = chooser->files; lp != NULL; lp = lp->next)
+ if (thunar_file_is_directory (THUNAR_FILE (lp->data)))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+
+static gboolean
+thunar_permissions_chooser_is_fixable_directory (ThunarFile *file)
+{
+ ThunarFileMode mode;
+
+ _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE);
+
+ if (!thunar_file_is_directory (file)
+ || !thunar_file_is_chmodable (file))
+ return FALSE;
+
+ mode = thunar_file_get_mode (file);
+
+ return ((mode & 0111) != ((mode >> 2) & 0111));
+}
+
+
+
+static gboolean
+thunar_permissions_chooser_has_fixable_directory (ThunarPermissionsChooser *chooser)
+{
+ GList *lp;
+
+ for (lp = chooser->files; lp != NULL; lp = lp->next)
+ if (thunar_permissions_chooser_is_fixable_directory (THUNAR_FILE (lp->data)))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+
+/* free returned list with g_list_free_full (file_list, g_object_unref); */
+static GList *
+thunar_permissions_chooser_get_file_list (ThunarPermissionsChooser *chooser)
+{
+ GList *file_list = NULL;
+ GList *lp;
+ GFile *gfile;
+
+ for (lp = chooser->files; lp != NULL; lp = lp->next)
+ {
+ gfile = thunar_file_get_file (THUNAR_FILE (lp->data));
+ _thunar_assert (G_IS_FILE (gfile));
+ file_list = g_list_prepend (file_list, g_object_ref (G_OBJECT (gfile)));
+ }
+
+ return file_list;
+}
+
+
+
static void
thunar_permissions_chooser_change_group (ThunarPermissionsChooser *chooser,
guint32 gid)
@@ -604,12 +670,13 @@ thunar_permissions_chooser_change_group (ThunarPermissionsChooser *chooser,
ThunarJob *job;
gboolean recursive = FALSE;
gint response;
+ GList *file_list;
_thunar_return_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser));
- _thunar_return_if_fail (THUNAR_IS_FILE (chooser->file));
+ _thunar_return_if_fail (chooser->files != NULL);
/* check if we should operate recursively */
- if (thunar_file_is_directory (chooser->file))
+ if (thunar_permissions_chooser_has_directory (chooser))
{
response = thunar_permissions_chooser_ask_recursive (chooser);
switch (response)
@@ -623,14 +690,16 @@ thunar_permissions_chooser_change_group (ThunarPermissionsChooser *chooser,
break;
default: /* cancelled by the user */
- thunar_file_changed (chooser->file);
+ thunar_permissions_chooser_file_changed (chooser);
return;
}
}
/* try to allocate the new job */
- job = thunar_io_jobs_change_group (thunar_file_get_file (chooser->file), gid, recursive);
+ file_list = thunar_permissions_chooser_get_file_list (chooser);
+ job = thunar_io_jobs_change_group (file_list, gid, recursive);
thunar_permissions_chooser_job_start (chooser, job, recursive);
+ g_list_free_full (file_list, g_object_unref);
g_object_unref (job);
}
@@ -643,15 +712,16 @@ thunar_permissions_chooser_change_mode (ThunarPermissionsChooser *chooser,
ThunarFileMode file_mask,
ThunarFileMode file_mode)
{
- ThunarJob*job;
- gboolean recursive = FALSE;
- gint response;
+ ThunarJob *job;
+ gboolean recursive = FALSE;
+ gint response;
+ GList *file_list;
_thunar_return_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser));
- _thunar_return_if_fail (THUNAR_IS_FILE (chooser->file));
+ _thunar_return_if_fail (chooser->files != NULL);
/* check if we should operate recursively */
- if (thunar_file_is_directory (chooser->file))
+ if (thunar_permissions_chooser_has_directory (chooser))
{
response = thunar_permissions_chooser_ask_recursive (chooser);
switch (response)
@@ -665,16 +735,16 @@ thunar_permissions_chooser_change_mode (ThunarPermissionsChooser *chooser,
break;
default: /* cancelled by the user */
- thunar_file_changed (chooser->file);
+ thunar_permissions_chooser_file_changed (chooser);
return;
}
}
/* try to allocate the new job */
- job = thunar_io_jobs_change_mode (thunar_file_get_file (chooser->file),
- dir_mask, dir_mode, file_mask, file_mode,
- recursive);
+ file_list = thunar_permissions_chooser_get_file_list (chooser);
+ job = thunar_io_jobs_change_mode (file_list, dir_mask, dir_mode, file_mask, file_mode, recursive);
thunar_permissions_chooser_job_start (chooser, job, recursive);
+ g_list_free_full (file_list, g_object_unref);
g_object_unref (job);
}
@@ -684,26 +754,22 @@ static void
thunar_permissions_chooser_access_changed (ThunarPermissionsChooser *chooser,
GtkWidget *combo)
{
- ThunarFileMode file_mask;
- ThunarFileMode file_mode;
- ThunarFileMode dir_mask;
- ThunarFileMode dir_mode;
- guint n;
+ ThunarFileMode file_mask;
+ ThunarFileMode file_mode;
+ ThunarFileMode dir_mask;
+ ThunarFileMode dir_mode;
+ guint n;
_thunar_return_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser));
_thunar_return_if_fail (GTK_IS_COMBO_BOX (combo));
- /* verify that we have a valid file */
- if (G_UNLIKELY (chooser->file == NULL))
- return;
-
/* determine the new mode from the combo box */
for (n = 0; n < G_N_ELEMENTS (chooser->access_combos) && chooser->access_combos[n] != combo ; ++n);
dir_mode = file_mode = (gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) << 1) << (n * 3);
dir_mask = file_mask = 0006 << (n * 3);
/* keep exec bit in sync for folders */
- if (thunar_file_is_directory (chooser->file))
+ if (thunar_permissions_chooser_has_directory (chooser))
{
/* if either read or write is, set exec as well, else unset exec as well */
if ((dir_mode & (0004 << (n * 3))) != 0)
@@ -743,16 +809,16 @@ group_compare (gconstpointer group_a,
return -1;
/* otherwise just sort by name */
- return g_ascii_strcasecmp (thunar_group_get_name (THUNAR_GROUP (group_a)),
+ return g_ascii_strcasecmp (thunar_group_get_name (THUNAR_GROUP (group_a)),
thunar_group_get_name (THUNAR_GROUP (group_b)));
}
static void
-thunar_permissions_chooser_file_changed (ThunarPermissionsChooser *chooser,
- ThunarFile *file)
+thunar_permissions_chooser_file_changed (ThunarPermissionsChooser *chooser)
{
+ ThunarFile *file;
ThunarUserManager *user_manager;
ThunarFileMode mode;
ThunarGroup *group;
@@ -767,8 +833,8 @@ thunar_permissions_chooser_file_changed (ThunarPermissionsChooser *chooser,
guint n;
_thunar_return_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser));
- _thunar_return_if_fail (THUNAR_IS_FILE (file));
- _thunar_return_if_fail (chooser->file == file);
+
+ file = THUNAR_FILE (chooser->files->data);
/* allocate a new store for the group combo box */
g_signal_handlers_block_by_func (G_OBJECT (chooser->group_combo), thunar_permissions_chooser_group_changed, chooser);
@@ -809,7 +875,7 @@ thunar_permissions_chooser_file_changed (ThunarPermissionsChooser *chooser,
for (lp = groups, n = 0; lp != NULL; lp = lp->next)
{
/* append a separator after the primary group and after the user-groups (not system groups) */
- if (thunar_group_get_id (groups->data) == thunar_group_get_id (group)
+ if (thunar_group_get_id (groups->data) == thunar_group_get_id (group)
&& lp != groups && n == 0)
{
gtk_list_store_append (store, &iter);
@@ -874,13 +940,11 @@ thunar_permissions_chooser_file_changed (ThunarPermissionsChooser *chooser,
g_signal_handlers_unblock_by_func (G_OBJECT (chooser->program_button), thunar_permissions_chooser_program_toggled, chooser);
/* update the "inconsistent folder permissions" warning and the "fix permissions" button based on the mode */
- if (thunar_file_is_directory (file) && ((mode & 0111) != ((mode >> 2) & 0111)))
+ if (thunar_permissions_chooser_has_fixable_directory (chooser))
{
- /* display the "fix permissions" button if we can modify the file */
- g_object_set (G_OBJECT (chooser->fixperm_button), "visible", thunar_file_is_chmodable (file), NULL);
-
/* always display the warning even if we cannot fix it */
gtk_widget_show (chooser->fixperm_label);
+ gtk_widget_show (chooser->fixperm_button);
}
else
{
@@ -912,7 +976,7 @@ thunar_permissions_chooser_group_changed (ThunarPermissionsChooser *chooser,
_thunar_return_if_fail (GTK_IS_COMBO_BOX (combo));
/* verify that we have a valid file */
- if (G_UNLIKELY (chooser->file == NULL))
+ if (G_UNLIKELY (chooser->files == NULL))
return;
/* determine the tree model from the combo box */
@@ -942,7 +1006,7 @@ thunar_permissions_chooser_program_toggled (ThunarPermissionsChooser *chooser,
_thunar_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
/* verify that we have a valid file */
- if (G_UNLIKELY (chooser->file == NULL))
+ if (G_UNLIKELY (chooser->files == NULL))
return;
/* determine the new mode based on the toggle state */
@@ -963,13 +1027,16 @@ thunar_permissions_chooser_fixperm_clicked (ThunarPermissionsChooser *chooser,
GtkWidget *window;
ThunarJob *job;
gint response;
+ GList *lp;
+ GList file_list;
_thunar_return_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser));
_thunar_return_if_fail (chooser->fixperm_button == button);
_thunar_return_if_fail (GTK_IS_BUTTON (button));
+ _thunar_return_if_fail (thunar_permissions_chooser_has_fixable_directory (chooser));
/* verify that we have a valid file */
- if (G_UNLIKELY (chooser->file == NULL))
+ if (G_UNLIKELY (chooser->files == NULL))
return;
/* determine the toplevel widget */
@@ -994,23 +1061,34 @@ thunar_permissions_chooser_fixperm_clicked (ThunarPermissionsChooser *chooser,
gtk_widget_destroy (dialog);
/* check if we should apply the changes */
- if (G_LIKELY (chooser->file != NULL && response == GTK_RESPONSE_OK))
+ if (response == GTK_RESPONSE_OK)
{
- /* determine the current mode */
- mode = thunar_file_get_mode (chooser->file);
+ for (lp = chooser->files; lp != NULL; lp = lp->next)
+ {
+ /* skip files that are fine */
+ if (!thunar_permissions_chooser_is_fixable_directory (THUNAR_FILE (lp->data)))
+ continue;
+
+ /* determine the current mode */
+ mode = thunar_file_get_mode (THUNAR_FILE (lp->data));
- /* determine the new mode (making sure the owner can read/enter the folder) */
- mode = (THUNAR_FILE_MODE_USR_READ | THUNAR_FILE_MODE_USR_EXEC)
- | (((mode & THUNAR_FILE_MODE_GRP_READ) != 0) ? THUNAR_FILE_MODE_GRP_EXEC : 0)
- | (((mode & THUNAR_FILE_MODE_OTH_READ) != 0) ? THUNAR_FILE_MODE_OTH_EXEC : 0);
+ /* determine the new mode (making sure the owner can read/enter the folder) */
+ mode = (THUNAR_FILE_MODE_USR_READ | THUNAR_FILE_MODE_USR_EXEC)
+ | (((mode & THUNAR_FILE_MODE_GRP_READ) != 0) ? THUNAR_FILE_MODE_GRP_EXEC : 0)
+ | (((mode & THUNAR_FILE_MODE_OTH_READ) != 0) ? THUNAR_FILE_MODE_OTH_EXEC : 0);
- /* try to allocate the new job */
- job = thunar_io_jobs_change_mode (thunar_file_get_file (chooser->file),
- 0511, mode, 0000, 0000, FALSE);
+ file_list.prev = NULL;
+ file_list.data = thunar_file_get_file (THUNAR_FILE (lp->data));
+ file_list.next = NULL;
- /* handle the job */
- thunar_permissions_chooser_job_start (chooser, job, FALSE);
- g_object_unref (job);
+ /* try to allocate the new job */
+ job = thunar_io_jobs_change_mode (&file_list,
+ 0511, mode, 0000, 0000, FALSE);
+
+ /* handle the job */
+ thunar_permissions_chooser_job_start (chooser, job, FALSE);
+ g_object_unref (job);
+ }
}
}
@@ -1075,7 +1153,7 @@ thunar_permissions_chooser_job_error (ThunarPermissionsChooser *chooser,
ThunarJob *job)
{
GtkWidget *toplevel;
-
+
_thunar_return_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser));
_thunar_return_if_fail (error != NULL && error->message != NULL);
_thunar_return_if_fail (THUNAR_IS_JOB (job));
@@ -1110,7 +1188,7 @@ thunar_permissions_chooser_job_finished (ThunarPermissionsChooser *chooser,
static void
-thunar_permissions_chooser_job_percent (ThunarPermissionsChooser *chooser,
+thunar_permissions_chooser_job_percent (ThunarPermissionsChooser *chooser,
gdouble percent,
ThunarJob *job)
{
@@ -1142,7 +1220,7 @@ thunar_permissions_chooser_job_start (ThunarPermissionsChooser *chooser,
/* don't connect percent for single file operations */
if (G_UNLIKELY (recursive))
g_signal_connect_swapped (job, "percent", G_CALLBACK (thunar_permissions_chooser_job_percent), chooser);
-
+
/* setup the progress bar */
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (chooser->job_progress), 0.0);
@@ -1188,65 +1266,70 @@ thunar_permissions_chooser_new (void)
/**
- * thunar_permissions_chooser_get_file:
+ * thunar_permissions_chooser_get_files:
* @chooser : a #ThunarPermissionsChooser.
*
- * Returns the #ThunarFile associated with the specified @chooser.
+ * Returns the #ThunarFile's associated with the specified @chooser.
*
* Return value: the file associated with @chooser.
**/
-ThunarFile*
-thunar_permissions_chooser_get_file (ThunarPermissionsChooser *chooser)
+GList*
+thunar_permissions_chooser_get_files (ThunarPermissionsChooser *chooser)
{
_thunar_return_val_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser), NULL);
- return chooser->file;
+ return chooser->files;
}
/**
- * thunar_permissions_chooser_set_file:
+ * thunar_permissions_chooser_set_files:
* @chooser : a #ThunarPermissionsChooser.
- * @file : a #ThunarFile or %NULL.
+ * @files : a list of #ThunarFiles or %NULL.
*
* Associates @chooser with the specified @file.
**/
void
-thunar_permissions_chooser_set_file (ThunarPermissionsChooser *chooser,
- ThunarFile *file)
+thunar_permissions_chooser_set_files (ThunarPermissionsChooser *chooser,
+ GList *files)
{
+ GList *lp;
+
_thunar_return_if_fail (THUNAR_IS_PERMISSIONS_CHOOSER (chooser));
- _thunar_return_if_fail (file == NULL || THUNAR_IS_FILE (file));
/* check if we already use that file */
- if (G_UNLIKELY (chooser->file == file))
+ if (G_UNLIKELY (chooser->files == files))
return;
- /* disconnect from the previous file */
- if (G_LIKELY (chooser->file != NULL))
+ /* disconnect from the previous files */
+ for (lp = chooser->files; lp != NULL; lp = lp->next)
{
- g_signal_handlers_disconnect_by_func (G_OBJECT (chooser->file), thunar_permissions_chooser_file_changed, chooser);
- g_object_unref (G_OBJECT (chooser->file));
+ _thunar_assert (THUNAR_IS_FILE (lp->data));
+ g_signal_handlers_disconnect_by_func (G_OBJECT (lp->data), thunar_permissions_chooser_file_changed, chooser);
+ g_object_unref (G_OBJECT (lp->data));
}
+ g_list_free (chooser->files);
/* activate the new file */
- chooser->file = file;
+ chooser->files = g_list_copy (files);
- /* connect to the new file */
- if (G_LIKELY (file != NULL))
+ /* connect to the new files */
+ for (lp = chooser->files; lp != NULL; lp = lp->next)
{
/* take a reference on the file */
- g_object_ref (G_OBJECT (file));
+ _thunar_assert (THUNAR_IS_FILE (lp->data));
+ g_object_ref (G_OBJECT (lp->data));
/* stay informed about changes */
- g_signal_connect_swapped (G_OBJECT (file), "changed", G_CALLBACK (thunar_permissions_chooser_file_changed), chooser);
-
- /* update our state */
- thunar_permissions_chooser_file_changed (chooser, file);
+ g_signal_connect_swapped (G_OBJECT (lp->data), "changed", G_CALLBACK (thunar_permissions_chooser_file_changed), chooser);
}
+ /* update our state */
+ if (chooser->files != NULL)
+ thunar_permissions_chooser_file_changed (chooser);
+
/* notify listeners */
- g_object_notify (G_OBJECT (chooser), "file");
+ g_object_notify (G_OBJECT (chooser), "files");
}
diff --git a/thunar/thunar-permissions-chooser.h b/thunar/thunar-permissions-chooser.h
index d85a5cf..db72ad9 100644
--- a/thunar/thunar-permissions-chooser.h
+++ b/thunar/thunar-permissions-chooser.h
@@ -34,13 +34,13 @@ typedef struct _ThunarPermissionsChooser ThunarPermissionsChooser;
#define THUNAR_IS_PERMISSIONS_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_TYPE_PERMISSIONS_CHOOSER))
#define THUNAR_PERMISSIONS_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_TYPE_PERMISSIONS_CHOOSER, ThunarPermissionsChooserClass))
-GType thunar_permissions_chooser_get_type (void) G_GNUC_CONST;
+GType thunar_permissions_chooser_get_type (void) G_GNUC_CONST;
-GtkWidget *thunar_permissions_chooser_new (void) G_GNUC_MALLOC;
+GtkWidget *thunar_permissions_chooser_new (void) G_GNUC_MALLOC;
-ThunarFile *thunar_permissions_chooser_get_file (ThunarPermissionsChooser *chooser);
-void thunar_permissions_chooser_set_file (ThunarPermissionsChooser *chooser,
- ThunarFile *file);
+GList *thunar_permissions_chooser_get_files (ThunarPermissionsChooser *chooser);
+void thunar_permissions_chooser_set_files (ThunarPermissionsChooser *chooser,
+ GList *files);
G_END_DECLS;
diff --git a/thunar/thunar-properties-dialog.c b/thunar/thunar-properties-dialog.c
index 907055e..d6b8b17 100644
--- a/thunar/thunar-properties-dialog.c
+++ b/thunar/thunar-properties-dialog.c
@@ -534,7 +534,7 @@ thunar_properties_dialog_init (ThunarPropertiesDialog *dialog)
*/
label = gtk_label_new (_("Permissions"));
dialog->permissions_chooser = thunar_permissions_chooser_new ();
- /*TODOexo_binding_new (G_OBJECT (dialog), "files", G_OBJECT (dialog->permissions_chooser), "files");*/
+ exo_binding_new (G_OBJECT (dialog), "files", G_OBJECT (dialog->permissions_chooser), "files");
gtk_notebook_append_page (GTK_NOTEBOOK (dialog->notebook), dialog->permissions_chooser, label);
gtk_widget_show (dialog->permissions_chooser);
gtk_widget_show (label);
@@ -1110,6 +1110,7 @@ thunar_properties_dialog_update_multiple (ThunarPropertiesDialog *dialog)
gchar *display_name;
ThunarFile *parent_file = NULL;
ThunarFile *tmp_parent;
+ gboolean has_trashed_files = FALSE;
_thunar_return_if_fail (THUNAR_IS_PROPERTIES_DIALOG (dialog));
_thunar_return_if_fail (g_list_length (dialog->files) > 1);
@@ -1190,6 +1191,9 @@ thunar_properties_dialog_update_multiple (ThunarPropertiesDialog *dialog)
g_object_unref (G_OBJECT (tmp_parent));
}
+ if (thunar_file_is_trashed (file))
+ has_trashed_files = TRUE;
+
first_file = FALSE;
}
@@ -1197,6 +1201,9 @@ thunar_properties_dialog_update_multiple (ThunarPropertiesDialog *dialog)
gtk_label_set_text (GTK_LABEL (dialog->names_label), names_string->str);
g_string_free (names_string, TRUE);
+ /* hide the permissions chooser for trashed files */
+ gtk_widget_set_visible (dialog->permissions_chooser, !has_trashed_files);
+
/* update the content type */
if (content_type != NULL
&& !g_content_type_equals (content_type, "inode/symlink"))
@@ -1244,10 +1251,6 @@ thunar_properties_dialog_update_multiple (ThunarPropertiesDialog *dialog)
{
gtk_widget_hide (dialog->volume_label);
}
-
- /* all files should have the same base-location, if that is the
- * trash or inside the trash, hide the permission chooser */
- gtk_widget_set_visible (dialog->permissions_chooser, FALSE/*!thunar_file_is_trashed (file)*/);
}
More information about the Xfce4-commits
mailing list