[Goodies-commits] r6407 - in ristretto/branches: . ristretto-gio ristretto-gio/po ristretto-gio/src

Stephan Arts stephan at xfce.org
Tue Jan 6 00:15:15 CET 2009


Author: stephan
Date: 2009-01-05 23:15:14 +0000 (Mon, 05 Jan 2009)
New Revision: 6407

Added:
   ristretto/branches/ristretto-gio/
   ristretto/branches/ristretto-gio/src/image.c
   ristretto/branches/ristretto-gio/src/image.h
   ristretto/branches/ristretto-gio/src/image_cache.c
   ristretto/branches/ristretto-gio/src/image_cache.h
   ristretto/branches/ristretto-gio/src/image_transform_orientation.c
   ristretto/branches/ristretto-gio/src/image_transform_orientation.h
   ristretto/branches/ristretto-gio/src/image_transformation.c
   ristretto/branches/ristretto-gio/src/image_transformation.h
Modified:
   ristretto/branches/ristretto-gio/configure.in.in
   ristretto/branches/ristretto-gio/po/ChangeLog
   ristretto/branches/ristretto-gio/po/pl.po
   ristretto/branches/ristretto-gio/src/Makefile.am
   ristretto/branches/ristretto-gio/src/main.c
   ristretto/branches/ristretto-gio/src/main_window.c
   ristretto/branches/ristretto-gio/src/main_window.h
   ristretto/branches/ristretto-gio/src/navigator.c
   ristretto/branches/ristretto-gio/src/navigator.h
   ristretto/branches/ristretto-gio/src/picture_viewer.c
   ristretto/branches/ristretto-gio/src/picture_viewer.h
Log:
Add gio branch




Property changes on: ristretto/branches/ristretto-gio
___________________________________________________________________
Added: svn:mergeinfo
   + 

Modified: ristretto/branches/ristretto-gio/configure.in.in
===================================================================
--- ristretto/trunk/configure.in.in	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/configure.in.in	2009-01-05 23:15:14 UTC (rev 6407)
@@ -21,7 +21,7 @@
 dnl *******************************************
 m4_define([ristretto_debug_default], [ifelse(ristretto_version_tag(), [svn], [full], [minimum])])
 
-AC_COPYRIGHT([Copyright (c) 2006-2008
+AC_COPYRIGHT([Copyright (c) 2006-2009
         The Xfce development team. All rights reserved.
 
 Written for Xfce by Stephan Arts <stephan at xfce.org>.])
@@ -51,10 +51,11 @@
 XDT_I18N([@LINGUAS@])
 
 XDT_CHECK_PACKAGE([LIBEXIF], [libexif], [0.6.0])
-XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.10.0])
-XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.12.0])
-XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [2.12.0])
-XDT_CHECK_PACKAGE([THUNAR_VFS], [thunar-vfs-1], [0.4.0])
+XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
+XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.18.0])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.34])
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.4.0])
 XDT_CHECK_PACKAGE([LIBXFCEGUI4], [libxfcegui4-1.0], [4.4.0])

Modified: ristretto/branches/ristretto-gio/po/ChangeLog
===================================================================
--- ristretto/trunk/po/ChangeLog	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/po/ChangeLog	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,7 +1,3 @@
-2009-01-04  Maximilian Schleiss <maximilian at xfce.org>
-
-	* pl.po: Polish translation update (Piotr Sokół)
-
 2008-12-25  Maximilian Schleiss <maximilian at xfce.org>
 
 	* es.po: Spanish translation update (Abel Martín)

Modified: ristretto/branches/ristretto-gio/po/pl.po
===================================================================
--- ristretto/trunk/po/pl.po	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/po/pl.po	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,3 +1,4 @@
+#: ../src/main.c:231
 msgid ""
 msgstr ""
 "Project-Id-Version: Ristretto\n"
@@ -3,25 +4,26 @@
 "Report-Msgid-Bugs-To: xfce-i18n at xfce.org\n"
 "POT-Creation-Date: 2008-11-14 13:24+0100\n"
-"PO-Revision-Date: 2008-12-27 17:26+0100\n"
-"Last-Translator: Piotr Sokół <piotr.sokol at 10g.pl>\n"
+"PO-Revision-Date: \n"
+"Last-Translator: Lukasz Romanowicz <romanowicz88 at gmail.com>\n"
 "Language-Team:  <romanowicz88 at gmail.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
 "X-Poedit-Language: Polish\n"
 "X-Poedit-Country: POLAND\n"
 
 #: ../src/main.c:61
 msgid "Version information"
-msgstr "Wypisuje informacje o wersji"
+msgstr "Informacje wersji"
 
 #: ../src/main.c:65
 msgid "Start in fullscreen mode"
-msgstr "Uruchamia w trybie pełnoekranowym"
+msgstr "Uruchom w trybie pełnoekranowym"
 
 #: ../src/main.c:69
 msgid "Start a slideshow"
-msgstr "Włącza pokaz slajdów po uruchomieniu"
+msgstr "Pokaz slajdów"
 
 #: ../src/main.c:235
@@ -31,15 +33,11 @@
 "%s: %s\n"
 "Try %s --help to see a full list of available command line options.\n"
 msgstr ""
-"%s: %s\n"
-"Proszę wpisać %s --help aby wypisać pełną listę opcji wiersza poleceń.\n"
 
-#: ../src/main.c:448
-#: ../src/main_window.c:1598
-#: ../src/main_window.c:1638
+#: ../src/main.c:448 ../src/main_window.c:1598 ../src/main_window.c:1638
 #: ../src/main_window.c:1675
 msgid "Opening file(s)..."
-msgstr "Otwieranie pliku..."
+msgstr "Otwieranie pliku ..."
 
 #. Create 'File' menu
 #: ../src/main_window.c:340
@@ -48,11 +46,11 @@
 
 #: ../src/main_window.c:347
 msgid "O_pen Folder"
-msgstr "O_twórz katalog..."
+msgstr "O_twórz folder"
 
 #: ../src/main_window.c:348
 msgid "_Recently used"
-msgstr "Ostatnio otwarte"
+msgstr "Ostatnio używane"
 
 #: ../src/main_window.c:353
 msgid "Close _all"
@@ -63,15 +61,13 @@
 msgid "_Edit"
 msgstr "_Edycja"
 
-#: ../src/main_window.c:388
-#: ../src/main_window.c:659
+#: ../src/main_window.c:388 ../src/main_window.c:659
 msgid "Open with..."
-msgstr "Otwórz za pomocą..."
+msgstr "Otwórz z ..."
 
-#: ../src/main_window.c:396
-#: ../src/main_window.c:670
+#: ../src/main_window.c:396 ../src/main_window.c:670
 msgid "No applications available"
-msgstr "Brak odpowiedniego programu"
+msgstr "Brak odpowiednich aplikacji"
 
 #. Create 'View' menu
 #: ../src/main_window.c:405
@@ -80,19 +76,19 @@
 
 #: ../src/main_window.c:412
 msgid "Show _Toolbar"
-msgstr "_Pasek narzędzi"
+msgstr "_Wyświetl pasek narzędzi"
 
 #: ../src/main_window.c:413
 msgid "Thumbnail _Viewer"
-msgstr "_Miniatury"
+msgstr "Wyświetlanie _miniatur"
 
 #: ../src/main_window.c:417
 msgid "_Zooming"
-msgstr "_Skalowanie"
+msgstr "_Skalowanie obrazu"
 
 #: ../src/main_window.c:418
 msgid "_Rotate"
-msgstr "_Obracanie"
+msgstr "_Obracanie obrazu"
 
 #: ../src/main_window.c:425
 msgid "_Set as wallpaper"
@@ -100,11 +96,11 @@
 
 #: ../src/main_window.c:476
 msgid "Show _Horizontally"
-msgstr "P_oziomo"
+msgstr "Wyświetl p_oziomo"
 
 #: ../src/main_window.c:480
 msgid "Show _Vertically"
-msgstr "P_ionowo"
+msgstr "Wyświetl p_ionowos"
 
 #: ../src/main_window.c:484
 msgid "H_ide"
@@ -121,20 +117,21 @@
 #. Create 'Go' menu
 #: ../src/main_window.c:543
 msgid "_Go"
-msgstr "P_rzejdź"
+msgstr "_Idź"
 
 #. Create 'Help' menu
 #: ../src/main_window.c:574
 msgid "_Help"
-msgstr "Pomo_c"
+msgstr "P_omoc"
 
 #: ../src/main_window.c:906
 msgid "One or more images have been modified, do you want to save the changes?"
-msgstr "Jeden lub więcej obrazów zostało zmodyfikowanych. Zapisać zmiany?"
+msgstr ""
+"Jeden lub więcej obrazów zostały zmodyfikowane, czy chcesz zapisać zmiany?"
 
 #: ../src/main_window.c:1394
 msgid "Image viewer Preferences"
-msgstr "Preferencje programu"
+msgstr "Preferencje przeglądarki obrazów"
 
 #: ../src/main_window.c:1412
 msgid "Display"
@@ -155,8 +152,6 @@
 #: ../src/main_window.c:1427
 msgid "Don't scale over 100% when maximizing the window."
 msgstr ""
-"Wyłączenie powiększania powyżej 100% podczas\n"
-"maksymalizowania okna"
 
 #: ../src/main_window.c:1437
 msgid "Background Color"
@@ -164,15 +159,15 @@
 
 #: ../src/main_window.c:1439
 msgid "_Override Background Color:"
-msgstr "_Własny kolor:"
+msgstr "_Nadpis Kolor Tła:"
 
 #: ../src/main_window.c:1462
 msgid "Image Cache"
-msgstr "Pamięć podręczna"
+msgstr "Kesz Grafik"
 
 #: ../src/main_window.c:1465
 msgid "Cache size:"
-msgstr "Rozmiar:"
+msgstr "Pamięć podręczna:"
 
 #: ../src/main_window.c:1466
 msgid "MB"
@@ -181,8 +176,6 @@
 #: ../src/main_window.c:1468
 msgid "_Preload images (GUI more responsive but more CPU-intensive)"
 msgstr ""
-"_Wcześniejsze wczytywanie obrazów\n"
-"(zmniejsza czas reakcji kosztem obciążenia procesora)"
 
 #: ../src/main_window.c:1486
 msgid "Timeout"
@@ -196,33 +189,33 @@
 msgid ""
 "The time period an individual image is displayed during a slideshow\n"
 "(in seconds)"
-msgstr "Czas wyświetlania pojedynczego obrazu (w sekundach):"
+msgstr "Ile czasu w sekundach pokazywana jest dana grafika"
 
 #: ../src/main_window.c:1497
 msgid "Hide the thumbnails bar during slideshow"
-msgstr "Miniatury obrazów podczas pokazu slajdów mogą zostać ukryte."
+msgstr "Ukryj pasek miniatur przy pokazie slajdów"
 
 #: ../src/main_window.c:1498
 msgid "_Hide thumbnails"
-msgstr "_Ukrywanie miniatur"
+msgstr "_Ukryj miniatury"
 
 #: ../src/main_window.c:1556
 msgid "Developer:"
-msgstr "Twórca:"
+msgstr "Deweloperzy:"
 
 #: ../src/main_window.c:1566
-msgid "Ristretto is a fast and lightweight picture-viewer for the Xfce desktop environment."
-msgstr "Ristretto jest szybką i lekką przeglądarką obrazów dla środowiska Xfce."
+msgid ""
+"Ristretto is a fast and lightweight picture-viewer for the Xfce desktop "
+"environment."
+msgstr "Ristretto jest szybką i lekką przeglądarką obrazów dla środowiska Xfce"
 
 #: ../src/main_window.c:1574
 msgid "translator-credits"
-msgstr ""
-"Łukasz Romanowicz <lukasz210 at gmail.com>\n"
-"Piotr Sokół <piotr.sokol at 10g.pl>"
+msgstr "Łukasz Romanowicz <lukasz210 at gmail.com>"
 
 #: ../src/main_window.c:1600
 msgid "Open image"
-msgstr "Wybór pliku"
+msgstr "Otwórz obraz"
 
 #: ../src/main_window.c:1618
 msgid "Could not open file"
@@ -230,11 +223,12 @@
 
 #: ../src/main_window.c:1640
 msgid "Open folder"
-msgstr "Wybór katalogu"
+msgstr "Otwórz folder"
 
 #: ../src/main_window.c:1715
-msgid "Are you sure you want to clear ristretto's list of recently opened documents?"
-msgstr "Wyczyścić listę ostatnio otwartych plików?"
+msgid ""
+"Are you sure you want to clear ristretto's list of recently opened documents?"
+msgstr "Czy na pewno chcesz usunąć listę ostatnio otwieranych dokumentów?"
 
 #: ../src/thumbnail_bar.c:185
 msgid "Spacing"
@@ -262,16 +256,17 @@
 
 #: ../ristretto.desktop.in.h:3
 msgid "Xfce Image viewer"
-msgstr "Przeglądarka obrazów dla środowiska Xfce"
+msgstr "Przeglądarka obrazów Xfce"
 
 #~ msgid "Preload"
 #~ msgstr "Preload"
+
 #~ msgid ""
 #~ "Preload images during slideshow\n"
 #~ "(uses more memory)"
 #~ msgstr ""
 #~ "Ładuje grafiki z pokazu slajdów\n"
 #~ "(zużywa więcej pamięci)"
+
 #~ msgid "_Preload images"
 #~ msgstr "_Ładuj grafiki"
-

Modified: ristretto/branches/ristretto-gio/src/Makefile.am
===================================================================
--- ristretto/trunk/src/Makefile.am	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/Makefile.am	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,22 +1,26 @@
 bin_PROGRAMS = ristretto
 
 ristretto_SOURCES = \
-	main.c \
-    main_window.c main_window.h \
 	navigator.c navigator.h \
+	image.c image.h \
+	image_cache.c image_cache.h \
+	image_transformation.c image_transformation.h \
+	image_transform_orientation.c image_transform_orientation.h \
 	picture_viewer.c picture_viewer.h \
-	save_dialog.h save_dialog.c \
-	thumbnail.c thumbnail.h \
-	thumbnail_bar.c thumbnail_bar.h
+	main_window.c main_window.h \
+	main.c
+#	save_dialog.h save_dialog.c
+#	thumbnail.c thumbnail.h \
+#	thumbnail_bar.c thumbnail_bar.h
 
 ristretto_CFLAGS = \
 	$(GTK_CFLAGS) \
 	$(GLIB_CFLAGS) \
-	$(DBUS_GLIB_CFLAGS) \
+	$(GTHREAD_CFLAGS) \
+	$(GIO_CFLAGS) \
 	$(LIBEXIF_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCEGUI4_CFLAGS) \
-	$(THUNAR_VFS_CFLAGS) \
 	-DDATADIR=\"$(datadir)\" \
 	-DSRCDIR=\"$(top_srcdir)\" \
 	-DLOCALEDIR=\"$(localedir)\"
@@ -24,11 +28,11 @@
 ristretto_LDADD = \
 	$(GTK_LIBS) \
 	$(GLIB_LIBS) \
-	$(DBUS_GLIB_LIBS) \
+	$(GTHREAD_LIBS) \
+	$(GIO_LIBS) \
 	$(LIBEXIF_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
-	$(LIBXFCEGUI4_LIBS) \
-	$(THUNAR_VFS_LIBS)
+	$(LIBXFCEGUI4_LIBS)
 
 INCLUDES = \
 	-I${top_srcdir}

Added: ristretto/branches/ristretto-gio/src/image.c
===================================================================
--- ristretto/branches/ristretto-gio/src/image.c	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,679 @@
+/*
+ *  Copyright (c) 2009 Stephan Arts <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <gdk/gdk.h>
+
+#include <libexif/exif-data.h>
+
+#include "image.h"
+#include "image_cache.h"
+#include "image_transformation.h"
+#include "image_transform_orientation.h"
+
+enum
+{
+    RSTTO_IMAGE_SIGNAL_UPDATED= 0,
+    RSTTO_IMAGE_SIGNAL_COUNT    
+};
+
+static void
+rstto_image_init (GObject *);
+static void
+rstto_image_class_init (GObjectClass *);
+
+static void
+rstto_image_dispose (GObject *object);
+
+static void
+cb_rstto_image_area_prepared (GdkPixbufLoader *loader, RsttoImage *image);
+static void
+cb_rstto_image_closed (GdkPixbufLoader *loader, RsttoImage *image);
+static gboolean
+cb_rstto_image_update(RsttoImage *image);
+
+static void
+cb_rstto_image_read_file_ready (GObject *source_object, GAsyncResult *result, gpointer user_data);
+
+static GObjectClass *parent_class = NULL;
+
+static gint rstto_image_signals[RSTTO_IMAGE_SIGNAL_COUNT];
+
+GType
+rstto_image_get_type ()
+{
+    static GType rstto_image_type = 0;
+
+    if (!rstto_image_type)
+    {
+        static const GTypeInfo rstto_image_info = 
+        {
+            sizeof (RsttoImageClass),
+            (GBaseInitFunc) NULL,
+            (GBaseFinalizeFunc) NULL,
+            (GClassInitFunc) rstto_image_class_init,
+            (GClassFinalizeFunc) NULL,
+            NULL,
+            sizeof (RsttoImage),
+            0,
+            (GInstanceInitFunc) rstto_image_init,
+            NULL
+        };
+
+        rstto_image_type = g_type_register_static (G_TYPE_OBJECT, "RsttoImage", &rstto_image_info, 0);
+    }
+    return rstto_image_type;
+}
+
+struct _RsttoImagePriv
+{
+    /* File data */
+    /*************/
+    GFile *file;
+    GFileMonitor *monitor;
+
+    /* Image data */
+    /**************/
+    GdkPixbufLoader *loader;
+    ExifData *exif_data;
+    GdkPixbuf *thumbnail;
+    GdkPixbuf *pixbuf;
+
+    GdkPixbufAnimation  *animation;
+    GdkPixbufAnimationIter *iter;
+    gint    animation_timeout_id;
+
+    GList *transformations;
+    
+    struct
+    {
+        GMutex *exif;
+        GMutex *thumbnail;
+        GMutex *pixbuf;
+        GMutex *loader;
+    } mutex;
+};
+
+
+static void
+rstto_image_init (GObject *object)
+{
+    RsttoImage *image = RSTTO_IMAGE (object);
+
+    image->priv = g_new0 (RsttoImagePriv, 1);
+
+    image->priv->mutex.exif = g_mutex_new();
+    image->priv->mutex.thumbnail = g_mutex_new();
+    image->priv->mutex.pixbuf = g_mutex_new();
+    image->priv->mutex.loader = g_mutex_new();
+}
+
+
+static void
+rstto_image_class_init (GObjectClass *object_class)
+{
+    RsttoImageClass *image_class = RSTTO_IMAGE_CLASS (object_class);
+
+    parent_class = g_type_class_peek_parent (image_class);
+
+    object_class->dispose = rstto_image_dispose;
+
+    rstto_image_signals[RSTTO_IMAGE_SIGNAL_UPDATED] = g_signal_new("updated",
+            G_TYPE_FROM_CLASS (image_class),
+            G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+            0,
+            NULL,
+            NULL,
+            g_cclosure_marshal_VOID__VOID,
+            G_TYPE_NONE,
+            0,
+            NULL);
+
+}
+
+/**
+ * rstto_image_dispose:
+ * @object:
+ *
+ */
+static void
+rstto_image_dispose (GObject *object)
+{
+    RsttoImage *image = RSTTO_IMAGE (object);
+
+    if(image->priv->thumbnail)
+    {
+        g_object_unref (image->priv->thumbnail);
+        image->priv->thumbnail = NULL;
+    }
+
+    if (image->priv->animation_timeout_id)
+    {
+        g_source_remove (image->priv->animation_timeout_id);
+        image->priv->animation_timeout_id = 0;
+    }
+
+    if (image->priv->loader)
+    {
+        g_signal_handlers_disconnect_by_func (image->priv->loader , cb_rstto_image_area_prepared, image);
+        gdk_pixbuf_loader_close (image->priv->loader, NULL);
+        image->priv->loader = NULL;
+    }
+
+    if (image->priv->animation)
+    {
+        g_object_unref (image->priv->animation);
+        image->priv->animation = NULL;
+    }
+
+    if (image->priv->pixbuf)
+    {
+        g_object_unref (image->priv->pixbuf);
+        image->priv->pixbuf = NULL;
+    }
+
+    if (image->priv->transformations)
+    {
+        g_list_foreach (image->priv->transformations, (GFunc)g_object_unref, NULL);
+        g_list_free (image->priv->transformations);
+        image->priv->transformations;
+    }
+
+    g_mutex_free (image->priv->mutex.exif);
+    g_mutex_free (image->priv->mutex.thumbnail);
+    g_mutex_free (image->priv->mutex.pixbuf);
+}
+
+
+
+
+/**
+ * rstto_image_new:
+ * @file : The file which contains the image.
+ *
+ */
+RsttoImage *
+rstto_image_new (GFile *file)
+{
+    g_object_ref (file);
+
+    RsttoImage *image = g_object_new (RSTTO_TYPE_IMAGE, NULL);
+    gchar *file_path = g_file_get_path (file);
+    gchar *exif_val = g_new0 (gchar, 20);
+    ExifEntry *exif_entry = NULL;
+    RsttoImageTransformation *transformation = NULL;
+
+
+    image->priv->file = file;
+    image->priv->exif_data = exif_data_new_from_file (file_path);
+    image->priv->thumbnail = NULL;
+    image->priv->pixbuf = NULL;
+
+    if (image->priv->exif_data) {
+        exif_entry = exif_data_get_entry (image->priv->exif_data, EXIF_TAG_ORIENTATION);
+    }
+    if (exif_entry)
+    {
+        exif_entry_get_value(exif_entry, exif_val, 20);
+        if (!strcmp(exif_val, "top - left"))
+        {
+            transformation = rstto_image_transform_orientation_new ( FALSE, FALSE, GDK_PIXBUF_ROTATE_NONE);
+        }
+        if (!strcmp(exif_val, "top - right"))
+        {
+            transformation = rstto_image_transform_orientation_new ( FALSE, TRUE, GDK_PIXBUF_ROTATE_NONE);
+        }
+        if (!strcmp(exif_val, "bottom - left"))
+        {
+            transformation = rstto_image_transform_orientation_new ( TRUE, FALSE, GDK_PIXBUF_ROTATE_NONE);
+        }
+        if (!strcmp(exif_val, "bottom - right"))
+        {
+            transformation = rstto_image_transform_orientation_new ( FALSE, FALSE, GDK_PIXBUF_ROTATE_UPSIDEDOWN);
+        }
+        if (!strcmp(exif_val, "right - top"))
+        {
+            transformation = rstto_image_transform_orientation_new ( FALSE, FALSE, GDK_PIXBUF_ROTATE_CLOCKWISE);
+        }
+        if (!strcmp(exif_val, "left - bottom"))
+        {
+            transformation = rstto_image_transform_orientation_new ( FALSE, FALSE, GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE);
+        }
+        if (!strcmp(exif_val, "right - bottom"))
+        {
+            transformation = rstto_image_transform_orientation_new ( FALSE, TRUE, GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE);
+        }
+        if (!strcmp(exif_val, "left - top"))
+        {
+            transformation = rstto_image_transform_orientation_new ( FALSE, TRUE, GDK_PIXBUF_ROTATE_CLOCKWISE);
+        }
+    }
+
+    if (transformation)
+    {
+        rstto_image_push_transformation (image, G_OBJECT (transformation), NULL);
+    }
+
+    g_free (exif_val);
+
+    return image;
+}
+
+
+/**
+ * rstto_image_load:
+ * @image       : The image to load from disk.
+ * @empty_cache : if it should empty the cache (eg, perform a reload)
+ * @error       : return location for errors or %NULL.
+ *
+ * If the image is not yet loaded in memory, load the image. 
+ * A reload can be forced with @empty_cache set to %TRUE.
+ * On failure, returns %FALSE. And @error will be set to 
+ * point to a #GError describing the cause of the failure.
+ * Warning: this function initializes a load, it is an a-sync call and
+ * does not guarantee that the image will be loaded afterwards.
+ * the 'image-loaded' signal will indicate that this operation 
+ * has finished.
+ *
+ * Return value: TRUE on success.
+ */
+gboolean
+rstto_image_load (RsttoImage *image, gboolean empty_cache, GError **error)
+{
+    g_return_val_if_fail (image != NULL, FALSE);
+    RsttoImageCache *cache = rstto_image_cache_new ();
+
+    gchar *file_path = g_file_get_path (image->priv->file);
+
+    /* Check if a GIOChannel is present, if so... the load is already in progress */
+    /* The image needs to be loaded if:
+     *   a) The image is already loaded but there is
+     *      a reload required because the cache needs
+     *      to be cleared.
+     *   b) The image is not yet loaded.
+     */
+    if ((image->priv->loader == NULL) && ((empty_cache == TRUE ) || image->priv->pixbuf == NULL))
+    {
+        /* If the image has been loaded, free it */
+        if (image->priv->pixbuf)
+        {
+            g_object_unref (image->priv->pixbuf);
+            image->priv->pixbuf = NULL;
+        }
+        
+        /* FIXME: should we check if the loader already exists? */
+        image->priv->loader = gdk_pixbuf_loader_new();
+
+        /* connect the signal-handlers */
+        g_signal_connect(image->priv->loader, "area-prepared", G_CALLBACK(cb_rstto_image_area_prepared), image);
+        /*g_signal_connect(image->priv->loader, "area-updated", G_CALLBACK(cb_rstto_image_area_updated), image);*/
+        g_signal_connect(image->priv->loader, "closed", G_CALLBACK(cb_rstto_image_closed), image);
+
+        g_file_read_async (image->priv->file, G_PRIORITY_DEFAULT, NULL, (GAsyncReadyCallback)cb_rstto_image_read_file_ready, image);
+    }
+
+    rstto_image_cache_push_image (cache, image);
+
+    g_free (file_path);
+}
+
+
+/**
+ * rstto_image_unload:
+ * @image       : The image to unload from memory.
+ *
+ * This function will unload the image-pixbuf from memory.
+ */
+void
+rstto_image_unload (RsttoImage *image)
+{
+    g_return_if_fail (image != NULL);
+    if (image->priv->pixbuf)
+    {
+        g_object_unref (image->priv->pixbuf);
+        image->priv->pixbuf = NULL;
+    }
+
+    g_mutex_lock (image->priv->mutex.loader);
+    if (image->priv->loader)
+    {
+        g_object_unref (image->priv->loader);
+        image->priv->loader = NULL;
+    }
+    g_mutex_unlock (image->priv->mutex.loader);
+}
+
+
+/**
+ * rstto_image_get_file:
+ * @image       : The image to get the GFile object from.
+ *
+ * Return value: A GFile object representing the image file.
+ */
+GFile *
+rstto_image_get_file (RsttoImage *image)
+{
+    g_return_if_fail (image != NULL);
+    g_return_if_fail (image->priv != NULL);
+    g_return_if_fail (image->priv->file != NULL);
+
+    return image->priv->file;
+}
+
+
+/**
+ * rstto_image_get_thumbnail:
+ * @image       : 
+ *
+ * return value: a gdkpixbuf * referencing a pixbuf pointing to the thumbnail.
+ */
+GdkPixbuf *
+rstto_image_get_thumbnail (RsttoImage *image)
+{
+    g_return_if_fail (image != NULL);
+    g_return_if_fail (image->priv != NULL);
+
+
+    return image->priv->thumbnail;
+}
+
+
+/**
+ * rstto_image_get_pixbuf:
+ * @image       : 
+ *
+ * return value: a gdkpixbuf * referencing a pixbuf pointing to the image.
+ */
+GdkPixbuf *
+rstto_image_get_pixbuf (RsttoImage *image)
+{
+    g_return_if_fail (image != NULL);
+    g_return_if_fail (image->priv != NULL);
+
+
+    return image->priv->pixbuf;
+}
+
+/**
+ * rstto_image_push_transformation:
+ * @image          : 
+ * @transformation :
+ * @error          :
+ *
+ * Return value: TRUE on success.
+ */
+gboolean
+rstto_image_push_transformation (RsttoImage *image, GObject *object, GError **error)
+{
+    g_return_val_if_fail (RSTTO_IS_IMAGE_TRANSFORMATION (object), FALSE);
+    RsttoImageTransformation *transformation = RSTTO_IMAGE_TRANSFORMATION (object);
+
+    g_object_ref (transformation);
+    /* Perform the transformation, on success add it to the stack */
+    if (transformation->transform (transformation, image) == TRUE)
+    {
+        image->priv->transformations = g_list_prepend (image->priv->transformations, transformation);
+        return TRUE;
+    }
+    g_object_unref (transformation);
+    return FALSE;
+}
+
+
+/**
+ * rstto_image_pop_transformation:
+ * @image          : 
+ * @error          :
+ *
+ * Return value: TRUE on success.
+ */
+gboolean
+rstto_image_pop_transformation (RsttoImage *image, GError **error)
+{
+    if (image->priv->transformations)
+    {
+        RsttoImageTransformation *transformation = image->priv->transformations->data;
+
+        if (transformation->revert (transformation, image) == TRUE)
+        {
+            /* remove the first item from the list */
+            image->priv->transformations = g_list_delete_link (image->priv->transformations, image->priv->transformations);
+            g_object_unref (transformation);
+            transformation = NULL;
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+
+/**
+ * PRIVATE CALLBACKS 
+ */
+
+/**
+ * cb_rstto_image_area_prepared:
+ * @loader:
+ * @image:
+ *
+ */
+static void
+cb_rstto_image_area_prepared (GdkPixbufLoader *loader, RsttoImage *image)
+{
+    image->priv->animation = gdk_pixbuf_loader_get_animation (loader);
+    image->priv->iter = gdk_pixbuf_animation_get_iter (image->priv->animation, NULL);
+    if (image->priv->pixbuf)
+    {
+        g_object_unref(image->priv->pixbuf);
+        image->priv->pixbuf = NULL;
+    }
+
+    g_object_ref (image->priv->animation);
+
+    gint time = gdk_pixbuf_animation_iter_get_delay_time (image->priv->iter);
+
+    if (time != -1)
+    {
+        /* fix borked stuff */
+        if (time == 0)
+        {
+            g_warning("timeout == 0: defaulting to 40ms");
+            time = 40;
+        }
+
+        image->priv->animation_timeout_id = g_timeout_add(time, (GSourceFunc)cb_rstto_image_update, image);
+    }   
+    else
+    {
+        image->priv->iter = NULL;
+    }
+    g_signal_emit(G_OBJECT(image), rstto_image_signals[RSTTO_IMAGE_SIGNAL_UPDATED], 0, image, NULL);
+}
+
+/**
+ * cb_rstto_image_closed:
+ * @loader:
+ * @image:
+ *
+ */
+static void
+cb_rstto_image_closed (GdkPixbufLoader *loader, RsttoImage *image)
+{
+    g_return_if_fail (image != NULL);
+    g_return_if_fail (RSTTO_IS_IMAGE (image));
+    g_return_if_fail (loader == image->priv->loader);
+
+    GdkPixbuf *pixbuf = NULL;
+    RsttoImageTransformation *transformation = NULL;
+
+    if (image->priv->pixbuf)
+    {
+        g_object_unref(image->priv->pixbuf);
+        image->priv->pixbuf = NULL;
+    }
+
+    if (image->priv->iter)
+    {
+        pixbuf = gdk_pixbuf_animation_iter_get_pixbuf (image->priv->iter);
+    }
+    else
+    {
+        if (image->priv->loader)
+        {
+            pixbuf = gdk_pixbuf_loader_get_pixbuf (image->priv->loader);
+        }
+    }
+
+    g_object_unref (image->priv->loader);
+    image->priv->loader = NULL;
+
+   
+    if (pixbuf != NULL)
+    {
+        image->priv->pixbuf = pixbuf;
+        /* Get to the bottom of the transformation list */
+        GList *transform_iter = g_list_last (image->priv->transformations);
+        while (transform_iter != NULL)
+        {
+            transformation = transform_iter->data;
+
+            /* Transform source image */
+            transformation->transform (transformation, image);
+
+            transform_iter = g_list_previous (transform_iter);
+        }
+        g_signal_emit(G_OBJECT(image), rstto_image_signals[RSTTO_IMAGE_SIGNAL_UPDATED], 0, image, NULL);
+    }
+}
+
+/**
+ * cb_rstto_image_update:
+ * @image:
+ */
+static gboolean
+cb_rstto_image_update(RsttoImage *image)
+{
+    RsttoImageTransformation *transformation = NULL;
+
+    if (image->priv->iter)
+    {
+        if(gdk_pixbuf_animation_iter_advance (image->priv->iter, NULL))
+        {
+            /* Cleanup old image */
+            if (image->priv->pixbuf)
+            {
+                g_object_unref (image->priv->pixbuf);
+                image->priv->pixbuf = NULL;
+            }
+
+            image->priv->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf (image->priv->iter);
+            if (image->priv->pixbuf)
+            {
+                /* Get to the bottom of the transformation list */
+                GList *transform_iter = g_list_last (image->priv->transformations);
+                while (transform_iter != NULL)
+                {
+                    transformation = transform_iter->data;
+
+                    /* Transform source image */
+                    transformation->transform (transformation, image);
+
+                    transform_iter = g_list_previous (transform_iter);
+                }
+            }
+        }
+
+        gint time = gdk_pixbuf_animation_iter_get_delay_time (image->priv->iter);
+        if (time != -1)
+        {
+            if (time == 0)
+            {
+                g_warning("timeout == 0: defaulting to 40ms");
+                time = 40;
+            }
+            image->priv->animation_timeout_id = g_timeout_add(time, (GSourceFunc)cb_rstto_image_update, image);
+        }
+        g_signal_emit (G_OBJECT(image), rstto_image_signals[RSTTO_IMAGE_SIGNAL_UPDATED], 0, image, NULL);
+
+        return FALSE;
+    }
+    return TRUE;
+}
+
+/**
+ * cb_rstto_image_read_file_ready:
+ * @source_object:
+ * @result:
+ * @user_data:
+ */
+static void
+cb_rstto_image_read_file_ready (GObject *source_object, GAsyncResult *result, gpointer user_data)
+{
+    RsttoImage *image = RSTTO_IMAGE (user_data);
+    gssize read_bytes = 0;
+    guchar buffer[1024];
+
+    GFileInputStream *input_stream = g_file_read_finish (G_FILE (source_object), result, NULL);
+
+    /** TODO: put this in a thread */
+
+    while (1)
+    {
+
+        g_mutex_lock (image->priv->mutex.loader);
+        if (image->priv->loader == NULL)
+        {
+            g_mutex_unlock (image->priv->mutex.loader);
+            break;
+        }
+
+        read_bytes = g_input_stream_read (G_INPUT_STREAM (input_stream), &buffer, 1024, NULL, NULL);
+
+        if (read_bytes > 0)
+        {
+            if(gdk_pixbuf_loader_write(image->priv->loader, (const guchar *)buffer, read_bytes, NULL) == FALSE)
+            {
+                /* PARSE ERROR */
+                g_mutex_unlock (image->priv->mutex.loader);
+                break;
+            }
+        }
+        else
+        if (read_bytes == 0)
+        {
+            /* OK */
+            gdk_pixbuf_loader_close (image->priv->loader, NULL);
+            image->priv->loader = NULL;
+            g_signal_emit (G_OBJECT(image), rstto_image_signals[RSTTO_IMAGE_SIGNAL_UPDATED], 0, image, NULL);
+            g_mutex_unlock (image->priv->mutex.loader);
+            break;
+        }
+        else
+        {
+            /* I/O ERROR */
+            gdk_pixbuf_loader_close (image->priv->loader, NULL);
+            image->priv->loader = NULL;
+            g_mutex_unlock (image->priv->mutex.loader);
+            break;
+        }
+        g_mutex_unlock (image->priv->mutex.loader);
+    }
+}

Added: ristretto/branches/ristretto-gio/src/image.h
===================================================================
--- ristretto/branches/ristretto-gio/src/image.h	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image.h	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,75 @@
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RISTRETTO_IMAGE_H__
+#define __RISTRETTO_IMAGE_H__
+
+G_BEGIN_DECLS
+
+#define RSTTO_TYPE_IMAGE rstto_image_get_type()
+
+#define RSTTO_IMAGE(obj)( \
+        G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                RSTTO_TYPE_IMAGE, \
+                RsttoImage))
+
+#define RSTTO_IS_IMAGE(obj)( \
+        G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                RSTTO_TYPE_IMAGE))
+
+#define RSTTO_IMAGE_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_CAST ((klass), \
+                RSTTO_TYPE_IMAGE, \
+                RsttoImageClass))
+
+#define RSTTO_IS_IMAGE_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                RSTTO_TYPE_IMAGE()))
+
+
+typedef struct _RsttoImage RsttoImage;
+typedef struct _RsttoImagePriv RsttoImagePriv;
+
+struct _RsttoImage
+{
+    GObject parent;
+
+    RsttoImagePriv *priv;
+};
+
+typedef struct _RsttoImageClass RsttoImageClass;
+
+struct _RsttoImageClass
+{
+    GObjectClass parent_class;
+};
+
+RsttoImage *rstto_image_new (GFile *file);
+
+GdkPixbuf *rstto_image_get_thumbnail (RsttoImage *image);
+GdkPixbuf *rstto_image_get_pixbuf (RsttoImage *image);
+GFile *rstto_image_get_file (RsttoImage *image);
+void rstto_image_unload (RsttoImage *image);
+gboolean rstto_image_load (RsttoImage *image, gboolean empty_cache, GError **error);
+
+gboolean
+rstto_image_push_transformation (RsttoImage *image, GObject *transformation, GError **error);
+gboolean
+rstto_image_pop_transformation (RsttoImage *image, GError **error);
+
+G_END_DECLS
+
+#endif /* __RISTRETTO_IMAGE_H__ */

Added: ristretto/branches/ristretto-gio/src/image_cache.c
===================================================================
--- ristretto/branches/ristretto-gio/src/image_cache.c	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image_cache.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,126 @@
+/*
+ *  Copyright (c) 2009 Stephan Arts <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <gdk/gdk.h>
+
+#include <libexif/exif-data.h>
+
+#include "image.h"
+#include "image_cache.h"
+
+static void
+rstto_image_cache_init (GObject *);
+static void
+rstto_image_cache_class_init (GObjectClass *);
+
+static RsttoImageCache *rstto_global_image_cache = NULL;
+
+struct _RsttoImageCache
+{
+    GObject parent;
+    GList *cache_list;
+};
+
+struct _RsttoImageCacheClass
+{
+    GObjectClass parent_class;
+};
+
+
+GType
+rstto_image_cache_get_type ()
+{
+    static GType rstto_image_cache_type = 0;
+
+    if (!rstto_image_cache_type)
+    {
+        static const GTypeInfo rstto_image_cache_info = 
+        {
+            sizeof (RsttoImageCacheClass),
+            (GBaseInitFunc) NULL,
+            (GBaseFinalizeFunc) NULL,
+            (GClassInitFunc) rstto_image_cache_class_init,
+            (GClassFinalizeFunc) NULL,
+            NULL,
+            sizeof (RsttoImageCache),
+            0,
+            (GInstanceInitFunc) rstto_image_cache_init,
+            NULL
+        };
+
+        rstto_image_cache_type = g_type_register_static (G_TYPE_OBJECT, "RsttoImageCache", &rstto_image_cache_info, 0);
+    }
+    return rstto_image_cache_type;
+}
+
+
+static void
+rstto_image_cache_init (GObject *object)
+{
+
+}
+
+static void
+rstto_image_cache_class_init (GObjectClass *object_class)
+{
+
+}
+
+void
+rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image)
+{
+    if (cache->cache_list)
+    {
+        cache->cache_list = g_list_remove_all (cache->cache_list, image);
+    }
+
+    cache->cache_list = g_list_prepend (cache->cache_list, image);
+
+    /**
+     * TODO:
+     * Fix the cache-size calculation
+     */
+    if (g_list_length (cache->cache_list) > 3)
+    {
+        RsttoImage *c_image = g_list_last (cache->cache_list)->data;
+        rstto_image_unload (c_image);
+        cache->cache_list = g_list_remove (cache->cache_list, c_image);
+    }
+}
+
+/**
+ * rstto_image_cache_new:
+ *
+ * Singleton
+ *
+ * Return value: 
+ */
+RsttoImageCache *
+rstto_image_cache_new ()
+{
+    if (rstto_global_image_cache == NULL)
+    {
+        rstto_global_image_cache = g_object_new (RSTTO_TYPE_IMAGE_CACHE, NULL);
+    }
+
+    return rstto_global_image_cache;
+}

Added: ristretto/branches/ristretto-gio/src/image_cache.h
===================================================================
--- ristretto/branches/ristretto-gio/src/image_cache.h	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image_cache.h	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,52 @@
+/*
+ *  Copyright (C) Stephan Arts 2009 <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RISTRETTO_IMAGE_CACHE_H__
+#define __RISTRETTO_IMAGE_CACHE_H__
+
+G_BEGIN_DECLS
+
+#define RSTTO_TYPE_IMAGE_CACHE rstto_image_cache_get_type()
+
+#define RSTTO_IMAGE_CACHE(obj)( \
+        G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                RSTTO_TYPE_IMAGE_CACHE, \
+                RsttoImageCache))
+
+#define RSTTO_IS_IMAGE_CACHE(obj)( \
+        G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                RSTTO_TYPE_IMAGE_CACHE))
+
+#define RSTTO_IMAGE_CACHE_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_CAST ((klass), \
+                RSTTO_TYPE_IMAGE_CACHE, \
+                RsttoImageCacheClass))
+
+#define RSTTO_IS_IMAGE_CACHE_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                RSTTO_TYPE_IMAGE_CACHE()))
+
+typedef struct _RsttoImageCache RsttoImageCache;
+
+typedef struct _RsttoImageCacheClass RsttoImageCacheClass;
+
+RsttoImageCache *rstto_image_cache_new ();
+
+G_END_DECLS
+
+#endif /* __RISTRETTO_IMAGE_CACHE_H__ */

Added: ristretto/branches/ristretto-gio/src/image_transform_orientation.c
===================================================================
--- ristretto/branches/ristretto-gio/src/image_transform_orientation.c	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image_transform_orientation.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,202 @@
+/*
+ *  Copyright (c) 2009 Stephan Arts <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <gdk/gdk.h>
+
+#include <libexif/exif-data.h>
+
+#include "image.h"
+#include "image_transformation.h"
+#include "image_transform_orientation.h"
+
+static void
+rstto_image_transform_orientation_init  (GObject *);
+static void
+rstto_image_transform_orientation_class_init (GObjectClass *);
+
+static void
+rstto_image_transform_orientation_get_property (GObject    *object,
+                                                guint       property_id,
+                                                GValue     *value,
+                                                GParamSpec *pspec);
+static void
+rstto_image_transform_orientation_set_property (GObject      *object,
+                                                guint         property_id,
+                                                const GValue *value,
+                                                GParamSpec   *pspec);
+
+static gboolean
+rstto_image_transform_orientation_transform (RsttoImageTransformation *transformation, RsttoImage *image);
+static gboolean
+rstto_image_transform_orientation_revert (RsttoImageTransformation *transformation, RsttoImage *image);
+
+enum
+{
+    PROP_0,
+    PROP_TRANSFORM_FLIP_VERTICAL,
+    PROP_TRANSFORM_FLIP_HORIZONTAL,
+    PROP_TRANSFORM_ROTATION
+};
+
+GType
+rstto_image_transform_orientation_get_type ()
+{
+    static GType rstto_image_transform_orientation_type = 0;
+
+    if (!rstto_image_transform_orientation_type)
+    {
+        static const GTypeInfo rstto_image_transform_orientation_info = 
+        {
+            sizeof (RsttoImageTransformOrientationClass),
+            (GBaseInitFunc) NULL,
+            (GBaseFinalizeFunc) NULL,
+            (GClassInitFunc) rstto_image_transform_orientation_class_init,
+            (GClassFinalizeFunc) NULL,
+            NULL,
+            sizeof (RsttoImageTransformOrientation),
+            0,
+            (GInstanceInitFunc) rstto_image_transform_orientation_init,
+            NULL
+        };
+
+        rstto_image_transform_orientation_type = g_type_register_static (RSTTO_TYPE_IMAGE_TRANSFORMATION, "RsttoImageTransformOrientation", &rstto_image_transform_orientation_info, 0);
+    }
+    return rstto_image_transform_orientation_type;
+}
+
+
+static void
+rstto_image_transform_orientation_init (GObject *object)
+{
+    RsttoImageTransformation *transformation = RSTTO_IMAGE_TRANSFORMATION (object);
+    
+    transformation->transform = rstto_image_transform_orientation_transform;
+    transformation->revert = rstto_image_transform_orientation_revert;
+}
+
+static void
+rstto_image_transform_orientation_class_init (GObjectClass *object_class)
+{
+    GParamSpec *pspec;
+
+    object_class->set_property = rstto_image_transform_orientation_set_property;
+    object_class->get_property = rstto_image_transform_orientation_get_property;
+
+    pspec = g_param_spec_boolean ("flip-vertical",
+                                  "",
+                                  "Indicates if this performs a vertical flip",
+                                  FALSE /* default value */,
+                                  G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
+
+    g_object_class_install_property (object_class,
+                                     PROP_TRANSFORM_FLIP_VERTICAL,
+                                     pspec);
+
+    pspec = g_param_spec_boolean ("flip-horizontal",
+                                  "",
+                                  "Indicates if this performs a horizontal flip",
+                                  FALSE /* default value */,
+                                  G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
+
+    g_object_class_install_property (object_class,
+                                     PROP_TRANSFORM_FLIP_HORIZONTAL,
+                                     pspec);
+
+
+    pspec = g_param_spec_uint ("rotation",
+                               "",
+                               "Indicates how it rotates",
+                               0 /* minimum */,
+                               360 /* maximum */,
+                               0 /* default value */,
+                               G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
+
+    g_object_class_install_property (object_class,
+                                     PROP_TRANSFORM_ROTATION,
+                                     pspec);
+
+}
+
+RsttoImageTransformation *
+rstto_image_transform_orientation_new (gboolean flip_vertical, 
+                                       gboolean flip_horizontal,
+                                       GdkPixbufRotation rotation)
+{
+    RsttoImageTransformation *transformation = g_object_new (RSTTO_TYPE_IMAGE_TRANSFORM_ORIENTATION, 
+                                                             "flip-vertical", flip_vertical,
+                                                             "flip-horizontal", flip_horizontal,
+                                                             "rotation", rotation,
+                                                             NULL);
+
+    return transformation;
+}
+
+static gboolean
+rstto_image_transform_orientation_transform (RsttoImageTransformation *transformation, RsttoImage *image)
+{
+
+}
+
+static gboolean
+rstto_image_transform_orientation_revert (RsttoImageTransformation *transformation, RsttoImage *image)
+{
+
+}
+
+static void
+rstto_image_transform_orientation_set_property (GObject      *object,
+                                                guint         property_id,
+                                                const GValue *value,
+                                                GParamSpec   *pspec)
+{
+    switch (property_id)
+    {
+        case PROP_TRANSFORM_FLIP_VERTICAL:
+            break;
+        case PROP_TRANSFORM_FLIP_HORIZONTAL:
+            break;
+        case PROP_TRANSFORM_ROTATION:
+            break;
+        default:
+            break;
+    }
+}
+
+
+static void
+rstto_image_transform_orientation_get_property (GObject    *object,
+                                                guint       property_id,
+                                                GValue     *value,
+                                                GParamSpec *pspec)
+{
+    switch (property_id)
+    {
+        case PROP_TRANSFORM_FLIP_VERTICAL:
+            break;
+        case PROP_TRANSFORM_FLIP_HORIZONTAL:
+            break;
+        case PROP_TRANSFORM_ROTATION:
+            break;
+        default:
+            break;
+    }
+}

Added: ristretto/branches/ristretto-gio/src/image_transform_orientation.h
===================================================================
--- ristretto/branches/ristretto-gio/src/image_transform_orientation.h	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image_transform_orientation.h	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,63 @@
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RISTRETTO_IMAGE_TRANSFORM_ORIENTATION_H__
+#define __RISTRETTO_IMAGE_TRANSFORM_ORIENTATION_H__
+
+G_BEGIN_DECLS
+
+#define RSTTO_TYPE_IMAGE_TRANSFORM_ORIENTATION rstto_image_transform_orientation_get_type()
+
+#define RSTTO_IMAGE_TRANSFORM_ORIENTATION(obj)( \
+        G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                RSTTO_TYPE_IMAGE_TRANSFORM_ORIENTATION, \
+                RsttoImageTransformOrientation))
+
+#define RSTTO_IS_IMAGE_TRANSFORM_ORIENTATION(obj)( \
+        G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                RSTTO_TYPE_IMAGE_TRANSFORM_ORIENTATION))
+
+#define RSTTO_IMAGE_TRANSFORM_ORIENTATION_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_CAST ((klass), \
+                RSTTO_TYPE_IMAGE_TRANSFORM_ORIENTATION, \
+                RsttoImageTransformOrientationClass))
+
+#define RSTTO_IS_IMAGE_TRANSFORM_ORIENTATION_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                RSTTO_TYPE_IMAGE_TRANSFORM_ORIENTATION()))
+
+typedef struct _RsttoImageTransformOrientation RsttoImageTransformOrientation;
+
+struct _RsttoImageTransformOrientation
+{
+    RsttoImageTransformation parent;
+};
+
+typedef struct _RsttoImageTransformOrientationClass RsttoImageTransformOrientationClass;
+
+struct _RsttoImageTransformOrientationClass
+{
+    RsttoImageTransformationClass parent_class;
+};
+
+RsttoImageTransformation *
+rstto_image_transform_orientation_new (gboolean flip_vertical, 
+                                       gboolean flip_horizontal,
+                                       GdkPixbufRotation rotation);
+
+G_END_DECLS
+
+#endif /* __RISTRETTO_IMAGE_TRANSFORM_ORIENTATION_H__ */

Added: ristretto/branches/ristretto-gio/src/image_transformation.c
===================================================================
--- ristretto/branches/ristretto-gio/src/image_transformation.c	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image_transformation.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,72 @@
+/*
+ *  Copyright (c) 2009 Stephan Arts <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <gdk/gdk.h>
+
+#include <libexif/exif-data.h>
+
+#include "image.h"
+#include "image_transformation.h"
+
+static void
+rstto_image_transformation_init (GObject *);
+static void
+rstto_image_transformation_class_init (GObjectClass *);
+
+GType
+rstto_image_transformation_get_type ()
+{
+    static GType rstto_image_transformation_type = 0;
+
+    if (!rstto_image_transformation_type)
+    {
+        static const GTypeInfo rstto_image_transformation_info = 
+        {
+            sizeof (RsttoImageTransformationClass),
+            (GBaseInitFunc) NULL,
+            (GBaseFinalizeFunc) NULL,
+            (GClassInitFunc) rstto_image_transformation_class_init,
+            (GClassFinalizeFunc) NULL,
+            NULL,
+            sizeof (RsttoImageTransformation),
+            0,
+            (GInstanceInitFunc) rstto_image_transformation_init,
+            NULL
+        };
+
+        rstto_image_transformation_type = g_type_register_static (G_TYPE_OBJECT, "RsttoImageTransformation", &rstto_image_transformation_info, 0);
+    }
+    return rstto_image_transformation_type;
+}
+
+
+static void
+rstto_image_transformation_init (GObject *object)
+{
+
+}
+
+static void
+rstto_image_transformation_class_init (GObjectClass *object_class)
+{
+
+}

Added: ristretto/branches/ristretto-gio/src/image_transformation.h
===================================================================
--- ristretto/branches/ristretto-gio/src/image_transformation.h	                        (rev 0)
+++ ristretto/branches/ristretto-gio/src/image_transformation.h	2009-01-05 23:15:14 UTC (rev 6407)
@@ -0,0 +1,61 @@
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RISTRETTO_IMAGE_TRANSFORMATION_H__
+#define __RISTRETTO_IMAGE_TRANSFORMATION_H__
+
+G_BEGIN_DECLS
+
+#define RSTTO_TYPE_IMAGE_TRANSFORMATION rstto_image_transformation_get_type()
+
+#define RSTTO_IMAGE_TRANSFORMATION(obj)( \
+        G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                RSTTO_TYPE_IMAGE_TRANSFORMATION, \
+                RsttoImageTransformation))
+
+#define RSTTO_IS_IMAGE_TRANSFORMATION(obj)( \
+        G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                RSTTO_TYPE_IMAGE_TRANSFORMATION))
+
+#define RSTTO_IMAGE_TRANSFORMATION_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_CAST ((klass), \
+                RSTTO_TYPE_IMAGE_TRANSFORMATION, \
+                RsttoImageTransformationClass))
+
+#define RSTTO_IS_IMAGE_TRANSFORMATION_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                RSTTO_TYPE_IMAGE_TRANSFORMATION()))
+
+typedef struct _RsttoImageTransformation RsttoImageTransformation;
+
+struct _RsttoImageTransformation
+{
+    GObject parent;
+
+    gboolean (*transform)(RsttoImageTransformation *, RsttoImage *);
+    gboolean (*revert)(RsttoImageTransformation *, RsttoImage *);
+};
+
+typedef struct _RsttoImageTransformationClass RsttoImageTransformationClass;
+
+struct _RsttoImageTransformationClass
+{
+    GObjectClass parent_class;
+};
+
+G_END_DECLS
+
+#endif /* __RISTRETTO_IMAGE_TRANSFORMATION_H__ */

Modified: ristretto/branches/ristretto-gio/src/main.c
===================================================================
--- ristretto/trunk/src/main.c	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/main.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,4 +1,6 @@
 /*
+ *  Copyright (c) 2006-2009 Stephan Arts <stephan at xfce.org>
+ *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
@@ -19,38 +21,33 @@
 #include <gdk/gdkkeysyms.h>
 #include <string.h>
 
-#include <thunar-vfs/thunar-vfs.h>
+#include <glib.h>
+#include <gio/gio.h>
+#include <libxfce4util/libxfce4util.h>
 #include <libexif/exif-data.h>
 
+#include "image.h"
 #include "navigator.h"
 #include "picture_viewer.h"
 #include "main_window.h"
 
+
+gboolean version = FALSE;
+gboolean start_fullscreen = FALSE;
+gboolean start_slideshow = FALSE;
+
 typedef struct {
     RsttoNavigator *navigator;
-    RsttoMainWindow *main_window;
-    GSList *files;
+    gint argc;
+    gchar **argv;
 } RsttoOpenFiles;
 
-static ThunarVfsMimeDatabase *mime_dbase = NULL;
-
-static XfceRc *xfce_rc;
-static gint window_save_geometry_timer_id = 0;
-
+static gpointer
+cb_rstto_open_files (RsttoOpenFiles *rof);
 static gboolean
-rstto_window_save_geometry_timer (gpointer user_data);
-static void
-rstto_window_save_geometry_timer_destroy(gpointer user_data);
-static gboolean
-cb_rstto_main_window_configure_event (GtkWidget *widget, GdkEventConfigure *event);
+cb_rstto_start_open_files_thread (RsttoOpenFiles *rof);
 
-static gboolean
-cb_rstto_open_files (RsttoOpenFiles *rof);
 
-gboolean version = FALSE;
-gboolean start_fullscreen = FALSE;
-gboolean start_slideshow = FALSE;
-
 static GOptionEntry entries[] =
 {
     {    "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &version,
@@ -68,156 +65,11 @@
     { NULL, ' ', 0, 0, NULL, NULL, NULL }
 };
 
-
-#if GTK_CHECK_VERSION(2,12,0)
-#define RSTTO_COLOR_PARSE gdk_color_parse
-#define RSTTO_COLOR_TO_STRING gdk_color_to_string
-#else
-gboolean
-rstto_color_parse(const gchar *string, GdkColor *color)
+int
+main(int argc, char **argv)
 {
-    gint i;
-    guint16 red = 0;
-    guint16 green = 0;
-    guint16 blue = 0;
-    g_return_val_if_fail(string != NULL, FALSE);
-    /* Check is the string is long enough tp contain #rrrrggggbbbb
-     */
-    if(strlen(string) != 13)
-        return FALSE;
-    if(string[0] != '#')
-        return FALSE;
-
-    /* red */
-    for(i = 1; i < 5; ++i)
-    {
-        if(string[i] >= '0' && string[i] <= '9')
-        {
-            red |= (string[i] ^ 0x30);
-        }
-        else
-        {
-            if(string[i] >= 'a' && string[i] <= 'f')
-            {
-                red |= ((string[i] ^ 0x60)+9);
-            }
-            else
-            {
-                return FALSE;
-            }
-        }
-        if (i < 4)
-            red = red << 4;
-    }
-
-    /* green */
-    for(i = 5; i < 9; ++i)
-    {
-        if(string[i] >= '0' && string[i] <= '9')
-        {
-            green |= (string[i] ^ 0x30);
-        }
-        else
-        {
-            if(string[i] >= 'a' && string[i] <= 'f')
-            {
-                green |= ((string[i] ^ 0x60)+9);
-            }
-            else
-            {
-                return FALSE;
-            }
-        }
-
-        if (i < 8)
-            green = green << 4;
-
-    }
-
-    /* blue */
-    for(i = 9; i < 13; ++i)
-    {
-        if(string[i] >= '0' && string[i] <= '9')
-        {
-            blue |= (string[i] ^ 0x30);
-        }
-        else
-        {
-            if(string[i] >= 'a' && string[i] <= 'f')
-            {
-                blue |= ((string[i] ^ 0x60)+9);
-            }
-            else
-            {
-                return FALSE;
-            }
-        }
-        if (i < 12)
-            blue = blue << 4;
-    }
-
-    color->red = red;
-    color->green = green;
-    color->blue = blue;
-    return TRUE;
-}
-
-gchar *
-rstto_color_to_string(const GdkColor *color)
-{
-    gint i;
-    gchar *color_string = g_new0(gchar, 14);
-
-    color_string[0] = '#';
-
-    for(i = 0; i < 4; ++i)
-    {
-        if(((color->red >> (4*i))&0x000f) < 0xA)
-        {
-           color_string[1+3-i] = (((color->red >> (4*i))&0x000f)|0x0030);
-        }
-        else
-        {
-           color_string[1+3-i] = ((((color->red >> (4*i))&0x000f)|0x0060)-9);
-        }
-    }
-
-    for(i = 0; i < 4; ++i)
-    {
-        if(((color->green >> (4*i))&0x000f) < 0xA)
-        {
-           color_string[5+3-i] = (((color->green >> (4*i))&0x000f)|0x0030);
-        }
-        else
-        {
-           color_string[5+3-i] = ((((color->green >> (4*i))&0x000f)|0x0060)-9);
-        }
-    }
-
-    for(i = 0; i < 4; ++i)
-    {
-        if(((color->blue >> (4*i))&0x000f) < 0xA)
-        {
-           color_string[9+3-i] = (((color->blue >> (4*i))&0x000f)|0x0030);
-        }
-        else
-        {
-           color_string[9+3-i] = ((((color->blue >> (4*i))&0x000f)|0x0060)-9);
-        }
-    }
-
-    return color_string;
-}
-#define RSTTO_COLOR_PARSE(string, color) rstto_color_parse(string, color)
-#define RSTTO_COLOR_TO_STRING(color) rstto_color_to_string(color)
-#endif
-
-int main(int argc, char **argv)
-{
-    GdkColor *bg_color = NULL;
+    static XfceRc *xfce_rc;
     GError *cli_error = NULL;
-    gint n;
-    gchar *program = NULL;
 
     #ifdef ENABLE_NLS
     bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
@@ -225,6 +77,9 @@
     textdomain (GETTEXT_PACKAGE);
     #endif
 
+    if (!g_thread_supported ()) g_thread_init (NULL);
+
+
     if(!gtk_init_with_args(&argc, &argv, _(""), entries, PACKAGE, &cli_error))
     {
         if (cli_error != NULL)
@@ -241,268 +96,51 @@
         return 0;
     }
 
-    
-    thunar_vfs_init();
-
-    mime_dbase = thunar_vfs_mime_database_get_default();
-
-    program = g_find_program_in_path ("xfconf-query");
-    if (G_LIKELY (program != NULL))
-    {
-        rstto_has_xfconf_query = TRUE;
-        g_free (program);
-    }
-
-    program = g_find_program_in_path ("gconftool");
-    if (G_LIKELY (program != NULL))
-    {
-        rstto_has_gconftool = TRUE;
-        g_free (program);
-    }
-
-
     gtk_window_set_default_icon_name("ristretto");
     xfce_rc = xfce_rc_config_open(XFCE_RESOURCE_CONFIG, "ristretto/ristrettorc", FALSE);
 
-    const gchar *thumbnail_viewer_orientation = xfce_rc_read_entry(xfce_rc, "ThumbnailViewerOrientation", "horizontal");
-    gboolean show_thumbnail_viewer = xfce_rc_read_bool_entry(xfce_rc, "ShowThumbnailViewer", TRUE);
-    gboolean show_toolbar = xfce_rc_read_bool_entry(xfce_rc, "ShowToolBar", TRUE);
-    gint window_width = xfce_rc_read_int_entry(xfce_rc, "LastWindowWidth", 400);
-    gint window_height = xfce_rc_read_int_entry(xfce_rc, "LastWindowHeight", 300);
-    gint slideshow_timeout = xfce_rc_read_int_entry(xfce_rc, "SlideShowTimeout", 5000);
-    gboolean slideshow_hide_thumbnail = xfce_rc_read_bool_entry(xfce_rc, "SlideShowHideThumbnail", TRUE);
-    gint max_cache = xfce_rc_read_int_entry(xfce_rc, "MaxImagesCacheSize", 64);
-    gboolean preload_imgs = xfce_rc_read_bool_entry (xfce_rc, "PreloadImgs", FALSE);
-    gboolean override_bg_color = xfce_rc_read_bool_entry (xfce_rc, "OverrideBgColor", FALSE);
-    gboolean scale_to_100 = xfce_rc_read_bool_entry (xfce_rc, "ScaleTo100", FALSE);
-
-    if (override_bg_color)
-    {
-        const gchar *color = xfce_rc_read_entry(xfce_rc, "BgColor", "#000000000000");
-        bg_color = g_new0(GdkColor, 1);
-        if(!RSTTO_COLOR_PARSE(color, bg_color))
-        {
-            g_debug("parse failed");
-        }
-    }
+    RsttoNavigator *navigator = rstto_navigator_new ();
     
-    GtkWidget *window = rstto_main_window_new();
-    gtk_widget_ref(window);
+    GtkWidget *window = rstto_main_window_new (navigator);
 
-    RsttoNavigator *navigator = rstto_main_window_get_navigator(RSTTO_MAIN_WINDOW(window));
-
-    navigator->preload = preload_imgs;
-
-    rstto_main_window_set_max_cache_size(RSTTO_MAIN_WINDOW(window), max_cache);
-    rstto_main_window_set_slideshow_timeout(RSTTO_MAIN_WINDOW(window), (gdouble)slideshow_timeout);
-    rstto_main_window_set_hide_thumbnail(RSTTO_MAIN_WINDOW(window), slideshow_hide_thumbnail);
-    rstto_main_window_set_scale_to_100(RSTTO_MAIN_WINDOW(window), scale_to_100);
-    rstto_navigator_set_timeout(navigator, slideshow_timeout);
-    rstto_main_window_set_start_fullscreen(RSTTO_MAIN_WINDOW(window), start_fullscreen);
-    rstto_main_window_set_start_slideshow(RSTTO_MAIN_WINDOW(window), start_slideshow);
-
-    /* When more then one file is provided over the CLI,
-     * just open those files and don't index the folder
-     */
     if (argc > 1)
     {
         RsttoOpenFiles rof;
 
-        rof.files = NULL;
         rof.navigator = navigator;
-        rof.main_window = RSTTO_MAIN_WINDOW(window);
-        for (n = 1; n < argc; ++n)
-        {
-            rof.files = g_slist_prepend(rof.files, argv[n]);
-        }
+        rof.argc = argc;
+        rof.argv = argv;
 
-        gtk_init_add((GtkFunction)cb_rstto_open_files, &rof);
+        gtk_init_add((GtkFunction)cb_rstto_start_open_files_thread, &rof);
+
     }
 
     g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
-    g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(cb_rstto_main_window_configure_event), NULL);
+    gtk_widget_show_all (window);
 
-    if (!strcmp(thumbnail_viewer_orientation, "vertical"))
-    {
-        rstto_main_window_set_thumbnail_viewer_orientation(RSTTO_MAIN_WINDOW(window), GTK_ORIENTATION_VERTICAL);
-    }
-    else
-    {
-        rstto_main_window_set_thumbnail_viewer_orientation(RSTTO_MAIN_WINDOW(window), GTK_ORIENTATION_HORIZONTAL);
-    }
-
-    if (bg_color)
-    {
-        rstto_main_window_set_pv_bg_color(RSTTO_MAIN_WINDOW(window), bg_color);
-        g_free(bg_color);
-    }
-
-
-    gtk_window_set_default_size(GTK_WINDOW(window), window_width, window_height);
-    gtk_widget_show_all(window);
-
-    rstto_main_window_set_show_thumbnail_viewer(RSTTO_MAIN_WINDOW(window), show_thumbnail_viewer);
-    rstto_main_window_set_show_toolbar(RSTTO_MAIN_WINDOW(window), show_toolbar);
-    if (start_fullscreen)
-        rstto_main_window_force_fullscreen(RSTTO_MAIN_WINDOW(window));
-    if (start_slideshow)
-        rstto_main_window_force_slideshow (RSTTO_MAIN_WINDOW(window));
     gtk_main();
 
-    bg_color = (GdkColor *)rstto_main_window_get_pv_bg_color(RSTTO_MAIN_WINDOW(window));
-
-    xfce_rc_write_bool_entry(xfce_rc, "ShowToolBar", rstto_main_window_get_show_toolbar(RSTTO_MAIN_WINDOW(window)));
-    xfce_rc_write_bool_entry(xfce_rc, "ScaleTo100", rstto_main_window_get_scale_to_100(RSTTO_MAIN_WINDOW(window)));
-    xfce_rc_write_bool_entry(xfce_rc, "PreloadImgs", navigator->preload);
-    xfce_rc_write_bool_entry(xfce_rc, "ShowThumbnailViewer", rstto_main_window_get_show_thumbnail_viewer(RSTTO_MAIN_WINDOW(window)));
-    if (bg_color)
-    {
-        xfce_rc_write_bool_entry(xfce_rc, "OverrideBgColor", TRUE);
-        xfce_rc_write_entry(xfce_rc, "BgColor", RSTTO_COLOR_TO_STRING(bg_color));
-    }
-    else
-    {
-        xfce_rc_write_bool_entry(xfce_rc, "OverrideBgColor", FALSE);
-    }
-    switch (rstto_main_window_get_thumbnail_viewer_orientation(RSTTO_MAIN_WINDOW(window)))
-    {
-        case GTK_ORIENTATION_VERTICAL:
-            xfce_rc_write_entry(xfce_rc, "ThumbnailViewerOrientation", "vertical");
-            break;
-        case GTK_ORIENTATION_HORIZONTAL:
-            xfce_rc_write_entry(xfce_rc, "ThumbnailViewerOrientation", "horizontal");
-            break;
-    }
-    xfce_rc_write_int_entry(xfce_rc, "MaxImagesCacheSize", rstto_main_window_get_max_cache_size(RSTTO_MAIN_WINDOW(window)));
-    xfce_rc_write_int_entry(xfce_rc, "SlideShowTimeout", (gint)rstto_main_window_get_slideshow_timeout(RSTTO_MAIN_WINDOW(window)));
-    xfce_rc_write_bool_entry(xfce_rc, "SlideShowHideThumbnail", rstto_main_window_get_hide_thumbnail(RSTTO_MAIN_WINDOW(window)));
     xfce_rc_flush(xfce_rc);
     xfce_rc_close(xfce_rc);
-    gtk_widget_unref(window);
 
+
     return 0;
 }
 
 static gboolean
-rstto_window_save_geometry_timer (gpointer user_data)
+cb_rstto_start_open_files_thread (RsttoOpenFiles *rof)
 {
-    GtkWindow *window = GTK_WINDOW(user_data);
-    gint width = 0;
-    gint height = 0;
-    /* check if the window is still visible */
-    if (GTK_WIDGET_VISIBLE (window))
-    {
-        /* determine the current state of the window */
-        gint state = gdk_window_get_state (GTK_WIDGET (window)->window);
-
-        /* don't save geometry for maximized or fullscreen windows */
-        if ((state & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)) == 0)
-        {
-            /* determine the current width/height of the window... */
-            gtk_window_get_size (GTK_WINDOW (window), &width, &height);
-
-            /* ...and remember them as default for new windows */
-            xfce_rc_write_int_entry (xfce_rc, "LastWindowWidth", width);
-            xfce_rc_write_int_entry (xfce_rc, "LastWindowHeight", height);
-        }
-    }
+    g_thread_create ((GThreadFunc)cb_rstto_open_files, rof, FALSE, NULL);
     return FALSE;
 }
 
-static void
-rstto_window_save_geometry_timer_destroy(gpointer user_data)
-{
-    window_save_geometry_timer_id = 0;
-}
-
-static gboolean
-cb_rstto_main_window_configure_event (GtkWidget *widget, GdkEventConfigure *event)
-{
-    /* shamelessly copied from thunar, written by benny */
-    /* check if we have a new dimension here */
-    if (widget->allocation.width != event->width || widget->allocation.height != event->height)
-    {
-        /* drop any previous timer source */
-        if (window_save_geometry_timer_id > 0)
-            g_source_remove (window_save_geometry_timer_id);
-
-        /* check if we should schedule another save timer */
-        if (GTK_WIDGET_VISIBLE (widget))
-        {
-            /* save the geometry one second after the last configure event */
-            window_save_geometry_timer_id = g_timeout_add_full (G_PRIORITY_LOW, 1000, rstto_window_save_geometry_timer,
-                widget, rstto_window_save_geometry_timer_destroy);
-        }
-    }
-
-    /* let Gtk+ handle the configure event */
-    return FALSE;
-}
-
-static gboolean
+static gpointer
 cb_rstto_open_files (RsttoOpenFiles *rof)
 {
-    GError *error = NULL;
-    gchar *path_dir = NULL;
-    RsttoNavigator *navigator = rof->navigator;
-    RsttoMainWindow *window = rof->main_window;
-
-    GtkStatusbar *bar = rstto_main_window_get_statusbar(window);
-
-    guint context_id = gtk_statusbar_get_context_id(bar, "StatusMessages");
-    guint message_id = gtk_statusbar_push(bar, context_id, N_("Opening file(s)..."));
-
-    if (g_slist_length(rof->files) >= 1)
+    gint i = 0;
+    for (i = 1; i < rof->argc; ++i)
     {
-        GSList *_iter = rof->files;
-        while(_iter)
-        {
-            if (g_path_is_absolute(_iter->data))
-            {
-                path_dir = g_strdup(_iter->data);
-            }
-            else
-            {
-                gchar *base_dir = g_get_current_dir();
-
-                path_dir = g_build_path("/", base_dir, _iter->data, NULL);
-
-                g_free(base_dir);
-            }
-            if(g_file_test(path_dir, G_FILE_TEST_EXISTS))
-            {
-
-                if(g_file_test(path_dir, G_FILE_TEST_IS_DIR))
-                {
-                    if(rstto_navigator_open_folder (navigator, path_dir, TRUE, &error) == TRUE)
-                    {
-                        rstto_navigator_jump_first(navigator);
-                        gtk_statusbar_remove(bar, context_id, message_id);
-                    }
-                    else
-                    {
-
-                    }
-                }
-                else
-                {
-                    if (g_slist_length(rof->files) == 1)
-                        rstto_navigator_open_file (navigator, path_dir, TRUE, NULL);
-                    else
-                        rstto_navigator_open_file (navigator, path_dir, FALSE, NULL);
-
-                    gtk_statusbar_remove(bar, context_id, message_id);
-                }
-            }
-
-            g_free(path_dir);
-
-            _iter = g_slist_next(_iter);
-        }
-
-        if (g_slist_length(rof->files) > 1)
-            rstto_navigator_jump_first(navigator);
+        GFile *file = g_file_new_for_commandline_arg (rof->argv[i]);
+        rstto_navigator_add_file (rof->navigator, file);
     }
-
-    return FALSE;
 }

Modified: ristretto/branches/ristretto-gio/src/main_window.c
===================================================================
--- ristretto/trunk/src/main_window.c	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/main_window.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) Stephan Arts 2006-2008 <stephan at xfce.org>
+ *  Copyright (C) Stephan Arts 2006-2009 <stephan at xfce.org>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -22,258 +22,93 @@
 #include <gdk/gdkx.h>
 #include <X11/Xlib.h>
 #include <string.h>
-#include <thunar-vfs/thunar-vfs.h>
+
+#include <gio/gio.h>
+
 #include <libxfcegui4/libxfcegui4.h>
 #include <libexif/exif-data.h>
-#include <dbus/dbus-glib.h>
 
+#include "image.h"
 #include "navigator.h"
-#include "thumbnail_bar.h"
 #include "picture_viewer.h"
 #include "main_window.h"
-#include "save_dialog.h"
 
 #define XFDESKTOP_SELECTION_FMT "XFDESKTOP_SELECTION_%d"
 
+#ifndef RISTRETTO_APP_TITLE
+#define RISTRETTO_APP_TITLE "Image viewer"
+#endif
 
-struct _RsttoMainWindowPriv
-{
-    RsttoNavigator *navigator;
-    GtkWidget *thumbnail_viewer;
-    GtkWidget *picture_viewer;
-    GtkWidget *statusbar;
-    GtkRecentManager *manager;
-    GtkIconTheme *icon_theme;
-    ThunarVfsMimeDatabase *mime_dbase;
-    GList *menu_apps_list;
-    gdouble zoom_factor;
 
-    DBusGConnection *connection;
-    DBusGProxy *filemanager_proxy;
+#ifndef ZOOM_FACTOR
+#define ZOOM_FACTOR 1.2
+#endif
 
-    struct {
-        GtkWidget *main_vbox;
-        GtkWidget *s_window;
-        GtkWidget *paned;
-    } containers;
 
+struct _RsttoMainWindowPriv
+{
     struct {
-        GtkOrientation  thumbnail_viewer_orientation;
-        gboolean        thumbnail_viewer_visibility;
-        gboolean        toolbar_visibility;
-        gint            max_cache_size;
-        gdouble         slideshow_timeout;
-        gboolean        slideshow_hide_thumbnail;
-        const GdkColor *bg_color;
-        gboolean        scale_to_100;
-        RsttoDesktop    desktop;
-        gboolean        start_fullscreen;
-        gboolean        start_slideshow;
-    } settings;
+        RsttoNavigator *navigator;
+    } props;
 
     struct {
-        GtkWidget *menu;
-        GtkWidget *menu_item_file;
-        struct {
-            GtkWidget *menu;
-            GtkWidget *menu_item_open_file;
-            GtkWidget *menu_item_open_folder;
-            GtkWidget *menu_item_open_recently;
-            struct {
-                GtkWidget *menu;
-                GtkWidget *menu_item_separator_1;
-                GtkWidget *menu_item_clear;
-            } recently;
-            GtkWidget *menu_item_separator_1;
-            GtkWidget *menu_item_file_properties;
-            GtkWidget *menu_item_separator_2;
-            GtkWidget *menu_item_close;
-            GtkWidget *menu_item_close_all;
-            GtkWidget *menu_item_quit;
-        } file;
+        GtkWidget *close;
+        GtkWidget *close_all;
+    } menu_items;
 
-        GtkWidget *menu_item_edit;
-        struct {
-            GtkWidget *menu;
-            GtkWidget *menu_item_open_with;
-            struct {
-                GtkWidget *menu;
-                GtkWidget *menu_item_empty;
-            } open_with;
-            GtkWidget *menu_item_preferences;
-        } edit;
+    RsttoNavigatorIter *iter;
 
-        GtkWidget *menu_item_view;
-        struct {
-            GtkWidget *menu;
-            GtkWidget *menu_item_show_toolbar;
-            GtkWidget *menu_item_show_thumbnail_viewer;
-            struct {
-                GtkWidget *menu;
-                GtkWidget *menu_item_thumbnail_viewer_horizontal;
-                GtkWidget *menu_item_thumbnail_viewer_vertical;
-                GtkWidget *menu_item_thumbnail_viewer_hide;
-            } show_thumbnail_viewer;
-            GtkWidget *menu_item_separator_1;
+    GtkWidget *menubar;
+    GtkWidget *toolbar;
+    GtkWidget *picture_viewer;
+    GtkWidget *p_viewer_s_window;
+};
 
-            GtkWidget *menu_item_zooming;
-            struct {
-                GtkWidget *menu;
-                GtkWidget *menu_item_zoom_in;
-                GtkWidget *menu_item_zoom_out;
-                GtkWidget *menu_item_zoom_100;
-                GtkWidget *menu_item_zoom_fit;
-                GtkWidget *menu_item_zoom_box;
-            } zooming;
-
-            GtkWidget *menu_item_rotate;
-            struct {
-                GtkWidget *menu;
-                GtkWidget *menu_item_rotate_cw;
-                GtkWidget *menu_item_rotate_ccw;
-            } rotate;
-
-            GtkWidget *menu_item_separator_2;
-            GtkWidget *menu_item_fullscreen;
-            GtkWidget *menu_item_set_wallpaper;
-        } view;
-
-        GtkWidget *menu_item_go;
-        struct {
-            GtkWidget *menu;
-            GtkWidget *menu_item_next;
-            GtkWidget *menu_item_previous;
-            GtkWidget *menu_item_first;
-            GtkWidget *menu_item_last;
-            GtkWidget *menu_item_separator_1;
-            GtkWidget *menu_item_play;
-            GtkWidget *menu_item_pause;
-        } go;
-
-        GtkWidget *menu_item_help;
-        struct {
-            GtkWidget *menu;
-            GtkWidget *menu_item_about;
-        } help;
-
-        struct {
-            GtkWidget *menu;
-            GtkWidget *menu_item_open_file;
-            GtkWidget *menu_item_close;
-            GtkWidget *menu_item_separator_1;
-            GtkWidget *menu_item_open_with;
-            struct {
-                GtkWidget *menu;
-                GtkWidget *menu_item_empty;
-            } open_with;
-            GtkWidget *menu_item_separator_2;
-            GtkWidget *menu_item_zoom_in;
-            GtkWidget *menu_item_zoom_out;
-            GtkWidget *menu_item_zoom_fit;
-            GtkWidget *menu_item_zoom_100;
-        } _picture_viewer;
-    } menus;
-
-    struct {
-        GtkWidget *bar;
-
-        GtkToolItem *tool_item_open;
-        GtkToolItem *tool_item_separator_1;
-        GtkToolItem *tool_item_next;
-        GtkToolItem *tool_item_previous;
-        GtkToolItem *tool_item_spacer_1;
-
-        GtkToolItem *tool_item_zoom_fit;
-        GtkToolItem *tool_item_zoom_100;
-        GtkToolItem *tool_item_zoom_out;
-        GtkToolItem *tool_item_zoom_in;
-    } toolbar;
+enum
+{
+    PROP_0,
+    PROP_NAVIGATOR,
 };
 
 static void
-cb_rstto_main_window_thumbnail_viewer_horizontal(GtkWidget *widget, RsttoMainWindow *window);
+rstto_main_window_init(RsttoMainWindow *);
 static void
-cb_rstto_main_window_thumbnail_viewer_vertical(GtkWidget *widget, RsttoMainWindow *window);
+rstto_main_window_class_init(RsttoMainWindowClass *);
 static void
-cb_rstto_main_window_thumbnail_viewer_hide(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_toggle_toolbar(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_toggle_fullscreen(GtkWidget *widget, RsttoMainWindow *window);
-#ifdef WITH_DESKTOP_WALLPAPER
-static void
-cb_rstto_main_window_set_wallpaper(GtkWidget *widget, RsttoMainWindow *window);
-#endif
-static gboolean
-cb_rstto_main_window_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data);
-static void
-cb_rstto_main_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data);
-static void
-cb_rstto_main_window_play(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_pause(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_spawn_app(GtkWidget *widget, ThunarVfsMimeApplication *app);
+rstto_main_window_dispose(GObject *object);
 
 static void
-cb_rstto_main_window_next(GtkWidget *widget, RsttoMainWindow *window);
+rstto_main_window_set_property (GObject      *object,
+                                guint         property_id,
+                                const GValue *value,
+                                GParamSpec   *pspec);
 static void
-cb_rstto_main_window_previous(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_last(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_first(GtkWidget *widget, RsttoMainWindow *window);
+rstto_main_window_get_property (GObject    *object,
+                                guint       property_id,
+                                GValue     *value,
+                                GParamSpec *pspec);
 
 static void
-cb_rstto_main_window_zoom_in(GtkWidget *widget, RsttoMainWindow *window);
+rstto_main_window_build_toolbar (RsttoMainWindow *window, GtkToolbar *toolbar);
 static void
-cb_rstto_main_window_zoom_out(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_zoom_100(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_zoom_fit(GtkWidget *widget, RsttoMainWindow *window);
+rstto_main_window_build_menubar (RsttoMainWindow *window, GtkMenuBar *menubar);
 
-static void
-cb_rstto_main_window_rotate_cw(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_rotate_ccw(GtkWidget *widget, RsttoMainWindow *window);
 
 static void
-cb_rstto_main_window_open_file(GtkWidget *widget, RsttoMainWindow *window);
+cb_rstto_main_window_zoom_100 (GtkWidget *widget, RsttoMainWindow *window);
 static void
-cb_rstto_main_window_open_folder(GtkWidget *widget, RsttoMainWindow *window);
+cb_rstto_main_window_zoom_fit (GtkWidget *widget, RsttoMainWindow *window);
 static void
-cb_rstto_main_window_open_recent(GtkRecentChooser *chooser, RsttoMainWindow *window);
+cb_rstto_main_window_zoom_in (GtkWidget *widget, RsttoMainWindow *window);
 static void
-cb_rstto_main_window_clear_recent(GtkWidget *widget, RsttoMainWindow *window);
+cb_rstto_main_window_zoom_out (GtkWidget *widget, RsttoMainWindow *window);
 static void
-cb_rstto_main_window_close(GtkWidget *widget, RsttoMainWindow *window);
+cb_rstto_main_window_next_image (GtkWidget *widget, RsttoMainWindow *window);
 static void
-cb_rstto_main_window_close_all(GtkWidget *widget, RsttoMainWindow *window);
+cb_rstto_main_window_previous_image (GtkWidget *widget, RsttoMainWindow *window);
 static void
-cb_rstto_main_window_file_properties(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_quit(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_about(GtkWidget *widget, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_preferences(GtkWidget *widget, RsttoMainWindow *window);
+cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window);
 
-static void
-cb_rstto_bg_color_override_check_toggled(GtkToggleButton *button, GtkWidget *);
-
-static void
-cb_rstto_main_window_nav_iter_changed(RsttoNavigator *navigator, gint nr, RsttoNavigatorEntry *entry, RsttoMainWindow *window);
-static void
-cb_rstto_main_window_nav_new_entry(RsttoNavigator *navigator, gint nr, RsttoNavigatorEntry *entry, RsttoMainWindow *window);
-
-static void
-rstto_main_window_init(RsttoMainWindow *);
-static void
-rstto_main_window_class_init(RsttoMainWindowClass *);
-static void
-rstto_main_window_dispose(GObject *object);
-
 static GtkWidgetClass *parent_class = NULL;
 
 GType
@@ -305,1905 +140,361 @@
 static void
 rstto_main_window_init(RsttoMainWindow *window)
 {
-    window->priv = g_new0(RsttoMainWindowPriv, 1);
-    window->priv->zoom_factor = 1.2;
+    GtkWidget   *main_vbox = gtk_vbox_new (FALSE, 0);
 
-    window->priv->mime_dbase = thunar_vfs_mime_database_get_default();
-    window->priv->icon_theme = gtk_icon_theme_get_default();
+    gtk_window_set_title (GTK_WINDOW (window), RISTRETTO_APP_TITLE);
 
-    window->priv->settings.scale_to_100 = TRUE;
-    
+    window->priv = g_new0(RsttoMainWindowPriv, 1);
 
-    GtkAccelGroup *accel_group = gtk_accel_group_new();
+    window->priv->iter = NULL;
 
-    gtk_window_set_title(GTK_WINDOW(window), PACKAGE_STRING);
-    gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
+    window->priv->menubar = gtk_menu_bar_new();
+    window->priv->toolbar = gtk_toolbar_new ();
 
-    window->priv->manager = gtk_recent_manager_get_default();
-    window->priv->navigator = rstto_navigator_new(window->priv->manager);
-    window->priv->thumbnail_viewer = rstto_thumbnail_bar_new(window->priv->navigator);
-    window->priv->picture_viewer = rstto_picture_viewer_new(window->priv->navigator);
+    rstto_main_window_build_toolbar (window, GTK_TOOLBAR (window->priv->toolbar));
+    rstto_main_window_build_menubar (window, GTK_MENU_BAR (window->priv->menubar));
 
+    window->priv->picture_viewer = rstto_picture_viewer_new ();
+    window->priv->p_viewer_s_window = gtk_scrolled_window_new (NULL, NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (window->priv->p_viewer_s_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    gtk_container_add (GTK_CONTAINER (window->priv->p_viewer_s_window), window->priv->picture_viewer);
 
-/* Set up default settings */
-    window->priv->settings.thumbnail_viewer_orientation = GTK_ORIENTATION_HORIZONTAL; 
-    window->priv->settings.thumbnail_viewer_visibility = TRUE;
 
-/* Create menu bar */
-    window->priv->menus.menu = gtk_menu_bar_new();
-    
-/* Create 'File' menu */
-    window->priv->menus.menu_item_file = gtk_menu_item_new_with_mnemonic(_("_File"));
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.menu), window->priv->menus.menu_item_file);
+    gtk_container_add (GTK_CONTAINER (window), main_vbox);
+    gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->menubar, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->toolbar, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->p_viewer_s_window, TRUE, TRUE, 0);
+}
 
-    window->priv->menus.file.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.file.menu), accel_group);
+static void
+rstto_main_window_build_toolbar (RsttoMainWindow *window, GtkToolbar *toolbar)
+{
+    GtkToolItem *toolbar_item_zoom_fit, *toolbar_item_zoom_100,
+                *toolbar_item_zoom_out, *toolbar_item_zoom_in,
+                *toolbar_item_next_image, *toolbar_item_previous_image,
+                *toolbar_item_open_image, *toolbar_separator1, *toolbar_separator2;
 
-    window->priv->menus.file.menu_item_open_file = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, accel_group);
-    window->priv->menus.file.menu_item_open_folder = gtk_menu_item_new_with_mnemonic(_("O_pen Folder"));
-    window->priv->menus.file.menu_item_open_recently = gtk_menu_item_new_with_mnemonic(_("_Recently used"));
-    window->priv->menus.file.menu_item_separator_1 = gtk_separator_menu_item_new();
-    window->priv->menus.file.menu_item_file_properties = gtk_image_menu_item_new_from_stock(GTK_STOCK_PROPERTIES, accel_group);
-    window->priv->menus.file.menu_item_separator_2 = gtk_separator_menu_item_new();
-    window->priv->menus.file.menu_item_close = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, accel_group);
-    window->priv->menus.file.menu_item_close_all = gtk_menu_item_new_with_mnemonic(_("Close _all"));
-    window->priv->menus.file.menu_item_quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group);
+    toolbar_item_zoom_fit = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_FIT);
+    gtk_toolbar_insert (toolbar, toolbar_item_zoom_fit, 0);
+    g_signal_connect (toolbar_item_zoom_fit,
+                     "clicked",
+                      G_CALLBACK(cb_rstto_main_window_zoom_fit), window);
+    toolbar_item_zoom_100 = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_100);
+    gtk_toolbar_insert (toolbar, toolbar_item_zoom_100, 0);
+    g_signal_connect (toolbar_item_zoom_100,
+                     "clicked",
+                      G_CALLBACK(cb_rstto_main_window_zoom_100), window);
+    toolbar_item_zoom_in = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_IN);
+    gtk_toolbar_insert (toolbar, toolbar_item_zoom_in, 0);
+    g_signal_connect (toolbar_item_zoom_in,
+                     "clicked",
+                      G_CALLBACK(cb_rstto_main_window_zoom_in), window);
+    toolbar_item_zoom_out = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_OUT);
+    gtk_toolbar_insert (toolbar, toolbar_item_zoom_out, 0);
+    g_signal_connect (toolbar_item_zoom_out,
+                     "clicked",
+                      G_CALLBACK(cb_rstto_main_window_zoom_out), window);
 
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.menu_item_file), window->priv->menus.file.menu);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_open_file);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_open_folder);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_open_recently);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_separator_1);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_file_properties);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_separator_2);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_close);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_close_all);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.menu), window->priv->menus.file.menu_item_quit);
+    toolbar_separator1 = gtk_separator_tool_item_new ();
+    gtk_toolbar_insert (toolbar, toolbar_separator1, 0);
+    gtk_tool_item_set_expand (toolbar_separator1, TRUE);
+    gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolbar_separator1), FALSE);
 
-    gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close, FALSE);
-    gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close_all, FALSE);
-    gtk_widget_set_sensitive(window->priv->menus.file.menu_item_file_properties, FALSE);
+/** Navigation */
+    toolbar_item_open_image = gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
+    gtk_toolbar_insert (toolbar, toolbar_item_open_image, 0);
+    g_signal_connect (toolbar_item_open_image,
+                     "clicked",
+                      G_CALLBACK(cb_rstto_main_window_open_image), window);
 
-    window->priv->menus.file.recently.menu = gtk_recent_chooser_menu_new_for_manager(GTK_RECENT_MANAGER(window->priv->manager));
-    window->priv->menus.file.recently.menu_item_clear = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLEAR, accel_group);
-    window->priv->menus.file.recently.menu_item_separator_1 = gtk_separator_menu_item_new();
+    toolbar_separator2 = gtk_separator_tool_item_new ();
+    gtk_toolbar_insert (toolbar, toolbar_separator2, 1);
 
-    GtkRecentFilter *filter = gtk_recent_filter_new();
-    gtk_recent_filter_add_application(filter, "ristretto");
-    gtk_recent_chooser_add_filter(GTK_RECENT_CHOOSER(window->priv->menus.file.recently.menu), filter);
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.file.menu_item_open_recently), window->priv->menus.file.recently.menu);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.recently.menu), window->priv->menus.file.recently.menu_item_separator_1);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.file.recently.menu), window->priv->menus.file.recently.menu_item_clear);
+    toolbar_item_previous_image = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
+    gtk_tool_item_set_is_important (toolbar_item_previous_image, TRUE);
+    gtk_toolbar_insert (toolbar, toolbar_item_previous_image, 2);
+    g_signal_connect (toolbar_item_previous_image,
+                     "clicked",
+                      G_CALLBACK(cb_rstto_main_window_previous_image), window);
 
-/* Create 'Edit' menu */
-    window->priv->menus.menu_item_edit = gtk_menu_item_new_with_mnemonic(_("_Edit"));
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.menu), window->priv->menus.menu_item_edit);
+    toolbar_item_next_image = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
+    gtk_tool_item_set_is_important (toolbar_item_next_image, TRUE);
+    gtk_toolbar_insert (toolbar, toolbar_item_next_image, 3);
+    g_signal_connect (toolbar_item_next_image,
+                     "clicked",
+                      G_CALLBACK(cb_rstto_main_window_next_image), window);
 
-    window->priv->menus.edit.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.edit.menu), accel_group);
-    window->priv->menus.edit.menu_item_open_with = gtk_menu_item_new_with_mnemonic(_("Open with..."));
-    window->priv->menus.edit.menu_item_preferences = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL);
+}
 
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.menu_item_edit), window->priv->menus.edit.menu);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.edit.menu), window->priv->menus.edit.menu_item_open_with);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.edit.menu), window->priv->menus.edit.menu_item_preferences);
-    
-    window->priv->menus.edit.open_with.menu = gtk_menu_new();
-    window->priv->menus.edit.open_with.menu_item_empty = gtk_menu_item_new_with_label(_("No applications available"));
+static void
+rstto_main_window_build_menubar (RsttoMainWindow *window, GtkMenuBar *menubar)
+{
+    GtkWidget *file, *edit, *view, *go, *help;
 
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.edit.open_with.menu), window->priv->menus.edit.open_with.menu_item_empty);
-    gtk_widget_set_sensitive(window->priv->menus.edit.open_with.menu_item_empty, FALSE);
-    gtk_widget_ref(window->priv->menus.edit.open_with.menu_item_empty);
+    file = gtk_menu_item_new_with_mnemonic(_("_File"));
+    edit = gtk_menu_item_new_with_mnemonic(_("_Edit"));
+    view = gtk_menu_item_new_with_mnemonic(_("_View"));
+    go   = gtk_menu_item_new_with_mnemonic(_("_Go"));
+    help = gtk_menu_item_new_with_mnemonic(_("_Help"));
 
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.edit.menu_item_open_with), window->priv->menus.edit.open_with.menu);
-
-/* Create 'View' menu */
-    window->priv->menus.menu_item_view = gtk_menu_item_new_with_mnemonic(_("_View"));
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.menu), window->priv->menus.menu_item_view);
-
-    window->priv->menus.view.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.view.menu), accel_group);
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.menu_item_view), window->priv->menus.view.menu);
-
-    window->priv->menus.view.menu_item_show_toolbar = gtk_check_menu_item_new_with_mnemonic(_("Show _Toolbar"));
-    window->priv->menus.view.menu_item_show_thumbnail_viewer = gtk_menu_item_new_with_mnemonic(_("Thumbnail _Viewer"));
-
-    window->priv->menus.view.menu_item_separator_1 = gtk_separator_menu_item_new();
-
-    window->priv->menus.view.menu_item_zooming = gtk_menu_item_new_with_mnemonic(_("_Zooming"));
-    window->priv->menus.view.menu_item_rotate = gtk_menu_item_new_with_mnemonic(_("_Rotate"));
-
-    window->priv->menus.view.menu_item_separator_2 = gtk_separator_menu_item_new();
-
-    window->priv->menus.view.menu_item_fullscreen = gtk_image_menu_item_new_from_stock(GTK_STOCK_FULLSCREEN, NULL);
-
-    GtkWidget *wallpaper_image = gtk_image_new_from_icon_name("preferences-desktop-wallpaper", GTK_ICON_SIZE_MENU);
-    window->priv->menus.view.menu_item_set_wallpaper = gtk_image_menu_item_new_with_mnemonic(_("_Set as wallpaper"));
-    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(window->priv->menus.view.menu_item_set_wallpaper), wallpaper_image);
-
-#ifdef WITH_DESKTOP_WALLPAPER
-    /** Set xfce-desktop as default when support has been compiled in */
-    /* Check if xfdesktop is running */
-    {
-        gchar selection_name[100];
-
-        GdkScreen *gdk_screen = gdk_screen_get_default();
-        gint xscreen = gdk_screen_get_number(gdk_screen);
-
-        g_snprintf(selection_name, 100, XFDESKTOP_SELECTION_FMT, xscreen);
-
-        Atom xfce_selection_atom = XInternAtom (gdk_display, selection_name, False);
-        if((XGetSelectionOwner(GDK_DISPLAY(), xfce_selection_atom)))
-        {
-            if (rstto_has_xfconf_query)
-                window->priv->settings.desktop = RSTTO_DESKTOP_XFCE;
-        }
-        else
-        {
-            g_debug("xfdesktop is not running");
-        }
-    }
-#endif
-
-    gtk_widget_add_accelerator(window->priv->menus.view.menu_item_fullscreen, "activate", accel_group, GDK_F11, 0,GTK_ACCEL_VISIBLE);
-    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(window->priv->menus.view.menu_item_show_toolbar), TRUE);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_show_toolbar);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_show_thumbnail_viewer);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_separator_1);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_zooming);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_rotate);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_separator_2);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_fullscreen);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.menu), window->priv->menus.view.menu_item_set_wallpaper);
-
-/* Create 'View/Show thumbnail-bar' menu */
-    window->priv->menus.view.show_thumbnail_viewer.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.view.show_thumbnail_viewer.menu), accel_group);
-
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.view.menu_item_show_thumbnail_viewer),
-            window->priv->menus.view.show_thumbnail_viewer.menu);
-    window->priv->menus.view.show_thumbnail_viewer.
-            menu_item_thumbnail_viewer_horizontal = gtk_radio_menu_item_new_with_mnemonic(
-                    NULL, 
-                    _("Show _Horizontally"));
-    window->priv->menus.view.show_thumbnail_viewer.
-            menu_item_thumbnail_viewer_vertical = gtk_radio_menu_item_new_with_mnemonic_from_widget(
-                    GTK_RADIO_MENU_ITEM(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_horizontal),
-                    _("Show _Vertically"));
-    window->priv->menus.view.show_thumbnail_viewer.
-            menu_item_thumbnail_viewer_hide = gtk_radio_menu_item_new_with_mnemonic_from_widget(
-                    GTK_RADIO_MENU_ITEM(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_horizontal),
-                    _("H_ide"));
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.show_thumbnail_viewer.menu),
-            window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_horizontal);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.show_thumbnail_viewer.menu),
-            window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_vertical);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.show_thumbnail_viewer.menu),
-            window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_hide);
-
-/* Create 'view/zooming' menu */
-    window->priv->menus.view.zooming.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.view.zooming.menu), accel_group);
-
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.view.menu_item_zooming),
-            window->priv->menus.view.zooming.menu);
-
-    window->priv->menus.view.zooming.menu_item_zoom_in = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN, accel_group);
-    window->priv->menus.view.zooming.menu_item_zoom_out = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT, accel_group);
-    window->priv->menus.view.zooming.menu_item_zoom_100 = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_100, accel_group);
-    window->priv->menus.view.zooming.menu_item_zoom_fit = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT, accel_group);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.zooming.menu),
-            window->priv->menus.view.zooming.menu_item_zoom_in);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.zooming.menu),
-            window->priv->menus.view.zooming.menu_item_zoom_out);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.zooming.menu),
-            window->priv->menus.view.zooming.menu_item_zoom_100);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.zooming.menu),
-            window->priv->menus.view.zooming.menu_item_zoom_fit);
-
-/* Create 'view/rotate' menu */
-    window->priv->menus.view.rotate.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.view.rotate.menu), accel_group);
-
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.view.menu_item_rotate),
-            window->priv->menus.view.rotate.menu);
-
-    window->priv->menus.view.rotate.menu_item_rotate_cw = gtk_image_menu_item_new_with_mnemonic(_("Rotate _Right"));
-    window->priv->menus.view.rotate.menu_item_rotate_ccw = gtk_image_menu_item_new_with_mnemonic(_("Rotate _Left"));
-
-    gtk_widget_add_accelerator(window->priv->menus.view.rotate.menu_item_rotate_cw,
-                               "activate",
-                               accel_group,
-                               GDK_bracketright,
-                               GDK_CONTROL_MASK,
-                               GTK_ACCEL_VISIBLE);
-    gtk_widget_add_accelerator(window->priv->menus.view.rotate.menu_item_rotate_ccw,
-                               "activate",
-                               accel_group,
-                               GDK_bracketleft,
-                               GDK_CONTROL_MASK,
-                               GTK_ACCEL_VISIBLE);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.rotate.menu),
-            window->priv->menus.view.rotate.menu_item_rotate_cw);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.view.rotate.menu),
-            window->priv->menus.view.rotate.menu_item_rotate_ccw);
-
-/* Create 'Go' menu */
-    window->priv->menus.menu_item_go= gtk_menu_item_new_with_mnemonic(_("_Go"));
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.menu), window->priv->menus.menu_item_go);
-
-    window->priv->menus.go.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.go.menu), accel_group);
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.menu_item_go), window->priv->menus.go.menu);
-
-    window->priv->menus.go.menu_item_first = gtk_image_menu_item_new_from_stock(GTK_STOCK_GOTO_FIRST, NULL);
-    window->priv->menus.go.menu_item_last = gtk_image_menu_item_new_from_stock(GTK_STOCK_GOTO_LAST, NULL);
-    window->priv->menus.go.menu_item_next = gtk_image_menu_item_new_from_stock(GTK_STOCK_GO_FORWARD, NULL);
-    window->priv->menus.go.menu_item_previous = gtk_image_menu_item_new_from_stock(GTK_STOCK_GO_BACK, NULL);
-    window->priv->menus.go.menu_item_separator_1 = gtk_separator_menu_item_new();
-    window->priv->menus.go.menu_item_play = gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PLAY, accel_group);
-    window->priv->menus.go.menu_item_pause = gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PAUSE, accel_group);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_next);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_previous);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_first);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_last);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_separator_1);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_play);
-
-    gtk_widget_set_sensitive(window->priv->menus.go.menu_item_first, FALSE);
-    gtk_widget_set_sensitive(window->priv->menus.go.menu_item_last, FALSE);
-    gtk_widget_set_sensitive(window->priv->menus.go.menu_item_next, FALSE);
-    gtk_widget_set_sensitive(window->priv->menus.go.menu_item_previous, FALSE);
-    gtk_widget_set_sensitive(window->priv->menus.go.menu_item_play, FALSE);
-
-    gtk_widget_set_sensitive(window->priv->menus.view.menu_item_set_wallpaper, FALSE);
-
-/* Create 'Help' menu */
-    window->priv->menus.menu_item_help = gtk_menu_item_new_with_mnemonic(_("_Help"));
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.menu), window->priv->menus.menu_item_help);
-
-    window->priv->menus.help.menu = gtk_menu_new();
-    gtk_menu_set_accel_group(GTK_MENU(window->priv->menus.help.menu), accel_group);
-
-    window->priv->menus.help.menu_item_about = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, accel_group);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.help.menu), window->priv->menus.help.menu_item_about);
-
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus.menu_item_help), window->priv->menus.help.menu);
-
-/* Create toolbar */
-    window->priv->toolbar.bar = gtk_toolbar_new();
-    window->priv->toolbar.tool_item_open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
-    window->priv->toolbar.tool_item_separator_1 = gtk_separator_tool_item_new();
-    window->priv->toolbar.tool_item_next = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
-    window->priv->toolbar.tool_item_previous = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
-    window->priv->toolbar.tool_item_spacer_1= gtk_tool_item_new();
-
-    gtk_tool_item_set_is_important(window->priv->toolbar.tool_item_previous, TRUE);
-    gtk_tool_item_set_is_important(window->priv->toolbar.tool_item_next, TRUE);
-
-    gtk_tool_item_set_expand(window->priv->toolbar.tool_item_spacer_1, TRUE);
-    gtk_tool_item_set_homogeneous(window->priv->toolbar.tool_item_spacer_1, FALSE);
-
-    window->priv->toolbar.tool_item_zoom_fit = gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_FIT);
-    window->priv->toolbar.tool_item_zoom_100 = gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_100);
-    window->priv->toolbar.tool_item_zoom_in  = gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_IN);
-    window->priv->toolbar.tool_item_zoom_out = gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_OUT);
-
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_open, 0);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_separator_1, 1);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_previous, 2);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_next, 3);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_spacer_1, 4);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_zoom_in, 5);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_zoom_out, 6);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_zoom_fit, 7);
-    gtk_toolbar_insert(GTK_TOOLBAR(window->priv->toolbar.bar), window->priv->toolbar.tool_item_zoom_100, 8);
-
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_previous), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_next), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_in), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_out), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_100), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_fit), FALSE);
-
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_in), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_out), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_100), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_fit), FALSE);
-
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.rotate.menu_item_rotate_cw), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.rotate.menu_item_rotate_ccw), FALSE);
-
-/* Create statusbar */
-    window->priv->statusbar = gtk_statusbar_new();
-
-/* Create containers */
-    window->priv->containers.main_vbox = gtk_vbox_new(FALSE, 0);
-    window->priv->containers.s_window = gtk_scrolled_window_new(NULL, NULL);
-    window->priv->containers.paned = gtk_vbox_new(FALSE, 0);
-
-    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window->priv->containers.s_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
-    gtk_container_add(GTK_CONTAINER(window), window->priv->containers.main_vbox);
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.main_vbox), window->priv->menus.menu, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.main_vbox), window->priv->toolbar.bar, FALSE, FALSE, 0);
-
-    gtk_container_add(GTK_CONTAINER(window->priv->containers.s_window), window->priv->picture_viewer);
-
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.paned), window->priv->containers.s_window, TRUE, TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.paned), window->priv->thumbnail_viewer, FALSE, FALSE, 0);
-
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.main_vbox), window->priv->containers.paned, TRUE, TRUE, 0);
-
-    gtk_box_pack_end(GTK_BOX(window->priv->containers.main_vbox), window->priv->statusbar, FALSE, FALSE, 0);
-
-/* Create picture viewer menu */
-    window->priv->menus._picture_viewer.menu = gtk_menu_new();
-    window->priv->menus._picture_viewer.menu_item_open_file = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
-    window->priv->menus._picture_viewer.menu_item_close = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL);
-
-    window->priv->menus._picture_viewer.menu_item_separator_1 = gtk_separator_menu_item_new();
-
-    window->priv->menus._picture_viewer.menu_item_open_with = gtk_menu_item_new_with_mnemonic(_("Open with..."));
-
-    window->priv->menus._picture_viewer.menu_item_separator_2 = gtk_separator_menu_item_new();
-
-
-    window->priv->menus._picture_viewer.menu_item_zoom_in = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN, NULL);
-    window->priv->menus._picture_viewer.menu_item_zoom_out = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT, NULL);
-    window->priv->menus._picture_viewer.menu_item_zoom_fit = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT, NULL);
-    window->priv->menus._picture_viewer.menu_item_zoom_100 = gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_100, NULL);
-
-    window->priv->menus._picture_viewer.open_with.menu = gtk_menu_new();
-    window->priv->menus._picture_viewer.open_with.menu_item_empty = gtk_menu_item_new_with_label(_("No applications available"));
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.open_with.menu),
-                                         window->priv->menus._picture_viewer.open_with.menu_item_empty);
-    gtk_widget_set_sensitive(window->priv->menus._picture_viewer.open_with.menu_item_empty, FALSE);
-    gtk_widget_ref(window->priv->menus._picture_viewer.open_with.menu_item_empty);
-
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->priv->menus._picture_viewer.menu_item_open_with),
-                              window->priv->menus._picture_viewer.open_with.menu);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_open_file);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_close);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_separator_1);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_open_with);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_separator_2);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_zoom_in);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_zoom_out);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_zoom_fit);
-    gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.menu), window->priv->menus._picture_viewer.menu_item_zoom_100);
-
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_close), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_in), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_out), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_100), FALSE);
-    gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_fit), FALSE);
-
-    rstto_picture_viewer_set_menu(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer),
-                                  GTK_MENU(window->priv->menus._picture_viewer.menu));
-/* D-Bus stuff */
-
-    window->priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
-    if (window->priv->connection)
-    {
-        window->priv->filemanager_proxy = dbus_g_proxy_new_for_name(window->priv->connection,
-                                                                "org.xfce.FileManager",
-                                                                "/org/xfce/FileManager",
-                                                                "org.xfce.FileManager");
-    }
-
-/* Connect signals */
-    
-    /* Thumbnail-viewer */
-    g_signal_connect(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_horizontal,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_thumbnail_viewer_horizontal), window);
-    g_signal_connect(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_vertical,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_thumbnail_viewer_vertical), window);
-    g_signal_connect(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_hide,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_thumbnail_viewer_hide), window);
-
-    /* Toolbar show/hide */
-    g_signal_connect(window->priv->menus.view.menu_item_show_toolbar, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_toggle_toolbar), window);
-
-    /* Fullscreen */
-    g_signal_connect(window->priv->menus.view.menu_item_fullscreen, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_toggle_fullscreen), window);
-
-    /* Set Wallpaper */
-#ifdef WITH_DESKTOP_WALLPAPER
-    g_signal_connect(window->priv->menus.view.menu_item_set_wallpaper, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_set_wallpaper), window);
-#endif
-
-    /* Play / Pause */
-    g_signal_connect(window->priv->menus.go.menu_item_play, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_play), window);
-    g_signal_connect(window->priv->menus.go.menu_item_pause, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_pause), window);
-
-    /* Window events */
-    g_signal_connect(G_OBJECT(window),
-            "window-state-event",
-            G_CALLBACK(cb_rstto_main_window_state_event), NULL);
-    g_signal_connect(G_OBJECT(window),
-            "key-press-event",
-            G_CALLBACK(cb_rstto_main_window_key_press_event), NULL);
-
-    /* Generic menu signals */
-    g_signal_connect(window->priv->menus.file.menu_item_open_file, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_open_file), window);
-    g_signal_connect(window->priv->menus.file.menu_item_open_folder, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_open_folder), window);
-    g_signal_connect(window->priv->menus.file.menu_item_close, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_close), window);
-    g_signal_connect(window->priv->menus.file.menu_item_close_all, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_close_all), window);
-    g_signal_connect(G_OBJECT(window->priv->menus.file.recently.menu),
-            "item-activated",
-            G_CALLBACK(cb_rstto_main_window_open_recent), window);
-    g_signal_connect(window->priv->menus.file.menu_item_file_properties, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_file_properties), window);
-    g_signal_connect(window->priv->menus.file.menu_item_quit, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_quit), window);
-    g_signal_connect(window->priv->menus.file.recently.menu_item_clear, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_clear_recent), window);
-    g_signal_connect(window->priv->menus.help.menu_item_about, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_about), window);
-
-    g_signal_connect(window->priv->menus.edit.menu_item_preferences, 
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_preferences), window);
-
-/* zoom menu items */
-    g_signal_connect(window->priv->menus.view.zooming.menu_item_zoom_in,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_in), window);
-    g_signal_connect(window->priv->menus.view.zooming.menu_item_zoom_out,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_out), window);
-    g_signal_connect(window->priv->menus.view.zooming.menu_item_zoom_100,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_100), window);
-    g_signal_connect(window->priv->menus.view.zooming.menu_item_zoom_fit,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_fit), window);
-/* rotate menu items */
-    g_signal_connect(window->priv->menus.view.rotate.menu_item_rotate_cw,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_rotate_cw), window);
-    g_signal_connect(window->priv->menus.view.rotate.menu_item_rotate_ccw,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_rotate_ccw), window);
-
-/* go menu items */
-    g_signal_connect(window->priv->menus.go.menu_item_next,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_next), window);
-    g_signal_connect(window->priv->menus.go.menu_item_previous,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_previous), window);
-    g_signal_connect(window->priv->menus.go.menu_item_first,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_first), window);
-    g_signal_connect(window->priv->menus.go.menu_item_last,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_last), window);
-
-    /* Toolbar signals */
-    g_signal_connect(window->priv->toolbar.tool_item_open,
-            "clicked",
-            G_CALLBACK(cb_rstto_main_window_open_folder), window);
-    g_signal_connect(window->priv->toolbar.tool_item_next,
-            "clicked",
-            G_CALLBACK(cb_rstto_main_window_next), window);
-    g_signal_connect(window->priv->toolbar.tool_item_previous,
-            "clicked",
-            G_CALLBACK(cb_rstto_main_window_previous), window);
-
-    g_signal_connect(window->priv->toolbar.tool_item_zoom_in,
-            "clicked",
-            G_CALLBACK(cb_rstto_main_window_zoom_in), window);
-    g_signal_connect(window->priv->toolbar.tool_item_zoom_out,
-            "clicked",
-            G_CALLBACK(cb_rstto_main_window_zoom_out), window);
-    g_signal_connect(window->priv->toolbar.tool_item_zoom_100,
-            "clicked",
-            G_CALLBACK(cb_rstto_main_window_zoom_100), window);
-    g_signal_connect(window->priv->toolbar.tool_item_zoom_fit,
-            "clicked",
-            G_CALLBACK(cb_rstto_main_window_zoom_fit), window);
-
-    /* Picture viewer menu */
-    g_signal_connect(window->priv->menus._picture_viewer.menu_item_open_file,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_open_file), window);
-    g_signal_connect(window->priv->menus._picture_viewer.menu_item_close,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_close), window);
-            
-    g_signal_connect(window->priv->menus._picture_viewer.menu_item_zoom_in,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_in), window);
-    g_signal_connect(window->priv->menus._picture_viewer.menu_item_zoom_out,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_out), window);
-    g_signal_connect(window->priv->menus._picture_viewer.menu_item_zoom_100,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_100), window);
-    g_signal_connect(window->priv->menus._picture_viewer.menu_item_zoom_fit,
-            "activate",
-            G_CALLBACK(cb_rstto_main_window_zoom_fit), window);
-    /* Misc */
-    g_signal_connect(G_OBJECT(window->priv->navigator),
-            "iter-changed",
-            G_CALLBACK(cb_rstto_main_window_nav_iter_changed), window);
-    g_signal_connect(G_OBJECT(window->priv->navigator),
-            "new-entry",
-            G_CALLBACK(cb_rstto_main_window_nav_new_entry), window);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), edit);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), view);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), go);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help);
 }
 
 static void
 rstto_main_window_class_init(RsttoMainWindowClass *window_class)
 {
+    GParamSpec *pspec;
+
     GObjectClass *object_class = (GObjectClass*)window_class;
     parent_class = g_type_class_peek_parent(window_class);
 
     object_class->dispose = rstto_main_window_dispose;
+
+    object_class->set_property = rstto_main_window_set_property;
+    object_class->get_property = rstto_main_window_get_property;
+
+    pspec = g_param_spec_object ("navigator",
+                                 "",
+                                 "",
+                                 RSTTO_TYPE_NAVIGATOR,
+                                 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
+
+    g_object_class_install_property (object_class,
+                                     PROP_NAVIGATOR,
+                                     pspec);
 }
 
 static void
 rstto_main_window_dispose(GObject *object)
 {
     RsttoMainWindow *window = RSTTO_MAIN_WINDOW(object);
-    RsttoNavigator  *navigator = window->priv->navigator;
-    if (navigator)
-    {
-#if 0
-        GList *iter, *modified_files = NULL;
-        
-        for (iter = navigator->file_list; iter != NULL; iter = iter->next)
-        {
-            if (rstto_navigator_entry_get_orientation_changed ((RsttoNavigatorEntry *)iter->data))
-            {
-                modified_files = g_list_append (modified_files, iter->data);
-            }
-        }
-
-        if (modified_files)
-        {
-            GtkWidget *dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, _("The orientation of one or more images has been modified, do you want to save the changes?")); 
-            if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
-            {
-                gtk_widget_hide(dialog);
-                GtkWidget *save_dialog = rstto_save_dialog_new (GTK_WINDOW(window), modified_files);
-                if (gtk_dialog_run (GTK_DIALOG(save_dialog)) == GTK_RESPONSE_OK)
-                {
-                    
-                }
-            }
-        }
-#endif
-        g_object_unref(window->priv->navigator);
-        window->priv->navigator = NULL;
-    }
     G_OBJECT_CLASS (parent_class)->dispose(object); 
 }
 
-static gboolean
-rstto_main_window_clear_recent(RsttoMainWindow *window)
-{
-    GList *items = gtk_recent_manager_get_items(window->priv->manager);
-    GList *iter = items;
-    while(iter)
-    {
-        if(gtk_recent_info_has_application(iter->data, "ristretto"))
-        {
-            gtk_recent_manager_remove_item(window->priv->manager, gtk_recent_info_get_uri(iter->data), NULL);
-        }
-        iter = g_list_next(iter);
-    }
-    return FALSE;
-}
-
-
 GtkWidget *
-rstto_main_window_new()
+rstto_main_window_new (RsttoNavigator *navigator)
 {
     GtkWidget *widget;
 
-    widget = g_object_new(RSTTO_TYPE_MAIN_WINDOW, NULL);
+    widget = g_object_new (RSTTO_TYPE_MAIN_WINDOW, "navigator", navigator, NULL);
 
     return widget;
 }
 
-void
-rstto_main_window_set_thumbnail_viewer_orientation(RsttoMainWindow *window, GtkOrientation orientation)
-{
-    window->priv->settings.thumbnail_viewer_orientation = orientation;
-
-    gtk_widget_ref(window->priv->thumbnail_viewer);
-    gtk_widget_ref(window->priv->containers.s_window);
-    gtk_container_remove(GTK_CONTAINER(window->priv->containers.paned), window->priv->thumbnail_viewer);
-    gtk_container_remove(GTK_CONTAINER(window->priv->containers.paned), window->priv->containers.s_window);
-    gtk_widget_destroy(window->priv->containers.paned);
-
-    rstto_thumbnail_bar_set_orientation(RSTTO_THUMBNAIL_BAR(window->priv->thumbnail_viewer), orientation);
-
-    switch (orientation)
-    {
-        case GTK_ORIENTATION_HORIZONTAL:
-            window->priv->containers.paned = gtk_vbox_new(FALSE, 0);
-            break;
-        case GTK_ORIENTATION_VERTICAL:
-            window->priv->containers.paned = gtk_hbox_new(FALSE, 0);
-            break;
-    }
-    
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.paned), window->priv->containers.s_window, TRUE, TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.paned), window->priv->thumbnail_viewer, FALSE, FALSE, 0);
-
-    gtk_box_pack_start(GTK_BOX(window->priv->containers.main_vbox), window->priv->containers.paned, TRUE, TRUE, 0);
-    gtk_box_reorder_child(GTK_BOX(window->priv->containers.main_vbox), window->priv->containers.paned, -2);
-    gtk_widget_show(window->priv->containers.paned);
-
-}
-
-void
-rstto_main_window_set_show_thumbnail_viewer(RsttoMainWindow *window, gboolean visibility)
-{
-    window->priv->settings.thumbnail_viewer_visibility = visibility;
-    if (visibility == TRUE)
-    {
-        switch(rstto_thumbnail_bar_get_orientation(RSTTO_THUMBNAIL_BAR(window->priv->thumbnail_viewer)))
-        {
-            case GTK_ORIENTATION_HORIZONTAL:
-                gtk_check_menu_item_set_active(
-                    GTK_CHECK_MENU_ITEM(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_horizontal),
-                    TRUE);
-                break;
-            case GTK_ORIENTATION_VERTICAL:
-                gtk_check_menu_item_set_active(
-                    GTK_CHECK_MENU_ITEM(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_vertical),
-                    TRUE);
-                break;
-        }
-        
-    }
-    else
-    {
-        gtk_check_menu_item_set_active(
-            GTK_CHECK_MENU_ITEM(window->priv->menus.view.show_thumbnail_viewer.menu_item_thumbnail_viewer_hide),
-            TRUE);
-    }
-}
-
-void
-rstto_main_window_set_show_toolbar (RsttoMainWindow *window, gboolean visibility)
-{
-    window->priv->settings.toolbar_visibility = visibility;
-    gtk_check_menu_item_set_active(
-            GTK_CHECK_MENU_ITEM(window->priv->menus.view.menu_item_show_toolbar),
-            visibility);
-}
-
-gboolean
-rstto_main_window_get_show_toolbar (RsttoMainWindow *window)
-{
-    return window->priv->settings.toolbar_visibility;
-}
-
-gboolean
-rstto_main_window_get_show_thumbnail_viewer (RsttoMainWindow *window)
-{
-    return window->priv->settings.thumbnail_viewer_visibility;
-}
-
-GtkOrientation
-rstto_main_window_get_thumbnail_viewer_orientation (RsttoMainWindow *window)
-{
-    return window->priv->settings.thumbnail_viewer_orientation;
-}
-
-RsttoNavigator *
-rstto_main_window_get_navigator (RsttoMainWindow *window)
-{
-    return window->priv->navigator;
-}
-
-GtkRecentManager *
-rstto_main_window_get_recent_manager (RsttoMainWindow *window)
-{
-    return window->priv->manager;
-}
-
-gdouble
-rstto_main_window_get_slideshow_timeout (RsttoMainWindow *window)
-{
-    return window->priv->settings.slideshow_timeout;
-}
-
-gboolean
-rstto_main_window_get_hide_thumbnail (RsttoMainWindow *window)
-{
-    return window->priv->settings.slideshow_hide_thumbnail;
-}
-
-gint
-rstto_main_window_get_max_cache_size (RsttoMainWindow *window)
-{
-    return window->priv->settings.max_cache_size;
-}
-
-void
-rstto_main_window_set_slideshow_timeout (RsttoMainWindow *window, gdouble timeout)
-{
-    window->priv->settings.slideshow_timeout = timeout;
-    rstto_navigator_set_timeout(window->priv->navigator, timeout);
-}
-
-void
-rstto_main_window_set_hide_thumbnail (RsttoMainWindow *window, gboolean hide)
-{
-    window->priv->settings.slideshow_hide_thumbnail = hide;
-}
-
-void
-rstto_main_window_set_start_fullscreen (RsttoMainWindow *window, gboolean fullscreen)
-{
-    window->priv->settings.start_fullscreen = fullscreen;
-}
-
-void
-rstto_main_window_set_start_slideshow (RsttoMainWindow *window, gboolean slideshow)
-{
-    window->priv->settings.start_slideshow = slideshow;
-}
-
-void
-rstto_main_window_force_fullscreen (RsttoMainWindow *window)
-{
-    if(gdk_window_get_state(GTK_WIDGET(window)->window) | GDK_WINDOW_STATE_FULLSCREEN)
-        gtk_window_fullscreen(GTK_WINDOW(window));
-}
-
-void
-rstto_main_window_force_slideshow (RsttoMainWindow *window)
-{
-    gtk_widget_activate(window->priv->menus.go.menu_item_play);
-}
-
-void
-rstto_main_window_set_max_cache_size (RsttoMainWindow *window, gint max_cache_size)
-{
-    window->priv->settings.max_cache_size = max_cache_size;
-    rstto_navigator_set_max_history_size(window->priv->navigator, (guint64)max_cache_size * 1000000);
-}
-
-void
-rstto_main_window_set_scale_to_100 (RsttoMainWindow *window, gboolean scale_to_100)
-{
-    window->priv->settings.scale_to_100 = scale_to_100;
-}
-
-gboolean
-rstto_main_window_get_scale_to_100 (RsttoMainWindow *window)
-{
-    return window->priv->settings.scale_to_100;
-}
-
-/* CALLBACK FUNCTIONS */
-
+/**
+ * cb_rstto_main_window_navigator_new_image:
+ * @navigator:
+ * @image:
+ * @window:
+ *
+ */
 static void
-cb_rstto_main_window_thumbnail_viewer_horizontal(GtkWidget *widget, RsttoMainWindow *window)
+cb_rstto_main_window_navigator_new_image (RsttoNavigator *navigator, RsttoImage *image, RsttoMainWindow *window)
 {
-    window->priv->settings.thumbnail_viewer_visibility = TRUE;
-    gtk_widget_show(window->priv->thumbnail_viewer);
-    rstto_main_window_set_thumbnail_viewer_orientation(window, GTK_ORIENTATION_HORIZONTAL);
+    rstto_image_load (image, FALSE, 0);
+    rstto_picture_viewer_set_image (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), image);
+    window->priv->iter = rstto_navigator_get_iter (window->priv->props.navigator);
 }
 
+/**
+ * rstto_main_window_set_property:
+ * @object:
+ * @property_id:
+ * @value:
+ * @pspec:
+ *
+ */
 static void
-cb_rstto_main_window_thumbnail_viewer_vertical(GtkWidget *widget, RsttoMainWindow *window)
+rstto_main_window_set_property (GObject      *object,
+                                guint         property_id,
+                                const GValue *value,
+                                GParamSpec   *pspec)
 {
-    window->priv->settings.thumbnail_viewer_visibility = TRUE;
-    gtk_widget_show(window->priv->thumbnail_viewer);
-    rstto_main_window_set_thumbnail_viewer_orientation(window, GTK_ORIENTATION_VERTICAL);
-}
+    RsttoMainWindow *window = RSTTO_MAIN_WINDOW (object);
 
-static void
-cb_rstto_main_window_thumbnail_viewer_hide(GtkWidget *widget, RsttoMainWindow *window)
-{
-    window->priv->settings.thumbnail_viewer_visibility = FALSE;
-    gtk_widget_hide(window->priv->thumbnail_viewer);
-}
-
-static void
-cb_rstto_main_window_toggle_fullscreen(GtkWidget *widget, RsttoMainWindow *window)
-{
-    if(gdk_window_get_state(GTK_WIDGET(window)->window) & GDK_WINDOW_STATE_FULLSCREEN)
+    switch (property_id)
     {
-        gtk_window_unfullscreen(GTK_WINDOW(window));
-    }
-    else
-    {
-        gtk_window_fullscreen(GTK_WINDOW(window));
-    }
-}
-
-static void
-cb_rstto_main_window_toggle_toolbar(GtkWidget *widget, RsttoMainWindow *window)
-{
-    gboolean active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(widget));
-
-    window->priv->settings.toolbar_visibility = active;
-
-    if (active == TRUE)
-    {
-        gtk_widget_show(window->priv->toolbar.bar);
-    }
-    else
-    {
-        gtk_widget_hide(window->priv->toolbar.bar);
-    }
-}
-
-#ifdef WITH_DESKTOP_WALLPAPER
-static void
-cb_rstto_main_window_set_wallpaper(GtkWidget *widget, RsttoMainWindow *window)
-{
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(window->priv->navigator);
-    ThunarVfsInfo *info = rstto_navigator_entry_get_info(entry);
-    gchar *path = thunar_vfs_path_dup_string(info->path);
-
-    GdkScreen *gdk_screen = gdk_screen_get_default();
-    gint screen = gdk_screen_get_number(gdk_screen);
-    gint monitor = gdk_screen_get_monitor_at_window(gdk_screen, GTK_WIDGET(window)->window);
-
-    gchar *image_path_prop = NULL;
-    gchar *image_show_prop = NULL;
-    gchar *image_style_prop = NULL;
-    gchar *command = NULL;
-
-    switch (window->priv->settings.desktop)
-    {
-        case RSTTO_DESKTOP_XFCE:
+        case PROP_NAVIGATOR:
+            if (window->priv->props.navigator)
             {
+                g_signal_handlers_disconnect_by_func (window->priv->props.navigator, cb_rstto_main_window_navigator_new_image, window);
+                g_object_unref (window->priv->props.navigator);
+            }
 
-                /*
-                 * Retrieve the screen and monitor number where the main ristretto window is running,
-                 * set the wallpaper there.
-                 */
-                image_path_prop = g_strdup_printf("/backdrop/screen%d/monitor%d/image-path", screen, monitor);
-                image_show_prop = g_strdup_printf("/backdrop/screen%d/monitor%d/image-show", screen, monitor);
-                image_style_prop = g_strdup_printf("/backdrop/screen%d/monitor%d/image-style", screen, monitor);
+            window->priv->props.navigator = g_value_get_object (value);
 
-                command = g_strdup_printf ("xfconf-query -c xfce4-desktop -p %s --create -t string -s %s", image_path_prop, path);
-                g_spawn_command_line_async (command, NULL);
-                g_free (command);
-
-                command = g_strdup_printf ("xfconf-query -c xfce4-desktop -p %s --create -t bool -s true", image_show_prop);
-                g_spawn_command_line_async (command, NULL);
-                g_free (command);
-
-                command = g_strdup_printf ("xfconf-query -c xfce4-desktop -p %s --create -t int -s 4", image_style_prop);
-                g_spawn_command_line_async (command, NULL);
-                g_free (command);
-
+            if (window->priv->props.navigator)
+            {
+                g_object_ref (window->priv->props.navigator);
+                g_signal_connect (G_OBJECT (window->priv->props.navigator), "new-image", G_CALLBACK (cb_rstto_main_window_navigator_new_image), window);
+                window->priv->iter = rstto_navigator_get_iter (window->priv->props.navigator);
             }
             break;
         default:
-            g_debug("not supported");
             break;
     }
-    if (image_path_prop)
-        g_free(image_path_prop);
-    if (image_show_prop)
-        g_free(image_show_prop);
-    if (image_style_prop)
-        g_free(image_style_prop);
-    if (path)
-        g_free(path);
 }
-#endif
 
-static gboolean
-cb_rstto_main_window_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
-{
-    GtkWindow *window = GTK_WINDOW(widget);
-    RsttoMainWindow *rstto_window = RSTTO_MAIN_WINDOW(widget);
-    if(gtk_window_activate_key(window, event) == FALSE)
-    {
-        switch(event->keyval)
-        {
-            case GDK_F5:
-                if (rstto_navigator_is_running(RSTTO_NAVIGATOR(rstto_window->priv->navigator)))
-                {
-                    cb_rstto_main_window_pause(rstto_window->priv->menus.go.menu_item_pause, rstto_window);
-                }
-                else
-                {
-                    cb_rstto_main_window_play(rstto_window->priv->menus.go.menu_item_play, rstto_window);
-                }
-                break;
-            case GDK_F11:
-                if(gdk_window_get_state(widget->window) & GDK_WINDOW_STATE_FULLSCREEN)
-                {
-                    gtk_window_unfullscreen(window);
-                }
-                else
-                {
-                    gtk_window_fullscreen(window);
-                }
-                break;
-            case GDK_Escape:
-                if(gdk_window_get_state(widget->window) & GDK_WINDOW_STATE_FULLSCREEN)
-                {
-                    gtk_window_unfullscreen(window);
-                }
-                break;
-            case GDK_Home:
-                rstto_navigator_jump_first(rstto_window->priv->navigator);
-                break;
-            case GDK_End:
-                rstto_navigator_jump_last(rstto_window->priv->navigator);
-                break;
-            case GDK_Page_Down:
-            case GDK_space:
-                rstto_navigator_jump_forward(rstto_window->priv->navigator);
-                break;
-            case GDK_Page_Up:
-            case GDK_BackSpace:
-                rstto_navigator_jump_back(rstto_window->priv->navigator);
-                break;
-            case GDK_t:
-                rstto_main_window_set_show_thumbnail_viewer(RSTTO_MAIN_WINDOW(window),
-                        !(RSTTO_MAIN_WINDOW(window)->priv->settings.thumbnail_viewer_visibility));
-                break;
-            case GDK_bracketleft:
-                cb_rstto_main_window_rotate_ccw(NULL, RSTTO_MAIN_WINDOW(window));
-                break;
-            case GDK_bracketright:
-                cb_rstto_main_window_rotate_cw(NULL, RSTTO_MAIN_WINDOW(window));
-                break;
-        }
-    }
-    return TRUE;
-}
-
+/**
+ * rstto_main_window_get_property:
+ * @object:
+ * @property_id:
+ * @value:
+ * @pspec:
+ *
+ */
 static void
-cb_rstto_main_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
+rstto_main_window_get_property (GObject    *object,
+                                guint       property_id,
+                                GValue     *value,
+                                GParamSpec *pspec)
 {
-    RsttoMainWindow *window = RSTTO_MAIN_WINDOW(widget);
-    if(event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)
-    {
-        if(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)
-        {
-            gtk_widget_hide(window->priv->menus.menu);
-            gtk_widget_hide(window->priv->toolbar.bar);
-            gtk_widget_hide(window->priv->statusbar);
-            GdkColor *color = g_new0(GdkColor, 1);
+    RsttoMainWindow *window = RSTTO_MAIN_WINDOW (object);
 
-            rstto_picture_viewer_set_bg_color(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), color);
-
-            g_free(color);
-        }
-        else
-        {
-            gtk_widget_show(window->priv->menus.menu);
-            gtk_widget_show(window->priv->statusbar);
-            rstto_picture_viewer_set_bg_color(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), window->priv->settings.bg_color);
-
-            if (window->priv->settings.toolbar_visibility == TRUE)
-            {
-                gtk_widget_show(window->priv->toolbar.bar);
-            }
-        }
-    }
-    if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED)
+    switch (property_id)
     {
-        RsttoNavigatorEntry *entry = rstto_navigator_get_file(window->priv->navigator);
-
-        if (window->priv->settings.scale_to_100 == TRUE)
-        {
-            rstto_picture_viewer_set_zoom_mode(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), RSTTO_ZOOM_MODE_CUSTOM);
-            rstto_navigator_entry_set_scale(entry, 0);
-        }
-
-    }
-}
-
-static void
-cb_rstto_main_window_play(GtkWidget *widget, RsttoMainWindow *window)
-{
-    gtk_widget_ref(widget);
-    gtk_container_remove(GTK_CONTAINER(window->priv->menus.go.menu), widget);
-    gtk_menu_shell_insert(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_pause, 5);
-    gtk_widget_show_all(window->priv->menus.go.menu_item_pause);
-    rstto_navigator_set_running(RSTTO_NAVIGATOR(window->priv->navigator), TRUE);
-    if (window->priv->settings.thumbnail_viewer_visibility &&
-        window->priv->settings.slideshow_hide_thumbnail)
-            gtk_widget_hide (window->priv->thumbnail_viewer);
-}
-
-static void
-cb_rstto_main_window_pause(GtkWidget *widget, RsttoMainWindow *window)
-{
-    gtk_widget_ref(widget);
-    gtk_container_remove(GTK_CONTAINER(window->priv->menus.go.menu), widget);
-    gtk_menu_shell_insert(GTK_MENU_SHELL(window->priv->menus.go.menu), window->priv->menus.go.menu_item_play, 5);
-    gtk_widget_show_all(window->priv->menus.go.menu_item_play);
-    rstto_navigator_set_running(RSTTO_NAVIGATOR(window->priv->navigator), FALSE);
-    if (window->priv->settings.thumbnail_viewer_visibility)
-        gtk_widget_show (window->priv->thumbnail_viewer);
-}
-
-static void
-cb_rstto_main_window_preferences(GtkWidget *widget, RsttoMainWindow *window)
-{
-    GdkColor  *color = NULL;
-    if (rstto_picture_viewer_get_bg_color(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer)))
-    {
-        color = gdk_color_copy(rstto_main_window_get_pv_bg_color(window));
-    }
-    GtkWidget *slideshow_main_vbox;
-    GtkWidget *slideshow_main_lbl;
-    GtkWidget *display_main_vbox;
-    GtkWidget *display_main_lbl;
-    GtkWidget *behaviour_main_vbox;
-    GtkWidget *behaviour_main_lbl;
-
-    GtkWidget *resize_to_content_vbox, *resize_to_content_frame;
-    GtkWidget *resize_on_maximize_check;
-
-    GtkWidget *bg_color_vbox;
-    GtkWidget *bg_color_hbox;
-    GtkWidget *bg_color_frame;
-    GtkWidget *bg_color_button;
-    GtkWidget *bg_color_override_check;
-    GtkWidget *cache_vbox;
-    GtkWidget *cache_frame;
-    GtkWidget *cache_hbox;
-    GtkObject *cache_adjustment;
-    GtkWidget *cache_spin_button;
-    GtkWidget *cache_label;
-    GtkWidget *cache_mb_label;
-
-    cache_adjustment = gtk_adjustment_new(rstto_main_window_get_max_cache_size(window), 0, 9999, 1, 100, 100);
-
-    GtkWidget *dialog = xfce_titled_dialog_new_with_buttons(_("Image viewer Preferences"),
-                                                    GTK_WINDOW(window),
-                                                    GTK_DIALOG_NO_SEPARATOR,
-                                                    GTK_STOCK_CANCEL,
-                                                    GTK_RESPONSE_CANCEL,
-                                                    GTK_STOCK_OK,
-                                                    GTK_RESPONSE_OK,
-                                                    NULL);
-    gtk_window_set_icon_name(GTK_WINDOW(dialog), "ristretto");
-    gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-
-    GtkWidget *notebook = gtk_notebook_new();
-    gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
-
-    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook,  TRUE, TRUE, 0);
-
-/** Add notebook pages */
-    display_main_vbox = gtk_vbox_new(FALSE, 0);
-    display_main_lbl = gtk_label_new(_("Display"));
-    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), display_main_vbox, display_main_lbl);
-
-    slideshow_main_vbox = gtk_vbox_new(FALSE, 0);
-    slideshow_main_lbl = gtk_label_new(_("Slideshow"));
-    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), slideshow_main_vbox, slideshow_main_lbl);
-
-    behaviour_main_vbox = gtk_vbox_new(FALSE, 0);
-    behaviour_main_lbl = gtk_label_new(_("Behaviour"));
-    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), behaviour_main_vbox, behaviour_main_lbl);
-
-/** Add content for behaviour page */
-    resize_to_content_vbox = gtk_vbox_new(FALSE, 0);
-    resize_to_content_frame = xfce_create_framebox_with_content(_("Scaling"), resize_to_content_vbox);
-
-    resize_on_maximize_check = gtk_check_button_new_with_mnemonic(_("Don't scale over 100% when maximizing the window."));
-    gtk_box_pack_start(GTK_BOX(resize_to_content_vbox), resize_on_maximize_check, FALSE, TRUE, 0);
-
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(resize_on_maximize_check), window->priv->settings.scale_to_100);
-
-    gtk_container_set_border_width (GTK_CONTAINER (resize_to_content_frame), 8);
-    gtk_box_pack_start(GTK_BOX(behaviour_main_vbox), resize_to_content_frame, FALSE, TRUE, 0);
-
-/** Add content for display page */
-    bg_color_vbox = gtk_vbox_new(FALSE, 0);
-    bg_color_frame = xfce_create_framebox_with_content (_("Background Color"), bg_color_vbox);
-
-    bg_color_override_check = gtk_check_button_new_with_mnemonic(_("_Override Background Color:"));
-    bg_color_hbox = gtk_hbox_new(FALSE, 4);
-    bg_color_button = gtk_color_button_new();
-
-    gtk_box_pack_start(GTK_BOX(bg_color_hbox), bg_color_override_check, FALSE, TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(bg_color_hbox), bg_color_button, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(bg_color_vbox), bg_color_hbox, FALSE, FALSE, 0);
-
-    g_signal_connect(G_OBJECT(bg_color_override_check), "toggled", (GCallback)cb_rstto_bg_color_override_check_toggled, bg_color_button);
-
-    if (color)
-    {
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bg_color_override_check), TRUE);
-        gtk_color_button_set_color(GTK_COLOR_BUTTON(bg_color_button), color);
-        gdk_color_free(color);
-        color = NULL;
-    }
-    else
-    {
-        gtk_widget_set_sensitive(bg_color_button, FALSE);
-    }
-
-    cache_vbox = gtk_vbox_new(FALSE, 0);
-    cache_frame = xfce_create_framebox_with_content (_("Image Cache"), cache_vbox);
-    cache_hbox = gtk_hbox_new(FALSE, 4);
-    cache_spin_button = gtk_spin_button_new(GTK_ADJUSTMENT(cache_adjustment), 1.0, 0);
-    cache_label = gtk_label_new(_("Cache size:"));
-    cache_mb_label = gtk_label_new(_("MB"));
-
-    GtkWidget *preload_check = gtk_check_button_new_with_mnemonic(_("_Preload images (GUI more responsive but more CPU-intensive)"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(preload_check), window->priv->navigator->preload);
-
-    gtk_box_pack_start(GTK_BOX(cache_hbox), cache_label, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(cache_hbox), cache_spin_button, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(cache_hbox), cache_mb_label, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(cache_vbox), cache_hbox, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(cache_vbox), preload_check, FALSE, FALSE, 0);
-
-    gtk_container_set_border_width (GTK_CONTAINER (bg_color_frame), 8);
-    gtk_container_set_border_width (GTK_CONTAINER (cache_frame), 8);
-
-    gtk_box_pack_start(GTK_BOX(display_main_vbox), bg_color_frame, FALSE, TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(display_main_vbox), cache_frame, FALSE, TRUE, 0);
-
-
-/** Add content for slideshow page */
-    GtkWidget *slideshow_vbox = gtk_vbox_new(FALSE, 0);
-    GtkWidget *slideshow_frame = xfce_create_framebox_with_content (_("Timeout"), slideshow_vbox);
-
-    GtkWidget *thumbnails_vbox = gtk_vbox_new(FALSE, 0);
-    GtkWidget *thumbnails_frame = xfce_create_framebox_with_content (_("Thumbnails"), thumbnails_vbox);
-
-    gtk_container_set_border_width (GTK_CONTAINER (slideshow_frame), 8);
-    gtk_container_set_border_width (GTK_CONTAINER (thumbnails_frame), 8);
-
-    GtkWidget *slideshow_lbl = gtk_label_new(_("The time period an individual image is displayed during a slideshow\n(in seconds)"));
-    GtkWidget *slideshow_hscale = gtk_hscale_new_with_range(1, 60, 1);
-
-    GtkWidget *thumbnails_lbl = gtk_label_new(_("Hide the thumbnails bar during slideshow"));
-    GtkWidget *thumbnails_check = gtk_check_button_new_with_mnemonic(_("_Hide thumbnails"));
-
-    gtk_misc_set_alignment(GTK_MISC(slideshow_lbl), 0, 0.5);
-    gtk_misc_set_alignment(GTK_MISC(thumbnails_lbl), 0, 0.5);
-
-    gtk_misc_set_padding(GTK_MISC(slideshow_lbl), 2, 2);
-    gtk_misc_set_padding(GTK_MISC(thumbnails_lbl), 2, 2);
-    
-    gtk_range_set_value(GTK_RANGE(slideshow_hscale), window->priv->settings.slideshow_timeout / 1000);
-
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(thumbnails_check), window->priv->settings.slideshow_hide_thumbnail);
-
-    gtk_box_pack_start(GTK_BOX(slideshow_vbox), slideshow_lbl, TRUE, TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(slideshow_vbox), slideshow_hscale, FALSE, TRUE, 0);
-
-    gtk_box_pack_start(GTK_BOX(thumbnails_vbox), thumbnails_lbl, TRUE, TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(thumbnails_vbox), thumbnails_check, FALSE, TRUE, 0);
-
-    gtk_box_pack_start(GTK_BOX(slideshow_main_vbox), slideshow_frame, FALSE, TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(slideshow_main_vbox), thumbnails_frame, FALSE, TRUE, 0);
-
-    gtk_widget_show_all(notebook);
-
-    gint result = gtk_dialog_run(GTK_DIALOG(dialog));
-
-    switch (result)
-    {
-        case GTK_RESPONSE_OK:
-            rstto_main_window_set_slideshow_timeout(window, gtk_range_get_value(GTK_RANGE(slideshow_hscale)) * 1000);
-            window->priv->navigator->preload = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(preload_check));
-            window->priv->settings.slideshow_hide_thumbnail = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(thumbnails_check));
-            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(bg_color_override_check)) == TRUE)
-            {
-                GdkColor *new_color = g_new0(GdkColor, 1);
-                gtk_color_button_get_color(GTK_COLOR_BUTTON(bg_color_button), new_color);
-                rstto_main_window_set_pv_bg_color(window, new_color);
-                g_free(new_color);
-            }
-            else
-            {
-                rstto_main_window_set_pv_bg_color(window, NULL);
-            }
-            rstto_picture_viewer_redraw(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer));
-            rstto_main_window_set_max_cache_size(window, (guint)GTK_ADJUSTMENT(cache_adjustment)->value);
-
-            window->priv->settings.scale_to_100 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(resize_on_maximize_check));
-
+        case PROP_NAVIGATOR:
+            g_value_set_object (value, window->priv->props.navigator);
+            break;
         default:
             break;
     }
-
-    gtk_widget_destroy(dialog);
 }
 
+/**
+ * cb_rstto_main_window_zoom_fit:
+ * @widget:
+ * @window:
+ *
+ *
+ */
 static void
-cb_rstto_main_window_about(GtkWidget *widget, RsttoMainWindow *window)
+cb_rstto_main_window_zoom_fit (GtkWidget *widget, RsttoMainWindow *window)
 {
-    const gchar *authors[] = {
-      _("Developer:"),
-        "Stephan Arts <stephan at xfce.org>",
-        NULL};
-
-    GtkWidget *about_dialog = gtk_about_dialog_new();
-
-    gtk_about_dialog_set_name((GtkAboutDialog *)about_dialog, PACKAGE_NAME);
-    gtk_about_dialog_set_version((GtkAboutDialog *)about_dialog, PACKAGE_VERSION);
-
-    gtk_about_dialog_set_comments((GtkAboutDialog *)about_dialog,
-        _("Ristretto is a fast and lightweight picture-viewer for the Xfce desktop environment."));
-    gtk_about_dialog_set_website((GtkAboutDialog *)about_dialog,
-        "http://goodies.xfce.org/projects/applications/ristretto");
-    gtk_about_dialog_set_logo_icon_name((GtkAboutDialog *)about_dialog,
-        "ristretto");
-    gtk_about_dialog_set_authors((GtkAboutDialog *)about_dialog,
-        authors);
-    gtk_about_dialog_set_translator_credits((GtkAboutDialog *)about_dialog,
-        _("translator-credits"));
-    gtk_about_dialog_set_license((GtkAboutDialog *)about_dialog,
-        xfce_get_license_text(XFCE_LICENSE_TEXT_GPL));
-    gtk_about_dialog_set_copyright((GtkAboutDialog *)about_dialog,
-        "Copyright \302\251 2006-2008 Stephan Arts");
-
-    gtk_dialog_run(GTK_DIALOG(about_dialog));
-
-    gtk_widget_destroy(about_dialog);
+    rstto_picture_viewer_set_zoom_mode (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), RSTTO_ZOOM_MODE_FIT);
 }
 
+/**
+ * cb_rstto_main_window_zoom_100:
+ * @widget:
+ * @window:
+ *
+ *
+ */
 static void
-cb_rstto_main_window_quit(GtkWidget *widget, RsttoMainWindow *window)
+cb_rstto_main_window_zoom_100 (GtkWidget *widget, RsttoMainWindow *window)
 {
-    gtk_widget_destroy(GTK_WIDGET(window));
+    rstto_picture_viewer_set_zoom_mode (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), RSTTO_ZOOM_MODE_100);
 }
 
+/**
+ * cb_rstto_main_window_zoom_in:
+ * @widget:
+ * @window:
+ *
+ *
+ */
 static void
-cb_rstto_main_window_open_file(GtkWidget *widget, RsttoMainWindow *window)
+cb_rstto_main_window_zoom_in (GtkWidget *widget, RsttoMainWindow *window)
 {
-    GtkStatusbar *statusbar = GTK_STATUSBAR(window->priv->statusbar);
-    g_object_add_weak_pointer(G_OBJECT(window), (gpointer)statusbar);
-
-    gint context_id = gtk_statusbar_get_context_id(statusbar, "StatusMessages");
-    gint message_id = gtk_statusbar_push(statusbar, context_id, N_("Opening file(s)..."));
-
-    GtkWidget *dialog = gtk_file_chooser_dialog_new(_("Open image"),
-                                                    GTK_WINDOW(window),
-                                                    GTK_FILE_CHOOSER_ACTION_OPEN,
-                                                    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                                    GTK_STOCK_OPEN, GTK_RESPONSE_OK,
-                                                    NULL);
-
-    gint response = gtk_dialog_run(GTK_DIALOG(dialog));
-    if(response == GTK_RESPONSE_OK)
-    {
-        const gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-        if (!rstto_navigator_open_file(window->priv->navigator, filename, FALSE, NULL))
-        {
-            gtk_widget_destroy(dialog);
-            dialog = gtk_message_dialog_new(GTK_WINDOW(window),
-                                            GTK_DIALOG_MODAL,
-                                            GTK_MESSAGE_ERROR,
-                                            GTK_BUTTONS_OK,
-                                            _("Could not open file"));
-            gtk_dialog_run(GTK_DIALOG(dialog));
-        }
-    }
-    gtk_widget_destroy(dialog);
-
-    if (statusbar)
-    {
-        gtk_statusbar_remove(statusbar, context_id, message_id);
-        g_object_remove_weak_pointer(G_OBJECT(window), (gpointer)statusbar);
-    }
+    gdouble scale = rstto_picture_viewer_get_scale (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer));
+    rstto_picture_viewer_set_scale (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), scale * ZOOM_FACTOR);
 }
 
+/**
+ * cb_rstto_main_window_zoom_out:
+ * @widget:
+ * @window:
+ *
+ *
+ */
 static void
-cb_rstto_main_window_open_folder(GtkWidget *widget, RsttoMainWindow *window)
+cb_rstto_main_window_zoom_out (GtkWidget *widget, RsttoMainWindow *window)
 {
-    GtkStatusbar *statusbar = GTK_STATUSBAR(window->priv->statusbar);
-    g_object_add_weak_pointer(G_OBJECT(window), (gpointer)statusbar);
-
-    gint context_id = gtk_statusbar_get_context_id(statusbar, "StatusMessages");
-    gint message_id = gtk_statusbar_push(statusbar, context_id, N_("Opening file(s)..."));
-
-    GtkWidget *dialog = gtk_file_chooser_dialog_new(_("Open folder"),
-                                                    GTK_WINDOW(window),
-                                                    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
-                                                    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                                    GTK_STOCK_OPEN, GTK_RESPONSE_OK,
-                                                    NULL);
-
-    gint response = gtk_dialog_run(GTK_DIALOG(dialog));
-    if(response == GTK_RESPONSE_OK)
-    {
-        gtk_widget_hide(dialog);
-        const gchar *dir_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-
-        RsttoNavigator *navigator = window->priv->navigator;
-        if(rstto_navigator_open_folder(navigator, dir_name, TRUE, NULL) == TRUE)
-        {
-            rstto_navigator_jump_first(navigator);
-        }
-    }
-    gtk_widget_destroy(dialog);
-
-    if (statusbar)
-    {
-        gtk_statusbar_remove(statusbar, context_id, message_id);
-        g_object_remove_weak_pointer(G_OBJECT(window), (gpointer)statusbar);
-    }
+    gdouble scale = rstto_picture_viewer_get_scale (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer));
+    rstto_picture_viewer_set_scale (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), scale / ZOOM_FACTOR);
 }
 
+/**
+ * cb_rstto_main_window_next_image:
+ * @widget:
+ * @window:
+ *
+ *
+ */
 static void
-cb_rstto_main_window_open_recent(GtkRecentChooser *chooser, RsttoMainWindow *window)
+cb_rstto_main_window_next_image (GtkWidget *widget, RsttoMainWindow *window)
 {
-    GtkStatusbar *statusbar = GTK_STATUSBAR(window->priv->statusbar);
-    g_object_add_weak_pointer(G_OBJECT(window), (gpointer)statusbar);
+    GFile *file;
+    RsttoImage *image;
+    gchar *path, *basename, *title;
+    rstto_navigator_iter_next (window->priv->iter);
+    image = rstto_navigator_iter_get_image (window->priv->iter);
+    file = rstto_image_get_file (image);
 
-    gint context_id = gtk_statusbar_get_context_id(statusbar, "StatusMessages");
-    gint message_id = gtk_statusbar_push(statusbar, context_id, N_("Opening file(s)..."));
+    rstto_image_load (image, TRUE, 0);
+    rstto_picture_viewer_set_image (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), image);
 
-    gchar *uri = gtk_recent_chooser_get_current_uri(chooser);
-    ThunarVfsPath *vfs_path = thunar_vfs_path_new(uri, NULL);
-    if (vfs_path)
-    {
-        gchar *path = thunar_vfs_path_dup_string(vfs_path);
-        if(g_file_test(path, G_FILE_TEST_EXISTS))
-        {
-            if(g_file_test(path, G_FILE_TEST_IS_DIR))
-            {
-                RsttoNavigator *navigator = window->priv->navigator;
-                if(rstto_navigator_open_folder(navigator, path, TRUE, NULL) == TRUE)
-                {
-                    rstto_navigator_jump_first(navigator);
-                }
-            }
-            else
-            {
-                rstto_navigator_open_file(window->priv->navigator, path, FALSE, NULL);
-            }
-        }
-        thunar_vfs_path_unref(vfs_path);
-        g_free(path);
-    }
+    path = g_file_get_path (file);
+    basename = g_path_get_basename (path);
 
-    if (statusbar)
-    {
-        gtk_statusbar_remove(statusbar, context_id, message_id);
-        g_object_remove_weak_pointer(G_OBJECT(window), (gpointer)statusbar);
-    }
-}
+    title = g_strdup_printf ("%s - %s [%d/%d]", RISTRETTO_APP_TITLE,  basename, -1, -1);
 
-static void
-cb_rstto_main_window_clear_recent(GtkWidget *widget, RsttoMainWindow *window)
-{
-    GtkWidget *dialog = gtk_message_dialog_new(NULL,
-                                    GTK_DIALOG_MODAL,
-                                    GTK_MESSAGE_ERROR,
-                                    GTK_BUTTONS_OK_CANCEL,
-                                    _("Are you sure you want to clear ristretto's list of recently opened documents?"));
-    gint result = gtk_dialog_run(GTK_DIALOG(dialog));
-    if (result == GTK_RESPONSE_OK)
-    {
-        g_timeout_add(150, (GSourceFunc)rstto_main_window_clear_recent, window);
-    }
-    gtk_widget_destroy(dialog);
+    gtk_window_set_title (GTK_WINDOW (window), title);
 
-}
 
-static void
-cb_rstto_main_window_close(GtkWidget *widget, RsttoMainWindow *window)
-{
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(window->priv->navigator);
-    if (entry)
-    {
-        rstto_navigator_remove(window->priv->navigator, entry);    
-        rstto_navigator_entry_free(entry);
-        if (rstto_navigator_get_n_files(window->priv->navigator) == 0)
-        {
-            gtk_widget_set_sensitive(widget, FALSE);
-            gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close_all, FALSE);
-        }
-    }
-    else
-    {
-        gtk_widget_set_sensitive(widget, FALSE);
-        gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close_all, FALSE);
-    }
+    g_object_unref (file);
+    g_free (title);
+    g_free (path);
+    g_free (basename);
 }
 
+/**
+ * cb_rstto_main_window_previous_image:
+ * @widget:
+ * @window:
+ *
+ *
+ */
 static void
-cb_rstto_main_window_close_all(GtkWidget *widget, RsttoMainWindow *window)
+cb_rstto_main_window_previous_image (GtkWidget *widget, RsttoMainWindow *window)
 {
-#if 0
-    RsttoNavigator  *navigator = window->priv->navigator;
+    GFile *file;
+    RsttoImage *image;
+    gchar *path, *basename, *title;
+    rstto_navigator_iter_previous (window->priv->iter);
+    image = rstto_navigator_iter_get_image (window->priv->iter);
+    file = rstto_image_get_file (image);
 
-    if (navigator)
-    {
-        GList *iter, *modified_files = NULL;
-        
-        for (iter = navigator->file_list; iter != NULL; iter = iter->next)
-        {
-            if (rstto_navigator_entry_get_orientation_changed ((RsttoNavigatorEntry *)iter->data))
-            {
-                modified_files = g_list_append (modified_files, iter->data);
-            }
-        }
+    rstto_image_load (image, TRUE, 0);
+    rstto_picture_viewer_set_image (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), image);
 
-        if (modified_files)
-        {
-            GtkWidget *dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, _("The orientation of one or more images has been modified, do you want to save the changes?")); 
-            if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
-            {
-                gtk_widget_hide(dialog);
-                GtkWidget *save_dialog = rstto_save_dialog_new (GTK_WINDOW(window), modified_files);
-                if (gtk_dialog_run (GTK_DIALOG(save_dialog)) == GTK_RESPONSE_OK)
-                {
-                    
-                }
-            }
-        }
-    }
-#endif
+    path = g_file_get_path (file);
+    basename = g_path_get_basename (path);
 
-    rstto_navigator_clear (window->priv->navigator);
-    gtk_widget_set_sensitive(widget, FALSE);
-    gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close, FALSE);
-}
+    title = g_strdup_printf ("%s - %s [%d/%d]", RISTRETTO_APP_TITLE,  basename, -1, -1);
 
-static void
-cb_rstto_main_window_file_properties(GtkWidget *widget, RsttoMainWindow *window)
-{
-    GError *error = NULL;
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(window->priv->navigator);
-    if (entry)
-    {
-        ThunarVfsInfo *info = rstto_navigator_entry_get_info(entry);
-        if(info)
-        {
-            gchar *uri = thunar_vfs_path_dup_uri(info->path);
-            if(dbus_g_proxy_call(window->priv->filemanager_proxy,
-                                 "DisplayFileProperties",
-                                 &error,
-                                 G_TYPE_STRING, uri,
-                                 G_TYPE_STRING, "",
-                                 G_TYPE_INVALID,
-                                 G_TYPE_INVALID) == FALSE)
-            {
-                g_warning("%s", error->message);
-            }
-            g_free(uri);
-        }
-    }
-}
+    gtk_window_set_title (GTK_WINDOW (window), title);
 
-static void
-cb_rstto_main_window_nav_iter_changed(RsttoNavigator *navigator, gint nr, RsttoNavigatorEntry *entry, RsttoMainWindow *window)
-{
-    ThunarVfsInfo *info = NULL;
-    const gchar *filename = NULL;
-    gchar *title = NULL;
 
-    if(entry)
-    {
-        info = rstto_navigator_entry_get_info(entry);
-        filename = info->display_name;
-        gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close_all, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.file.menu_item_file_properties, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.go.menu_item_first, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.go.menu_item_last, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.go.menu_item_previous, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.go.menu_item_next, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.go.menu_item_play, TRUE);
-        gtk_widget_set_sensitive(window->priv->menus.go.menu_item_pause, TRUE);
-
-#ifdef WITH_DESKTOP_WALLPAPER 
-        if (window->priv->settings.desktop > 0)
-        {
-            gtk_widget_set_sensitive(window->priv->menus.view.menu_item_set_wallpaper, TRUE);
-        }
-        else
-        {
-            gtk_widget_set_sensitive(window->priv->menus.view.menu_item_set_wallpaper, FALSE);
-        }
-#endif
-
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_next), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_previous), TRUE);
-
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_in), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_out), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_fit), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_100), TRUE);
-
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_close), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_in), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_out), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_100), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_fit), TRUE);
-
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_in), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_out), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_100), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_fit), TRUE);
-
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.rotate.menu_item_rotate_cw), TRUE);
-        gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.rotate.menu_item_rotate_ccw), TRUE);
-
-
-        /* Update window title */
-        if (rstto_navigator_get_n_files(navigator) > 1)
-        {
-            title = g_strdup_printf("%s - %s [%d/%d]", PACKAGE_NAME, filename, nr+1, rstto_navigator_get_n_files(navigator));
-        }
-        else
-        {
-            title = g_strconcat(PACKAGE_NAME, " - ", filename, NULL);
-        }
-        gtk_window_set_title(GTK_WINDOW(window), title);
-        g_free(title);
-        title = NULL;
-
-        /* Update 'open with...' submenu */
-        if(gtk_widget_get_parent(window->priv->menus.edit.open_with.menu_item_empty))
-        {
-            gtk_container_remove(GTK_CONTAINER(window->priv->menus.edit.open_with.menu),
-                                 window->priv->menus.edit.open_with.menu_item_empty);
-        }
-        if(gtk_widget_get_parent(window->priv->menus._picture_viewer.open_with.menu_item_empty))
-        {
-            gtk_container_remove(GTK_CONTAINER(window->priv->menus._picture_viewer.open_with.menu),
-                                 window->priv->menus._picture_viewer.open_with.menu_item_empty);
-        }
-
-        gtk_container_foreach(GTK_CONTAINER(window->priv->menus.edit.open_with.menu), (GtkCallback)gtk_widget_destroy, NULL);
-        gtk_container_foreach(GTK_CONTAINER(window->priv->menus._picture_viewer.open_with.menu), (GtkCallback)gtk_widget_destroy, NULL);
-
-        if (info)
-        {
-            window->priv->menu_apps_list = thunar_vfs_mime_database_get_applications(window->priv->mime_dbase, info->mime_info);
-            GList *iter = window->priv->menu_apps_list;
-            if (iter == NULL)
-            {
-                gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.edit.open_with.menu), window->priv->menus.edit.open_with.menu_item_empty);
-                gtk_widget_show(window->priv->menus.edit.open_with.menu_item_empty);
-
-                gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.open_with.menu),
-                                      window->priv->menus._picture_viewer.open_with.menu_item_empty);
-                gtk_widget_show(window->priv->menus._picture_viewer.open_with.menu_item_empty);
-            }
-            while (iter != NULL)
-            {
-                GtkWidget *menu_item = gtk_image_menu_item_new_with_label(thunar_vfs_mime_application_get_name(iter->data));
-                GtkWidget *image = gtk_image_new_from_icon_name(thunar_vfs_mime_handler_lookup_icon_name(iter->data, window->priv->icon_theme), GTK_ICON_SIZE_MENU);
-                gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
-                gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.edit.open_with.menu), menu_item);
-                g_object_set_data(iter->data, "entry", entry);
-                g_signal_connect(menu_item, "activate", G_CALLBACK(cb_rstto_main_window_spawn_app), iter->data);
-                gtk_widget_show(menu_item);
-
-                menu_item = gtk_image_menu_item_new_with_label(thunar_vfs_mime_application_get_name(iter->data));
-                image = gtk_image_new_from_icon_name(thunar_vfs_mime_handler_lookup_icon_name(iter->data, window->priv->icon_theme), GTK_ICON_SIZE_MENU);
-                gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
-                gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.open_with.menu), menu_item);
-                g_object_set_data(iter->data, "entry", entry);
-                g_signal_connect(menu_item, "activate", G_CALLBACK(cb_rstto_main_window_spawn_app), iter->data);
-                gtk_widget_show(menu_item);
-
-                iter = g_list_next(iter);
-            }
-        }        
-        else
-        {
-            gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.edit.open_with.menu), window->priv->menus.edit.open_with.menu_item_empty);
-            gtk_widget_show(window->priv->menus.edit.open_with.menu_item_empty);
-
-            gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.open_with.menu),
-                                  window->priv->menus._picture_viewer.open_with.menu_item_empty);
-            gtk_widget_show(window->priv->menus._picture_viewer.open_with.menu_item_empty);
-        }
-    }
-    else
-    {
-        gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close, FALSE);
-        gtk_widget_set_sensitive(window->priv->menus.file.menu_item_close_all, FALSE);
-        gtk_widget_set_sensitive(window->priv->menus.view.menu_item_set_wallpaper, FALSE);
-        gtk_window_set_title(GTK_WINDOW(window), PACKAGE_STRING);
-        if (rstto_navigator_get_n_files(window->priv->navigator) == 0)
-        {
-            gtk_widget_set_sensitive(window->priv->menus.go.menu_item_first, FALSE);
-            gtk_widget_set_sensitive(window->priv->menus.go.menu_item_last, FALSE);
-            gtk_widget_set_sensitive(window->priv->menus.go.menu_item_previous, FALSE);
-            gtk_widget_set_sensitive(window->priv->menus.go.menu_item_next, FALSE);
-            gtk_widget_set_sensitive(window->priv->menus.go.menu_item_play, FALSE);
-            gtk_widget_set_sensitive(window->priv->menus.go.menu_item_pause, FALSE);
-            gtk_widget_set_sensitive(window->priv->menus.file.menu_item_file_properties, FALSE);
-
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_next), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_previous), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_in), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_out), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_fit), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->toolbar.tool_item_zoom_100), FALSE);
-
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_close), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_in), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_out), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_100), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus._picture_viewer.menu_item_zoom_fit), FALSE);
-
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_in), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_out), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_100), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.zooming.menu_item_zoom_fit), FALSE);
-
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.rotate.menu_item_rotate_cw), FALSE);
-            gtk_widget_set_sensitive(GTK_WIDGET(window->priv->menus.view.rotate.menu_item_rotate_ccw), FALSE);
-        }
-
-        gtk_container_foreach(GTK_CONTAINER(window->priv->menus.edit.open_with.menu), (GtkCallback)gtk_widget_destroy, NULL);
-        gtk_container_foreach(GTK_CONTAINER(window->priv->menus._picture_viewer.open_with.menu), (GtkCallback)gtk_widget_destroy, NULL);
-        if(!gtk_widget_get_parent(window->priv->menus.edit.open_with.menu_item_empty))
-        {
-            gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus.edit.open_with.menu), window->priv->menus.edit.open_with.menu_item_empty);
-            gtk_widget_show(window->priv->menus.edit.open_with.menu_item_empty);
-        }
-
-        if(!gtk_widget_get_parent(window->priv->menus._picture_viewer.open_with.menu_item_empty))
-        {
-            gtk_menu_shell_append(GTK_MENU_SHELL(window->priv->menus._picture_viewer.open_with.menu),
-                                  window->priv->menus._picture_viewer.open_with.menu_item_empty);
-            gtk_widget_show(window->priv->menus._picture_viewer.open_with.menu_item_empty);
-        }
-    }
-
+    g_object_unref (file);
+    g_free (title);
+    g_free (path);
+    g_free (basename);
 }
 
+/**
+ * cb_rstto_main_window_open_image:
+ * @widget:
+ * @window:
+ *
+ *
+ */
 static void
-cb_rstto_main_window_nav_new_entry(RsttoNavigator *navigator, gint nr, RsttoNavigatorEntry *entry, RsttoMainWindow *window)
+cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window)
 {
-    RsttoNavigatorEntry *current_entry = rstto_navigator_get_file(navigator);
-    ThunarVfsInfo *info = rstto_navigator_entry_get_info(entry);
-    gchar *filename = info->display_name;
-
-    gint current_nr = rstto_navigator_get_position(navigator);
-
-    if (current_entry)
-    {
-        gchar *title;
-        /* Update window title */
-        if (rstto_navigator_get_n_files(navigator) > 1)
-        {
-            title = g_strdup_printf("%s - %s [%d/%d]", PACKAGE_NAME, filename, current_nr+1, rstto_navigator_get_n_files(navigator));
-        }
-        else
-        {
-            title = g_strconcat(PACKAGE_NAME, " - ", filename, NULL);
-        }
-        gtk_window_set_title(GTK_WINDOW(window), title);
-        g_free(title);
-        title = NULL;
-    }
-
 }
-
-static void
-cb_rstto_main_window_next(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_navigator_jump_forward(window->priv->navigator);
-}
-
-static void
-cb_rstto_main_window_previous(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_navigator_jump_back(window->priv->navigator);
-}
-
-static void
-cb_rstto_main_window_first(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_navigator_jump_first(window->priv->navigator);
-}
-
-static void
-cb_rstto_main_window_last(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_navigator_jump_last(window->priv->navigator);
-}
-
-static void
-cb_rstto_main_window_zoom_in(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_picture_viewer_set_zoom_mode(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), RSTTO_ZOOM_MODE_CUSTOM);
-    gdouble scale = rstto_picture_viewer_get_scale(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer));
-    rstto_picture_viewer_set_scale(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), scale * window->priv->zoom_factor);
-}
-
-static void
-cb_rstto_main_window_zoom_out(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_picture_viewer_set_zoom_mode(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), RSTTO_ZOOM_MODE_CUSTOM);
-    gdouble scale = rstto_picture_viewer_get_scale(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer));
-    rstto_picture_viewer_set_scale(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), scale / window->priv->zoom_factor);
-}
-
-static void
-cb_rstto_main_window_zoom_100(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_picture_viewer_set_zoom_mode(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), RSTTO_ZOOM_MODE_100);
-    rstto_picture_viewer_set_scale(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), 1);
-}
-
-static void
-cb_rstto_main_window_zoom_fit(GtkWidget *widget, RsttoMainWindow *window)
-{
-    rstto_picture_viewer_set_zoom_mode(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), RSTTO_ZOOM_MODE_FIT);
-    rstto_picture_viewer_fit_scale(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer));
-}
-
-static void
-cb_rstto_main_window_rotate_cw(GtkWidget *widget, RsttoMainWindow *window)
-{
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(window->priv->navigator);
-    if (entry)
-    {
-        GdkPixbufRotation rotation = rstto_navigator_entry_get_rotation(entry);
-        switch (rotation)
-        {
-            case GDK_PIXBUF_ROTATE_NONE:
-                rotation = GDK_PIXBUF_ROTATE_CLOCKWISE;
-                break;
-            case GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE:
-                rotation = GDK_PIXBUF_ROTATE_NONE;
-                break;
-            case GDK_PIXBUF_ROTATE_UPSIDEDOWN:
-                rotation = GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE;
-                break;
-            case GDK_PIXBUF_ROTATE_CLOCKWISE:
-                rotation = GDK_PIXBUF_ROTATE_UPSIDEDOWN;
-                break;
-            default:
-                g_warning("Unable to rotate, rotation unknown");
-                break;
-        }
-        rstto_navigator_entry_set_rotation(entry, rotation);
-    }
-}
-
-static void
-cb_rstto_main_window_rotate_ccw(GtkWidget *widget, RsttoMainWindow *window)
-{
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(window->priv->navigator);
-    if (entry)
-    {
-        GdkPixbufRotation rotation = rstto_navigator_entry_get_rotation(entry);
-        switch (rotation)
-        {
-            case GDK_PIXBUF_ROTATE_NONE:
-                rotation = GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE;
-                break;
-            case GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE:
-                rotation = GDK_PIXBUF_ROTATE_UPSIDEDOWN;
-                break;
-            case GDK_PIXBUF_ROTATE_UPSIDEDOWN:
-                rotation = GDK_PIXBUF_ROTATE_CLOCKWISE;
-                break;
-            case GDK_PIXBUF_ROTATE_CLOCKWISE:
-                rotation = GDK_PIXBUF_ROTATE_NONE;
-                break;
-            default:
-                g_warning("Unable to rotate, rotation unknown");
-                break;
-        }
-        rstto_navigator_entry_set_rotation(entry, rotation);
-    }
-}
-
-static void
-cb_rstto_main_window_spawn_app(GtkWidget *widget, ThunarVfsMimeApplication *app)
-{
-    ThunarVfsInfo *info = rstto_navigator_entry_get_info(g_object_get_data(G_OBJECT(app), "entry"));
-    GList *list = g_list_prepend(NULL, info->path);
-    thunar_vfs_mime_handler_exec(THUNAR_VFS_MIME_HANDLER(app), NULL, list, NULL);
-}
-
-void
-rstto_main_window_set_pv_bg_color (RsttoMainWindow *window, const GdkColor *color)
-{
-    rstto_picture_viewer_set_bg_color(RSTTO_PICTURE_VIEWER(window->priv->picture_viewer), color);
-    if (color)
-    {
-        window->priv->settings.bg_color = gdk_color_copy(color);
-    }
-    else
-    {
-        window->priv->settings.bg_color = NULL;
-    }
-}
-
-const GdkColor *
-rstto_main_window_get_pv_bg_color (RsttoMainWindow *window)
-{
-    return window->priv->settings.bg_color;
-}
-
-static void
-cb_rstto_bg_color_override_check_toggled(GtkToggleButton *button, GtkWidget *widget)
-{
-    if (gtk_toggle_button_get_active(button) == TRUE)
-    {
-        gtk_widget_set_sensitive(widget, TRUE);
-    }
-    else
-    {
-        gtk_widget_set_sensitive(widget, FALSE);
-    }
-}
-
-GtkStatusbar *
-rstto_main_window_get_statusbar(RsttoMainWindow *window)
-{
-    return GTK_STATUSBAR(window->priv->statusbar);
-}
-
-gint
-rstto_main_window_get_desktop(RsttoMainWindow *window)
-{
-    return window->priv->settings.desktop;
-}
-
-gint
-rstto_main_window_set_desktop(RsttoMainWindow *window, RsttoDesktop desktop)
-{
-    switch(desktop)
-    {
-#ifdef WITH_DESKTOP_WALLPAPER
-#ifdef HAVE_XFCONF
-        case RSTTO_DESKTOP_XFCE:
-            window->priv->settings.desktop = desktop;
-            break;
-#endif
-#endif
-        default:
-            window->priv->settings.desktop = RSTTO_DESKTOP_NONE;
-            break;
-    }
-    return 0;
-}

Modified: ristretto/branches/ristretto-gio/src/main_window.h
===================================================================
--- ristretto/trunk/src/main_window.h	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/main_window.h	2009-01-05 23:15:14 UTC (rev 6407)
@@ -60,7 +60,8 @@
 
 typedef enum {
     RSTTO_DESKTOP_NONE,
-    RSTTO_DESKTOP_XFCE
+    RSTTO_DESKTOP_XFCE,
+    RSTTO_DESKTOP_GNOME
 } RsttoDesktop;
 
 static gboolean rstto_has_xfconf_query = FALSE;
@@ -69,70 +70,8 @@
 
 GType      rstto_main_window_get_type();
 
-GtkWidget *rstto_main_window_new();
+GtkWidget *rstto_main_window_new (RsttoNavigator *);
 
-void
-rstto_main_window_set_thumbnail_viewer_orientation(RsttoMainWindow *window, GtkOrientation orientation);
-void
-rstto_main_window_set_show_thumbnail_viewer (RsttoMainWindow *window, gboolean visibility);
-void
-rstto_main_window_set_show_toolbar (RsttoMainWindow *window, gboolean visibility);
-gboolean
-rstto_main_window_get_show_toolbar (RsttoMainWindow *window);
-gboolean
-rstto_main_window_get_show_thumbnail_viewer (RsttoMainWindow *window);
-GtkOrientation
-rstto_main_window_get_thumbnail_viewer_orientation (RsttoMainWindow *window);
-RsttoNavigator *
-rstto_main_window_get_navigator (RsttoMainWindow *window);
-GtkRecentManager *
-rstto_main_window_get_recent_manager (RsttoMainWindow *window);
-
-
-gdouble
-rstto_main_window_get_slideshow_timeout (RsttoMainWindow *window);
-gboolean
-rstto_main_window_get_hide_thumbnails (RsttoMainWindow *window);
-gint
-rstto_main_window_get_max_cache_size (RsttoMainWindow *window);
-void
-rstto_main_window_set_slideshow_timeout (RsttoMainWindow *window, gdouble timeout);
-void
-rstto_main_window_set_hide_thumbnails (RsttoMainWindow *window, gboolean hide);
-void
-rstto_main_window_set_max_cache_size (RsttoMainWindow *window, gint max_cache_size);
-void
-rstto_main_window_set_pv_bg_color (RsttoMainWindow *window, const GdkColor *color);
-const GdkColor *
-rstto_main_window_get_pv_bg_color (RsttoMainWindow *window);
-
-void
-rstto_main_window_set_start_fullscreen (RsttoMainWindow *window, gboolean fullscreen);
-void
-rstto_main_window_set_start_slideshow (RsttoMainWindow *window, gboolean slideshow);
-void
-rstto_main_window_force_fullscreen (RsttoMainWindow *window);
-void
-rstto_main_window_force_slideshow (RsttoMainWindow *window);
-
-void
-rstto_main_window_set_scale_to_100 (RsttoMainWindow *window, gboolean scale_to_100);
-gboolean
-rstto_main_window_get_scale_to_100 (RsttoMainWindow *window);
-
-GtkStatusbar *
-rstto_main_window_get_statusbar(RsttoMainWindow *window);
-gint
-rstto_main_window_get_desktop(RsttoMainWindow *window);
-gint
-rstto_main_window_set_desktop(RsttoMainWindow *window, RsttoDesktop desktop);
-gboolean
-rstto_main_window_get_hide_thumbnail (RsttoMainWindow *window);
-void
-rstto_main_window_set_hide_thumbnail (RsttoMainWindow *window, gboolean hide);
-void
-rstto_main_window_set_start_fullscreen (RsttoMainWindow *window, gboolean fullscreen);
-
 G_END_DECLS
 
 #endif /* __RISTRETTO_MAIN_WINDOW_H__ */

Modified: ristretto/branches/ristretto-gio/src/navigator.c
===================================================================
--- ristretto/trunk/src/navigator.c	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/navigator.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,4 +1,6 @@
 /*
+ *  Copyright (c) 2009 Stephan Arts <stephan at xfce.org>
+ *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
@@ -15,13 +17,15 @@
  */
 
 #include <config.h>
+
 #include <gtk/gtk.h>
 #include <gtk/gtkmarshal.h>
+
 #include <string.h>
 
-#include <thunar-vfs/thunar-vfs.h>
 #include <libexif/exif-data.h>
 
+#include "image.h"
 #include "navigator.h"
 
 static void 
@@ -31,89 +35,25 @@
 static void
 rstto_navigator_dispose(GObject *object);
 
-static void
-rstto_navigator_entry_clear (RsttoNavigatorEntry *nav_entry);
-
-static gboolean
-cb_rstto_navigator_running(RsttoNavigator *navigator);
-
 static GObjectClass *parent_class = NULL;
 
-static gint
-rstto_navigator_entry_name_compare_func(RsttoNavigatorEntry *a, RsttoNavigatorEntry *b);
-
-static void
-cb_rstto_navigator_entry_area_prepared (GdkPixbufLoader *loader, RsttoNavigatorEntry *entry);
-static void
-cb_rstto_navigator_entry_closed (GdkPixbufLoader *loader, RsttoNavigatorEntry *entry);
-static gboolean
-cb_rstto_navigator_entry_read_file(GIOChannel *io_channel, GIOCondition cond, RsttoNavigatorEntry *entry);
-
-static gboolean
-cb_rstto_navigator_entry_update_image (RsttoNavigatorEntry *entry);
-
-static void
-cb_rstto_navigator_entry_fs_event (ThunarVfsMonitor *,
-                                   ThunarVfsMonitorHandle *,
-                                   ThunarVfsMonitorEvent,
-                                   ThunarVfsPath *,
-                                   ThunarVfsPath *,
-                                   RsttoNavigatorEntry *);
-static void
-cb_rstto_navigator_fs_event (ThunarVfsMonitor *monitor,
-                             ThunarVfsMonitorHandle *handl,
-                             ThunarVfsMonitorEvent event,
-                             ThunarVfsPath *handle_path,
-                             ThunarVfsPath *event_path,
-                             RsttoNavigator *nav);
-
-static void
-rstto_navigator_set_busy (RsttoNavigator *navigator, gboolean busy);
-
-static gint
-cb_rstto_navigator_entry_path_compare_func(RsttoNavigatorEntry *entry, ThunarVfsPath *path);
-
 enum
 {
-    RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED = 0,
-    RSTTO_NAVIGATOR_SIGNAL_ENTRY_REMOVED,
-    RSTTO_NAVIGATOR_SIGNAL_NEW_ENTRY,
-    RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED,
-    RSTTO_NAVIGATOR_SIGNAL_REORDERED,
-    RSTTO_NAVIGATOR_SIGNAL_COUNT    
+    RSTTO_NAVIGATOR_SIGNAL_NEW_IMAGE = 0,
+    RSTTO_NAVIGATOR_SIGNAL_COUNT
 };
 
-struct _RsttoNavigatorEntry
+struct _RsttoNavigatorIter
 {
-    ThunarVfsInfo       *info;
-    GdkPixbufLoader     *loader;
-    ExifData            *exif_data;
-    ThunarVfsMonitorHandle *monitor_handle;
+    GList *data;
+};
 
-    GdkPixbuf           *thumb;
-
-    GdkPixbufAnimation  *animation;
-    GdkPixbufAnimationIter *iter;
-    GdkPixbuf           *src_pixbuf;
-
-    GIOChannel          *io_channel;
-    gint                 io_source_id;
-    gint                 timeout_id;
-
-    RsttoNavigator      *navigator;
-
-    gdouble              scale;
-    gboolean             fit_to_screen;
-    GdkPixbufRotation    rotation;
-    gboolean             h_flipped;
-    gboolean             v_flipped;
-    gint                 x_offset;
-    gint                 y_offset;
-
-    gboolean             orientation_changed;
+struct _RsttoNavigatorPriv
+{
+    GList *images;
+    GMutex *images_mutex;
 };
 
-
 static gint rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_COUNT];
 
 GType
@@ -145,17 +85,8 @@
 static void
 rstto_navigator_init(RsttoNavigator *navigator)
 {
-    navigator->file_iter = NULL;
-    navigator->compare_func = (GCompareFunc)rstto_navigator_entry_name_compare_func;
-    navigator->old_position = -1;
-    navigator->timeout = 5000;
-    navigator->monitor = thunar_vfs_monitor_get_default();
-    navigator->preload = FALSE;
-
-    /* Max history size (in bytes) */
-    navigator->max_history = 128000000;
-
-    navigator->factory = thunar_vfs_thumb_factory_new(THUNAR_VFS_THUMB_SIZE_NORMAL);
+    navigator->priv = g_new0 (RsttoNavigatorPriv, 1);
+    navigator->priv->images_mutex = g_mutex_new();
 }
 
 static void
@@ -167,1579 +98,74 @@
 
     object_class->dispose = rstto_navigator_dispose;
 
-    rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_REORDERED] = g_signal_new("reordered",
+    rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_NEW_IMAGE] = g_signal_new("new-image",
             G_TYPE_FROM_CLASS(nav_class),
             G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
             0,
             NULL,
             NULL,
-            g_cclosure_marshal_VOID__VOID,
+            g_cclosure_marshal_VOID__OBJECT,
             G_TYPE_NONE,
-            0,
-            NULL);
-    rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED] = g_signal_new("entry-modified",
-            G_TYPE_FROM_CLASS(nav_class),
-            G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-            0,
-            NULL,
-            NULL,
-            g_cclosure_marshal_VOID__POINTER,
-            G_TYPE_NONE,
             1,
-            G_TYPE_POINTER,
+            G_TYPE_OBJECT,
             NULL);
-    rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_REMOVED] = g_signal_new("entry-removed",
-            G_TYPE_FROM_CLASS(nav_class),
-            G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-            0,
-            NULL,
-            NULL,
-            g_cclosure_marshal_VOID__POINTER,
-            G_TYPE_NONE,
-            1,
-            G_TYPE_POINTER,
-            NULL);
-    rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED] = g_signal_new("iter-changed",
-            G_TYPE_FROM_CLASS(nav_class),
-            G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-            0,
-            NULL,
-            NULL,
-            g_cclosure_marshal_VOID__UINT_POINTER,
-            G_TYPE_NONE,
-            2,
-            G_TYPE_UINT,
-            G_TYPE_POINTER,
-            NULL);
-    rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_NEW_ENTRY] = g_signal_new("new-entry",
-            G_TYPE_FROM_CLASS(nav_class),
-            G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-            0,
-            NULL,
-            NULL,
-            g_cclosure_marshal_VOID__UINT_POINTER,
-            G_TYPE_NONE,
-            2,
-            G_TYPE_UINT,
-            G_TYPE_POINTER,
-            NULL);
 }
 
 static void
 rstto_navigator_dispose(GObject *object)
 {
     RsttoNavigator *navigator = RSTTO_NAVIGATOR(object);
-
-    if(navigator->file_list)
-    {
-        g_list_foreach(navigator->file_list, (GFunc)rstto_navigator_entry_free, NULL);
-        navigator->file_list = NULL;
-        navigator->file_iter = NULL;
-    }
 }
 
 RsttoNavigator *
-rstto_navigator_new(GtkRecentManager *manager)
+rstto_navigator_new ()
 {
     RsttoNavigator *navigator;
 
     navigator = g_object_new(RSTTO_TYPE_NAVIGATOR, NULL);
-    navigator->manager = manager;
 
     return navigator;
 }
 
-/*
- * static gint
- * rstto_navigator_entry_name_compare_func:
- *
- * @a: RsttoNavigatorEntry 
- * @b: RsttoNavigatorEntry
- *
- * Return value: see g_strcasecmp
- */
-static gint
-rstto_navigator_entry_name_compare_func(RsttoNavigatorEntry *a, RsttoNavigatorEntry *b)
-{
-    return g_strcasecmp(a->info->display_name, b->info->display_name);
-}
-
-
-static void
-rstto_navigator_add_entry_to_history(RsttoNavigator *navigator, RsttoNavigatorEntry *entry)
-{
-
-    /* rstto_debug_print_src_pixbufs(navigator); */
-
-    /* Check if the image is already available in the image-cache */
-    if (g_list_index(navigator->history, entry) != -1)
-    {
-        /* Remove the image from the history, we are going to re-add it at the front of the list later */
-        navigator->history = g_list_remove(navigator->history, entry);
-    }
-    navigator->history = g_list_prepend(navigator->history, entry);
-
-    /* manage history by kicking excess elements out */
-    GList *iter = NULL;
-    guint64 size = 0;
-
-    for (iter = navigator->history; iter != NULL; iter = g_list_next(iter))
-    {
-        RsttoNavigatorEntry *nav_entry = iter->data;
-
-        if (nav_entry)
-        {
-            size += rstto_navigator_entry_get_size(nav_entry);
-            size += sizeof (*nav_entry);
-            size += sizeof (*nav_entry->info);
-
-            if (nav_entry->exif_data);
-                size += sizeof (*nav_entry->exif_data);
-            if (nav_entry->loader)
-                size += sizeof (nav_entry->loader);
-
-            if (size > navigator->max_history)
-            {
-                if (iter != navigator->file_iter)
-                {
-                    rstto_navigator_entry_clear (nav_entry);
-                    iter = g_list_previous(iter);
-                }
-                else
-                {
-                    iter = g_list_previous(iter);
-                    nav_entry = iter->data;
-                    if (nav_entry)
-                    {
-                        rstto_navigator_entry_clear (nav_entry);
-                    }
-                    iter = g_list_next(iter);
-                }
-                navigator->history = g_list_remove(navigator->history, nav_entry);
-            }
-        }
-    }
-}
-
-
 void
-rstto_navigator_guard_history(RsttoNavigator *navigator, RsttoNavigatorEntry *entry)
+rstto_navigator_add_file (RsttoNavigator *navigator, GFile *file)
 {
-    /* check if the image is still loading, if so... don't cache the image */
-    if(entry->io_channel)
-    {
-        g_source_remove(entry->io_source_id);
-        g_io_channel_unref(entry->io_channel);
-        entry->io_channel = NULL;
-        entry->io_source_id = 0;
-        if(entry->loader)
-        {
-            g_signal_handlers_disconnect_by_func(entry->loader , cb_rstto_navigator_entry_area_prepared, entry);
-            gdk_pixbuf_loader_close(entry->loader, NULL);
-        }
+    RsttoImage *image = rstto_image_new (file);
 
-        if (entry->timeout_id)
-        {
-            g_source_remove(entry->timeout_id);
-            entry->timeout_id = 0;
-        }
+    g_mutex_lock (navigator->priv->images_mutex);
+    navigator->priv->images = g_list_prepend (navigator->priv->images, image);
+    g_mutex_unlock (navigator->priv->images_mutex);
 
-        if(entry->animation)
-        {
-            g_object_unref(entry->animation);
-            entry->animation = NULL;
-        }
-
-        if(entry->src_pixbuf)
-        {
-            gdk_pixbuf_unref(entry->src_pixbuf);
-            entry->src_pixbuf = NULL;
-        }
-    }
-
-    rstto_navigator_add_entry_to_history(navigator, entry);
+    g_signal_emit (G_OBJECT (navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_NEW_IMAGE], 0, image, NULL);
 }
 
-/* for debugging:
- * iterate through navigator->file_list and print out all
- * pixbuf entries to see whether they've been loaded or not
- */
-void
-rstto_debug_print_src_pixbufs (RsttoNavigator *navigator)
+RsttoNavigatorIter *
+rstto_navigator_get_iter (RsttoNavigator *navigator)
 {
-    GList *e = navigator->file_list;
-    int i = 1;
-    printf("src_pixbufs loaded for these image indices: ");
-    while (e != NULL)
-    {
-        RsttoNavigatorEntry *re = e->data;
-        if (re->src_pixbuf != NULL)
-        {
-            printf("%d ", i);
-        }
-        e = g_list_next(e);
-        i++;
-    }
-    printf("\n");
-}
+    RsttoNavigatorIter *iter = g_new0 (RsttoNavigatorIter, 1);
+    g_mutex_lock (navigator->priv->images_mutex);
+    iter->data = navigator->priv->images;
+    g_mutex_unlock (navigator->priv->images_mutex);
 
-
-/* preloading for improved responsiveness
- * (at the expense of increased memory usage) 
- */
-static gboolean
-rstto_navigator_preload_next_img (RsttoNavigator *navigator)
-{
-    GList *next = g_list_next(navigator->file_iter);
-    /* wraparound case */
-    if (next == NULL)
-    {
-        next = navigator->file_list;
-    }
-    if (next != NULL)
-    {
-        RsttoNavigatorEntry *next_entry = next->data;
-        rstto_navigator_entry_load_image(next_entry, FALSE);
-
-        /* add image to the cache-history */
-        rstto_navigator_add_entry_to_history(navigator, next_entry);
-    }
-
-    /* for use with g_timeout_add() */
-    return FALSE;
+    return iter;
 }
 
-static gboolean
-rstto_navigator_preload_prev_img (RsttoNavigator *navigator)
-{
-    GList *prev = g_list_previous(navigator->file_iter);
-    /* wraparound case */
-    if (prev == NULL)
-    {
-        prev = g_list_last(navigator->file_list);
-    }
-    if (prev != NULL)
-    {
-        RsttoNavigatorEntry *prev_entry = prev->data;
-        rstto_navigator_entry_load_image(prev_entry, FALSE);
-
-        /* add image to the cache-history */
-        rstto_navigator_add_entry_to_history(navigator, prev_entry);
-    }
-    
-    /* for use with g_timeout_add() */
-    return FALSE;
-}
-
-
-void
-rstto_navigator_jump_first (RsttoNavigator *navigator)
-{
-    if(navigator->file_iter)
-    {
-        rstto_navigator_guard_history(navigator, navigator->file_iter->data);
-        navigator->old_position = rstto_navigator_get_position(navigator);
-    }
-    navigator->file_iter = g_list_first(navigator->file_list);
-    if(navigator->file_iter)
-    {
-        g_signal_emit(G_OBJECT(navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED], 0, 0, navigator->file_iter->data, NULL);
-
-        if (navigator->preload)
-        {
-            /* preload in both directions */
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_next_img, navigator);
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_prev_img, navigator);
-        }
-    }
-}
-
-void
-rstto_navigator_jump_forward (RsttoNavigator *navigator)
-{
-    if(navigator->file_iter)
-    {
-        rstto_navigator_guard_history(navigator, navigator->file_iter->data);
-        navigator->old_position = rstto_navigator_get_position(navigator);
-        navigator->file_iter = g_list_next(navigator->file_iter);
-    }
-    if(!navigator->file_iter)
-        navigator->file_iter = g_list_first(navigator->file_list);
-
-    if(navigator->file_iter)
-    {
-        g_signal_emit(G_OBJECT(navigator),
-                      rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                      0,
-                      g_list_position(navigator->file_list, navigator->file_iter),
-                      navigator->file_iter->data,
-                      NULL);
-
-        if (navigator->preload)
-        {
-            /* preload forwards */
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_next_img, navigator);
-        }
-    }
-    else
-    {
-        g_signal_emit(G_OBJECT(navigator),
-                      rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                      0,
-                      -1,
-                      NULL,
-                      NULL);
-
-    }
-}
-
-void
-rstto_navigator_jump_back (RsttoNavigator *navigator)
-{
-    if(navigator->file_iter)
-    {
-        rstto_navigator_guard_history(navigator, navigator->file_iter->data);
-        navigator->old_position = rstto_navigator_get_position(navigator);
-        navigator->file_iter = g_list_previous(navigator->file_iter);
-    }
-    if(!navigator->file_iter)
-        navigator->file_iter = g_list_last(navigator->file_list);
-
-    if(navigator->file_iter)
-    {
-        g_signal_emit(G_OBJECT(navigator),
-                      rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                      0,
-                      g_list_position(navigator->file_list, navigator->file_iter),
-                      navigator->file_iter->data,
-                      NULL);
-
-        if (navigator->preload)
-        {
-            /* preload backwards */
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_prev_img, navigator);
-        }
-    }
-}
-
-void
-rstto_navigator_jump_last (RsttoNavigator *navigator)
-{
-    if(navigator->file_iter)
-    {
-        rstto_navigator_guard_history(navigator, navigator->file_iter->data);
-        navigator->old_position = rstto_navigator_get_position(navigator);
-    }
-    navigator->file_iter = g_list_last(navigator->file_list);
-
-    if(navigator->file_iter)
-    {
-        g_signal_emit(G_OBJECT(navigator),
-                      rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                      0,
-                      g_list_position(navigator->file_list, navigator->file_iter),
-                      navigator->file_iter->data,
-                      NULL);
-
-        if (navigator->preload)
-        {
-            /* preload in both directions */
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_next_img, navigator);
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_prev_img, navigator);
-        }
-    }
-}
-
-void
-rstto_navigator_set_running (RsttoNavigator *navigator, gboolean running)
-{
-    if(!navigator->running)
-    {
-        navigator->running = running;
-        if(!navigator->id)
-        {
-            navigator->id = g_timeout_add(navigator->timeout, (GSourceFunc)cb_rstto_navigator_running, navigator);
-            if (navigator->preload)
-            {
-                /* preload forwards */
-                rstto_navigator_preload_next_img(navigator);
-            }
-        }
-    }
-    else
-    {
-        navigator->running = running;
-    }
-}
-
 gboolean
-rstto_navigator_is_running (RsttoNavigator *navigator)
+rstto_navigator_iter_next (RsttoNavigatorIter *iter)
 {
-    return navigator->running;
+    iter->data = g_list_next (iter->data);
 }
 
-RsttoNavigatorEntry *
-rstto_navigator_get_file (RsttoNavigator *navigator)
-{
-    if(navigator->file_iter)
-    {
-        return (RsttoNavigatorEntry *)(navigator->file_iter->data);
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-gint
-rstto_navigator_get_position(RsttoNavigator *navigator)
-{
-    return g_list_position(navigator->file_list, navigator->file_iter);
-}
-
-gint
-rstto_navigator_get_n_files (RsttoNavigator *navigator)
-{
-    return g_list_length(navigator->file_list);
-}
-
-RsttoNavigatorEntry *
-rstto_navigator_get_nth_file (RsttoNavigator *navigator, gint n)
-{
-    return g_list_nth_data(navigator->file_list, n);
-}
-
-gint
-rstto_navigator_add (RsttoNavigator *navigator, RsttoNavigatorEntry *entry, gboolean with_monitor)
-{
-    g_return_val_if_fail(navigator == entry->navigator, -1);
-
-    if (g_list_index(navigator->file_list, entry) ==  -1)
-    {
-        navigator->file_list = g_list_insert_sorted(navigator->file_list, entry, navigator->compare_func);
-        if (!navigator->file_iter)
-        {
-            navigator->file_iter = navigator->file_list;
-            if (navigator->busy == FALSE)
-            {
-                g_signal_emit(G_OBJECT(navigator),
-                          rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                          0,
-                          g_list_index(navigator->file_list, entry),
-                          entry,
-                          NULL);
-            }
-        }
-
-        if (with_monitor == TRUE)
-            entry->monitor_handle = thunar_vfs_monitor_add_file(navigator->monitor, entry->info->path, (ThunarVfsMonitorCallback)cb_rstto_navigator_entry_fs_event, entry);
-
-        if (navigator->busy == FALSE)
-        {
-            g_signal_emit(G_OBJECT(navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_NEW_ENTRY], 0, g_list_index(navigator->file_list, entry), entry, NULL);
-        }
-    }
-    return g_list_index(navigator->file_list, entry);
-}
-
-void
-rstto_navigator_remove (RsttoNavigator *navigator, RsttoNavigatorEntry *entry)
-{
-    if(navigator->file_iter)
-    {
-        if(navigator->file_iter->data == entry)
-        {
-            navigator->old_position = rstto_navigator_get_position(navigator);
-            navigator->file_iter = g_list_next(navigator->file_iter);
-
-            navigator->file_list = g_list_remove(navigator->file_list, entry);
-
-            if(!navigator->file_iter)
-                navigator->file_iter = g_list_first(navigator->file_list);
-
-            /* An item should not be able to exist several times inside the
-             * history, g_list_remove should suffice here
-             */
-            if (navigator->history)
-            {
-                navigator->history = g_list_remove (navigator->history, entry);
-            }
-
-            if (navigator->busy == FALSE)
-            {
-                g_signal_emit(G_OBJECT(navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_REMOVED], 0, entry, NULL);
-            }
-            if(g_list_length(navigator->file_list) == 0)
-            {
-                navigator->file_iter = NULL;
-                navigator->file_list = NULL;
-            }
-            if(navigator->file_iter)
-            {
-                if (navigator->busy == FALSE)
-                {
-                    g_signal_emit(G_OBJECT(navigator),
-                              rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                              0,
-                              g_list_position(navigator->file_list, navigator->file_iter),
-                              navigator->file_iter->data,
-                              NULL);
-                }
-            }
-            else
-            {
-                g_signal_emit(G_OBJECT(navigator),
-                              rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                              0,
-                              -1,
-                              NULL,
-                              NULL);
-
-            }
-            return;
-        }
-        if (g_list_find(navigator->history, entry))
-        {
-            navigator->history = g_list_remove(navigator->history, entry);
-        }
-    }
-    navigator->file_list = g_list_remove(navigator->file_list, entry);
-    if (entry->monitor_handle)
-    {
-        thunar_vfs_monitor_remove(navigator->monitor, entry->monitor_handle);
-    }
-    if(g_list_length(navigator->file_list) == 0)
-    {
-        navigator->file_iter = NULL;
-        navigator->file_list = NULL;
-    }
-}
-
-void
-rstto_navigator_clear (RsttoNavigator *navigator)
-{
-    if(navigator->file_list)
-    {
-        g_list_free(navigator->history);
-        g_list_foreach(navigator->file_list, (GFunc)rstto_navigator_entry_free, NULL);
-        navigator->file_list = NULL;
-        navigator->file_iter = NULL;
-        navigator->old_position = -1;
-        navigator->history = NULL;
-    }
-    g_signal_emit(G_OBJECT(navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED], 0, -1, NULL, NULL);
-    g_signal_emit(G_OBJECT(navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_REORDERED], 0, NULL);
-}
-
-void
-rstto_navigator_set_file_nr (RsttoNavigator *navigator, gint n)
-{
-    if(navigator->file_iter)
-    {
-        rstto_navigator_guard_history(navigator, navigator->file_iter->data);
-        navigator->old_position = rstto_navigator_get_position(navigator);
-    }
-    navigator->file_iter = g_list_nth(navigator->file_list, n);
-    if(navigator->file_iter)
-    {
-        g_signal_emit(G_OBJECT(navigator),
-                      rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                      0,
-                      g_list_position(navigator->file_list, navigator->file_iter),
-                      navigator->file_iter->data,
-                      NULL);
-    }
-}
-
-/* Callbacks */
-
-static gboolean
-cb_rstto_navigator_running(RsttoNavigator *navigator)
-{
-    if(navigator->running)
-    {
-        rstto_navigator_jump_forward(navigator);
-
-        if (navigator->preload)
-        {
-            /* preload forwards */
-            rstto_navigator_preload_next_img(navigator);
-        }
-    }
-    else
-    {
-        navigator->id = 0;
-    }
-    return navigator->running;
-}
-
-void
-rstto_navigator_set_timeout (RsttoNavigator *navigator, gint timeout)
-{
-    navigator->timeout = timeout;
-}
-
-void
-rstto_navigator_flip_entry(RsttoNavigator *navigator, RsttoNavigatorEntry *entry, gboolean horizontal)
-{
-    if (horizontal)
-    {
-        entry->h_flipped = !entry->h_flipped;
-    }
-    else
-    {
-        entry->v_flipped = !entry->v_flipped;
-    }
-}
-
-
-RsttoNavigatorEntry *
-rstto_navigator_entry_new (RsttoNavigator *navigator, ThunarVfsInfo *info)
-{
-    RsttoNavigatorEntry *entry = NULL;
-    ExifEntry *exifentry = NULL;
-    gchar *filename = thunar_vfs_path_dup_string(info->path);
-    if(filename)
-    {
-        GList *iter = g_list_find_custom(navigator->file_list, info->path, (GCompareFunc)cb_rstto_navigator_entry_path_compare_func);
-        if (iter)
-            entry = iter->data;
-
-        if (entry == NULL)
-        {
-            entry = g_new0(RsttoNavigatorEntry, 1);
-
-            entry->info = info;
-            entry->exif_data = exif_data_new_from_file(filename);
-            entry->navigator = navigator;
-            entry->animation = NULL;
-            
-            if (entry->exif_data) {
-                exifentry = exif_data_get_entry(entry->exif_data, EXIF_TAG_ORIENTATION);
-            }
-            if (exifentry)
-            {
-                gchar *val = g_new0(gchar, 20);
-                exif_entry_get_value(exifentry, val, 20);
-                if (!strcmp(val, "top - left"))
-                {
-                    entry->v_flipped = FALSE;
-                    entry->h_flipped = FALSE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_NONE;
-                }
-                if (!strcmp(val, "top - right"))
-                {
-                    entry->v_flipped = FALSE;
-                    entry->h_flipped = TRUE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_NONE;
-                }
-                if (!strcmp(val, "bottom - left"))
-                {
-                    entry->v_flipped = TRUE;
-                    entry->h_flipped = FALSE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_NONE;
-                }
-                if (!strcmp(val, "bottom - right"))
-                {
-                    entry->v_flipped = FALSE;
-                    entry->h_flipped = FALSE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_UPSIDEDOWN;
-                }
-                if (!strcmp(val, "right - top"))
-                {
-                    entry->v_flipped = FALSE;
-                    entry->h_flipped = FALSE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_CLOCKWISE;
-                }
-                if (!strcmp(val, "right - bottom"))
-                {
-                    entry->v_flipped = FALSE;
-                    entry->h_flipped = TRUE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE;
-                }
-                if (!strcmp(val, "left - top"))
-                {
-                    entry->v_flipped = FALSE;
-                    entry->h_flipped = TRUE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_CLOCKWISE;
-                }
-                if (!strcmp(val, "left - bottom"))
-                {
-                    entry->v_flipped = FALSE;
-                    entry->h_flipped = FALSE;
-                    entry->rotation = GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE;
-                }
-                g_free(val);
-            }
-        }
-
-        g_free(filename);
-    }
-    return entry;
-}
-
-ThunarVfsInfo *
-rstto_navigator_entry_get_info (RsttoNavigatorEntry *entry)
-{
-    return entry->info;
-}
-
-GdkPixbufRotation
-rstto_navigator_entry_get_rotation (RsttoNavigatorEntry *entry)
-{
-    return entry->rotation;
-}
-
 gboolean
-rstto_navigator_entry_get_flip (RsttoNavigatorEntry *entry, gboolean horizontal)
+rstto_navigator_iter_previous (RsttoNavigatorIter *iter)
 {
-    if (horizontal)
-    {
-        return entry->h_flipped;
-    }
-    else
-    {
-        return entry->v_flipped;
-    }
+    iter->data = g_list_previous (iter->data);
 }
 
-static void
-rstto_navigator_entry_clear (RsttoNavigatorEntry *nav_entry)
+RsttoImage *
+rstto_navigator_iter_get_image (RsttoNavigatorIter *iter)
 {
-    if(nav_entry->thumb)
-    {
-        gdk_pixbuf_unref(nav_entry->thumb);
-        nav_entry->thumb = NULL;
-    }
-
-    if(nav_entry->io_channel)
-    {
-        g_source_remove(nav_entry->io_source_id);
-        g_io_channel_unref(nav_entry->io_channel);
-        nav_entry->io_channel = NULL;
-        nav_entry->io_source_id = 0;
-    }
-
-    if (nav_entry->timeout_id)
-    {
-        g_source_remove(nav_entry->timeout_id);
-        nav_entry->timeout_id = 0;
-    }
-
-    if(nav_entry->loader)
-    {
-        g_signal_handlers_disconnect_by_func(nav_entry->loader , cb_rstto_navigator_entry_area_prepared, nav_entry);
-        gdk_pixbuf_loader_close(nav_entry->loader, NULL);
-    }
-
-    if(nav_entry->animation)
-    {
-        g_object_unref(nav_entry->animation);
-        nav_entry->animation = NULL;
-    }
-    if(nav_entry->src_pixbuf)
-    {
-        gdk_pixbuf_unref(nav_entry->src_pixbuf);
-        nav_entry->src_pixbuf = NULL;
-    }
-
+    if (iter->data)
+        return RSTTO_IMAGE (iter->data->data);
+    return NULL;
 }
-
-void
-rstto_navigator_entry_free(RsttoNavigatorEntry *nav_entry)
-{
-    rstto_navigator_entry_clear (nav_entry);
-    thunar_vfs_info_unref(nav_entry->info);
-    g_free(nav_entry);
-}
-
-GdkPixbuf *
-rstto_navigator_entry_get_thumb(RsttoNavigatorEntry *entry, gint size)
-{
-    ThunarVfsPath *home_path = thunar_vfs_path_get_for_home();
-    ThunarVfsPath *thumbnail_path = thunar_vfs_path_relative (home_path, ".thumbnails");
-    if(entry->thumb)    
-    {
-        if(!(gdk_pixbuf_get_width(entry->thumb) == size || gdk_pixbuf_get_height(entry->thumb) == size))
-        {
-            /* TODO: rebuild thumbnail */
-        }
-    }
-    else
-    {
-        ThunarVfsInfo *info = rstto_navigator_entry_get_info(entry);
-        gchar *thumbnail = thunar_vfs_thumb_factory_lookup_thumbnail(entry->navigator->factory, info);
-        if (thumbnail == NULL)
-        {
-            if (!thunar_vfs_path_is_ancestor (info->path, thumbnail_path))
-            {
-                GdkPixbuf *pixbuf = thunar_vfs_thumb_factory_generate_thumbnail(entry->navigator->factory, info);
-                if (pixbuf != NULL)
-                {
-                    if (!thunar_vfs_thumb_factory_store_thumbnail(entry->navigator->factory, pixbuf, info, NULL))
-                    {
-                        g_critical("Storing thumbnail failed");
-                    }
-
-                    gint width = gdk_pixbuf_get_width(pixbuf);
-                    gint height = gdk_pixbuf_get_height(pixbuf);
-
-                    if (width > height)
-                    {
-                        entry->thumb = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
-                                                      gdk_pixbuf_get_has_alpha(pixbuf),
-                                                      gdk_pixbuf_get_bits_per_sample(pixbuf),
-                                                      size,
-                                                      height*size/width);
-                    }
-                    else
-                    {
-                        entry->thumb = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
-                                                      gdk_pixbuf_get_has_alpha(pixbuf),
-                                                      gdk_pixbuf_get_bits_per_sample(pixbuf),
-                                                      width*size/height,
-                                                      size);
-                    }
-                    gdk_pixbuf_scale(pixbuf, entry->thumb,
-                                     0, 0, 
-                                     gdk_pixbuf_get_width(entry->thumb),
-                                     gdk_pixbuf_get_height(entry->thumb),
-                                     0, 0,
-                                     ((gdouble)gdk_pixbuf_get_width(entry->thumb)) / (gdouble)width,
-                                     ((gdouble)gdk_pixbuf_get_height(entry->thumb)) / (gdouble)height,
-                                     GDK_INTERP_BILINEAR);
-                }
-                else
-                {
-                    thumbnail = thunar_vfs_path_dup_string(info->path);
-                    entry->thumb = gdk_pixbuf_new_from_file_at_scale(thumbnail, size, size, TRUE, NULL);
-                    g_free(thumbnail);
-                }
-            }
-            else
-            {
-                GtkIconTheme *theme = gtk_icon_theme_get_default();
-                entry->thumb = gtk_icon_theme_load_icon (theme, thunar_vfs_mime_info_lookup_icon_name (info->mime_info, theme), size, 0, NULL);
-            }
-        }
-        else
-        {
-            entry->thumb = gdk_pixbuf_new_from_file_at_scale(thumbnail, size, size, TRUE, NULL);
-            g_free(thumbnail);
-        }
-    }
-    return entry->thumb;
-}
-
-gint
-rstto_navigator_get_old_position (RsttoNavigator *navigator)
-{
-    return navigator->old_position;
-}
-
-gdouble
-rstto_navigator_entry_get_scale (RsttoNavigatorEntry *entry)
-{
-    return entry->scale;
-}
-
-void
-rstto_navigator_entry_set_scale (RsttoNavigatorEntry *entry, gdouble scale)
-{
-    if (scale == 0.0)
-    {
-        entry->scale = scale;
-        return;
-    }
-    /* Max scale 1600% */
-    if (scale > 16)
-    {
-        scale = 16;
-    }
-    /* Min scale 5% */
-    if (scale < 0.05)
-    {
-        scale = 0.05;
-    }
-    entry->scale = scale;
-}
-
-gboolean
-rstto_navigator_entry_get_fit_to_screen (RsttoNavigatorEntry *entry)
-{
-    return entry->fit_to_screen;
-}
-
-void
-rstto_navigator_entry_set_fit_to_screen (RsttoNavigatorEntry *entry, gboolean fts)
-{
-    entry->fit_to_screen = fts;
-}
-
-void
-rstto_navigator_entry_set_rotation (RsttoNavigatorEntry *entry, GdkPixbufRotation rotation)
-{
-    GdkPixbuf *pixbuf = entry->src_pixbuf;
-    if (pixbuf)
-    {
-        entry->src_pixbuf = gdk_pixbuf_rotate_simple(pixbuf, (360+(rotation-entry->rotation))%360);
-    }
-    entry->rotation = rotation;
-    entry->orientation_changed = TRUE;
-    g_signal_emit(G_OBJECT(entry->navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED], 0, entry, NULL);
-}
-
-
-ExifData *
-rstto_navigator_entry_get_exif_data (RsttoNavigatorEntry *entry)
-{
-    return entry->exif_data;
-}
-
-
-GdkPixbufLoader *
-rstto_navigator_entry_get_pixbuf_loader (RsttoNavigatorEntry *entry)
-{
-    if (!entry->loader)
-    {
-        entry->loader = gdk_pixbuf_loader_new();
-    }
-    return entry->loader;
-}
-
-GdkPixbuf *
-rstto_navigator_entry_get_pixbuf (RsttoNavigatorEntry *entry)
-{
-    return entry->src_pixbuf;
-}
-
-guint64
-rstto_navigator_entry_get_size (RsttoNavigatorEntry *entry)
-{
-    guint64 size = 0;
-    
-    gint width, height, n_channels;
-
-    if (entry->src_pixbuf)
-    {
-        width = gdk_pixbuf_get_width(entry->src_pixbuf);
-        height = gdk_pixbuf_get_height(entry->src_pixbuf);
-
-        n_channels = gdk_pixbuf_get_n_channels(entry->src_pixbuf);
-
-        size += (guint64) width * height * n_channels;
-    }
-    if (entry->thumb)
-    {
-        width = gdk_pixbuf_get_width(entry->thumb);
-        height = gdk_pixbuf_get_height(entry->thumb);
-
-        n_channels = gdk_pixbuf_get_n_channels(entry->thumb);
-        size += (guint64) width * height * n_channels;
-    }
-    
-    size += (guint64)sizeof (RsttoNavigatorEntry);
-
-    return size;
-}
-
-gboolean
-rstto_navigator_entry_get_orientation_changed (RsttoNavigatorEntry *entry)
-{
-    return entry->orientation_changed;
-}
-
-gboolean
-rstto_navigator_entry_load_image (RsttoNavigatorEntry *entry, gboolean empty_cache)
-{
-    g_return_val_if_fail(entry != NULL, FALSE);
-    gchar *path = NULL;
-
-    if (entry->io_channel)
-    {
-        return FALSE;
-    }
-    if ((entry->loader == NULL) && ((empty_cache == TRUE ) || entry->src_pixbuf == NULL))
-    {
-        if (entry->src_pixbuf)
-        {
-            gdk_pixbuf_unref(entry->src_pixbuf);
-            entry->src_pixbuf = NULL;
-        }
-        entry->loader = gdk_pixbuf_loader_new();
-
-        g_signal_connect(entry->loader, "area-prepared", G_CALLBACK(cb_rstto_navigator_entry_area_prepared), entry);
-        /*g_signal_connect(entry->loader, "area-updated", G_CALLBACK(cb_rstto_navigator_entry_area_updated), viewer);*/
-        g_signal_connect(entry->loader, "closed", G_CALLBACK(cb_rstto_navigator_entry_closed), entry);
-
-        path = thunar_vfs_path_dup_string(entry->info->path);
-
-        entry->io_channel = g_io_channel_new_file(path, "r", NULL);
-
-        g_io_channel_set_encoding(entry->io_channel, NULL, NULL);
-        entry->io_source_id = g_io_add_watch(entry->io_channel, G_IO_IN | G_IO_PRI, (GIOFunc)cb_rstto_navigator_entry_read_file, entry);
-        g_free(path);
-    }
-    else
-    {
-        if (entry->src_pixbuf)
-        {
-            g_signal_emit(G_OBJECT(entry->navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED], 0, entry, NULL);
-        }
-    }
-
-    return TRUE;
-}
-
-
-static gboolean
-cb_rstto_navigator_entry_read_file(GIOChannel *io_channel, GIOCondition cond, RsttoNavigatorEntry *entry)
-{
-    gchar buffer[1024];
-    gsize bytes_read = 0;
-    GError *error = NULL;
-    GIOStatus status;
-
-    g_return_val_if_fail(io_channel == entry->io_channel, FALSE);
-
-    if (entry->loader)
-    {
-
-        status = g_io_channel_read_chars(io_channel, buffer, 1024, &bytes_read,  &error);
-
-        switch (status)
-        {
-            case G_IO_STATUS_NORMAL:
-                if(gdk_pixbuf_loader_write(entry->loader, (const guchar *)buffer, bytes_read, NULL) == FALSE)
-                {
-                    g_io_channel_unref(io_channel);
-                    entry->io_channel = NULL;
-                    entry->io_source_id = 0;
-                    return FALSE;
-                }
-                return TRUE;
-                break;
-            case G_IO_STATUS_EOF:
-                gdk_pixbuf_loader_write(entry->loader, (const guchar *)buffer, bytes_read, NULL);
-                gdk_pixbuf_loader_close(entry->loader, NULL);
-                g_io_channel_unref(io_channel);
-                entry->io_channel = NULL;
-                entry->io_source_id = 0;
-                return FALSE;
-                break;
-            case G_IO_STATUS_ERROR:
-                if (entry->loader)
-                {
-                    gdk_pixbuf_loader_close(entry->loader, NULL);
-                }
-                g_io_channel_unref(io_channel);
-                entry->io_channel = NULL;
-                entry->io_source_id = 0;
-                return FALSE;
-                break;
-            case G_IO_STATUS_AGAIN:
-                return TRUE;
-                break;
-        }
-    }
-    g_io_channel_unref(io_channel);
-    entry->io_channel = NULL;
-    entry->io_source_id = 0;
-    return FALSE;
-}
-
-static void
-cb_rstto_navigator_entry_area_prepared (GdkPixbufLoader *loader, RsttoNavigatorEntry *entry)
-{
-    entry->animation = gdk_pixbuf_loader_get_animation(loader);
-    entry->iter = gdk_pixbuf_animation_get_iter(entry->animation, NULL);
-    if (entry->src_pixbuf)
-    {
-        gdk_pixbuf_unref(entry->src_pixbuf);
-        entry->src_pixbuf = NULL;
-    }
-
-    g_object_ref (entry->animation);
-
-    gint time = gdk_pixbuf_animation_iter_get_delay_time(entry->iter);
-
-    if (time != -1)
-    {
-        /* fix borked stuff */
-        if (time == 0)
-        {
-            g_warning("timeout == 0: defaulting to 40ms");
-            time = 40;
-        }
-
-        entry->timeout_id = g_timeout_add(time, (GSourceFunc)cb_rstto_navigator_entry_update_image, entry);
-    }   
-    else
-    {
-        entry->iter = NULL;
-    }
-    g_signal_emit(G_OBJECT(entry->navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED], 0, entry, NULL);
-}
-
-static void
-cb_rstto_navigator_entry_closed (GdkPixbufLoader *loader, RsttoNavigatorEntry *entry)
-{
-    GdkPixbuf *pixbuf = NULL;
-
-    if (entry->src_pixbuf)
-    {
-        gdk_pixbuf_unref(entry->src_pixbuf);
-        entry->src_pixbuf = NULL;
-    }
-
-    if (entry->iter)
-    {
-        pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(entry->iter);
-    }
-    else
-    {
-        if (entry->loader)
-        {
-            pixbuf = gdk_pixbuf_loader_get_pixbuf(entry->loader);
-        }
-    }
-
-    if (entry->loader == loader)
-    {
-        g_object_unref(entry->loader);
-        entry->loader = NULL;
-    }
-
-   
-    if (pixbuf != NULL)
-    {
-        entry->src_pixbuf = gdk_pixbuf_rotate_simple(pixbuf, rstto_navigator_entry_get_rotation(entry));
-        gdk_pixbuf_unref(pixbuf);
-        pixbuf = NULL;
-        if (rstto_navigator_entry_get_flip(entry, FALSE))
-        {
-            pixbuf = entry->src_pixbuf;
-            entry->src_pixbuf = gdk_pixbuf_flip(pixbuf, FALSE);
-            gdk_pixbuf_unref(pixbuf);
-            pixbuf = NULL;
-        }
-
-        if (rstto_navigator_entry_get_flip(entry, TRUE))
-        {
-            pixbuf = entry->src_pixbuf;
-            entry->src_pixbuf = gdk_pixbuf_flip(pixbuf, TRUE);
-            gdk_pixbuf_unref(pixbuf);
-            pixbuf = NULL;
-        }
-        g_signal_emit(G_OBJECT(entry->navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED], 0, entry, NULL);
-    }
-}
-
-static gboolean
-cb_rstto_navigator_entry_update_image (RsttoNavigatorEntry *entry)
-{
-    GdkPixbuf *src_pixbuf = NULL;
-
-    if (entry->iter)
-    {
-        if(gdk_pixbuf_animation_iter_advance(entry->iter, NULL))
-        {
-            /* Cleanup old image */
-            if (entry->src_pixbuf)
-            {
-                gdk_pixbuf_unref(entry->src_pixbuf);
-                entry->src_pixbuf = NULL;
-            }
-            entry->src_pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(entry->iter);
-            src_pixbuf = entry->src_pixbuf;
-
-            if (src_pixbuf)
-            {
-                entry->src_pixbuf = gdk_pixbuf_rotate_simple(src_pixbuf, rstto_navigator_entry_get_rotation(entry));
-                if (rstto_navigator_entry_get_flip(entry, FALSE))
-                {
-                    src_pixbuf = entry->src_pixbuf;
-                    entry->src_pixbuf = gdk_pixbuf_flip(src_pixbuf, FALSE);
-                    gdk_pixbuf_unref(src_pixbuf);
-                }
-
-                if (rstto_navigator_entry_get_flip(entry, TRUE))
-                {
-                    src_pixbuf = entry->src_pixbuf;
-                    entry->src_pixbuf = gdk_pixbuf_flip(src_pixbuf, TRUE);
-                    gdk_pixbuf_unref(src_pixbuf);
-                }
-            }
-        }
-
-        gint time = gdk_pixbuf_animation_iter_get_delay_time(entry->iter);
-        if (time != -1)
-        {
-            if (time == 0)
-            {
-                g_warning("timeout == 0: defaulting to 40ms");
-                time = 40;
-            }
-            entry->timeout_id = g_timeout_add(time, (GSourceFunc)cb_rstto_navigator_entry_update_image, entry);
-        }
-        g_signal_emit(G_OBJECT(entry->navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED], 0, entry, NULL);
-
-        return FALSE;
-    }
-    return TRUE;
-}
-
-static void
-cb_rstto_navigator_entry_fs_event (ThunarVfsMonitor *monitor,
-                                   ThunarVfsMonitorHandle *handl,
-                                   ThunarVfsMonitorEvent event,
-                                   ThunarVfsPath *handle_path,
-                                   ThunarVfsPath *event_path,
-                                   RsttoNavigatorEntry *entry)
-{
-    switch (event)
-    {
-        case THUNAR_VFS_MONITOR_EVENT_CHANGED:
-            rstto_navigator_entry_load_image (entry, TRUE);
-            break;
-        case THUNAR_VFS_MONITOR_EVENT_CREATED:
-            break;
-        case THUNAR_VFS_MONITOR_EVENT_DELETED:
-            rstto_navigator_remove(entry->navigator, entry);
-            rstto_navigator_entry_free(entry);
-            break;
-        default:
-            break;
-    }
-}
-
-static void
-cb_rstto_navigator_fs_event (ThunarVfsMonitor *monitor,
-                             ThunarVfsMonitorHandle *handl,
-                             ThunarVfsMonitorEvent event,
-                             ThunarVfsPath *handle_path,
-                             ThunarVfsPath *event_path,
-                             RsttoNavigator *nav)
-{
-    RsttoNavigatorEntry *entry = NULL;
-    GList *iter = g_list_find_custom(nav->file_list, event_path, (GCompareFunc)cb_rstto_navigator_entry_path_compare_func);
-    if (iter != NULL)
-        entry = iter->data;
-
-    switch (event)
-    {
-        case THUNAR_VFS_MONITOR_EVENT_CHANGED:
-            if(entry)
-            {
-                rstto_navigator_entry_load_image (entry, TRUE);
-            }
-            break;
-        case THUNAR_VFS_MONITOR_EVENT_CREATED:
-            if (entry)
-            {
-                g_critical("File created... yet it is already here");
-                rstto_navigator_remove(entry->navigator, entry);
-                rstto_navigator_entry_free(entry);
-            }
-
-            ThunarVfsInfo *info = thunar_vfs_info_new_for_path(event_path, NULL);
-            if (info)
-            {
-                gchar *file_media = thunar_vfs_mime_info_get_media(info->mime_info);
-                if(!strcmp(file_media, "image"))
-                {
-                    entry = rstto_navigator_entry_new(nav, info);
-                    rstto_navigator_add (nav, entry, FALSE);
-                }
-                g_free(file_media);
-            }
-            break;
-        case THUNAR_VFS_MONITOR_EVENT_DELETED:
-            if(entry)
-            {
-                rstto_navigator_remove(entry->navigator, entry);
-                rstto_navigator_entry_free(entry);
-            }
-            break;
-        default:
-            break;
-    }
-}
-
-void
-rstto_navigator_entry_select (RsttoNavigatorEntry *entry)
-{
-    RsttoNavigator *navigator = entry->navigator;
-    GList *iter = g_list_find (navigator->file_list, entry);
-    if (iter)
-    {
-        if(navigator->file_iter)
-        {
-            rstto_navigator_guard_history(navigator, navigator->file_iter->data);
-            navigator->old_position = rstto_navigator_get_position(navigator);
-        }
-
-        navigator->file_iter = iter;
-
-        if (navigator->busy  == FALSE)
-        {
-            g_signal_emit(G_OBJECT(navigator),
-                      rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_ITER_CHANGED],
-                      0,
-                      g_list_position(navigator->file_list, navigator->file_iter),
-                      navigator->file_iter->data,
-                      NULL);
-        }
-
-        if (navigator->preload)
-        {
-            /* preload in both directions */
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_next_img, navigator);
-            g_timeout_add(500, (GSourceFunc)rstto_navigator_preload_prev_img, navigator);
-
-        }
-    }
-
-}
-
-guint64
-rstto_navigator_get_max_history_size (RsttoNavigator *navigator)
-{
-    return navigator->max_history;
-}
-
-
-
-gint
-rstto_navigator_entry_get_position(RsttoNavigatorEntry *entry)
-{
-    RsttoNavigator *navigator = entry->navigator;
-    GList *iter = g_list_find (navigator->file_list, entry);
-    if (iter)
-    {
-        return g_list_position(navigator->file_list, iter);
-    }
-    return -1;
-}
-
-void
-rstto_navigator_set_max_history_size(RsttoNavigator *nav, guint64 size)
-{
-    nav->max_history = size;
-}
-
-void
-rstto_navigator_set_monitor_handle_for_dir(RsttoNavigator *nav, ThunarVfsPath *dir_path)
-{
-    if (nav->monitor_handle)
-    {
-        thunar_vfs_monitor_remove(nav->monitor, nav->monitor_handle);
-        nav->monitor_handle = NULL;
-    }
-    
-    if (dir_path)
-    {
-        nav->monitor_handle = thunar_vfs_monitor_add_directory(nav->monitor, dir_path, (ThunarVfsMonitorCallback)cb_rstto_navigator_fs_event, nav);
-    }
-}
-
-static gint
-cb_rstto_navigator_entry_path_compare_func(RsttoNavigatorEntry *entry, ThunarVfsPath *path)
-{
-    if (thunar_vfs_path_equal(entry->info->path, path) == TRUE)
-    {
-        return 0;
-    }
-    return 1;
-}
-
-gboolean
-rstto_navigator_entry_is_selected(RsttoNavigatorEntry *entry)
-{
-    g_return_val_if_fail(RSTTO_IS_NAVIGATOR(entry->navigator), FALSE);
-    g_return_val_if_fail((entry->navigator->file_iter != NULL), FALSE);
-
-    if (entry == entry->navigator->file_iter->data)
-        return TRUE;
-    else
-        return FALSE;
-}
-
-gboolean
-rstto_navigator_open_file(RsttoNavigator *navigator, const gchar *path, gboolean open_folder, GError **error)
-{
-    ThunarVfsInfo *vfs_info = NULL;
-    ThunarVfsPath *vfs_path = thunar_vfs_path_new(path, error);
-
-    gchar *file_media = NULL;
-    gchar *file_uri = NULL;
-
-
-    if (vfs_path == NULL)
-    {
-        return FALSE;
-    }
-
-    vfs_info = thunar_vfs_info_new_for_path(vfs_path, error);
-    if (vfs_info == NULL)
-    {
-        thunar_vfs_path_unref(vfs_path);
-        return FALSE;
-    }
-
-    if(!strcmp(thunar_vfs_mime_info_get_name(vfs_info->mime_info), 
-                "inode/directory"))
-    {
-        g_set_error(error,
-                    g_quark_from_static_string(
-                            "Path refers to folder"),
-                    G_FILE_ERROR_ISDIR,
-                    "Path refers to directory\n"
-                    "Use rstto_navigator_open_folder instead.");
-        return FALSE;
-    }
-
-    file_media = thunar_vfs_mime_info_get_media(vfs_info->mime_info);
-    if(!strcmp(file_media, "image"))
-    {
-        RsttoNavigatorEntry *entry = rstto_navigator_entry_new(navigator, vfs_info);
-        rstto_navigator_add (navigator, entry, TRUE);
-
-        if (open_folder == TRUE)
-        {
-            ThunarVfsPath *parent_vfs_path = thunar_vfs_path_get_parent(vfs_path);
-            thunar_vfs_path_ref(parent_vfs_path);
-
-            gchar *parent_path = thunar_vfs_path_dup_string(parent_vfs_path);
-
-            if(rstto_navigator_open_folder(navigator, parent_path, FALSE, error) == FALSE)
-            {
-                g_free(parent_path);
-                thunar_vfs_path_unref(parent_vfs_path);
-                return FALSE;
-            }
-
-            g_free(parent_path);
-            thunar_vfs_path_unref(parent_vfs_path);
-
-            rstto_navigator_entry_select(entry);
-        }
-    }
-
-    file_uri = thunar_vfs_path_dup_uri(vfs_path);
-    gtk_recent_manager_add_item(navigator->manager, file_uri);
-    g_free(file_uri);
-
-    g_free(file_media);
-    return TRUE;
-}
-
-gboolean
-rstto_navigator_open_folder(RsttoNavigator *navigator, const gchar *path, gboolean clear, GError **error)
-{
-    ThunarVfsInfo *vfs_info = NULL;
-    ThunarVfsPath *vfs_path = thunar_vfs_path_new(path, error);
-    GDir *dir = NULL;
-    gchar *dir_path = NULL;
-    gchar *dir_uri = NULL;
-
-    rstto_navigator_set_busy(navigator, TRUE);
-
-
-    if (vfs_path == NULL)
-    {
-        return FALSE;
-    }
-
-    vfs_info = thunar_vfs_info_new_for_path(vfs_path, error);
-    if (vfs_info == NULL)
-    {
-        thunar_vfs_path_unref(vfs_path);
-        return FALSE;
-    }
-    
-    if(strcmp(thunar_vfs_mime_info_get_name(vfs_info->mime_info),
-                "inode/directory"))
-    {
-        g_set_error(error,
-                    g_quark_from_static_string(
-                            "Path does not refer to folder"),
-                    G_FILE_ERROR_ISDIR,
-                    "Path does not refer to directory\n"
-                    "Use rstto_navigator_open_file instead.");
-        return FALSE;
-    }
-
-    dir_path = thunar_vfs_path_dup_string(vfs_path);
-
-    g_object_add_weak_pointer(G_OBJECT(navigator), (gpointer)navigator);
-
-    dir = g_dir_open(dir_path, 0, NULL);
-
-    dir_uri = thunar_vfs_path_dup_uri(vfs_path);
-
-    gtk_recent_manager_add_item(navigator->manager, dir_uri);
-
-
-    {
-        if (clear == TRUE)
-        {
-            rstto_navigator_clear(navigator);
-        }
-        const gchar *filename = g_dir_read_name(dir);
-        ThunarVfsPath *file_vfs_path = NULL;
-        ThunarVfsInfo *file_vfs_info = NULL;
-        gchar *file_media;
-        gchar *path_name;
-
-        while (filename)
-        {
-            path_name = g_strconcat(dir_path,  "/", filename, NULL);
-            file_vfs_path = thunar_vfs_path_new(path_name, NULL);
-
-            if (file_vfs_path)
-            {
-                file_vfs_info = thunar_vfs_info_new_for_path(file_vfs_path, NULL);
-                file_media = thunar_vfs_mime_info_get_media(file_vfs_info->mime_info);
-
-                if (navigator == NULL)
-                {
-                    g_free(file_media);
-                    thunar_vfs_path_unref(file_vfs_path);
-                    return FALSE;
-                }
-
-                if(!strcmp(file_media, "image"))
-                {
-                    RsttoNavigatorEntry *entry = rstto_navigator_entry_new(navigator, file_vfs_info);
-                    rstto_navigator_add (navigator, entry, FALSE);
-                }
-
-                g_free(file_media);
-                thunar_vfs_path_unref(file_vfs_path);
-                while (gtk_events_pending())
-                {
-                    gtk_main_iteration();
-                }
-            }
-            g_free(path_name);
-            filename = g_dir_read_name(dir);
-        }
-    }
-
-    g_free(dir_uri);
-    g_free(dir_path);
-    g_object_remove_weak_pointer(G_OBJECT(navigator), (gpointer)navigator);
-    rstto_navigator_set_busy(navigator, FALSE);
-    return TRUE;
-}
-
-static void
-rstto_navigator_set_busy (RsttoNavigator *navigator, gboolean busy)
-{
-    navigator->busy = busy;
-    if (busy == FALSE)
-    {
-        g_signal_emit(G_OBJECT(navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_REORDERED], 0, NULL);
-    }
-}

Modified: ristretto/branches/ristretto-gio/src/navigator.h
===================================================================
--- ristretto/trunk/src/navigator.h	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/navigator.h	2009-01-05 23:15:14 UTC (rev 6407)
@@ -39,34 +39,13 @@
         G_TYPE_CHECK_CLASS_TYPE ((klass), \
                 RSTTO_TYPE_NAVIGATOR()))
 
-typedef struct _RsttoNavigatorEntry RsttoNavigatorEntry;
-
+typedef struct _RsttoNavigatorPriv RsttoNavigatorPriv;
 typedef struct _RsttoNavigator RsttoNavigator;
 
 struct _RsttoNavigator
 {
     GObject                parent;
-    GtkRecentManager      *manager;
-    ThunarVfsMonitor      *monitor;
-    ThunarVfsMonitorHandle *monitor_handle;
-
-    ThunarVfsThumbFactory *factory;
-
-    ThunarVfsPath         *path;
-    GCompareFunc           compare_func;
-    GList                 *file_list;
-    GList                 *file_iter;
-    GList                 *history;
-    guint64                max_history;
-
-    gboolean               preload;
-
-    gint                   old_position;
-    gboolean               running;
-    gint                   timeout;
-    gint                   id;
-
-    gboolean               busy;
+    RsttoNavigatorPriv    *priv;
 };
 
 typedef struct _RsttoNavigatorClass RsttoNavigatorClass;
@@ -75,102 +54,22 @@
     GObjectClass      parent_class;
 };
 
-GType      rstto_navigator_get_type ();
+typedef struct _RsttoNavigatorIter RsttoNavigatorIter;
 
-RsttoNavigator *
-rstto_navigator_new (GtkRecentManager *recent_manager);
 
-void       rstto_navigator_jump_first (RsttoNavigator *navigator);
-void       rstto_navigator_jump_forward (RsttoNavigator *navigator);
-void       rstto_navigator_jump_back (RsttoNavigator *navigator);
-void       rstto_navigator_jump_last (RsttoNavigator *navigator);
+GType           rstto_navigator_get_type ();
+RsttoNavigator *rstto_navigator_new ();
 
-void       rstto_navigator_set_running (RsttoNavigator *navigator,
-                                        gboolean running);
-gboolean   rstto_navigator_is_running (RsttoNavigator *navigator);
-void
-rstto_navigator_set_timeout (RsttoNavigator *nav, gint);
+void rstto_navigator_add_file (RsttoNavigator *navigator, GFile *file);
+RsttoNavigatorIter *rstto_navigator_get_iter (RsttoNavigator *navigator);
 
 
-RsttoNavigatorEntry *
-rstto_navigator_get_file (RsttoNavigator *navigator);
-gint
-rstto_navigator_get_position(RsttoNavigator *navigator);
-gint
-rstto_navigator_get_old_position(RsttoNavigator *navigator);
+/** Iter functions */
+RsttoImage *rstto_navigator_iter_get_image (RsttoNavigatorIter *iter);
+gboolean rstto_navigator_iter_previous (RsttoNavigatorIter *iter);
+gboolean rstto_navigator_iter_next (RsttoNavigatorIter *iter);
 
-gint
-rstto_navigator_add (RsttoNavigator *navigator, RsttoNavigatorEntry *entry, gboolean with_monitor);
-void
-rstto_navigator_remove (RsttoNavigator *navigator, RsttoNavigatorEntry *entry);
-gint
-rstto_navigator_get_n_files (RsttoNavigator *navigator);
-RsttoNavigatorEntry *
-rstto_navigator_get_nth_file (RsttoNavigator *navigator, gint n);
-void
-rstto_navigator_set_file_nr (RsttoNavigator *navigator, gint n);
-void
-rstto_navigator_clear (RsttoNavigator *navigator);
 
-RsttoNavigatorEntry *
-rstto_navigator_entry_new (RsttoNavigator *, ThunarVfsInfo *info);
-void
-rstto_navigator_entry_free(RsttoNavigatorEntry *nav_entry);
-ThunarVfsInfo *
-rstto_navigator_entry_get_info (RsttoNavigatorEntry *entry);
-gboolean
-rstto_navigator_entry_get_fit_to_screen (RsttoNavigatorEntry *entry);
-gdouble
-rstto_navigator_entry_get_scale (RsttoNavigatorEntry *entry);
-void
-rstto_navigator_entry_set_fit_to_screen (RsttoNavigatorEntry *entry, gboolean);
-void
-rstto_navigator_entry_set_scale (RsttoNavigatorEntry *entry, gdouble);
-void
-rstto_navigator_entry_set_rotation (RsttoNavigatorEntry *entry, GdkPixbufRotation rotation);
-gint
-rstto_navigator_entry_get_position(RsttoNavigatorEntry *entry);
-
-GdkPixbufRotation
-rstto_navigator_entry_get_rotation (RsttoNavigatorEntry *entry);
-gboolean
-rstto_navigator_entry_get_flip (RsttoNavigatorEntry *entry, gboolean horizontal);
-void
-rstto_navigator_flip_entry(RsttoNavigator *navigator, RsttoNavigatorEntry *entry, gboolean horizontal);
-GdkPixbuf *
-rstto_navigator_entry_get_thumb(RsttoNavigatorEntry *entry, gint size);
-ExifData *
-rstto_navigator_entry_get_exif_data (RsttoNavigatorEntry *entry);
-
-GdkPixbufLoader *
-rstto_navigator_entry_get_pixbuf_loader (RsttoNavigatorEntry *entry);
-GdkPixbuf *
-rstto_navigator_entry_get_pixbuf (RsttoNavigatorEntry *entry);
-gboolean
-rstto_navigator_entry_load_image (RsttoNavigatorEntry *entry, gboolean empty_cache);
-void
-rstto_navigator_entry_select (RsttoNavigatorEntry *entry);
-
-guint64
-rstto_navigator_entry_get_size (RsttoNavigatorEntry *entry);
-guint64
-rstto_navigator_get_max_history_size(RsttoNavigator *navigator);
-void
-rstto_navigator_set_max_history_size(RsttoNavigator *nav, guint64 size);
-void
-rstto_navigator_set_monitor_handle_for_dir(RsttoNavigator *nav, ThunarVfsPath *dir_path);
-
-gboolean
-rstto_navigator_entry_is_selected(RsttoNavigatorEntry *entry);
-
-gboolean
-rstto_navigator_open_file(RsttoNavigator *navigator, const gchar *path, gboolean open_folder, GError **error);
-gboolean
-rstto_navigator_open_folder(RsttoNavigator *navigator, const gchar *path, gboolean clear, GError **error);
-
-gboolean
-rstto_navigator_entry_get_orientation_changed (RsttoNavigatorEntry *entry);
-
 G_END_DECLS
 
 #endif /* __RISTRETTO_NAVIGATOR_H__ */

Modified: ristretto/branches/ristretto-gio/src/picture_viewer.c
===================================================================
--- ristretto/trunk/src/picture_viewer.c	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/picture_viewer.c	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,4 +1,6 @@
 /*
+ *  Copyright (C) Stephan Arts 2006-2009 <stephan at xfce.org>
+ *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
@@ -20,10 +22,10 @@
 #include <gtk/gtk.h>
 #include <gtk/gtkmarshal.h>
 #include <string.h>
-#include <thunar-vfs/thunar-vfs.h>
+#include <gio/gio.h>
 #include <libexif/exif-data.h>
 
-#include "navigator.h"
+#include "image.h"
 #include "picture_viewer.h"
 
 typedef enum
@@ -45,15 +47,14 @@
 
 struct _RsttoPictureViewerPriv
 {
-    RsttoNavigator   *navigator;
-    RsttoNavigatorEntry *entry;
+    RsttoImage *image;
+
     RsttoZoomMode    zoom_mode;
 
-    GdkPixbuf        *src_pixbuf;
     GdkPixbuf        *dst_pixbuf; /* The pixbuf which ends up on screen */
     void             (*cb_value_changed)(GtkAdjustment *, RsttoPictureViewer *);
-    gboolean          show_border;
     GdkColor         *bg_color;
+
     struct
     {
         gdouble x;
@@ -78,6 +79,12 @@
 static void
 rstto_picture_viewer_destroy(GtkObject *object);
 
+static gdouble
+rstto_picture_viewer_fit_scale(RsttoPictureViewer *viewer);
+
+static void
+cb_rstto_picture_viewer_image_updated (RsttoImage *image, RsttoPictureViewer *viewer);
+
 static gboolean 
 cb_rstto_picture_viewer_queued_repaint(RsttoPictureViewer *viewer);
 
@@ -91,7 +98,7 @@
 rstto_picture_viewer_expose(GtkWidget *, GdkEventExpose *);
 
 static void
-rstto_picture_viewer_paint(GtkWidget *widget);
+rstto_picture_viewer_paint (GtkWidget *widget);
 static gboolean
 rstto_picture_viewer_refresh(RsttoPictureViewer *viewer);
 
@@ -99,11 +106,6 @@
 rstto_picture_viewer_set_scroll_adjustments(RsttoPictureViewer *, GtkAdjustment *, GtkAdjustment *);
 
 static void
-cb_rstto_picture_viewer_nav_iter_changed(RsttoNavigator *, gint , RsttoNavigatorEntry *, RsttoPictureViewer *);
-static void
-cb_rstto_picture_viewer_nav_entry_modified(RsttoNavigator *, RsttoNavigatorEntry *, RsttoPictureViewer *);
-
-static void
 cb_rstto_picture_viewer_value_changed(GtkAdjustment *, RsttoPictureViewer *);
 static void
 cb_rstto_picture_viewer_scroll_event (RsttoPictureViewer *, GdkEventScroll *);
@@ -167,7 +169,6 @@
     viewer->priv = g_new0(RsttoPictureViewerPriv, 1);
     viewer->priv->cb_value_changed = cb_rstto_picture_viewer_value_changed;
 
-    viewer->priv->src_pixbuf = NULL;
     viewer->priv->dst_pixbuf = NULL;
     viewer->priv->zoom_mode = RSTTO_ZOOM_MODE_CUSTOM;
     gtk_widget_set_redraw_on_allocate(GTK_WIDGET(viewer), TRUE);
@@ -176,8 +177,6 @@
                            GDK_BUTTON_RELEASE_MASK |
                            GDK_BUTTON1_MOTION_MASK);
 
-    viewer->priv->show_border = FALSE;
-
     g_signal_connect(G_OBJECT(viewer), "scroll_event", G_CALLBACK(cb_rstto_picture_viewer_scroll_event), NULL);
     g_signal_connect(G_OBJECT(viewer), "button_press_event", G_CALLBACK(cb_rstto_picture_viewer_button_press_event), NULL);
     g_signal_connect(G_OBJECT(viewer), "button_release_event", G_CALLBACK(cb_rstto_picture_viewer_button_release_event), NULL);
@@ -188,6 +187,17 @@
                       GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_MOVE | GDK_ACTION_PRIVATE);
 }
 
+/**
+ * rstto_marshal_VOID__OBJECT_OBJECT:
+ * @closure:
+ * @return_value:
+ * @n_param_values:
+ * @param_values:
+ * @invocation_hint:
+ * @marshal_data:
+ *
+ * A marshaller for the set_scroll_adjustments signal.
+ */
 void
 rstto_marshal_VOID__OBJECT_OBJECT (GClosure     *closure,
                                    GValue       *return_value,
@@ -196,33 +206,33 @@
                                    gpointer      invocation_hint,
                                    gpointer      marshal_data)
 {
-  typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer data1,
-                                                    gpointer arg_1,
-                                                    gpointer arg_2,
-                                                    gpointer data2);
-  register GMarshalFunc_VOID__OBJECT_OBJECT callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
+    typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer data1,
+                                                      gpointer arg_1,
+                                                      gpointer arg_2,
+                                                      gpointer data2);
+    register GMarshalFunc_VOID__OBJECT_OBJECT callback;
+    register GCClosure *cc = (GCClosure*) closure;
+    register gpointer data1, data2;
 
-  g_return_if_fail (n_param_values == 3);
+    g_return_if_fail (n_param_values == 3);
 
-  if (G_CCLOSURE_SWAP_DATA (closure))
+    if (G_CCLOSURE_SWAP_DATA (closure))
     {
-      data1 = closure->data;
-      data2 = g_value_get_object (param_values + 0);
+        data1 = closure->data;
+        data2 = g_value_get_object (param_values + 0);
     }
-  else
+    else
     {
-      data1 = g_value_get_object (param_values + 0);
-      data2 = closure->data;
+        data1 = g_value_get_object (param_values + 0);
+        data2 = closure->data;
     }
-  callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ?
-      marshal_data : cc->callback);
+    callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ?
+    marshal_data : cc->callback);
 
-  callback (data1,
-            g_value_get_object (param_values + 1),
-            g_value_get_object (param_values + 2),
-            data2);
+    callback (data1,
+              g_value_get_object (param_values + 1),
+              g_value_get_object (param_values + 2),
+              data2);
 }
 
 static void
@@ -264,8 +274,8 @@
 static void
 rstto_picture_viewer_size_request(GtkWidget *widget, GtkRequisition *requisition)
 {
-    requisition->width = 100;
-    requisition->height= 500;
+    requisition->width = 300;
+    requisition->height= 400;
 }
 
 static void
@@ -285,7 +295,7 @@
     }
 
     rstto_picture_viewer_refresh(viewer);
-    rstto_picture_viewer_paint(GTK_WIDGET(viewer));
+    rstto_picture_viewer_paint (GTK_WIDGET(viewer));
 }
 
 static void
@@ -322,13 +332,13 @@
 static gboolean
 rstto_picture_viewer_expose(GtkWidget *widget, GdkEventExpose *event)
 {
-    rstto_picture_viewer_refresh(RSTTO_PICTURE_VIEWER(widget));
-    rstto_picture_viewer_paint(widget);
+    rstto_picture_viewer_refresh (RSTTO_PICTURE_VIEWER(widget));
+    rstto_picture_viewer_paint (widget);
     return FALSE;
 }
 
 static void
-rstto_picture_viewer_paint(GtkWidget *widget)
+rstto_picture_viewer_paint (GtkWidget *widget)
 {
     RsttoPictureViewer *viewer = RSTTO_PICTURE_VIEWER(widget);
     GdkPixbuf *pixbuf = viewer->priv->dst_pixbuf;
@@ -490,15 +500,6 @@
                                 m_y2 - m_y1);
             }
 
-            if(viewer->priv->show_border)
-            {
-                gdk_gc_set_foreground(gc, &line_color);
-                gdk_draw_line(GDK_DRAWABLE(buffer), gc, x1, y1, x1, y1+y2);
-                gdk_draw_line(GDK_DRAWABLE(buffer), gc, x1, y1+y2, x1+x2, y1+y2);
-                gdk_draw_line(GDK_DRAWABLE(buffer), gc, x1, y1, x1+x2, y1);
-                gdk_draw_line(GDK_DRAWABLE(buffer), gc, x1+x2, y1, x1+x2, y1+y2);
-            }
-
         }
         gdk_draw_drawable(GDK_DRAWABLE(widget->window), 
                         gdk_gc_new(widget->window), 
@@ -560,14 +561,11 @@
 }
 
 GtkWidget *
-rstto_picture_viewer_new(RsttoNavigator *navigator)
+rstto_picture_viewer_new()
 {
     GtkWidget *widget;
 
     widget = g_object_new(RSTTO_TYPE_PICTURE_VIEWER, NULL);
-    RSTTO_PICTURE_VIEWER(widget)->priv->navigator = navigator;
-    g_signal_connect(G_OBJECT(navigator), "iter-changed", G_CALLBACK(cb_rstto_picture_viewer_nav_iter_changed), widget);
-    g_signal_connect(G_OBJECT(navigator), "entry-modified", G_CALLBACK(cb_rstto_picture_viewer_nav_entry_modified), widget);
 
     return widget;
 }
@@ -575,29 +573,39 @@
 void
 rstto_picture_viewer_set_scale(RsttoPictureViewer *viewer, gdouble scale)
 {
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(viewer->priv->navigator);
-    if (entry)
+    gdouble *old_scale, *new_scale;
+    GdkPixbuf *src_pixbuf = NULL;
+    gboolean *fit_to_screen = NULL;
+
+    if (viewer->priv->image)
     {
-        gdouble old_scale = rstto_navigator_entry_get_scale(entry);
+        src_pixbuf = rstto_image_get_pixbuf (viewer->priv->image);
+        old_scale = g_object_get_data (G_OBJECT (viewer->priv->image), "viewer-scale");
+        fit_to_screen = g_object_get_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen");
+        rstto_picture_viewer_set_zoom_mode (viewer, RSTTO_ZOOM_MODE_CUSTOM);
 
-        gdouble width = (gdouble)gdk_pixbuf_get_width(viewer->priv->src_pixbuf);
-        gdouble height = (gdouble)gdk_pixbuf_get_height(viewer->priv->src_pixbuf);
+        new_scale = g_new0 (gdouble, 1);
+        *new_scale = scale;
+        *fit_to_screen = FALSE;
+        g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-scale", new_scale);
+        g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen", fit_to_screen);
 
-        rstto_navigator_entry_set_fit_to_screen (entry, FALSE);
-        rstto_navigator_entry_set_scale(entry, scale);
+        gdouble width = (gdouble)gdk_pixbuf_get_width (src_pixbuf);
+        gdouble height = (gdouble)gdk_pixbuf_get_height (src_pixbuf);
 
-        viewer->hadjustment->upper = width * scale;
+
+        viewer->hadjustment->upper = width * (*new_scale);
         gtk_adjustment_changed(viewer->hadjustment);
 
-        viewer->vadjustment->upper = height * scale;
+        viewer->vadjustment->upper = height * (*new_scale);
         gtk_adjustment_changed(viewer->vadjustment);
 
         viewer->hadjustment->value = (((viewer->hadjustment->value +
                                       (viewer->hadjustment->page_size / 2)) *
-                                       scale) / old_scale) - (viewer->hadjustment->page_size / 2);
+                                       (*new_scale)) / (*old_scale)) - (viewer->hadjustment->page_size / 2);
         viewer->vadjustment->value = (((viewer->vadjustment->value +
                                       (viewer->vadjustment->page_size / 2)) *
-                                       scale) / old_scale) - (viewer->vadjustment->page_size / 2);
+                                       (*new_scale)) / (*old_scale)) - (viewer->vadjustment->page_size / 2);
 
         if((viewer->hadjustment->value + viewer->hadjustment->page_size) > viewer->hadjustment->upper)
         {
@@ -619,22 +627,29 @@
         gtk_adjustment_value_changed(viewer->hadjustment);
         gtk_adjustment_value_changed(viewer->vadjustment);
 
+        g_free (old_scale);
+
     }
 }
 
-gdouble
+/**
+ * rstto_picture_viewer_fit_scale:
+ * @viewer:
+ *
+ */
+static gdouble
 rstto_picture_viewer_fit_scale(RsttoPictureViewer *viewer)
 {
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(viewer->priv->navigator);
-    if (entry)
+    gboolean *fit_to_screen;
+    if (viewer->priv->image)
     {
-        rstto_navigator_entry_set_fit_to_screen (entry, TRUE);
+        fit_to_screen = g_new0(gboolean, 1);
+        g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen", fit_to_screen);
 
         if(rstto_picture_viewer_refresh(viewer))
         {
             rstto_picture_viewer_paint(GTK_WIDGET(viewer));
         }
-        return rstto_navigator_entry_get_scale(entry);
     }
     return 0;
 }
@@ -642,10 +657,11 @@
 gdouble
 rstto_picture_viewer_get_scale(RsttoPictureViewer *viewer)
 {
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(viewer->priv->navigator);
-    if (entry)
+    gdouble *scale;
+    if (viewer->priv->image)
     {
-        return rstto_navigator_entry_get_scale(entry);
+        scale = g_object_get_data (G_OBJECT (viewer->priv->image), "viewer-scale");
+        return *scale;
     }
     return 0;
 }
@@ -654,223 +670,213 @@
 rstto_picture_viewer_refresh(RsttoPictureViewer *viewer)
 {
     GtkWidget *widget = GTK_WIDGET(viewer);
-    gboolean fit_to_screen = FALSE;
-    gdouble scale = 0;
-    RsttoNavigatorEntry *entry = rstto_navigator_get_file(viewer->priv->navigator);
+    GdkPixbuf *src_pixbuf = NULL;
+    gboolean *fit_to_screen = NULL;
+    gdouble *scale = NULL;
     gboolean changed = TRUE;
-    if (entry)
+
+    if (viewer->priv->image)
     {
-        fit_to_screen = rstto_navigator_entry_get_fit_to_screen(entry);
-        scale = rstto_navigator_entry_get_scale(entry);
+        fit_to_screen = g_object_get_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen");
+        scale         = g_object_get_data (G_OBJECT (viewer->priv->image), "viewer-scale");
+
+        src_pixbuf = rstto_image_get_pixbuf (viewer->priv->image);
+        if (src_pixbuf == NULL)
+        {
+            src_pixbuf = rstto_image_get_thumbnail (viewer->priv->image);
+        }
+        if (src_pixbuf != NULL)
+        {
+            g_object_ref (src_pixbuf);
+        }
+        else
+        {
+            if(viewer->priv->dst_pixbuf)
+            {
+                g_object_unref(viewer->priv->dst_pixbuf);
+                viewer->priv->dst_pixbuf = NULL;
+            }
+            return changed;
+        }
     }
+    else
+    {
+        if(viewer->priv->dst_pixbuf)
+        {
+            g_object_unref(viewer->priv->dst_pixbuf);
+            viewer->priv->dst_pixbuf = NULL;
+        }
+        return changed;
+    }
+
+
+    if (scale == NULL)
+        scale = g_new0 (gdouble, 1);
+    if (fit_to_screen == NULL)
+        fit_to_screen = g_new0 (gboolean , 1);
     
 
     gboolean vadjustment_changed = FALSE;
     gboolean hadjustment_changed = FALSE;
 
-    if (viewer->priv->src_pixbuf != NULL && entry == NULL)
+    gdouble width = (gdouble)gdk_pixbuf_get_width(src_pixbuf);
+    gdouble height = (gdouble)gdk_pixbuf_get_height(src_pixbuf);
+
+    if (*scale == 0)
     {
-        gdk_pixbuf_unref(viewer->priv->src_pixbuf);
-        viewer->priv->src_pixbuf = NULL;
+        if ((widget->allocation.width > width) && (widget->allocation.height > height))
+        {
+            *scale = 1.0;
+            *fit_to_screen = FALSE;
+
+            g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-scale", scale);
+            g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen", fit_to_screen);
+        }
+        else
+        {
+            *fit_to_screen = TRUE;
+            g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen", fit_to_screen);
+        }
     }
 
-    if(viewer->priv->src_pixbuf)
+    switch (viewer->priv->zoom_mode)
     {
-        gdouble width = (gdouble)gdk_pixbuf_get_width(viewer->priv->src_pixbuf);
-        gdouble height = (gdouble)gdk_pixbuf_get_height(viewer->priv->src_pixbuf);
-        if (scale == 0)
+        case RSTTO_ZOOM_MODE_FIT:
+            *fit_to_screen = TRUE;
+            g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen", fit_to_screen);
+            break;
+        case RSTTO_ZOOM_MODE_100:
+            *fit_to_screen = FALSE;
+            *scale = 1.0;
+            g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-scale", scale);
+            break;
+        case RSTTO_ZOOM_MODE_CUSTOM:
+            break;
+    }
+
+    if(*fit_to_screen)
+    {
+        gdouble h_scale = GTK_WIDGET(viewer)->allocation.width / width;
+        gdouble v_scale = GTK_WIDGET(viewer)->allocation.height / height;
+        if(h_scale < v_scale)
         {
-            if ((widget->allocation.width > width) && (widget->allocation.height > height))
+            if(*scale != h_scale)
             {
-                scale = 1.0;
-                rstto_navigator_entry_set_scale(entry, scale);
-                rstto_navigator_entry_set_fit_to_screen(entry, FALSE);
-                fit_to_screen = FALSE;
+                *scale = h_scale;
+                changed = TRUE;
             }
-            else
+        }
+        else
+        {
+            if(*scale != v_scale)
             {
-                fit_to_screen = TRUE;
-                rstto_navigator_entry_set_fit_to_screen(entry, TRUE);
+                *scale = v_scale;
+                changed = TRUE;
             }
         }
-
-        switch (viewer->priv->zoom_mode)
+        if (changed == TRUE)
         {
-            case RSTTO_ZOOM_MODE_FIT:
-                fit_to_screen = TRUE;
-                rstto_navigator_entry_set_fit_to_screen(entry, TRUE);
-                break;
-            case RSTTO_ZOOM_MODE_100:
-                fit_to_screen = FALSE;
-                scale = 1.0;
-                rstto_navigator_entry_set_scale(entry, scale);
-                break;
-            case RSTTO_ZOOM_MODE_CUSTOM:
-                break;
+            g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-scale", scale);
         }
-
-        if(fit_to_screen)
+    }
+    if(GTK_WIDGET_REALIZED(widget))
+    {
+        gdouble width = (gdouble)gdk_pixbuf_get_width (src_pixbuf);
+        gdouble height = (gdouble)gdk_pixbuf_get_height (src_pixbuf);
+        
+        if(viewer->hadjustment)
         {
-            gdouble h_scale = GTK_WIDGET(viewer)->allocation.width / width;
-            gdouble v_scale = GTK_WIDGET(viewer)->allocation.height / height;
-            if(h_scale < v_scale)
+            viewer->hadjustment->page_size = widget->allocation.width;
+            viewer->hadjustment->upper = width * (*scale);
+            viewer->hadjustment->lower = 0;
+            viewer->hadjustment->step_increment = 1;
+            viewer->hadjustment->page_increment = 100;
+            if((viewer->hadjustment->value + viewer->hadjustment->page_size) > viewer->hadjustment->upper)
             {
-                if(scale != h_scale)
-                {
-                    scale = h_scale;
-                    changed = TRUE;
-                }
-                rstto_navigator_entry_set_scale(entry, h_scale);
+                viewer->hadjustment->value = viewer->hadjustment->upper - viewer->hadjustment->page_size;
+                hadjustment_changed = TRUE;
             }
-            else
+            if(viewer->hadjustment->value < viewer->hadjustment->lower)
             {
-                if(scale != v_scale)
-                {
-                    scale = v_scale;
-                    changed = TRUE;
-                }
-                rstto_navigator_entry_set_scale(entry, v_scale);
+                viewer->hadjustment->value = viewer->hadjustment->lower;
+                hadjustment_changed = TRUE;
             }
         }
-        if(GTK_WIDGET_REALIZED(widget))
+        if(viewer->vadjustment)
         {
-            gdouble width = (gdouble)gdk_pixbuf_get_width(viewer->priv->src_pixbuf);
-            gdouble height = (gdouble)gdk_pixbuf_get_height(viewer->priv->src_pixbuf);
-            
-            if(viewer->hadjustment)
+            viewer->vadjustment->page_size = widget->allocation.height;
+            viewer->vadjustment->upper = height * (*scale);
+            viewer->vadjustment->lower = 0;
+            viewer->vadjustment->step_increment = 1;
+            viewer->vadjustment->page_increment = 100;
+            if((viewer->vadjustment->value + viewer->vadjustment->page_size) > viewer->vadjustment->upper)
             {
-                viewer->hadjustment->page_size = widget->allocation.width;
-                viewer->hadjustment->upper = width * scale;
-                viewer->hadjustment->lower = 0;
-                viewer->hadjustment->step_increment = 1;
-                viewer->hadjustment->page_increment = 100;
-                if((viewer->hadjustment->value + viewer->hadjustment->page_size) > viewer->hadjustment->upper)
-                {
-                    viewer->hadjustment->value = viewer->hadjustment->upper - viewer->hadjustment->page_size;
-                    hadjustment_changed = TRUE;
-                }
-                if(viewer->hadjustment->value < viewer->hadjustment->lower)
-                {
-                    viewer->hadjustment->value = viewer->hadjustment->lower;
-                    hadjustment_changed = TRUE;
-                }
+                viewer->vadjustment->value = viewer->vadjustment->upper - viewer->vadjustment->page_size;
+                vadjustment_changed = TRUE;
             }
-            if(viewer->vadjustment)
+            if(viewer->vadjustment->value < viewer->vadjustment->lower)
             {
-                viewer->vadjustment->page_size = widget->allocation.height;
-                viewer->vadjustment->upper = height * scale;
-                viewer->vadjustment->lower = 0;
-                viewer->vadjustment->step_increment = 1;
-                viewer->vadjustment->page_increment = 100;
-                if((viewer->vadjustment->value + viewer->vadjustment->page_size) > viewer->vadjustment->upper)
-                {
-                    viewer->vadjustment->value = viewer->vadjustment->upper - viewer->vadjustment->page_size;
-                    vadjustment_changed = TRUE;
-                }
-                if(viewer->vadjustment->value < viewer->vadjustment->lower)
-                {
-                    viewer->vadjustment->value = viewer->vadjustment->lower;
-                    vadjustment_changed = TRUE;
-                }
+                viewer->vadjustment->value = viewer->vadjustment->lower;
+                vadjustment_changed = TRUE;
             }
+        }
 
 
-            GdkPixbuf *tmp_pixbuf = NULL;
-            if (viewer->vadjustment && viewer->hadjustment)
+        GdkPixbuf *tmp_pixbuf = NULL;
+        if (viewer->vadjustment && viewer->hadjustment)
+        {
+            if (1.0)
             {
-                if (1.0)
-                {
-                    tmp_pixbuf = gdk_pixbuf_new_subpixbuf(viewer->priv->src_pixbuf,
-                                                      (gint)(viewer->hadjustment->value / scale), 
-                                                      viewer->vadjustment->value / scale,
-                                                      ((widget->allocation.width/scale)) < width?
-                                                        widget->allocation.width/scale:width,
-                                                      ((widget->allocation.height/scale))< height?
-                                                        widget->allocation.height/scale:height);
-                }
-                else
-                {
-                    tmp_pixbuf = viewer->priv->src_pixbuf;
-                    g_object_ref(tmp_pixbuf);
-                }
+                tmp_pixbuf = gdk_pixbuf_new_subpixbuf(src_pixbuf,
+                                               (gint)(viewer->hadjustment->value / (*scale)), 
+                                                      viewer->vadjustment->value / (*scale),
+                                                    ((widget->allocation.width/(*scale))) < width?
+                                                      widget->allocation.width/(*scale):width,
+                                                    ((widget->allocation.height/(*scale)))< height?
+                                                      widget->allocation.height/(*scale):height);
             }
-
-            if(viewer->priv->dst_pixbuf)
+            else
             {
-                g_object_unref(viewer->priv->dst_pixbuf);
-                viewer->priv->dst_pixbuf = NULL;
+                tmp_pixbuf = src_pixbuf;
+                g_object_ref(tmp_pixbuf);
             }
+        }
 
-            if(tmp_pixbuf)
-            {
-                gint dst_width = gdk_pixbuf_get_width(tmp_pixbuf)*scale;
-                gint dst_height = gdk_pixbuf_get_height(tmp_pixbuf)*scale;
-                viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple(tmp_pixbuf,
-                                        dst_width>0?dst_width:1,
-                                        dst_height>0?dst_height:1,
-                                        GDK_INTERP_BILINEAR);
-                g_object_unref(tmp_pixbuf);
-                tmp_pixbuf = NULL;
-            }
-            if (viewer->vadjustment && viewer->hadjustment)
-            {
-                gtk_adjustment_changed(viewer->hadjustment);
-                gtk_adjustment_changed(viewer->vadjustment);
-            }
-            if (hadjustment_changed == TRUE)
-                gtk_adjustment_value_changed(viewer->hadjustment);
-            if (vadjustment_changed == TRUE)
-                gtk_adjustment_value_changed(viewer->vadjustment);
-        }
-    }
-    else
-    {
         if(viewer->priv->dst_pixbuf)
         {
             g_object_unref(viewer->priv->dst_pixbuf);
             viewer->priv->dst_pixbuf = NULL;
         }
-    }
-    return changed;
-}
 
-static void
-cb_rstto_picture_viewer_nav_iter_changed(RsttoNavigator *nav, gint nr, RsttoNavigatorEntry *entry, RsttoPictureViewer *viewer)
-{
-    viewer->priv->entry = entry;
-    if(entry)
-    {
-        rstto_navigator_entry_load_image(entry, FALSE);
-    }
-    else
-    {
-        rstto_picture_viewer_refresh(viewer);
-        rstto_picture_viewer_paint(GTK_WIDGET(viewer));
-    }
-}
-
-static void
-cb_rstto_picture_viewer_nav_entry_modified(RsttoNavigator *nav, RsttoNavigatorEntry *entry, RsttoPictureViewer *viewer)
-{
-    if (entry == viewer->priv->entry)
-    {
-        if(viewer->priv->src_pixbuf)
+        if(tmp_pixbuf)
         {
-            gdk_pixbuf_unref(viewer->priv->src_pixbuf);
+            gint dst_width = gdk_pixbuf_get_width(tmp_pixbuf)*(*scale);
+            gint dst_height = gdk_pixbuf_get_height(tmp_pixbuf)*(*scale);
+            viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple(tmp_pixbuf,
+                                    dst_width>0?dst_width:1,
+                                    dst_height>0?dst_height:1,
+                                    GDK_INTERP_BILINEAR);
+            g_object_unref(tmp_pixbuf);
+            tmp_pixbuf = NULL;
         }
-        viewer->priv->src_pixbuf = rstto_navigator_entry_get_pixbuf(entry);
-        if (viewer->priv->src_pixbuf)
+        if (viewer->vadjustment && viewer->hadjustment)
         {
-            gdk_pixbuf_ref(viewer->priv->src_pixbuf);
+            gtk_adjustment_changed(viewer->hadjustment);
+            gtk_adjustment_changed(viewer->vadjustment);
         }
-        rstto_picture_viewer_refresh(viewer);
-        rstto_picture_viewer_paint(GTK_WIDGET(viewer));
+        if (hadjustment_changed == TRUE)
+            gtk_adjustment_value_changed(viewer->hadjustment);
+        if (vadjustment_changed == TRUE)
+            gtk_adjustment_value_changed(viewer->vadjustment);
     }
+    g_object_unref (src_pixbuf);
+    return changed;
 }
 
 static void
 cb_rstto_picture_viewer_scroll_event (RsttoPictureViewer *viewer, GdkEventScroll *event)
 {
+    /*
     RsttoNavigatorEntry *entry = rstto_navigator_get_file(viewer->priv->navigator);
 
     if (entry == NULL)
@@ -919,6 +925,7 @@
             viewer->priv->refresh.idle_id = g_idle_add((GSourceFunc)cb_rstto_picture_viewer_queued_repaint, viewer);
             break;
     }
+    */
 }
 
 static gboolean 
@@ -995,6 +1002,7 @@
 static void
 cb_rstto_picture_viewer_button_press_event (RsttoPictureViewer *viewer, GdkEventButton *event)
 {
+    /*
     if(event->button == 1)
     {
         viewer->priv->motion.x = event->x;
@@ -1030,6 +1038,7 @@
 
         
     }
+    */
     if(event->button == 3)
     {
         if (viewer->priv->menu)
@@ -1049,6 +1058,7 @@
 static void
 cb_rstto_picture_viewer_button_release_event (RsttoPictureViewer *viewer, GdkEventButton *event)
 {
+    /*
     if(event->button == 1)
     {
         GtkWidget *widget = GTK_WIDGET(viewer);
@@ -1104,9 +1114,7 @@
                     gdouble h_scale = widget->allocation.width / box_width * scale;
                     gdouble v_scale = widget->allocation.height / box_height * scale;
 
-                    /** 
-                     * Check if the mouse has been moved (and there exists a box
-                     */
+                     //Check if the mouse has been moved (and there exists a box
                     if (box_height > 1 && box_width > 1)
                     {
                         if (h_scale < v_scale)
@@ -1178,6 +1186,7 @@
     }
 
     viewer->priv->motion.state = RSTTO_PICTURE_VIEWER_STATE_NONE;
+    */
 
 }
 
@@ -1202,53 +1211,72 @@
 {
     if (viewer->priv->menu)
     {
-        gtk_menu_detach(viewer->priv->menu);
-        gtk_widget_destroy(GTK_WIDGET(viewer->priv->menu));
+        gtk_menu_detach (viewer->priv->menu);
+        gtk_widget_destroy (GTK_WIDGET(viewer->priv->menu));
     }
 
     viewer->priv->menu = menu;
 
     if (viewer->priv->menu)
     {
-        gtk_menu_attach_to_widget(viewer->priv->menu, GTK_WIDGET(viewer), NULL);
+        gtk_menu_attach_to_widget (viewer->priv->menu, GTK_WIDGET(viewer), NULL);
     }
 }
 
 void
-rstto_picture_viewer_set_bg_color (RsttoPictureViewer *viewer, const GdkColor *color)
+rstto_picture_viewer_set_zoom_mode(RsttoPictureViewer *viewer, RsttoZoomMode mode)
 {
-    if (viewer->priv->bg_color)
+    viewer->priv->zoom_mode = mode;
+    switch (viewer->priv->zoom_mode)
     {
-        gdk_color_free(viewer->priv->bg_color);
-        viewer->priv->bg_color = NULL;
+        case RSTTO_ZOOM_MODE_FIT:
+            rstto_picture_viewer_fit_scale (viewer);
+            break;
+        case RSTTO_ZOOM_MODE_100:
+            rstto_picture_viewer_set_scale (viewer, 1);
+            break;
     }
-    if (color)
-    {
-        viewer->priv->bg_color = gdk_color_copy(color);
-        GdkColormap *colormap = gtk_widget_get_colormap(GTK_WIDGET(viewer));
-        gdk_colormap_alloc_color(colormap, viewer->priv->bg_color, TRUE, TRUE);
-    }
 }
 
-const GdkColor *
-rstto_picture_viewer_get_bg_color (RsttoPictureViewer *viewer)
+/**
+ *  rstto_picture_viewer_set_image:
+ *  @viewer :
+ *  @image  :
+ *
+ *
+ */
+void
+rstto_picture_viewer_set_image (RsttoPictureViewer *viewer, RsttoImage *image)
 {
-    return viewer->priv->bg_color;
-}
+    if (viewer->priv->image)
+    {
+        g_signal_handlers_disconnect_by_func(viewer->priv->image, cb_rstto_picture_viewer_image_updated, viewer);
+        g_object_unref (viewer->priv->image);
+    }
 
-void
-rstto_picture_viewer_redraw(RsttoPictureViewer *viewer)
-{
-    rstto_picture_viewer_refresh(viewer);
-    rstto_picture_viewer_paint(GTK_WIDGET(viewer));
+    viewer->priv->image = image;
+
+    if (viewer->priv->image)
+    {
+        g_object_ref (viewer->priv->image);
+        g_signal_connect (G_OBJECT (viewer->priv->image), "updated", G_CALLBACK (cb_rstto_picture_viewer_image_updated), viewer);
+
+        rstto_picture_viewer_refresh (viewer);   
+        rstto_picture_viewer_paint (GTK_WIDGET (viewer));
+    }
 }
 
-void
-rstto_picture_viewer_set_zoom_mode(RsttoPictureViewer *viewer, RsttoZoomMode mode)
+static void
+cb_rstto_picture_viewer_image_updated (RsttoImage *image, RsttoPictureViewer *viewer)
 {
-    viewer->priv->zoom_mode = mode;
+    rstto_picture_viewer_refresh (viewer);   
+    rstto_picture_viewer_paint (GTK_WIDGET (viewer));
 }
 
+/************************
+ * FIXME: DnD
+ */
+
 static void
 rstto_picture_viewer_drag_data_received(GtkWidget *widget,
                                         GdkDragContext *context,
@@ -1258,6 +1286,7 @@
                                         guint info,
                                         guint time)
 {
+    /*
     RsttoPictureViewer *picture_viewer = RSTTO_PICTURE_VIEWER(widget);
     gchar **array = gtk_selection_data_get_uris (selection_data);
 
@@ -1295,6 +1324,7 @@
     }
     
     gtk_drag_finish (context, TRUE, FALSE, time);
+    */
 }
 
 static gboolean
@@ -1324,6 +1354,7 @@
     return TRUE;
 }
 
+
 static gboolean
 rstto_picture_viewer_drag_motion (GtkWidget *widget,
                                 GdkDragContext *context,
@@ -1341,3 +1372,4 @@
     }
     return TRUE;
 }
+

Modified: ristretto/branches/ristretto-gio/src/picture_viewer.h
===================================================================
--- ristretto/trunk/src/picture_viewer.h	2009-01-05 18:10:28 UTC (rev 6406)
+++ ristretto/branches/ristretto-gio/src/picture_viewer.h	2009-01-05 23:15:14 UTC (rev 6407)
@@ -1,4 +1,6 @@
 /*
+ *  Copyright (C) Stephan Arts 2006-2009 <stephan at xfce.org>
+ *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
@@ -72,11 +74,15 @@
 
 GType      rstto_picture_viewer_get_type();
 
-GtkWidget *rstto_picture_viewer_new(RsttoNavigator *navigator);
+GtkWidget *rstto_picture_viewer_new ();
+void       rstto_picture_viewer_set_image (RsttoPictureViewer *, RsttoImage *);
+void       rstto_picture_viewer_set_zoom_mode(RsttoPictureViewer *viewer, RsttoZoomMode mode);
+
 void       rstto_picture_viewer_set_scale(RsttoPictureViewer *viewer, gdouble scale);
 gdouble    rstto_picture_viewer_get_scale(RsttoPictureViewer *viewer);
+
+/**
 gdouble    rstto_picture_viewer_fit_scale(RsttoPictureViewer *viewer);
-void       rstto_picture_viewer_set_timeout(RsttoPictureViewer *viewer, gboolean timeout);
 
 void       rstto_picture_viewer_set_menu (RsttoPictureViewer *viewer, GtkMenu *menu);
 void       rstto_picture_viewer_set_bg_color (RsttoPictureViewer *viewer, const GdkColor *color);
@@ -84,8 +90,7 @@
 rstto_picture_viewer_get_bg_color (RsttoPictureViewer *viewer);
 
 void       rstto_picture_viewer_redraw (RsttoPictureViewer *viewer);
-void
-rstto_picture_viewer_set_zoom_mode(RsttoPictureViewer *viewer, RsttoZoomMode mode);
+*/
 
 G_END_DECLS
 




More information about the Goodies-commits mailing list