Proposed draft for the thumbnail D-Bus specification

Philip Van Hoof spam at
Tue Sep 9 04:27:42 PDT 2008

On Tue, 2008-09-09 at 12:46 +0200, David Faure wrote:
> On Tuesday 09 September 2008, Philip Van Hoof wrote:
> > But I don't want to require process-based by specifying the possibility
> > of canceling an active task.
> Sure, I don't think it should be required, but I think it should be possible.
> Otherwise it kills any hope of KDE switching to such a spec.

Okay. Feel free to send me a proposal for cancels then.

> > Previews are not thumbnails ...
> That's a distinction I don't understand :)
> We use kio_thumbnail in PreviewJob, so obviously for us there is no such distinction.
> What distinction do you make?

> I thought we were talking about the use cases like "the icons in my file manager
> look like the contents of the files" (as well as the less common "the tooltip shows
> a bigger version of it" which we do as well, using the same backend).
> I assume you allow the application to request the size it wants?

No, the thumbnail-spec only mentions two sizes. This specification is
only for managing the cache in "thumbnail-spec".

The resize to the final size that the application is going to require,
is something a library on top of the specification is responsible for.

What most thumbnailers do is pick the best-fit thumbnail and resize that
to the final size (for example in memory).

Quick example:

static void on_thumbnails_ready (DBusGProxy *proxy,
				const gchar **uris,
				gpointer user_data)
  MyClass *self = user_data;

  unsigned int i = 0;
  while (uris[i] != NULL) {
    GdkPixbuf *pixbuf;

    char *small = get_thumbnail_path (uri);
    GFile *file = g_file_new_from_path (small);
    GInputStream *stream = g_file_read (file, NULL, NULL);

    /* This is the final resize */
    pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
		100, 100, TRUE,  NULL, NULL);

    /* Render the pixmap (assign to a GtkImage) */
    my_class_put_pixbuf_at (self, pixbuf, uri);

    gdk_pixbuf_unref (pixbuf);

    g_input_stream_close (stream);
    g_object_unref (stream);
    g_object_unref (file);


static void
my_class_init (MyClass *self)
   DBusGProxy *proxy = org.freedesktop.thumbnailer.Generic

   dbus_g_proxy_connect_signal (proxy, "Ready",
       G_CALLBACK (on_thumbnails_ready), NULL, self);

static void
my_class_on_i_need_to_render_a_screen (gchar **uris_to_render)
   char **uris = uris_to_render;

   uris[0] = strdup ("file:///home/user/Screenshot.png");

   org_freedesktop_thumbnailer_Generic_queue_async (proxy, 
         (const char **) uris, 0, NULL, NULL);

A preview is usually a lot larger than a thumbnail. Although you could
take the largest-sized thumbnail out of thumbnail-spec and resize that
for files that don't have a quick-preview technique (unlike jpeg).

In the spec you'll see Queue and Unqueue. You wont see: Queue for this
size. That also doesn't make a lot of sense "for managing the caches of
thumbnail-spec": The "thumbnail-spec" has "large", "normal" and "fail":
Large for the large thumbnail, normal for the normal thumbnail and fail
for failures. It doesn't have a folder for each ever requested final
resolution. No, your application (the library on top) must take the
best-fit thumbnail and do a final resize instead.

Other than using the largest thumbnail and resizing that to the preview
size, I don't see how that correlates to previews.

Philip Van Hoof, freelance software developer
home: me at pvanhoof dot be 
gnome: pvanhoof at gnome dot org

More information about the xdg mailing list