[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