[Xfce4-commits] <thunar:master> Improve flag handing in ThunarFile.

Nick Schermer noreply at xfce.org
Sat Nov 10 17:04:01 CET 2012


Updating branch refs/heads/master
         to 42c64c1693350448e91be05da79bcdaca8179c0a (commit)
       from 3e50f502578fdf8377a3d46e05cacb65f8abaff8 (commit)

commit 42c64c1693350448e91be05da79bcdaca8179c0a
Author: Nick Schermer <nick at xfce.org>
Date:   Fri Nov 9 20:05:26 2012 +0100

    Improve flag handing in ThunarFile.
    
    Code is easier to understand this way.

 thunar/thunar-file.c |   79 +++++++++++++++++++++++++++++++------------------
 thunar/thunar-file.h |   18 ++++++------
 2 files changed, 59 insertions(+), 38 deletions(-)

diff --git a/thunar/thunar-file.c b/thunar/thunar-file.c
index 50db469..7a18e83 100644
--- a/thunar/thunar-file.c
+++ b/thunar/thunar-file.c
@@ -70,9 +70,6 @@
 
 
 
-/* Additional flags associated with a ThunarFile */
-#define THUNAR_FILE_IN_DESTRUCTION 0x04
-
 /* Dump the file cache every X second, set to 0 to disable */
 #define DUMP_FILE_CACHE 0
 
@@ -132,6 +129,22 @@ static guint              file_signals[LAST_SIGNAL];
 
 
 
+#define FLAG_SET_THUMB_STATE(file,new_state) G_STMT_START{ (file)->flags = ((file)->flags & ~THUNAR_FILE_FLAG_THUMB_MASK) | (new_state); }G_STMT_END
+#define FLAG_GET_THUMB_STATE(file)           ((file)->flags & THUNAR_FILE_FLAG_THUMB_MASK)
+#define FLAG_SET(file,flag)                  G_STMT_START{ ((file)->flags |= (flag)); }G_STMT_END
+#define FLAG_UNSET(file,flag)                G_STMT_START{ ((file)->flags &= ~(flag)); }G_STMT_END
+#define FLAG_IS_SET(file,flag)               (((file)->flags & (flag)) != 0)
+
+
+
+typedef enum
+{
+  THUNAR_FILE_FLAG_THUMB_MASK     = 0x03,   /* storage for ThunarFileThumbState */
+  THUNAR_FILE_FLAG_IN_DESTRUCTION = 1 << 2, /* for avoiding recursion during destroy */
+  THUNAR_FILE_FLAG_IS_MOUNTED     = 1 << 3, /* whether this file is mounted */
+}
+ThunarFileFlags;
+
 struct _ThunarFileClass
 {
   GObjectClass __parent__;
@@ -142,20 +155,24 @@ struct _ThunarFileClass
 
 struct _ThunarFile
 {
-  GObject        __parent__;
+  GObject __parent__;
 
-  /*< private >*/
-  GFileInfo     *info;
-  GFileType      kind;
-  GFile         *gfile;
-  gchar         *custom_icon_name;
-  gchar         *display_name;
-  gchar         *collate_key;
-  gchar         *collate_key_nocase;
-  gchar         *basename;
-  gchar         *thumbnail_path;
-  guint          flags;
-  guint          is_mounted : 1;
+  /* storage for the file information */
+  GFileInfo            *info;
+  GFileType             kind;
+  GFile                *gfile;
+
+  gchar                *custom_icon_name;
+  gchar                *display_name;
+  gchar                *basename;
+  gchar                *thumbnail_path;
+
+  /* sorting */
+  gchar                *collate_key;
+  gchar                *collate_key_nocase;
+
+  /* flags for thumbnail state etc */
+  ThunarFileFlags       flags;
 };
 
 typedef struct
@@ -347,12 +364,12 @@ thunar_file_dispose (GObject *object)
   ThunarFile *file = THUNAR_FILE (object);
 
   /* check that we don't recurse here */
-  if (G_LIKELY ((file->flags & THUNAR_FILE_IN_DESTRUCTION) == 0))
+  if (!FLAG_IS_SET (file, THUNAR_FILE_FLAG_IN_DESTRUCTION))
     {
       /* emit the "destroy" signal */
-      file->flags |= THUNAR_FILE_IN_DESTRUCTION;
+      FLAG_SET (file, THUNAR_FILE_FLAG_IN_DESTRUCTION);
       g_signal_emit (object, file_signals[DESTROY], 0);
-      file->flags &= ~THUNAR_FILE_IN_DESTRUCTION;
+      FLAG_UNSET (file, THUNAR_FILE_FLAG_IN_DESTRUCTION);
     }
 
   (*G_OBJECT_CLASS (thunar_file_parent_class)->dispose) (object);
@@ -523,7 +540,7 @@ thunar_file_info_changed (ThunarxFileInfo *file_info)
 
   /* set the new thumbnail state manually, so we only emit file
    * changed once */
-  file->flags = (file->flags & ~THUNAR_FILE_THUMB_STATE_MASK) | (THUNAR_FILE_THUMB_STATE_UNKNOWN);
+  FLAG_SET_THUMB_STATE (file, THUNAR_FILE_THUMB_STATE_UNKNOWN);
 
   /* tell the file monitor that this file changed */
   thunar_file_monitor_file_changed (file);
@@ -765,10 +782,10 @@ thunar_file_info_clear (ThunarFile *file)
   file->thumbnail_path = NULL;
 
   /* assume the file is mounted by default */
-  file->is_mounted = TRUE;
+  FLAG_SET (file, THUNAR_FILE_FLAG_IS_MOUNTED);
 
   /* set thumb state to unknown */
-  file->flags = (file->flags & ~THUNAR_FILE_THUMB_STATE_MASK) | THUNAR_FILE_THUMB_STATE_UNKNOWN;
+  FLAG_SET_THUMB_STATE (file, THUNAR_FILE_THUMB_STATE_UNKNOWN);
 }
 
 
@@ -795,7 +812,11 @@ thunar_file_info_reload (ThunarFile   *file,
       if (file->kind == G_FILE_TYPE_MOUNTABLE)
         {
           target_uri = g_file_info_get_attribute_string (file->info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
-          file->is_mounted = (target_uri != NULL) && !g_file_info_get_attribute_boolean (file->info, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT);
+          if (target_uri != NULL
+              && !g_file_info_get_attribute_boolean (file->info, G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT))
+            FLAG_SET (file, THUNAR_FILE_FLAG_IS_MOUNTED);
+          else
+             FLAG_UNSET (file, THUNAR_FILE_FLAG_IS_MOUNTED);
         }
     }
 
@@ -929,7 +950,7 @@ thunar_file_get_async_finish (GObject      *object,
       && error->domain == G_IO_ERROR
       && error->code == G_IO_ERROR_NOT_MOUNTED)
    {
-      file->is_mounted = FALSE;
+      FLAG_UNSET (file, THUNAR_FILE_FLAG_IS_MOUNTED);
       g_clear_error (&error);
    }
 
@@ -1002,7 +1023,7 @@ thunar_file_load (ThunarFile   *file,
       && err->domain == G_IO_ERROR
       && err->code == G_IO_ERROR_NOT_MOUNTED)
    {
-      file->is_mounted = FALSE;
+      FLAG_UNSET (file, THUNAR_FILE_FLAG_IS_MOUNTED);
       g_clear_error (&err);
    }
 
@@ -2355,7 +2376,7 @@ gboolean
 thunar_file_is_mounted (const ThunarFile *file)
 {
   _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE);
-  return file->is_mounted;
+  return FLAG_IS_SET (file, THUNAR_FILE_FLAG_IS_MOUNTED);
 }
 
 
@@ -3203,7 +3224,7 @@ ThunarFileThumbState
 thunar_file_get_thumb_state (const ThunarFile *file)
 {
   _thunar_return_val_if_fail (THUNAR_IS_FILE (file), THUNAR_FILE_THUMB_STATE_UNKNOWN);
-  return (file->flags & THUNAR_FILE_THUMB_STATE_MASK);
+  return FLAG_GET_THUMB_STATE (file);
 }
 
 
@@ -3228,7 +3249,7 @@ thunar_file_set_thumb_state (ThunarFile          *file,
     return;
 
   /* set the new thumbnail state */
-  file->flags = (file->flags & ~THUNAR_FILE_THUMB_STATE_MASK) | (state);
+  FLAG_SET_THUMB_STATE (file, state);
 
   /* remove path if the type is not supported */
   if (state == THUNAR_FILE_THUMB_STATE_NONE
@@ -3518,7 +3539,7 @@ thunar_file_destroy (ThunarFile *file)
 {
   _thunar_return_if_fail (THUNAR_IS_FILE (file));
 
-  if (G_LIKELY ((file->flags & THUNAR_FILE_IN_DESTRUCTION) == 0))
+  if (!FLAG_IS_SET (file, THUNAR_FILE_FLAG_IN_DESTRUCTION))
     {
       /* take an additional reference on the file, as the file-destroyed
        * invocation may already release the last reference.
diff --git a/thunar/thunar-file.h b/thunar/thunar-file.h
index d78b612..586b18a 100644
--- a/thunar/thunar-file.h
+++ b/thunar/thunar-file.h
@@ -76,7 +76,6 @@ typedef enum /*< enum >*/
 
 /**
  * ThunarFileThumbState:
- * @THUNAR_FILE_THUMB_STATE_MASK    : the mask to extract the thumbnail state.
  * @THUNAR_FILE_THUMB_STATE_UNKNOWN : unknown whether there's a thumbnail.
  * @THUNAR_FILE_THUMB_STATE_NONE    : no thumbnail is available.
  * @THUNAR_FILE_THUMB_STATE_READY   : a thumbnail is available.
@@ -86,17 +85,18 @@ typedef enum /*< enum >*/
  **/
 typedef enum /*< flags >*/
 {
-  THUNAR_FILE_THUMB_STATE_MASK    = 0x03,
-  THUNAR_FILE_THUMB_STATE_UNKNOWN = 0x00,
-  THUNAR_FILE_THUMB_STATE_NONE    = 0x01,
-  THUNAR_FILE_THUMB_STATE_READY   = 0x02,
-  THUNAR_FILE_THUMB_STATE_LOADING = 0x03,
+  THUNAR_FILE_THUMB_STATE_UNKNOWN = 0,
+  THUNAR_FILE_THUMB_STATE_NONE    = 1,
+  THUNAR_FILE_THUMB_STATE_READY   = 2,
+  THUNAR_FILE_THUMB_STATE_LOADING = 3,
 } ThunarFileThumbState;
 
+
+
 #define THUNAR_FILE_EMBLEM_NAME_SYMBOLIC_LINK "emblem-symbolic-link"
-#define THUNAR_FILE_EMBLEM_NAME_CANT_READ "emblem-noread"
-#define THUNAR_FILE_EMBLEM_NAME_CANT_WRITE "emblem-nowrite"
-#define THUNAR_FILE_EMBLEM_NAME_DESKTOP "emblem-desktop"
+#define THUNAR_FILE_EMBLEM_NAME_CANT_READ     "emblem-noread"
+#define THUNAR_FILE_EMBLEM_NAME_CANT_WRITE    "emblem-nowrite"
+#define THUNAR_FILE_EMBLEM_NAME_DESKTOP       "emblem-desktop"
 
 
 


More information about the Xfce4-commits mailing list