[Xfce4-commits] <tumbler:jannis/specialized> Squashme: Reworking the loading process of specialized thumbnailers.

Jannis Pohlmann noreply at xfce.org
Mon Oct 26 01:34:06 CET 2009


Updating branch refs/heads/jannis/specialized
         to 742e2df3e77ba9ada119ab8af90bb5d697c580b8 (commit)
       from 17eccbf92dac484e8d13ee6ea3d9c5cbbfbb5cca (commit)

commit 742e2df3e77ba9ada119ab8af90bb5d697c580b8
Author: Jannis Pohlmann <jannis at xfce.org>
Date:   Mon Oct 26 01:24:26 2009 +0100

    Squashme: Reworking the loading process of specialized thumbnailers.
    
    I think we can simplify it the following way: TumblerManager keeps a
    list of all override infos for each override URI scheme / MIME type
    pair. TumblerRegistry uses two hash tables: one for normal thumbnailers,
    one for thumbnailers that override others.
    
    So, when a thumbnail request is received, the registry first looks for a
    thumbnailer in the override hash table. When a thumbnailer service file
    changes or a new thumbnailer registers itself dynamically we check if we
    need to update the override state or not. This might involve a few
    changes to TumblerRegistry as it cannot all be done in TumblerManager.
    
    When an override file is modified, we need to reload all override
    information and then walk through the specialized thumbnailers, moving
    them into or out of the override hash table in TumblerRegistry.
    
    Something like that might work. This commit is a first step towards it.

 tumbler/tumbler-thumbnailer.c              |    2 +-
 tumblerd/tumbler-manager.c                 |  158 +++++++++++++++++++++-------
 tumblerd/tumbler-manager.h                 |    4 +-
 tumblerd/tumbler-specialized-thumbnailer.c |   82 +++++++++++---
 tumblerd/tumbler-specialized-thumbnailer.h |   29 +++---
 5 files changed, 201 insertions(+), 74 deletions(-)

diff --git a/tumbler/tumbler-thumbnailer.c b/tumbler/tumbler-thumbnailer.c
index 31dad95..0395035 100644
--- a/tumbler/tumbler-thumbnailer.c
+++ b/tumbler/tumbler-thumbnailer.c
@@ -124,7 +124,7 @@ tumbler_thumbnailer_class_init (TumblerThumbnailerIface *klass)
   tumbler_thumbnailer_signals[SIGNAL_UNREGISTER] =
     g_signal_new ("unregister",
                   TUMBLER_TYPE_THUMBNAILER,
-                  G_SIGNAL_RUN_LAST,
+                  G_SIGNAL_RUN_LAST | G_SIGNAL_NO_HOOKS,
                   G_STRUCT_OFFSET (TumblerThumbnailerIface, unregister),
                   NULL,
                   NULL,
diff --git a/tumblerd/tumbler-manager.c b/tumblerd/tumbler-manager.c
index 24759fa..a08e4ef 100644
--- a/tumblerd/tumbler-manager.c
+++ b/tumblerd/tumbler-manager.c
@@ -33,6 +33,8 @@
 #include <glib-object.h>
 #include <glib/gi18n.h>
 
+#include <gio/gio.h>
+
 #include <dbus/dbus.h>
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
@@ -108,11 +110,9 @@ struct _OverrideInfo
 
 struct _ThumbnailerInfo
 {
-  gchar *filename;
-  gchar *name;
-  gchar **uri_schemes;
-  gchar **mime_types;
-  time_t  mtime;
+  gchar              *basename;
+  TumblerThumbnailer *thumbnailer;
+  gint                dir_index;
 };
 
 
@@ -181,6 +181,9 @@ tumbler_manager_finalize (GObject *object)
   g_list_foreach (manager->monitors, (GFunc) monitor_unref, NULL);
   g_list_free (manager->monitors);
 
+  if (manager->thumbnailers != NULL)
+    g_hash_table_unref (manager->thumbnailers);
+
   if (manager->overrides != NULL)
     g_hash_table_unref (manager->overrides);
 
@@ -477,10 +480,9 @@ thumbnailer_info_free (ThumbnailerInfo *info)
   if (info == NULL)
     return;
 
-  g_free (info->filename);
-  g_free (info->name);
-  g_strfreev (info->uri_schemes);
-  g_strfreev (info->mime_types);
+  g_free (info->basename);
+  if (info->thumbnailer != NULL)
+    g_object_unref (info->thumbnailer);
   g_slice_free (ThumbnailerInfo, info);
 }
 
@@ -490,10 +492,20 @@ static gint
 thumbnailer_info_compare (gconstpointer a, 
                           gconstpointer b)
 {
-  const ThumbnailerInfo *info_a = a;
-  const ThumbnailerInfo *info_b = b;
+  TumblerSpecializedThumbnailer *thumbnailer_a;
+  TumblerSpecializedThumbnailer *thumbnailer_b;
+  const ThumbnailerInfo         *info_a = a;
+  const ThumbnailerInfo         *info_b = b;
+  guint64                        mtime_a;
+  guint64                        mtime_b;
 
-  return CLAMP (info_a->mtime - info_b->mtime, -1, 1);
+  thumbnailer_a = TUMBLER_SPECIALIZED_THUMBNAILER (info_a->thumbnailer);
+  thumbnailer_b = TUMBLER_SPECIALIZED_THUMBNAILER (info_b->thumbnailer);
+
+  mtime_a = tumbler_specialized_thumbnailer_get_modified (thumbnailer_a);
+  mtime_b = tumbler_specialized_thumbnailer_get_modified (thumbnailer_b);
+
+  return CLAMP (mtime_a - mtime_b, -1, 1);
 }
 
 
@@ -523,6 +535,7 @@ tumbler_manager_load_thumbnailer_infos (TumblerManager *manager,
   gchar           *dirname;
   gchar           *filename;
   gchar           *name;
+  gchar           *object_path;
   gchar          **uri_schemes;
   gchar          **mime_types;
   guint            n;
@@ -548,6 +561,11 @@ tumbler_manager_load_thumbnailer_infos (TumblerManager *manager,
       if (!g_str_has_suffix (basename, ".service"))
         continue;
 
+      /* skip .service files if files with the same filename appeared in
+       * directories with higher priorities */
+      if (g_hash_table_lookup (manager->thumbnailers, basename) != NULL)
+        continue;
+
       filename = g_build_filename (dirname, basename, NULL);
 
       if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR))
@@ -583,6 +601,19 @@ tumbler_manager_load_thumbnailer_infos (TumblerManager *manager,
           continue;
         }
 
+      object_path = g_key_file_get_string (key_file, "Specialized Thumbnailer", 
+                                           "ObjectPath", &error);
+      if (object_path == NULL)
+        {
+          g_warning (_("Malformed file \"%s\": %s"), filename, error->message);
+          g_clear_error (&error);
+
+          g_key_file_free (key_file);
+          g_free (filename);
+
+          continue;
+        }
+
       mime_types = g_key_file_get_string_list (key_file, "Specialized Thumbnailer",
                                                "MimeTypes", NULL, &error);
       if (mime_types == NULL)
@@ -590,6 +621,7 @@ tumbler_manager_load_thumbnailer_infos (TumblerManager *manager,
           g_warning (_("Malformed file \"%s\": %s"), filename, error->message);
           g_clear_error (&error);
 
+          g_free (object_path);
           g_free (name);
           g_key_file_free (key_file);
           g_free (filename);
@@ -612,6 +644,7 @@ tumbler_manager_load_thumbnailer_infos (TumblerManager *manager,
 
           g_strfreev (uri_schemes);
           g_strfreev (mime_types);
+          g_free (object_path);
           g_free (name);
           g_key_file_free (key_file);
           g_free (filename);
@@ -619,21 +652,24 @@ tumbler_manager_load_thumbnailer_infos (TumblerManager *manager,
           continue;
         }
 
-      infos = g_hash_table_lookup (manager->thumbnailers, name);
-      if (infos == NULL)
-        {
-          infos = g_ptr_array_new ();
-          g_hash_table_replace (manager->thumbnailers, name, infos);
-        }
-
       info = thumbnailer_info_new ();
-      info->filename = filename;
-      info->name = name;
-      info->mtime = stat.st_mtime;
-      info->uri_schemes = uri_schemes;
-      info->mime_types = mime_types;
+      info->basename = g_strdup (basename);
+      info->dir_index = g_list_index (manager->directories, directory);
+      info->thumbnailer = 
+        tumbler_specialized_thumbnailer_new (manager->connection, name, object_path,
+                                             (const gchar *const *)uri_schemes,
+                                             (const gchar *const *)mime_types,
+                                             stat.st_mtime);
+
+      g_hash_table_insert (manager->thumbnailers, g_strdup (basename), info);
+
+      g_strfreev (uri_schemes);
+      g_strfreev (mime_types);
+      g_free (object_path);
+      g_free (name);
+      g_key_file_free (key_file);
 
-      g_ptr_array_add (infos, info);
+      g_free (filename);
     }
 }
 
@@ -642,9 +678,16 @@ tumbler_manager_load_thumbnailer_infos (TumblerManager *manager,
 static void
 tumbler_manager_update_thumbnailers (TumblerManager *manager)
 {
-  GHashTableIter hash_iter;
-  GPtrArray     *infos;
-  GList         *iter;
+  ThumbnailerInfo *thumbnailer_info;
+  GHashTableIter   thumbnailer_iter;
+  GHashTableIter   override_iter;
+  OverrideInfo    *override_info;
+  const gchar     *hash_key;
+  const gchar     *override_key;
+  const gchar     *name;
+  GPtrArray       *overrides;
+  GList           *iter;
+  guint            n;
 
   g_return_if_fail (TUMBLER_IS_MANAGER (manager));
 
@@ -656,17 +699,48 @@ tumbler_manager_update_thumbnailers (TumblerManager *manager)
   else
     {
       /* otheriwse allocate the thumbnailer cache on-demand */
-      manager->thumbnailers = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                                     g_free, thumbnailer_info_array_free);
+      manager->thumbnailers = 
+        g_hash_table_new_full (g_str_hash, g_str_equal, g_free, 
+                               (GDestroyNotify) thumbnailer_info_free);
     }
 
   /* iterate over all thumbnailer directories with increasing priority */
   for (iter = manager->directories; iter != NULL; iter = iter->next)
     tumbler_manager_load_thumbnailer_infos (manager, iter->data);
 
-  g_hash_table_iter_init (&hash_iter, manager->thumbnailers);
-  while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &infos))
-    g_ptr_array_sort (infos, thumbnailer_info_compare);
+  /* iterate over all thumbnailers */
+  g_hash_table_iter_init (&thumbnailer_iter, manager->thumbnailers);
+  while (g_hash_table_iter_next (&thumbnailer_iter, NULL, (gpointer) &thumbnailer_info))
+    {
+      override_key = NULL;
+
+      name = tumbler_specialized_thumbnailer_get_name (
+        TUMBLER_SPECIALIZED_THUMBNAILER (thumbnailer_info->thumbnailer));
+
+      g_debug ("thumbnailer: %s", name);
+
+      g_hash_table_iter_init (&override_iter, manager->overrides);
+      while (override_key == NULL 
+             && g_hash_table_iter_next (&override_iter, (gpointer) &hash_key, 
+                                        (gpointer) &overrides))
+        {
+          for (n = 0; override_key == NULL && n < overrides->len; ++n)
+            {
+              override_info = g_ptr_array_index (overrides, n);
+
+              if (g_strcmp0 (name, override_info->name) == 0)
+                override_key = hash_key;
+            }
+        }
+
+      if (override_key != NULL)
+        {
+          g_debug ("  overrides others in %s", override_key);
+        }
+      else
+        {
+        }
+    }
 }
 
 
@@ -707,6 +781,10 @@ tumbler_manager_load_thumbnailers (TumblerManager *manager)
       g_free (dirname);
     }
 
+  /* reverse the directory list so that the directories with highest 
+   * priority come first */
+  directories = g_list_reverse (directories);
+
   g_mutex_lock (manager->mutex);
 
   /* pass the ownership of the directories list to the manager */
@@ -837,7 +915,7 @@ tumbler_manager_directory_changed (TumblerManager   *manager,
 
               /* TODO load thumbnailers from iter->data */
             }
-          else if (event_type == G_FILE_MONITOR_CHANGED)
+          else if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
             {
               g_debug ("dir %s at index %i changed", g_file_get_path (file), dir_index);
 
@@ -927,24 +1005,24 @@ tumbler_manager_start (TumblerManager *manager,
 
 void
 tumbler_manager_register (TumblerManager        *manager, 
-                          gchar                 *uri_scheme, 
-                          gchar                 *mime_type, 
+                          const gchar *const    *uri_schemes, 
+                          const gchar *const    *mime_types, 
                           DBusGMethodInvocation *context)
 {
   TumblerThumbnailer *thumbnailer;
   gchar              *sender_name;
 
   dbus_async_return_if_fail (TUMBLER_IS_MANAGER (manager), context);
-  dbus_async_return_if_fail (uri_scheme != NULL, context);
-  dbus_async_return_if_fail (mime_type != NULL, context);
+  dbus_async_return_if_fail (uri_schemes != NULL, context);
+  dbus_async_return_if_fail (mime_types != NULL, context);
 
   sender_name = dbus_g_method_get_sender (context);
 
   g_mutex_lock (manager->mutex);
 
   thumbnailer = tumbler_specialized_thumbnailer_new_foreign (manager->connection,
-                                                             sender_name, uri_scheme, 
-                                                             mime_type);
+                                                             sender_name, uri_schemes, 
+                                                             mime_types);
 
   tumbler_registry_add (manager->registry, thumbnailer);
 
diff --git a/tumblerd/tumbler-manager.h b/tumblerd/tumbler-manager.h
index de02186..0f79f6e 100644
--- a/tumblerd/tumbler-manager.h
+++ b/tumblerd/tumbler-manager.h
@@ -44,8 +44,8 @@ TumblerManager *tumbler_manager_new           (DBusGConnection       *connection
 gboolean        tumbler_manager_start         (TumblerManager        *manager,
                                                GError               **error);
 void            tumbler_manager_register      (TumblerManager        *manager, 
-                                               gchar                 *uri_scheme, 
-                                               gchar                 *mime_type, 
+                                               const gchar *const    *uri_schemes, 
+                                               const gchar *const    *mime_types, 
                                                DBusGMethodInvocation *context);
 void            tumbler_manager_get_supported (TumblerManager        *manager, 
                                                DBusGMethodInvocation *context);
diff --git a/tumblerd/tumbler-specialized-thumbnailer.c b/tumblerd/tumbler-specialized-thumbnailer.c
index 63ea663..c1a3b0a 100644
--- a/tumblerd/tumbler-specialized-thumbnailer.c
+++ b/tumblerd/tumbler-specialized-thumbnailer.c
@@ -35,10 +35,8 @@
 enum
 {
   PROP_0,
-  PROP_MIME_TYPES,
-  PROP_URI_SCHEMES,
-  PROP_HASH_KEYS,
   PROP_NAME,
+  PROP_OBJECT_PATH,
   PROP_CONNECTION,
   PROP_PROXY,
   PROP_FOREIGN,
@@ -91,6 +89,7 @@ struct _TumblerSpecializedThumbnailer
   guint64          modified;
 
   gchar           *name;
+  gchar           *object_path;
 };
 
 
@@ -124,6 +123,15 @@ tumbler_specialized_thumbnailer_class_init (TumblerSpecializedThumbnailerClass *
                                                         G_PARAM_READWRITE));
 
   g_object_class_install_property (gobject_class,
+                                   PROP_OBJECT_PATH,
+                                   g_param_spec_string ("object-path",
+                                                        "object-path",
+                                                        "object-path",
+                                                        NULL,
+                                                        G_PARAM_CONSTRUCT_ONLY |
+                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
                                    PROP_CONNECTION,
                                    g_param_spec_pointer ("connection",
                                                          "connection",
@@ -179,7 +187,6 @@ static void
 tumbler_specialized_thumbnailer_constructed (GObject *object)
 {
   TumblerSpecializedThumbnailer *thumbnailer = TUMBLER_SPECIALIZED_THUMBNAILER (object);
-  gchar                         *bus_path;
 
   g_return_if_fail (TUMBLER_SPECIALIZED_THUMBNAILER (thumbnailer));
 
@@ -187,17 +194,12 @@ tumbler_specialized_thumbnailer_constructed (GObject *object)
   if (G_OBJECT_CLASS (tumbler_specialized_thumbnailer_parent_class)->constructed != NULL)
     (G_OBJECT_CLASS (tumbler_specialized_thumbnailer_parent_class)->constructed) (object);
 
-  bus_path = g_strdup_printf ("/%s", thumbnailer->name);
-  bus_path = g_strdelimit (bus_path, ".", '/');
-
   thumbnailer->proxy = 
     dbus_g_proxy_new_for_name (thumbnailer->connection,
                                thumbnailer->name,
-                               bus_path,
+                               thumbnailer->object_path,
                                "org.freedesktop.thumbnails.SpecializedThumbnailer1");
 
-  g_free (bus_path);
-
   dbus_g_object_register_marshaller (g_cclosure_marshal_VOID__STRING,
                                      G_TYPE_NONE, 
                                      G_TYPE_STRING,
@@ -237,6 +239,7 @@ tumbler_specialized_thumbnailer_finalize (GObject *object)
   TumblerSpecializedThumbnailer *thumbnailer = TUMBLER_SPECIALIZED_THUMBNAILER (object);
 
   g_free (thumbnailer->name);
+  g_free (thumbnailer->object_path);
 
   dbus_g_proxy_disconnect_signal (thumbnailer->proxy, "Ready",
                                   G_CALLBACK (tumbler_specialized_thumbnailer_proxy_ready),
@@ -246,6 +249,9 @@ tumbler_specialized_thumbnailer_finalize (GObject *object)
                                   G_CALLBACK (tumbler_specialized_thumbnailer_proxy_error),
                                   thumbnailer);
 
+  g_signal_handlers_disconnect_matched (thumbnailer->proxy, G_SIGNAL_MATCH_DATA,
+                                        0, 0, NULL, NULL, thumbnailer);
+
   g_object_unref (thumbnailer->proxy);
 
   dbus_g_connection_unref (thumbnailer->connection);
@@ -271,6 +277,9 @@ tumbler_specialized_thumbnailer_get_property (GObject    *object,
     case PROP_NAME:
       g_value_set_string (value, thumbnailer->name);
       break;
+    case PROP_OBJECT_PATH:
+      g_value_set_string (value, thumbnailer->object_path);
+      break;
     case PROP_PROXY:
       g_value_set_object (value, thumbnailer->proxy);
       break;
@@ -304,6 +313,9 @@ tumbler_specialized_thumbnailer_set_property (GObject      *object,
     case PROP_NAME:
       thumbnailer->name = g_value_dup_string (value);
       break;
+    case PROP_OBJECT_PATH:
+      thumbnailer->object_path = g_value_dup_string (value);
+      break;
     case PROP_FOREIGN:
       thumbnailer->foreign = g_value_get_boolean (value);
       break;
@@ -373,19 +385,44 @@ tumbler_specialized_thumbnailer_proxy_destroyed (DBusGProxy                    *
 
 
 TumblerThumbnailer *
-tumbler_specialized_thumbnailer_new_foreign (DBusGConnection *connection,
-                                             const gchar     *name,
-                                             const gchar     *uri_scheme,
-                                             const gchar     *mime_type)
+tumbler_specialized_thumbnailer_new (DBusGConnection    *connection,
+                                     const gchar        *name,
+                                     const gchar        *object_path,
+                                     const gchar *const *uri_schemes,
+                                     const gchar *const *mime_types,
+                                     guint64             modified)
+{
+  TumblerSpecializedThumbnailer *thumbnailer;
+
+  g_return_val_if_fail (connection != NULL, NULL);
+  g_return_val_if_fail (object_path != NULL, NULL);
+  g_return_val_if_fail (name != NULL, NULL);
+  g_return_val_if_fail (uri_schemes != NULL, NULL);
+  g_return_val_if_fail (mime_types != NULL, NULL);
+
+  thumbnailer = g_object_new (TUMBLER_TYPE_SPECIALIZED_THUMBNAILER, 
+                              "connection", connection, "foreign", FALSE, "name", name, 
+                              "object-path", object_path, "uri-schemes", uri_schemes, 
+                              "mime-types", mime_types,
+                              "modified", modified, NULL);
+
+  return TUMBLER_THUMBNAILER (thumbnailer);
+}
+
+
+
+TumblerThumbnailer *
+tumbler_specialized_thumbnailer_new_foreign (DBusGConnection    *connection,
+                                             const gchar        *name,
+                                             const gchar *const *uri_schemes,
+                                             const gchar *const *mime_types)
 {
   TumblerSpecializedThumbnailer *thumbnailer;
-  const gchar                   *uri_schemes[2] = { uri_scheme, NULL };
-  const gchar                   *mime_types[2] = { mime_type, NULL };
 
   g_return_val_if_fail (connection != NULL, NULL);
   g_return_val_if_fail (name != NULL, NULL);
-  g_return_val_if_fail (uri_scheme != NULL, NULL);
-  g_return_val_if_fail (mime_type != NULL, NULL);
+  g_return_val_if_fail (uri_schemes != NULL, NULL);
+  g_return_val_if_fail (mime_types != NULL, NULL);
 
   thumbnailer = g_object_new (TUMBLER_TYPE_SPECIALIZED_THUMBNAILER, 
                               "connection", connection, "foreign", TRUE, "name", name, 
@@ -397,6 +434,15 @@ tumbler_specialized_thumbnailer_new_foreign (DBusGConnection *connection,
 
 
 
+const gchar *
+tumbler_specialized_thumbnailer_get_name (TumblerSpecializedThumbnailer *thumbnailer)
+{
+  g_return_val_if_fail (TUMBLER_IS_SPECIALIZED_THUMBNAILER (thumbnailer), FALSE);
+  return thumbnailer->name;
+}
+
+
+
 gboolean
 tumbler_specialized_thumbnailer_get_foreign (TumblerSpecializedThumbnailer *thumbnailer)
 {
diff --git a/tumblerd/tumbler-specialized-thumbnailer.h b/tumblerd/tumbler-specialized-thumbnailer.h
index 7914618..97c922f 100644
--- a/tumblerd/tumbler-specialized-thumbnailer.h
+++ b/tumblerd/tumbler-specialized-thumbnailer.h
@@ -37,19 +37,22 @@ G_BEGIN_DECLS
 typedef struct _TumblerSpecializedThumbnailerClass TumblerSpecializedThumbnailerClass;
 typedef struct _TumblerSpecializedThumbnailer      TumblerSpecializedThumbnailer;
 
-GType               tumbler_specialized_thumbnailer_get_type     (void) G_GNUC_CONST;
-
-TumblerThumbnailer *tumbler_specialized_thumbnailer_new          (DBusGConnection               *connection,
-                                                                  const gchar                   *name,
-                                                                  const GStrv                   *uri_schemes,
-                                                                  const GStrv                   *mime_types,
-                                                                  guint64                        modified) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-TumblerThumbnailer *tumbler_specialized_thumbnailer_new_foreign  (DBusGConnection               *connection,
-                                                                  const gchar                   *name,
-                                                                  const gchar                   *uri_scheme,
-                                                                  const gchar                   *mime_type) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-gboolean            tumbler_specialized_thumbnailer_get_foreign  (TumblerSpecializedThumbnailer *thumbnailer);
-guint64             tumbler_specialized_thumbnailer_get_modified (TumblerSpecializedThumbnailer *thumbnailer);
+GType               tumbler_specialized_thumbnailer_get_type        (void) G_GNUC_CONST;
+
+TumblerThumbnailer *tumbler_specialized_thumbnailer_new             (DBusGConnection               *connection,
+                                                                     const gchar                   *name,
+                                                                     const gchar                   *object_path,
+                                                                     const gchar *const            *uri_schemes,
+                                                                     const gchar *const            *mime_types,
+                                                                     guint64                        modified) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+TumblerThumbnailer *tumbler_specialized_thumbnailer_new_foreign     (DBusGConnection               *connection,
+                                                                     const gchar                   *name,
+                                                                     const gchar *const            *uri_scheme,
+                                                                     const gchar *const            *mime_type) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+const gchar        *tumbler_specialized_thumbnailer_get_name        (TumblerSpecializedThumbnailer *thumbnailer);
+const gchar        *tumbler_specialized_thumbnailer_get_object_path (TumblerSpecializedThumbnailer *thumbnailer);
+gboolean            tumbler_specialized_thumbnailer_get_foreign     (TumblerSpecializedThumbnailer *thumbnailer);
+guint64             tumbler_specialized_thumbnailer_get_modified    (TumblerSpecializedThumbnailer *thumbnailer);
 
 G_END_DECLS
 



More information about the Xfce4-commits mailing list