[Xfce4-commits] [apps/ristretto] 01/01: Port to GTK3

noreply at xfce.org noreply at xfce.org
Sat Jul 27 18:00:15 CEST 2019


This is an automated email from the git hooks/post-receive script.

f   2   4   0   4       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository apps/ristretto.

commit 793ab19e19e7ed8cbeed7f35d1bbe048330977a4
Author: Igor <f2404 at yandex.ru>
Date:   Sat Jul 27 11:58:18 2019 -0400

    Port to GTK3
---
 configure.ac.in               |  22 +--
 src/gnome_wallpaper_manager.c |  27 +--
 src/icon_bar.c                | 340 ++++++++++++++++++++-------------
 src/icon_bar.h                |   4 +-
 src/image_list.c              |   2 +-
 src/image_viewer.c            | 291 ++++++++++++++++------------
 src/main.c                    |   2 +-
 src/main_window.c             | 430 ++++++++++++++++++++----------------------
 src/monitor_chooser.c         |  82 ++++----
 src/preferences_dialog.c      |  59 +++---
 src/privacy_dialog.c          |   5 +-
 src/properties_dialog.c       | 227 ++++++----------------
 src/settings.c                |  20 +-
 src/thumbnailer.c             |   7 +-
 src/xfce_wallpaper_manager.c  |  71 +++----
 15 files changed, 777 insertions(+), 812 deletions(-)

diff --git a/configure.ac.in b/configure.ac.in
index 4caf2bc..42ae4d4 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -10,10 +10,10 @@ dnl ***************************
 dnl *** Version information ***
 dnl ***************************
 m4_define([ristretto_version_major], [0])
-m4_define([ristretto_version_minor], [8])
-m4_define([ristretto_version_micro], [5])
+m4_define([ristretto_version_minor], [9])
+m4_define([ristretto_version_micro], [0])
 m4_define([ristretto_version_build], [r at REVISION@])
-m4_define([ristretto_version_tag], []) # Leave empty for releases
+m4_define([ristretto_version_tag], [git]) # Leave empty for releases
 m4_define([ristretto_version], [ristretto_version_major().ristretto_version_minor().ristretto_version_micro()ifelse(ristretto_version_tag(), [], [], [ristretto_version_tag()-ristretto_version_build()])])
 
 dnl *******************************************
@@ -52,16 +52,16 @@ dnl Check for i18n support
 XDT_I18N([@LINGUAS@])
 
 XDT_CHECK_PACKAGE([LIBEXIF], [libexif], [0.6.0])
-XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.20.0])
-XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.24.0])
-XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.24.0])
-XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [2.24.0])
-XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.18.0])
-XDT_CHECK_PACKAGE([GIO_UNIX], [gio-unix-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [3.20.0])
+XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.42.0])
+XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.42.0])
+XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [2.42.0])
+XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.42.0])
+XDT_CHECK_PACKAGE([GIO_UNIX], [gio-unix-2.0], [2.42.0])
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.10.0])
-XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.10.0])
+XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-2], [4.10.0])
 
-XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.10.0])
+XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.12.1])
 
 XDT_CHECK_PACKAGE([CAIRO], [cairo], [1.8.0])
 
diff --git a/src/gnome_wallpaper_manager.c b/src/gnome_wallpaper_manager.c
index e571b8b..b25b04a 100644
--- a/src/gnome_wallpaper_manager.c
+++ b/src/gnome_wallpaper_manager.c
@@ -219,7 +219,7 @@ static void
 rstto_gnome_wallpaper_manager_init (GObject *object)
 {
     RsttoGnomeWallpaperManager *manager = RSTTO_GNOME_WALLPAPER_MANAGER (object);
-    GtkWidget *image_prop_table = gtk_table_new (3, 2, FALSE);
+    GtkWidget *image_prop_grid = gtk_grid_new ();
     GtkWidget *style_label = gtk_label_new( _("Style:"));
     GtkWidget *vbox;
 
@@ -247,8 +247,6 @@ rstto_gnome_wallpaper_manager_init (GObject *object)
     manager->priv->monitor_chooser = rstto_monitor_chooser_new ();
     manager->priv->style_combo = gtk_combo_box_text_new ();
 
-    gtk_table_set_row_spacing (GTK_TABLE(image_prop_table), 1, 4);
-
     for (i = 0; i < n_monitors; ++i)
     {
         gdk_screen_get_monitor_geometry (
@@ -268,34 +266,27 @@ rstto_gnome_wallpaper_manager_init (GObject *object)
             0);
     gtk_box_pack_start (
             GTK_BOX (vbox),
-            image_prop_table,
+            image_prop_grid,
             FALSE,
             FALSE,
             0);
 
-    gtk_table_attach (
-            GTK_TABLE (image_prop_table),
+    gtk_grid_attach (
+            GTK_GRID (image_prop_grid),
             style_label,
             0,
-            1,
             0,
             1,
-            0,
-            0,
-            0,
-            0);
-    gtk_table_attach (
-            GTK_TABLE (image_prop_table),
+            1);
+    gtk_grid_attach (
+            GTK_GRID (image_prop_grid),
             manager->priv->style_combo,
             1,
-            2,
             0,
             1,
-            GTK_EXPAND|GTK_FILL,
-            0,
-            0,
-            0);
+            1);
 
+    gtk_widget_set_hexpand (manager->priv->style_combo, TRUE);
     gtk_combo_box_text_append_text (
             GTK_COMBO_BOX_TEXT (manager->priv->style_combo),
             _("Auto"));
diff --git a/src/icon_bar.c b/src/icon_bar.c
index 5732061..f05e292 100644
--- a/src/icon_bar.c
+++ b/src/icon_bar.c
@@ -59,6 +59,7 @@ enum
     PROP_MODEL,
     PROP_ACTIVE,
     PROP_SHOW_TEXT,
+    PROP_SCROLLED_WINDOW
 };
 
 enum
@@ -70,7 +71,7 @@ enum
 static GdkPixbuf *thumbnail_missing = NULL;
 
 static void
-rstto_icon_bar_destroy (GtkObject *object);
+rstto_icon_bar_destroy (GtkWidget *widget);
 
 static void
 rstto_icon_bar_finalize (GObject *object);
@@ -103,6 +104,16 @@ static void
 rstto_icon_bar_size_request (
         GtkWidget      *widget,
         GtkRequisition *requisition);
+static void
+rstto_icon_bar_get_preferred_width (
+        GtkWidget *widget,
+        gint *minimal_width,
+        gint *natural_width);
+static void
+rstto_icon_bar_get_preferred_height (
+        GtkWidget *widget,
+        gint *minimal_height,
+        gint *natural_height);
 
 static void
 rstto_icon_bar_size_allocate (
@@ -110,9 +121,9 @@ rstto_icon_bar_size_allocate (
         GtkAllocation *allocation);
 
 static gboolean
-rstto_icon_bar_expose (
-        GtkWidget      *widget,
-        GdkEventExpose *expose);
+rstto_icon_bar_draw (
+        GtkWidget *widget,
+        cairo_t   *cr);
 
 static gboolean
 rstto_icon_bar_leave (
@@ -168,7 +179,7 @@ static void
 rstto_icon_bar_paint_item (
         RsttoIconBar     *icon_bar,
         RsttoIconBarItem *item,
-        GdkRectangle     *area);
+        cairo_t          *cr);
 
 static void
 rstto_icon_bar_calculate_item_size (
@@ -253,6 +264,7 @@ struct _RsttoIconBarItem
 struct _RsttoIconBarPrivate
 {
     GdkWindow      *bin_window;
+    GtkWidget      *s_window;
 
     gint            width;
     gint            height;
@@ -291,46 +303,40 @@ struct _RsttoIconBarPrivate
 
 static guint icon_bar_signals[LAST_SIGNAL];
 
-#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
-G_DEFINE_TYPE (RsttoIconBar, rstto_icon_bar, GTK_TYPE_CONTAINER)
-#else
-G_DEFINE_TYPE_WITH_CODE (RsttoIconBar, rstto_icon_bar, GTK_TYPE_CONTAINER, G_ADD_PRIVATE (RsttoIconBar))
-#endif
+G_DEFINE_TYPE_WITH_CODE (
+        RsttoIconBar,
+        rstto_icon_bar,
+        GTK_TYPE_CONTAINER,
+        G_ADD_PRIVATE (RsttoIconBar))
 
 
 static void
 rstto_icon_bar_class_init (RsttoIconBarClass *klass)
 {
-    GtkObjectClass *gtkobject_class;
     GtkWidgetClass *gtkwidget_class;
     GObjectClass   *gobject_class;
 
-#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
-    g_type_class_add_private (klass, sizeof (RsttoIconBarPrivate));
-#endif
-
     gobject_class = G_OBJECT_CLASS (klass);
     gobject_class->finalize = rstto_icon_bar_finalize;
     gobject_class->get_property = rstto_icon_bar_get_property;
     gobject_class->set_property = rstto_icon_bar_set_property;
 
-    gtkobject_class = GTK_OBJECT_CLASS (klass);
-    gtkobject_class->destroy = rstto_icon_bar_destroy;
-
     gtkwidget_class = GTK_WIDGET_CLASS (klass);
     gtkwidget_class->style_set = rstto_icon_bar_style_set;
     gtkwidget_class->realize = rstto_icon_bar_realize;
     gtkwidget_class->unrealize = rstto_icon_bar_unrealize;
-    gtkwidget_class->size_request = rstto_icon_bar_size_request;
+    gtkwidget_class->get_preferred_width = rstto_icon_bar_get_preferred_width;
+    gtkwidget_class->get_preferred_height = rstto_icon_bar_get_preferred_height;
     gtkwidget_class->size_allocate = rstto_icon_bar_size_allocate;
-    gtkwidget_class->expose_event = rstto_icon_bar_expose;
+    gtkwidget_class->draw = rstto_icon_bar_draw;
     gtkwidget_class->leave_notify_event = rstto_icon_bar_leave;
     gtkwidget_class->motion_notify_event = rstto_icon_bar_motion;
-    gtkwidget_class->scroll_event = rstto_icon_bar_scroll;
+    //gtkwidget_class->scroll_event = rstto_icon_bar_scroll;
     gtkwidget_class->button_press_event = rstto_icon_bar_button_press;
     gtkwidget_class->button_release_event = rstto_icon_bar_button_release;
+    gtkwidget_class->destroy = rstto_icon_bar_destroy;
 
-    klass->set_scroll_adjustments = rstto_icon_bar_set_adjustments;
+    //klass->set_scroll_adjustments = rstto_icon_bar_set_adjustments;
 
     /**
      * RsttoIconBar:orientation:
@@ -411,68 +417,62 @@ rstto_icon_bar_class_init (RsttoIconBarClass *klass)
                 TRUE,
                 G_PARAM_READWRITE));
 
+    /**
+     * RsttoIconBar:s_window:
+     *
+     * The scrolled window icon bar is placed into.
+     **/
+    g_object_class_install_property (gobject_class,
+            PROP_SCROLLED_WINDOW,
+            g_param_spec_object ("scrolled-window",
+                _("Scrolled window"),
+                _("Scrolled window icon bar is placed into"),
+                GTK_TYPE_WIDGET,
+                G_PARAM_READWRITE));
+
     gtk_widget_class_install_style_property (gtkwidget_class,
             g_param_spec_boxed ("active-item-fill-color",
                 _("Active item fill color"),
                 _("Active item fill color"),
-                GDK_TYPE_COLOR,
+                GDK_TYPE_RGBA,
                 G_PARAM_READABLE));
 
     gtk_widget_class_install_style_property (gtkwidget_class,
             g_param_spec_boxed ("active-item-border-color",
                 _("Active item border color"),
                 _("Active item border color"),
-                GDK_TYPE_COLOR,
+                GDK_TYPE_RGBA,
                 G_PARAM_READABLE));
 
     gtk_widget_class_install_style_property (gtkwidget_class,
             g_param_spec_boxed ("active-item-text-color",
                 _("Active item text color"),
                 _("Active item text color"),
-                GDK_TYPE_COLOR,
+                GDK_TYPE_RGBA,
                 G_PARAM_READABLE));
 
     gtk_widget_class_install_style_property (gtkwidget_class,
             g_param_spec_boxed ("cursor-item-fill-color",
                 _("Cursor item fill color"),
                 _("Cursor item fill color"),
-                GDK_TYPE_COLOR,
+                GDK_TYPE_RGBA,
                 G_PARAM_READABLE));
 
     gtk_widget_class_install_style_property (gtkwidget_class,
             g_param_spec_boxed ("cursor-item-border-color",
                 _("Cursor item border color"),
                 _("Cursor item border color"),
-                GDK_TYPE_COLOR,
+                GDK_TYPE_RGBA,
                 G_PARAM_READABLE));
 
     gtk_widget_class_install_style_property (gtkwidget_class,
             g_param_spec_boxed ("cursor-item-text-color",
                 _("Cursor item text color"),
                 _("Cursor item text color"),
-                GDK_TYPE_COLOR,
+                GDK_TYPE_RGBA,
                 G_PARAM_READABLE));
 
     /**
-     * RsttoIconBar::set-scroll-adjustments:
-     * @icon_bar    : The #RsttoIconBar.
-     * @hadjustment : The horizontal adjustment.
-     * @vadjustment : The vertical adjustment.
-     *
-     * Used internally to make the #RsttoIconBar scrollable.
-     **/
-    gtkwidget_class->set_scroll_adjustments_signal =
-        g_signal_new ("set-scroll-adjustments",
-                G_TYPE_FROM_CLASS (gobject_class),
-                G_SIGNAL_RUN_LAST,
-                G_STRUCT_OFFSET (RsttoIconBarClass, set_scroll_adjustments),
-                NULL, NULL,
-                _rstto_marshal_VOID__OBJECT_OBJECT,
-                G_TYPE_NONE, 2,
-                GTK_TYPE_ADJUSTMENT,
-                GTK_TYPE_ADJUSTMENT);
-
-    /**
      * RsttoIconBar::selection-changed:
      * @icon_bar  : The #RsttoIconBar.
      *
@@ -519,7 +519,7 @@ rstto_icon_bar_init (RsttoIconBar *icon_bar)
 
     gtk_widget_set_can_focus (GTK_WIDGET (icon_bar), FALSE);
 
-    rstto_icon_bar_set_adjustments (icon_bar, NULL, NULL);
+    //rstto_icon_bar_set_adjustments (icon_bar, NULL, NULL);
 
     g_signal_connect (
             G_OBJECT(icon_bar->priv->settings),
@@ -531,13 +531,13 @@ rstto_icon_bar_init (RsttoIconBar *icon_bar)
 
 
 static void
-rstto_icon_bar_destroy (GtkObject *object)
+rstto_icon_bar_destroy (GtkWidget *widget)
 {
-    RsttoIconBar *icon_bar = RSTTO_ICON_BAR (object);
+    RsttoIconBar *icon_bar = RSTTO_ICON_BAR (widget);
 
     rstto_icon_bar_set_model (icon_bar, NULL);
 
-    (*GTK_OBJECT_CLASS (rstto_icon_bar_parent_class)->destroy) (object);
+    (*GTK_WIDGET_CLASS (rstto_icon_bar_parent_class)->destroy) (widget);
 }
 
 
@@ -587,6 +587,10 @@ rstto_icon_bar_get_property (
             g_value_set_boolean (value, rstto_icon_bar_get_show_text (icon_bar));
             break;
 
+        case PROP_SCROLLED_WINDOW:
+            g_value_set_object (value, icon_bar->priv->s_window);
+            break;
+
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
             break;
@@ -603,6 +607,7 @@ rstto_icon_bar_set_property (
         GParamSpec   *pspec)
 {
     RsttoIconBar *icon_bar = RSTTO_ICON_BAR (object);
+    GtkWidget    *hscrollbar, *vscrollbar;
 
     switch (prop_id)
     {
@@ -626,6 +631,15 @@ rstto_icon_bar_set_property (
             rstto_icon_bar_set_show_text (icon_bar, g_value_get_boolean (value));
             break;
 
+        case PROP_SCROLLED_WINDOW:
+            icon_bar->priv->s_window = g_value_get_object (value);
+            hscrollbar = gtk_scrolled_window_get_hscrollbar (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
+            vscrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
+            g_signal_connect_swapped (icon_bar->priv->s_window, "scroll-event", G_CALLBACK (rstto_icon_bar_scroll), icon_bar);
+            g_signal_connect_swapped (hscrollbar, "scroll-event", G_CALLBACK (rstto_icon_bar_scroll), icon_bar);
+            g_signal_connect_swapped (vscrollbar, "scroll-event", G_CALLBACK (rstto_icon_bar_scroll), icon_bar);
+            break;
+
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
             break;
@@ -639,14 +653,18 @@ rstto_icon_bar_style_set (
         GtkWidget *widget,
         GtkStyle  *previous_style)
 {
-    RsttoIconBar *icon_bar = RSTTO_ICON_BAR (widget);
+    RsttoIconBar    *icon_bar = RSTTO_ICON_BAR (widget);
+    GtkStyleContext *context;
+    GdkRGBA          bg;
 
     (*GTK_WIDGET_CLASS (rstto_icon_bar_parent_class)->style_set) (widget, previous_style);
 
     if (gtk_widget_get_realized (widget))
     {
-        gdk_window_set_background (icon_bar->priv->bin_window,
-                &(gtk_widget_get_style (widget)->base[gtk_widget_get_state (widget)]));
+        context = gtk_widget_get_style_context (gtk_widget_get_toplevel (widget));
+        gtk_style_context_get (context, gtk_widget_get_state_flags (widget),
+                GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &bg, NULL);
+        gdk_window_set_background_rgba (icon_bar->priv->bin_window, &bg);
     }
 }
 
@@ -655,27 +673,29 @@ rstto_icon_bar_style_set (
 static void
 rstto_icon_bar_realize (GtkWidget *widget)
 {
-    GdkWindowAttr attributes;
-    RsttoIconBar   *icon_bar = RSTTO_ICON_BAR (widget);
-    gint          attributes_mask;
-    GtkAllocation allocation;
-    GdkWindow    *window;
-    GtkStyle     *style;
+    GdkWindowAttr    attributes;
+    RsttoIconBar    *icon_bar = RSTTO_ICON_BAR (widget);
+    gint             attributes_mask;
+    GtkAllocation    allocation;
+    GdkWindow       *window;
+    GtkStyleContext *context;
+    GdkRGBA         *bg;
 
     gtk_widget_set_realized (widget, TRUE);
 
     gtk_widget_get_allocation (widget, &allocation);
 
-    attributes.window_type = GDK_WINDOW_CHILD;
     attributes.x = allocation.x;
     attributes.y = allocation.y;
     attributes.width = allocation.width;
     attributes.height = allocation.height;
     attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
     attributes.visual = gtk_widget_get_visual (widget);
-    attributes.colormap = gtk_widget_get_colormap (widget);
-    attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK;
-    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    attributes.event_mask = gtk_widget_get_events (widget)
+            | GDK_EXPOSURE_MASK
+            | GDK_VISIBILITY_NOTIFY_MASK;
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
 
     window = gdk_window_new (gtk_widget_get_parent_window (widget),
             &attributes, attributes_mask);
@@ -695,15 +715,17 @@ rstto_icon_bar_realize (GtkWidget *widget)
             | GDK_KEY_PRESS_MASK
             | GDK_KEY_RELEASE_MASK)
             | gtk_widget_get_events (widget);
-    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
 
     icon_bar->priv->bin_window = gdk_window_new (window, &attributes, attributes_mask);
     gdk_window_set_user_data (icon_bar->priv->bin_window, widget);
 
-    style = gtk_style_attach (gtk_widget_get_style (widget), window);
-    gtk_widget_set_style (widget, style);
-    gdk_window_set_background (window, &(gtk_widget_get_style (widget)->base[gtk_widget_get_state (widget)]));
-    gdk_window_set_background (icon_bar->priv->bin_window, &(gtk_widget_get_style (widget)->base[gtk_widget_get_state (widget)]));
+    context = gtk_widget_get_style_context (gtk_widget_get_toplevel (widget));
+    gtk_style_context_get (context, gtk_widget_get_state_flags (widget),
+            GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &bg, NULL);
+    gdk_window_set_background_rgba (window, bg);
+    gdk_window_set_background_rgba (icon_bar->priv->bin_window, bg);
+    gdk_rgba_free (bg);
     gdk_window_show (icon_bar->priv->bin_window);
 }
 
@@ -714,9 +736,12 @@ rstto_icon_bar_unrealize (GtkWidget *widget)
 {
     RsttoIconBar *icon_bar = RSTTO_ICON_BAR (widget);
 
-    gdk_window_set_user_data (icon_bar->priv->bin_window, NULL);
-    gdk_window_destroy (icon_bar->priv->bin_window);
-    icon_bar->priv->bin_window = NULL;
+    if (icon_bar->priv->bin_window)
+    {
+        gdk_window_set_user_data (icon_bar->priv->bin_window, NULL);
+        gdk_window_destroy (icon_bar->priv->bin_window);
+        icon_bar->priv->bin_window = NULL;
+    }
 
     /* GtkWidget::unrealize destroys children and widget->window */
     (*GTK_WIDGET_CLASS (rstto_icon_bar_parent_class)->unrealize) (widget);
@@ -769,6 +794,22 @@ rstto_icon_bar_size_request (
         icon_bar->priv->height = requisition->height = icon_bar->priv->item_height;
     }
 }
+static void
+rstto_icon_bar_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width)
+{
+    GtkRequisition requisition;
+
+    rstto_icon_bar_size_request (widget, &requisition);
+    *minimal_width = *natural_width = requisition.width;
+}
+static void
+rstto_icon_bar_get_preferred_height (GtkWidget *widget, gint *minimal_height, gint *natural_height)
+{
+    GtkRequisition requisition;
+
+    rstto_icon_bar_size_request (widget, &requisition);
+    *minimal_height = *natural_height = requisition.height;
+}
 
 
 
@@ -797,6 +838,8 @@ rstto_icon_bar_size_allocate (
                 MAX (icon_bar->priv->width, allocation->width),
                 MAX (icon_bar->priv->height, allocation->height));
     }
+    icon_bar->priv->hadjustment = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
+    icon_bar->priv->vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
 
     if (icon_bar->priv->orientation == GTK_ORIENTATION_VERTICAL)
     {
@@ -809,18 +852,17 @@ rstto_icon_bar_size_allocate (
         value = value / gtk_adjustment_get_upper (icon_bar->priv->hadjustment) * MAX (allocation->width, icon_bar->priv->width);
     }
 
-    gtk_adjustment_set_page_size (icon_bar->priv->hadjustment, allocation->width);
+//    gtk_adjustment_set_page_size (icon_bar->priv->hadjustment, allocation->width);
     gtk_adjustment_set_page_increment (icon_bar->priv->hadjustment, allocation->width * 0.9);
     gtk_adjustment_set_step_increment (icon_bar->priv->hadjustment, allocation->width * 0.1);
-    gtk_adjustment_set_lower (icon_bar->priv->hadjustment, 0);
-    gtk_adjustment_set_upper (icon_bar->priv->hadjustment, MAX (allocation->width, icon_bar->priv->width));
+//    gtk_adjustment_set_lower (icon_bar->priv->hadjustment, 0);
+//    gtk_adjustment_set_upper (icon_bar->priv->hadjustment, MAX (allocation->width, icon_bar->priv->width));
 
-    gtk_adjustment_set_page_size (icon_bar->priv->vadjustment, allocation->height);
+//    gtk_adjustment_set_page_size (icon_bar->priv->vadjustment, allocation->height);
     gtk_adjustment_set_page_increment (icon_bar->priv->vadjustment, allocation->height * 0.9);
     gtk_adjustment_set_step_increment (icon_bar->priv->vadjustment, allocation->height * 0.1);
-    gtk_adjustment_set_lower (icon_bar->priv->vadjustment, 0);
-    gtk_adjustment_set_upper (icon_bar->priv->vadjustment, MAX (allocation->height, icon_bar->priv->height));
-
+//    gtk_adjustment_set_lower (icon_bar->priv->vadjustment, 0);
+//    gtk_adjustment_set_upper (icon_bar->priv->vadjustment, MAX (allocation->height, icon_bar->priv->height));
 
     if (icon_bar->priv->orientation == GTK_ORIENTATION_VERTICAL)
     {
@@ -889,9 +931,9 @@ rstto_icon_bar_size_allocate (
 
 
 static gboolean
-rstto_icon_bar_expose (
-        GtkWidget      *widget,
-        GdkEventExpose *expose)
+rstto_icon_bar_draw (
+        GtkWidget *widget,
+        cairo_t   *cr)
 {
     RsttoIconBarItem *item;
     GdkRectangle    area;
@@ -900,9 +942,6 @@ rstto_icon_bar_expose (
     RsttoFile      *file;
     GtkTreeIter     iter;
 
-    if (expose->window != icon_bar->priv->bin_window)
-        return FALSE;
-
     for (lp = icon_bar->priv->items; lp != NULL; lp = lp->next)
     {
         item = lp->data;
@@ -921,11 +960,12 @@ rstto_icon_bar_expose (
         area.width = icon_bar->priv->item_width;
         area.height = icon_bar->priv->item_height;
 
-
-        if (gdk_region_rect_in (expose->region, &area) != GDK_OVERLAP_RECTANGLE_OUT)
+        // TODO: fix me
+        /*if (gdk_region_rect_in (expose->region, &area) != GDK_OVERLAP_RECTANGLE_OUT)
         {
-            rstto_icon_bar_paint_item (icon_bar, item, &expose->area);
-        }
+            rstto_icon_bar_paint_item (icon_bar, item, &expose->area);*/
+            rstto_icon_bar_paint_item (icon_bar, item, cr);
+        /*}
         else
         {
             iter = item->iter;
@@ -934,7 +974,7 @@ rstto_icon_bar_expose (
                     -1);
             rstto_thumbnailer_dequeue_file (icon_bar->priv->thumbnailer, file);
             g_object_unref (file);
-        }
+        }*/
     }
 
     return TRUE;
@@ -1001,7 +1041,7 @@ rstto_icon_bar_scroll (
         GtkWidget      *widget,
         GdkEventScroll *event)
 {
-    RsttoIconBar    *icon_bar   = RSTTO_ICON_BAR (widget);
+    RsttoIconBar  *icon_bar   = RSTTO_ICON_BAR (widget);
     GtkAdjustment *adjustment = NULL;
     gdouble        val        = 0;
     gdouble        step_size  = 0;
@@ -1009,12 +1049,12 @@ rstto_icon_bar_scroll (
 
     if (icon_bar->priv->orientation == GTK_ORIENTATION_VERTICAL)
     {
-        adjustment = icon_bar->priv->vadjustment;
+        adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
         step_size = icon_bar->priv->item_height / 2.0;
     }
     else
     {
-        adjustment = icon_bar->priv->hadjustment;
+        adjustment = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
         step_size = icon_bar->priv->item_width / 2.0;
     }
 
@@ -1025,16 +1065,41 @@ rstto_icon_bar_scroll (
     {
         case GDK_SCROLL_UP:
         case GDK_SCROLL_LEFT:
-            val-=step_size;
-            if (val<0) val = 0.0;
+            val -= step_size;
+            if (val < 0) val = 0.0;
             break;
         case GDK_SCROLL_DOWN:
         case GDK_SCROLL_RIGHT:
-            val+=step_size;
+            val += step_size;
             if (val > max_value) val = max_value;
             break;
+
+        default: /* GDK_SCROLL_SMOOTH */
+            if (icon_bar->priv->orientation == GTK_ORIENTATION_VERTICAL)
+            {
+                if (event->delta_y < 0) {
+                    val -= step_size;
+                    if (val < 0) val = 0.0;
+                } else if (event->delta_y > 0) {
+                    val += step_size;
+                    if (val > max_value) val = max_value;
+                }
+            }
+            else
+            {
+                if (event->delta_y < 0) {
+                    val -= step_size;
+                    if (val<0) val = 0.0;
+                } else if (event->delta_y > 0) {
+                    val += step_size;
+                    if (val > max_value) val = max_value;
+                }
+            }
+            break;
     }
+
     gtk_adjustment_set_value (adjustment, val);
+
     return TRUE;
 }
 
@@ -1085,6 +1150,7 @@ rstto_icon_bar_set_adjustments (
         GtkAdjustment *hadj,
         GtkAdjustment *vadj)
 {
+#if 0
     gboolean need_adjust = FALSE;
 
     if (hadj != NULL)
@@ -1137,6 +1203,7 @@ rstto_icon_bar_set_adjustments (
 
     if (need_adjust)
         cb_rstto_icon_bar_adjustment_value_changed (NULL, icon_bar);
+#endif
 }
 
 
@@ -1146,6 +1213,7 @@ cb_rstto_icon_bar_adjustment_value_changed (
         GtkAdjustment *adjustment,
         RsttoIconBar  *icon_bar)
 {
+#if 0
     if (gtk_widget_get_realized (GTK_WIDGET (icon_bar)))
     {
         /* Set auto_center to false, this should be the default behaviour
@@ -1163,6 +1231,7 @@ cb_rstto_icon_bar_adjustment_value_changed (
 
         gdk_window_process_updates (icon_bar->priv->bin_window, TRUE);
     }
+#endif
 }
 
 static void
@@ -1227,12 +1296,12 @@ static void
 rstto_icon_bar_paint_item (
         RsttoIconBar     *icon_bar,
         RsttoIconBarItem *item,
-        GdkRectangle     *area)
+        cairo_t          *cr)
 {
     const GdkPixbuf *pixbuf = NULL;
-    GdkColor        *border_color;
-    GdkColor        *fill_color;
-    cairo_t         *cr;
+    GdkRGBA         *border_color;
+    GdkRGBA         *fill_color;
+    GdkRGBA          tmp_color;
     gint             focus_width;
     gint             focus_pad;
     gint             x, y;
@@ -1296,25 +1365,24 @@ rstto_icon_bar_paint_item (
 
         if (fill_color == NULL)
         {
-            fill_color = gdk_color_copy (&(gtk_widget_get_style (GTK_WIDGET (icon_bar))->base[GTK_STATE_SELECTED]));
-            gdk_color_parse ("#c1d2ee", fill_color);
+            gdk_rgba_parse (&tmp_color, "#c1d2ee");
+            fill_color = gdk_rgba_copy (&tmp_color);
         }
 
         if (border_color == NULL)
         {
-            border_color = gdk_color_copy (&(gtk_widget_get_style (GTK_WIDGET (icon_bar))->base[GTK_STATE_SELECTED]));
-            gdk_color_parse ("#316ac5", border_color);
+            gdk_rgba_parse (&tmp_color, "#316ac5");
+            border_color = gdk_rgba_copy (&tmp_color);
         }
 
-        cr = gdk_cairo_create (icon_bar->priv->bin_window);
-        gdk_cairo_rectangle (cr, area);
-        cairo_clip (cr);
-        cairo_set_source_rgb (cr, fill_color->red/65535., fill_color->green/65535., fill_color->blue/65535.);
+        cairo_save (cr);
+        //cairo_clip (cr);
+        cairo_set_source_rgb (cr, fill_color->red, fill_color->green, fill_color->blue);
         cairo_rectangle (cr, x + focus_pad + focus_width, y + focus_pad + focus_width,
                          icon_bar->priv->item_width - 2 * (focus_width + focus_pad),
                          icon_bar->priv->item_height - 2 * (focus_width + focus_pad));
         cairo_fill (cr);
-        cairo_set_source_rgb (cr, border_color->red/65535., border_color->green/65535., border_color->blue/65535.);
+        cairo_set_source_rgb (cr, border_color->red, border_color->green, border_color->blue);
         cairo_set_line_width (cr, focus_width);
         cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
         cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
@@ -1322,10 +1390,10 @@ rstto_icon_bar_paint_item (
                          icon_bar->priv->item_width - (2 * focus_pad + focus_width),
                          icon_bar->priv->item_height - (2 * focus_pad + focus_width));
         cairo_stroke (cr);
-        cairo_destroy (cr);
+        cairo_restore (cr);
 
-        gdk_color_free (border_color);
-        gdk_color_free (fill_color);
+        gdk_rgba_free (border_color);
+        gdk_rgba_free (fill_color);
     }
     else if (icon_bar->priv->cursor_item == item)
     {
@@ -1336,25 +1404,24 @@ rstto_icon_bar_paint_item (
 
         if (fill_color == NULL)
         {
-            fill_color = gdk_color_copy (&(gtk_widget_get_style (GTK_WIDGET (icon_bar))->base[GTK_STATE_SELECTED]));
-            gdk_color_parse ("#e0e8f6", fill_color);
+            gdk_rgba_parse (&tmp_color, "#e0e8f6");
+            fill_color = gdk_rgba_copy (&tmp_color);
         }
 
         if (border_color == NULL)
         {
-            border_color = gdk_color_copy (&(gtk_widget_get_style (GTK_WIDGET (icon_bar))->base[GTK_STATE_SELECTED]));
-            gdk_color_parse ("#98b4e2", border_color);
+            gdk_rgba_parse (&tmp_color, "#98b4e2");
+            border_color = gdk_rgba_copy (&tmp_color);
         }
 
-        cr = gdk_cairo_create (icon_bar->priv->bin_window);
-        gdk_cairo_rectangle (cr, area);
-        cairo_clip (cr);
-        cairo_set_source_rgb (cr, fill_color->red/65535., fill_color->green/65535., fill_color->blue/65535.);
+        cairo_save (cr);
+        //cairo_clip (cr);
+        cairo_set_source_rgb (cr, fill_color->red, fill_color->green, fill_color->blue);
         cairo_rectangle (cr, x + focus_pad + focus_width, y + focus_pad + focus_width,
                          icon_bar->priv->item_width - 2 * (focus_width + focus_pad),
                          icon_bar->priv->item_height - 2 * (focus_width + focus_pad));
         cairo_fill (cr);
-        cairo_set_source_rgb (cr, border_color->red/65535., border_color->green/65535., border_color->blue/65535.);
+        cairo_set_source_rgb (cr, border_color->red, border_color->green, border_color->blue);
         cairo_set_line_width (cr, focus_width);
         cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
         cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
@@ -1362,19 +1429,18 @@ rstto_icon_bar_paint_item (
                          icon_bar->priv->item_width - (2 * focus_pad + focus_width),
                          icon_bar->priv->item_height - (2 * focus_pad + focus_width));
         cairo_stroke (cr);
-        cairo_destroy (cr);
+        cairo_restore (cr);
 
-        gdk_color_free (border_color);
-        gdk_color_free (fill_color);
+        gdk_rgba_free (border_color);
+        gdk_rgba_free (fill_color);
     }
 
-
     if (NULL != pixbuf)
     {
-        cr = gdk_cairo_create (icon_bar->priv->bin_window);
+        cairo_save (cr);
         gdk_cairo_set_source_pixbuf (cr, pixbuf, px, py);
         cairo_paint (cr);
-        cairo_destroy (cr);
+        cairo_restore (cr);
     }
 }
 
@@ -1628,15 +1694,20 @@ rstto_icon_bar_rows_reordered (
 
 /**
  * rstto_icon_bar_new:
+ * @s_window : A #GtkScrolledWindow.
  *
  * Creates a new #RsttoIconBar without model.
  *
  * Returns: a newly allocated #RsttoIconBar.
  **/
 GtkWidget *
-rstto_icon_bar_new (void)
+rstto_icon_bar_new (GtkWidget *s_window)
 {
-    return g_object_new (RSTTO_TYPE_ICON_BAR, NULL);
+    g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (s_window), NULL);
+
+    return g_object_new (RSTTO_TYPE_ICON_BAR,
+            "scrolled-window", s_window,
+            NULL);
 }
 
 
@@ -2065,6 +2136,7 @@ rstto_icon_bar_show_active (RsttoIconBar *icon_bar)
 
     if (icon_bar->priv->orientation == GTK_ORIENTATION_VERTICAL)
     {
+        icon_bar->priv->vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
         page_size = gtk_adjustment_get_page_size (icon_bar->priv->vadjustment);
         value = icon_bar->priv->active_item->index * icon_bar->priv->item_height - ((page_size-icon_bar->priv->item_height)/2);
 
@@ -2079,6 +2151,7 @@ rstto_icon_bar_show_active (RsttoIconBar *icon_bar)
     }
     else
     {
+        icon_bar->priv->hadjustment = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (icon_bar->priv->s_window));
         page_size = gtk_adjustment_get_page_size (icon_bar->priv->hadjustment);
         value = icon_bar->priv->active_item->index * icon_bar->priv->item_width - ((page_size-icon_bar->priv->item_width)/2);
 
@@ -2099,6 +2172,7 @@ rstto_icon_bar_adjustment_changed (
         RsttoIconBar  *icon_bar,
         GtkAdjustment *adjustment)
 {
+#if 0
     if (TRUE == icon_bar->priv->auto_center)
     {
         gtk_adjustment_changed (adjustment);
@@ -2108,6 +2182,7 @@ rstto_icon_bar_adjustment_changed (
     {
         gtk_adjustment_changed (adjustment);
     }
+#endif
 }
 
 static void
@@ -2115,15 +2190,18 @@ rstto_icon_bar_adjustment_value_changed (
         RsttoIconBar  *icon_bar,
         GtkAdjustment *adjustment)
 {
+#if 0
     if (TRUE == icon_bar->priv->auto_center)
     {
-        gtk_adjustment_value_changed (adjustment);
+        //gtk_adjustment_value_changed (adjustment);
         icon_bar->priv->auto_center = TRUE;
     }
     else
     {
-        gtk_adjustment_value_changed (adjustment);
+        //gtk_adjustment_value_changed (adjustment);
     }
+    cb_rstto_icon_bar_adjustment_value_changed (adjustment, icon_bar);
+#endif
 }
 
 static void
diff --git a/src/icon_bar.h b/src/icon_bar.h
index 5f846a7..03f0e42 100644
--- a/src/icon_bar.h
+++ b/src/icon_bar.h
@@ -48,9 +48,11 @@ struct _RsttoIconBarClass
   GtkContainerClass __parent__;
 
   /* signals */
+#if 0
   void  (*set_scroll_adjustments)  (RsttoIconBar    *icon_bar,
                                     GtkAdjustment *hadjustment,
                                     GtkAdjustment *vadjustment);
+#endif
   void  (*selection_changed)       (RsttoIconBar *icon_bar);
 
   /*< private >*/
@@ -76,7 +78,7 @@ struct _RsttoIconBar
 
 GType           rstto_icon_bar_get_type           (void) G_GNUC_CONST;
 
-GtkWidget      *rstto_icon_bar_new                (void);
+GtkWidget      *rstto_icon_bar_new                (GtkWidget      *s_window);
 GtkWidget      *rstto_icon_bar_new_with_model     (GtkTreeModel   *model);
 
 GtkTreeModel   *rstto_icon_bar_get_model          (RsttoIconBar     *icon_bar);
diff --git a/src/image_list.c b/src/image_list.c
index e9b943f..6743e71 100644
--- a/src/image_list.c
+++ b/src/image_list.c
@@ -708,7 +708,7 @@ rstto_image_list_set_directory (
             loader->file_enum = file_enumerator;
             loader->image_list = image_list;
 
-            image_list->priv->directory_loader = g_idle_add ( (GSourceFunc) cb_rstto_read_file, loader );
+            image_list->priv->directory_loader = gdk_threads_add_idle ( (GSourceFunc) cb_rstto_read_file, loader );
         }
     }
 
diff --git a/src/image_viewer.c b/src/image_viewer.c
index 7a29c45..f0b2370 100644
--- a/src/image_viewer.c
+++ b/src/image_viewer.c
@@ -22,6 +22,7 @@
 #include <gio/gio.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <libexif/exif-data.h>
+#include <cairo/cairo.h>
 
 #include <math.h>
 
@@ -52,7 +53,13 @@
 enum
 {
     PROP_0,
-    PROP_SHOW_CLOCK
+    PROP_SHOW_CLOCK,
+
+    /* For scrollable interface */
+    PROP_HADJUSTMENT,
+    PROP_VADJUSTMENT,
+    PROP_HSCROLL_POLICY,
+    PROP_VSCROLL_POLICY
 };
 
 typedef enum
@@ -69,18 +76,21 @@ struct _RsttoImageViewerPriv
     RsttoFile                   *file;
     RsttoSettings               *settings;
     GdkVisual                   *visual;
-    GdkColormap                 *colormap;
+    //GdkColormap                 *colormap;
 
     GtkIconTheme                *icon_theme;
     GdkPixbuf                   *missing_icon;
     GdkPixbuf                   *bg_icon;
-    GdkColor                    *bg_color;
-    GdkColor                    *bg_color_fs;
+    GdkRGBA                     *bg_color;
+    GdkRGBA                     *bg_color_fs;
 
     gboolean                     limit_quality;
 
     GError                      *error;
 
+    guint                        hscroll_policy : 1;
+    guint                        vscroll_policy : 1;
+
     RsttoImageViewerTransaction *transaction;
     GdkPixbuf                   *pixbuf;
     RsttoImageOrientation        orientation;
@@ -167,20 +177,22 @@ paint_background_icon (
 
 
 static void
-rstto_image_viewer_init (GObject *);
+rstto_image_viewer_init (RsttoImageViewer *viewer);
 static void
 rstto_image_viewer_class_init(RsttoImageViewerClass *);
 static void
-rstto_image_viewer_destroy(GtkObject *object);
+rstto_image_viewer_dispose (GObject *object);
 
 static void
-rstto_image_viewer_size_request(GtkWidget *, GtkRequisition *);
+rstto_image_viewer_get_preferred_width(GtkWidget *, gint *, gint *);
+static void
+rstto_image_viewer_get_preferred_height(GtkWidget *, gint *, gint *);
 static void
 rstto_image_viewer_size_allocate(GtkWidget *, GtkAllocation *);
 static void
 rstto_image_viewer_realize(GtkWidget *);
 static gboolean 
-rstto_image_viewer_expose(GtkWidget *, GdkEventExpose *);
+rstto_image_viewer_draw(GtkWidget *, cairo_t *);
 static void
 rstto_image_viewer_paint (GtkWidget *widget, cairo_t *);
 
@@ -278,37 +290,13 @@ rstto_image_viewer_transaction_free (RsttoImageViewerTransaction *tr);
 static GtkWidgetClass *parent_class = NULL;
 static GdkScreen      *default_screen = NULL;
 
-GType
-rstto_image_viewer_get_type (void)
-{
-    static GType rstto_image_viewer_type = 0;
-
-    if (!rstto_image_viewer_type)
-    {
-        static const GTypeInfo rstto_image_viewer_info = 
-        {
-            sizeof (RsttoImageViewerClass),
-            (GBaseInitFunc) NULL,
-            (GBaseFinalizeFunc) NULL,
-            (GClassInitFunc) rstto_image_viewer_class_init,
-            (GClassFinalizeFunc) NULL,
-            NULL,
-            sizeof (RsttoImageViewer),
-            0,
-            (GInstanceInitFunc) rstto_image_viewer_init,
-            NULL
-        };
+G_DEFINE_TYPE_WITH_CODE (RsttoImageViewer, rstto_image_viewer, GTK_TYPE_WIDGET,
+             G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
 
-        rstto_image_viewer_type = g_type_register_static (GTK_TYPE_WIDGET, "RsttoImageViewer", &rstto_image_viewer_info, 0);
-    }
-    return rstto_image_viewer_type;
-}
 
 static void
-rstto_image_viewer_init ( GObject *object )
+rstto_image_viewer_init (RsttoImageViewer *viewer)
 {
-    RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER (object);
-
     if (default_screen == NULL)
     {
         default_screen = gdk_screen_get_default();
@@ -320,7 +308,8 @@ rstto_image_viewer_init ( GObject *object )
     viewer->priv->image_width = 0;
     viewer->priv->image_height = 0;
     viewer->priv->visual = gdk_visual_get_system ();
-    viewer->priv->colormap = gdk_colormap_new (viewer->priv->visual, TRUE);
+    // TODO: comment out for now
+    //viewer->priv->colormap = gdk_colormap_new (viewer->priv->visual, TRUE);
 
     viewer->priv->icon_theme = gtk_icon_theme_get_default ();
     viewer->priv->bg_icon = gtk_icon_theme_load_icon (
@@ -376,13 +365,12 @@ rstto_image_viewer_init ( GObject *object )
                            GDK_BUTTON_RELEASE_MASK |
                            GDK_BUTTON1_MOTION_MASK |
                            GDK_ENTER_NOTIFY_MASK |
-                           GDK_POINTER_MOTION_MASK);
-
+                           GDK_POINTER_MOTION_MASK |
+                           GDK_SCROLL_MASK);
 
     gtk_drag_dest_set(GTK_WIDGET(viewer), GTK_DEST_DEFAULT_ALL, NULL, 0,
                       GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_MOVE | GDK_ACTION_PRIVATE);
     gtk_drag_dest_add_uri_targets (GTK_WIDGET(viewer));
-
 }
 
 /**
@@ -396,18 +384,19 @@ rstto_image_viewer_class_init(RsttoImageViewerClass *viewer_class)
 {
     GParamSpec *pspec;
     GtkWidgetClass *widget_class;
-    GtkObjectClass *object_class;
+    GObjectClass *object_class;
 
     widget_class = (GtkWidgetClass*)viewer_class;
-    object_class = (GtkObjectClass*)viewer_class;
+    object_class = (GObjectClass*)viewer_class;
 
     parent_class = g_type_class_peek_parent(viewer_class);
 
     viewer_class->set_scroll_adjustments = rstto_image_viewer_set_scroll_adjustments;
 
-    widget_class->expose_event = rstto_image_viewer_expose;
+    widget_class->draw = rstto_image_viewer_draw;
     widget_class->realize = rstto_image_viewer_realize;
-    widget_class->size_request = rstto_image_viewer_size_request;
+    widget_class->get_preferred_width = rstto_image_viewer_get_preferred_width;
+    widget_class->get_preferred_height = rstto_image_viewer_get_preferred_height;
     widget_class->size_allocate = rstto_image_viewer_size_allocate;
     widget_class->scroll_event = rstto_scroll_event;
 
@@ -416,22 +405,10 @@ rstto_image_viewer_class_init(RsttoImageViewerClass *viewer_class)
     widget_class->motion_notify_event = rstto_motion_notify_event;
     widget_class->popup_menu = rstto_popup_menu;
 
-    object_class->destroy = rstto_image_viewer_destroy;
-
-    G_OBJECT_CLASS(object_class)->set_property = rstto_image_viewer_set_property;
-    G_OBJECT_CLASS(object_class)->get_property = rstto_image_viewer_get_property;
+    object_class->set_property = rstto_image_viewer_set_property;
+    object_class->get_property = rstto_image_viewer_get_property;
+    object_class->dispose      = rstto_image_viewer_dispose;
 
-
-    widget_class->set_scroll_adjustments_signal =
-                  g_signal_new ("set_scroll_adjustments",
-                                G_TYPE_FROM_CLASS (object_class),
-                                G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-                                G_STRUCT_OFFSET (RsttoImageViewerClass, set_scroll_adjustments),
-                                NULL, NULL,
-                                _rstto_marshal_VOID__OBJECT_OBJECT,
-                                G_TYPE_NONE, 2,
-                                GTK_TYPE_ADJUSTMENT,
-                                GTK_TYPE_ADJUSTMENT);
     g_signal_new (
             "size-ready",
             G_TYPE_FROM_CLASS (object_class),
@@ -473,6 +450,24 @@ rstto_image_viewer_class_init(RsttoImageViewerClass *viewer_class)
             G_OBJECT_CLASS(object_class),
             PROP_SHOW_CLOCK,
             pspec);
+
+    /* Scrollable interface properties */
+    g_object_class_override_property (
+            object_class,
+            PROP_HADJUSTMENT,
+            "hadjustment");
+    g_object_class_override_property (
+            object_class,
+            PROP_VADJUSTMENT,
+            "vadjustment");
+    g_object_class_override_property (
+            object_class,
+            PROP_HSCROLL_POLICY,
+            "hscroll-policy");
+    g_object_class_override_property (
+            object_class,
+            PROP_VSCROLL_POLICY,
+            "vscroll-policy");
 }
 
 /**
@@ -493,7 +488,6 @@ rstto_image_viewer_realize(GtkWidget *widget)
     GtkAllocation allocation;
     GdkWindowAttr attributes;
     GdkWindow *window;
-    GtkStyle *style;
     gint attributes_mask;
 
     g_return_if_fail (widget != NULL);
@@ -501,8 +495,8 @@ rstto_image_viewer_realize(GtkWidget *widget)
 
     gtk_widget_set_realized (widget, TRUE);
 
-    g_value_init (&val_bg_color, GDK_TYPE_COLOR);
-    g_value_init (&val_bg_color_fs, GDK_TYPE_COLOR);
+    g_value_init (&val_bg_color, GDK_TYPE_RGBA);
+    g_value_init (&val_bg_color_fs, GDK_TYPE_RGBA);
     g_value_init (&val_bg_color_override, G_TYPE_BOOLEAN);
     g_value_init (&val_limit_quality, G_TYPE_BOOLEAN);
     g_value_init (&val_invert_zoom, G_TYPE_BOOLEAN);
@@ -516,17 +510,15 @@ rstto_image_viewer_realize(GtkWidget *widget)
     attributes.window_type = GDK_WINDOW_CHILD;
     attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK;
     attributes.visual = gtk_widget_get_visual (widget);
-    attributes.colormap = gtk_widget_get_colormap (widget);
+    // TODO: comment out for now
+    //attributes.colormap = gtk_widget_get_colormap (widget);
 
-    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    // TODO: comment out for now
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL /*| GDK_WA_COLORMAP*/;
     window = gdk_window_new (gtk_widget_get_parent_window(widget), &attributes, attributes_mask);
     gtk_widget_set_window (widget, window);
-
-    style = gtk_style_attach (gtk_widget_get_style (widget), window);
-    gtk_widget_set_style (widget, style);
     gdk_window_set_user_data (window, widget);
-
-    gtk_style_set_background (gtk_widget_get_style (widget), window, GTK_STATE_ACTIVE);
+    g_object_ref (window);
 
     g_object_get_property (
             G_OBJECT(viewer->priv->settings),
@@ -558,26 +550,30 @@ rstto_image_viewer_realize(GtkWidget *widget)
     }
     else
     {
-        viewer->priv->bg_color = &(gtk_widget_get_style (widget)->bg[GTK_STATE_NORMAL]);
+        viewer->priv->bg_color = NULL;
     }
 
     viewer->priv->bg_color_fs = g_value_get_boxed (&val_bg_color_fs);
 }
 
 /**
- * rstto_image_viewer_size_request:
- * @widget:
- * @requisition:
+ * rstto_image_viewer_get_preferred_width/height:
  *
  * Request a default size of 300 by 400 pixels
  */
 static void
-rstto_image_viewer_size_request(GtkWidget *widget, GtkRequisition *requisition)
+rstto_image_viewer_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width)
 {
-    requisition->width = 400;
-    requisition->height= 300;
+    *minimal_width = 100;
+    *natural_width = 400;
 }
 
+static void
+rstto_image_viewer_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height)
+{
+    *minimal_height = 100;
+    *natural_height = 300;
+}
 
 /**
  * rstto_image_viewer_size_allocate:
@@ -589,12 +585,13 @@ static void
 rstto_image_viewer_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
 {
     RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER (widget);
+    GdkWindow *window = gtk_widget_get_window (widget);
     gint border_width = 0;
 
     gtk_widget_set_allocation (widget, allocation);
     if (gtk_widget_get_realized (widget))
     {
-        gdk_window_move_resize (gtk_widget_get_window (widget),
+        gdk_window_move_resize (window,
                 allocation->x + border_width,
                 allocation->y + border_width,
                 allocation->width - border_width * 2,
@@ -609,52 +606,32 @@ rstto_image_viewer_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
         }
 
         gdk_window_invalidate_rect (
-                gtk_widget_get_window (widget),
+                window,
                 NULL,
                 FALSE);
     }
 }
 
 /**
- * rstto_image_viewer_expose:
+ * rstto_image_viewer_draw:
  * @widget:
- * @event:
+ * @cairo_t:
  *
  */
 static gboolean
-rstto_image_viewer_expose(GtkWidget *widget, GdkEventExpose *event)
+rstto_image_viewer_draw(GtkWidget *widget, cairo_t *ctx)
 {
-    RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER (widget);
-
-    cairo_t *ctx;
-
-    /* get a cairo_t */
-    ctx = gdk_cairo_create (gtk_widget_get_window (widget));
-
-    /* set a clip region for the expose event */
-    if (FALSE == viewer->priv->auto_scale)
-    {
-        cairo_rectangle (
-                ctx,
-                event->area.x, event->area.y,
-                event->area.width, event->area.height);
-        cairo_clip (ctx);
-    }
-
     cairo_save (ctx);
 
     rstto_image_viewer_paint (widget, ctx);
 
     cairo_restore (ctx);
 
-    cairo_destroy (ctx);
-
-
     return TRUE;
 }
 
 static void
-rstto_image_viewer_destroy(GtkObject *object)
+rstto_image_viewer_dispose (GObject *object)
 {
     RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER(object);
 
@@ -885,13 +862,16 @@ static void
 paint_background (GtkWidget *widget, cairo_t *ctx)
 {
     RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER (widget);
-    GdkColor *bg_color = NULL;
+    GdkRGBA *bg_color = NULL;
+    GdkWindow *window = gtk_widget_get_window (widget);
+    GtkAllocation allocation;
+    GtkStyleContext *context = gtk_widget_get_style_context (widget);
 
     /* Determine if we draw the 'default' background-color,
      * or the fullscreen-background-color.
      */
     if (GDK_WINDOW_STATE_FULLSCREEN & gdk_window_get_state (
-                gdk_window_get_toplevel (gtk_widget_get_window (widget))))
+                gdk_window_get_toplevel (window)))
     {
         bg_color = viewer->priv->bg_color_fs;
     }
@@ -903,8 +883,16 @@ paint_background (GtkWidget *widget, cairo_t *ctx)
 
     /* Paint the background-color */
     /******************************/
-    gdk_cairo_set_source_color (ctx, bg_color);
-    cairo_paint (ctx);
+    if ( NULL != bg_color )
+    {
+        gdk_cairo_set_source_rgba (ctx, bg_color);
+        cairo_paint (ctx);
+    }
+    else
+    {
+        gtk_widget_get_allocation (widget, &allocation);
+        gtk_render_background (context, ctx, 0, 0, allocation.width, allocation.height);
+    }
 }
 
 static void
@@ -1576,19 +1564,17 @@ static void
 rstto_image_viewer_paint (GtkWidget *widget, cairo_t *ctx)
 {
     RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER (widget);
-    GtkAllocation allocation;
     
     if (gtk_widget_get_realized (widget))
     {
-        gtk_widget_get_allocation (widget, &allocation);
         correct_adjustments (viewer);
 
         cairo_rectangle (
                 ctx,
                 0.0,
                 0.0,
-                (gdouble)allocation.width,
-                (gdouble)allocation.height);
+                (gdouble)gtk_widget_get_allocated_width (widget),
+                (gdouble)gtk_widget_get_allocated_height (widget));
         cairo_clip (ctx);
         cairo_save (ctx);
         
@@ -2125,7 +2111,7 @@ cb_rstto_image_loader_image_ready (GdkPixbufLoader *loader, RsttoImageViewerTran
         if (timeout > 0)
         {
             viewer->priv->animation_timeout_id =
-                    g_timeout_add(timeout, (GSourceFunc)cb_rstto_image_viewer_update_pixbuf, viewer);
+                    gdk_threads_add_timeout (timeout, (GSourceFunc) cb_rstto_image_viewer_update_pixbuf, viewer);
         }
         else
         {
@@ -2267,7 +2253,7 @@ cb_rstto_image_viewer_update_pixbuf (RsttoImageViewer *viewer)
         if (timeout > 0)
         {
             viewer->priv->animation_timeout_id =
-                    g_timeout_add(timeout, (GSourceFunc)cb_rstto_image_viewer_update_pixbuf, viewer);
+                    gdk_threads_add_timeout(timeout, (GSourceFunc)cb_rstto_image_viewer_update_pixbuf, viewer);
         }
 
         gdk_window_invalidate_rect (gtk_widget_get_window (widget), NULL, FALSE);
@@ -2351,6 +2337,7 @@ rstto_scroll_event (GtkWidget *widget, GdkEventScroll *event)
                     case RSTTO_IMAGE_ORIENT_180:
                     case RSTTO_IMAGE_ORIENT_FLIP_HORIZONTAL:
                     case RSTTO_IMAGE_ORIENT_FLIP_VERTICAL:
+
                     default:
                         v_scale = (gdouble)(allocation.width) / (gdouble)viewer->priv->image_width;
                         h_scale = (gdouble)(allocation.height) / (gdouble)viewer->priv->image_height;
@@ -2538,9 +2525,9 @@ rstto_motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
                      (event->y < (viewer->priv->rendering.y_offset + viewer->priv->rendering.height)) &&
                      (event->x < (viewer->priv->rendering.x_offset + viewer->priv->rendering.width)))
                 {
-                    GdkCursor *cursor = gdk_cursor_new(GDK_UL_ANGLE);
+                    GdkCursor *cursor = gdk_cursor_new_for_display(gdk_display_get_default(), GDK_UL_ANGLE);
                     gdk_window_set_cursor(gtk_widget_get_window (widget), cursor);
-                    gdk_cursor_unref(cursor);
+                    g_object_unref(cursor);
                 }
                 else
                 {
@@ -2580,9 +2567,9 @@ rstto_button_press_event (GtkWidget *widget, GdkEventButton *event)
                      (event->y < (viewer->priv->rendering.y_offset + viewer->priv->rendering.height)) &&
                      (event->x < (viewer->priv->rendering.x_offset + viewer->priv->rendering.width)))
                 {
-                    GdkCursor *cursor = gdk_cursor_new(GDK_FLEUR);
+                    GdkCursor *cursor = gdk_cursor_new_for_display(gdk_display_get_default(), GDK_FLEUR);
                     gdk_window_set_cursor(gtk_widget_get_window (widget), cursor);
-                    gdk_cursor_unref(cursor);
+                    g_object_unref(cursor);
                     rstto_image_viewer_set_motion_state (viewer, RSTTO_IMAGE_VIEWER_MOTION_STATE_MOVE);
                 }
             }
@@ -2596,9 +2583,9 @@ rstto_button_press_event (GtkWidget *widget, GdkEventButton *event)
                      (event->y < (viewer->priv->rendering.y_offset + viewer->priv->rendering.height)) &&
                      (event->x < (viewer->priv->rendering.x_offset + viewer->priv->rendering.width)))
                 {
-                    GdkCursor *cursor = gdk_cursor_new(GDK_UL_ANGLE);
+                    GdkCursor *cursor = gdk_cursor_new_for_display(gdk_display_get_default(), GDK_UL_ANGLE);
                     gdk_window_set_cursor(gtk_widget_get_window (widget), cursor);
-                    gdk_cursor_unref(cursor);
+                    g_object_unref(cursor);
                 }
 
                 /* Set the zoom-state even if not hovering over the
@@ -2616,6 +2603,9 @@ rstto_button_press_event (GtkWidget *widget, GdkEventButton *event)
         if (viewer->priv->menu)
         {
             gtk_widget_show_all(GTK_WIDGET(viewer->priv->menu));
+#if GTK_CHECK_VERSION (3, 22, 0)
+            gtk_menu_popup_at_pointer(viewer->priv->menu, NULL);
+#else
             gtk_menu_popup (
                     viewer->priv->menu,
                     NULL,
@@ -2624,6 +2614,7 @@ rstto_button_press_event (GtkWidget *widget, GdkEventButton *event)
                     NULL,
                     3,
                     event->time);
+#endif
         }
         return TRUE;
     }
@@ -2835,8 +2826,8 @@ cb_rstto_bgcolor_changed (GObject *settings, GParamSpec *pspec, gpointer user_da
     GValue val_bg_color_override = {0, };
     GValue val_bg_color_fs = {0, };
 
-    g_value_init (&val_bg_color, GDK_TYPE_COLOR);
-    g_value_init (&val_bg_color_fs, GDK_TYPE_COLOR);
+    g_value_init (&val_bg_color, GDK_TYPE_RGBA);
+    g_value_init (&val_bg_color_fs, GDK_TYPE_RGBA);
     g_value_init (&val_bg_color_override, G_TYPE_BOOLEAN);
 
     g_object_get_property (
@@ -2858,7 +2849,7 @@ cb_rstto_bgcolor_changed (GObject *settings, GParamSpec *pspec, gpointer user_da
     }
     else
     {
-        viewer->priv->bg_color = &(gtk_widget_get_style (widget)->bg[GTK_STATE_NORMAL]);
+        viewer->priv->bg_color = NULL;
     }
     viewer->priv->bg_color_fs = g_value_get_boxed (&val_bg_color_fs);
 
@@ -2883,9 +2874,13 @@ rstto_popup_menu (GtkWidget *widget)
     if (viewer->priv->menu)
     {
         gtk_widget_show_all (GTK_WIDGET (viewer->priv->menu));
+#if GTK_CHECK_VERSION (3, 22, 0)
+        gtk_menu_popup_at_pointer (viewer->priv->menu, NULL);
+#else
         gtk_menu_popup (viewer->priv->menu,
                         NULL, NULL, NULL, NULL, 0,
                         gtk_get_current_event_time());
+#endif
         return TRUE;
     }
     return FALSE;
@@ -2934,6 +2929,48 @@ rstto_image_viewer_set_property (GObject *object, guint property_id, const GValu
         case PROP_SHOW_CLOCK:
             viewer->priv->props.show_clock = g_value_get_boolean (value);
             break;
+        case PROP_HADJUSTMENT:
+            if(viewer->hadjustment)
+            {
+                g_signal_handlers_disconnect_by_func(viewer->hadjustment, viewer->priv->cb_value_changed, viewer);
+                g_object_unref(viewer->hadjustment);
+            }
+            viewer->hadjustment = g_value_get_object (value);
+
+            if(viewer->hadjustment)
+            {
+                gtk_adjustment_set_lower (viewer->hadjustment, 0);
+                gtk_adjustment_set_upper (viewer->hadjustment, 0);
+
+                g_signal_connect(G_OBJECT(viewer->hadjustment), "value-changed", (GCallback)viewer->priv->cb_value_changed, viewer);
+                g_object_ref(viewer->hadjustment);
+            }
+            break;
+        case PROP_VADJUSTMENT:
+            if(viewer->vadjustment)
+            {
+                g_signal_handlers_disconnect_by_func(viewer->vadjustment, viewer->priv->cb_value_changed, viewer);
+                g_object_unref(viewer->vadjustment);
+            }
+            viewer->vadjustment = g_value_get_object (value);
+
+            if(viewer->vadjustment)
+            {
+                gtk_adjustment_set_lower (viewer->vadjustment, 0);
+                gtk_adjustment_set_upper (viewer->vadjustment, 0);
+
+                g_signal_connect(G_OBJECT(viewer->vadjustment), "value-changed", (GCallback)viewer->priv->cb_value_changed, viewer);
+                g_object_ref(viewer->vadjustment);
+            }
+            break;
+        case PROP_HSCROLL_POLICY:
+            viewer->priv->hscroll_policy = g_value_get_enum (value);
+            gtk_widget_queue_resize (GTK_WIDGET (viewer));
+            break;
+        case PROP_VSCROLL_POLICY:
+            viewer->priv->vscroll_policy = g_value_get_enum (value);
+            gtk_widget_queue_resize (GTK_WIDGET (viewer));
+            break;
     }
 }
 
@@ -2947,6 +2984,18 @@ rstto_image_viewer_get_property (GObject *object, guint property_id, GValue *val
         case PROP_SHOW_CLOCK:
             g_value_set_boolean (value, viewer->priv->props.show_clock);
             break;
+        case PROP_HADJUSTMENT:
+            g_value_set_object (value, viewer->hadjustment);
+            break;
+        case PROP_VADJUSTMENT:
+            g_value_set_object (value, viewer->vadjustment);
+            break;
+        case PROP_HSCROLL_POLICY:
+            g_value_set_enum (value, viewer->priv->hscroll_policy);
+            break;
+        case PROP_VSCROLL_POLICY:
+            g_value_set_enum (value, viewer->priv->vscroll_policy);
+            break;
     }
 }
 
@@ -2969,7 +3018,7 @@ rstto_image_viewer_set_show_clock (RsttoImageViewer *viewer, gboolean value)
     viewer->priv->props.show_clock = value;
     if (viewer->priv->props.show_clock)
     {
-        viewer->priv->refresh_timeout_id = g_timeout_add (
+        viewer->priv->refresh_timeout_id = gdk_threads_add_timeout (
                 15000,
                 (GSourceFunc)cb_rstto_image_viewer_refresh, viewer);
     }
diff --git a/src/main.c b/src/main.c
index c081add..f2a5b75 100644
--- a/src/main.c
+++ b/src/main.c
@@ -143,7 +143,7 @@ main(int argc, char **argv)
             rof.iter = 1;
             rof.window = window;
 
-            g_idle_add ((GSourceFunc )cb_rstto_open_files, &rof);
+            gdk_threads_add_idle ((GSourceFunc )cb_rstto_open_files, &rof);
 
             if (TRUE == rstto_settings_get_boolean_property (
                         settings,
diff --git a/src/main_window.c b/src/main_window.c
index 2c2a0b8..adb1117 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -100,7 +100,7 @@ struct _RsttoMainWindowPriv
     GtkWidget             *position_menu;
     GtkWidget             *image_viewer;
     GtkWidget             *p_viewer_s_window;
-    GtkWidget             *table;
+    GtkWidget             *grid;
     GtkWidget             *t_bar_s_window;
     GtkWidget             *thumbnailbar;
     GtkWidget             *statusbar;
@@ -334,6 +334,31 @@ cb_rstto_main_window_image_viewer_scroll_event (
         gpointer user_data);
 
 static void
+rstto_main_activate_file_menu_actions (
+        RsttoMainWindow *window,
+        gboolean activate);
+
+static void
+rstto_main_activate_go_menu_actions (
+        RsttoMainWindow *window,
+        gboolean activate);
+
+static void
+rstto_main_activate_view_menu_actions (
+        RsttoMainWindow *window,
+        gboolean activate);
+
+static void
+rstto_main_activate_popup_menu_actions (
+        RsttoMainWindow *window,
+        gboolean activate);
+
+static void
+rstto_main_activate_toolbar_actions (
+        RsttoMainWindow *window,
+        gboolean activate);
+
+static void
 rstto_main_window_update_buttons (
         RsttoMainWindow *window);
 
@@ -793,7 +818,7 @@ rstto_main_window_init (RsttoMainWindow *window)
 {
     GtkAccelGroup   *accel_group;
     GtkWidget       *separator;
-    GtkWidget       *main_vbox = gtk_vbox_new (FALSE, 0);
+    GtkWidget       *main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
     GtkRecentFilter *recent_filter;
     guint            window_width, window_height;
     gchar           *desktop_type = NULL;
@@ -948,7 +973,7 @@ rstto_main_window_init (RsttoMainWindow *window)
     gtk_action_group_add_radio_actions (window->priv->action_group, radio_action_size_entries, G_N_ELEMENTS (radio_action_size_entries), thumbnail_size, G_CALLBACK (cb_rstto_main_window_thumbnail_size_changed), GTK_WIDGET (window));
 
 
-    gtk_ui_manager_add_ui_from_string (window->priv->ui_manager,main_window_ui, main_window_ui_length, NULL);
+    gtk_ui_manager_add_ui_from_string (window->priv->ui_manager, main_window_ui, main_window_ui_length, NULL);
     window->priv->menubar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu");
     window->priv->toolbar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar");
     window->priv->image_viewer_menu = gtk_ui_manager_get_widget (window->priv->ui_manager, "/image-viewer-menu");
@@ -996,19 +1021,21 @@ rstto_main_window_init (RsttoMainWindow *window)
         RSTTO_IMAGE_VIEWER(window->priv->image_viewer),
         GTK_MENU(window->priv->image_viewer_menu));
 
-    window->priv->thumbnailbar = rstto_icon_bar_new();
-    rstto_icon_bar_set_show_text (RSTTO_ICON_BAR (window->priv->thumbnailbar), FALSE);
-
-    g_signal_connect(G_OBJECT(window->priv->thumbnailbar), "selection-changed", G_CALLBACK(cb_icon_bar_selection_changed), window);
-
     window->priv->t_bar_s_window = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
+    gtk_scrolled_window_set_overlay_scrolling (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), FALSE);
+
+    window->priv->thumbnailbar = rstto_icon_bar_new (window->priv->t_bar_s_window);
     gtk_container_add (GTK_CONTAINER (window->priv->t_bar_s_window), window->priv->thumbnailbar);
 
+    rstto_icon_bar_set_show_text (RSTTO_ICON_BAR (window->priv->thumbnailbar), FALSE);
     rstto_icon_bar_set_file_column (RSTTO_ICON_BAR (window->priv->thumbnailbar), 0);
     rstto_icon_bar_set_item_width (RSTTO_ICON_BAR (window->priv->thumbnailbar), 96);
 
-    window->priv->table = gtk_table_new (5, 5, FALSE);
+    g_signal_connect (G_OBJECT (window->priv->thumbnailbar), "selection-changed",
+                      G_CALLBACK (cb_icon_bar_selection_changed), window);
+
+    window->priv->grid = gtk_grid_new ();
 
     window->priv->statusbar = gtk_statusbar_new();
     window->priv->statusbar_context_id = gtk_statusbar_get_context_id (GTK_STATUSBAR(window->priv->statusbar), "image-data");
@@ -1021,11 +1048,13 @@ rstto_main_window_init (RsttoMainWindow *window)
     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->warning, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->table, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->grid, TRUE, TRUE, 0);
     gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->statusbar, FALSE, FALSE, 0);
 
-    gtk_table_attach (GTK_TABLE (window->priv->table), window->priv->t_bar_s_window, 1, 2, 0, 5, GTK_FILL|GTK_SHRINK, GTK_FILL|GTK_EXPAND, 0, 0);
-    gtk_table_attach (GTK_TABLE (window->priv->table), window->priv->p_viewer_s_window, 2, 3, 2, 3, GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL, 0, 0);
+    gtk_grid_attach (GTK_GRID (window->priv->grid), window->priv->t_bar_s_window, 1, 0, 1, 5);
+    gtk_grid_attach (GTK_GRID (window->priv->grid), window->priv->p_viewer_s_window, 2, 2, 1, 1);
+    gtk_widget_set_hexpand (window->priv->p_viewer_s_window, TRUE);
+    gtk_widget_set_vexpand (window->priv->p_viewer_s_window, TRUE);
 
     gtk_widget_set_no_show_all (window->priv->toolbar, TRUE);
     gtk_widget_set_no_show_all (window->priv->warning, TRUE);
@@ -1369,8 +1398,8 @@ rstto_main_window_image_list_iter_changed (RsttoMainWindow *window)
 
     GtkWidget *open_with_menu = gtk_menu_new();
     GtkWidget *open_with_window_menu = gtk_menu_new();
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/open-with-menu")), open_with_menu);
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/edit-menu/open-with-menu")), open_with_window_menu);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (window->priv->ui_manager, "/image-viewer-menu/open-with-menu")), open_with_menu);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/edit-menu/open-with-menu")), open_with_window_menu);
 
     if (window->priv->image_list)
     {
@@ -1588,11 +1617,11 @@ rstto_main_window_update_statusbar (RsttoMainWindow *window)
                 {
                     gchar *size_string = g_format_size (rstto_file_get_size (cur_file));
                     tmp_status = g_strdup_printf ("%s\t%d x %d\t%s\t%.1f%%", status,
-                                                rstto_image_viewer_get_width(viewer),
-                                                rstto_image_viewer_get_height(viewer),
-                                                size_string,
-                                                (100 * rstto_image_viewer_get_scale(viewer)));
-
+                                                  rstto_image_viewer_get_width(viewer),
+                                                  rstto_image_viewer_get_height(viewer),
+                                                  size_string,
+                                                  (100 * rstto_image_viewer_get_scale(viewer)));
+ 
                     g_free (size_string);
                     g_free (status);
                     status = tmp_status;
@@ -1627,6 +1656,108 @@ rstto_main_window_update_statusbar (RsttoMainWindow *window)
 
 }
 
+static void
+rstto_main_activate_file_menu_actions (RsttoMainWindow *window, gboolean activate)
+{
+    GtkWidget   *widget;
+    guint        i;
+    const gchar *actions[] = {
+        "/main-menu/file-menu/save-copy",
+        //"/main-menu/file-menu/print",
+        "/main-menu/file-menu/properties",
+        "/main-menu/file-menu/close",
+        "/main-menu/edit-menu/delete"
+    };
+
+    for (i = 0; i < G_N_ELEMENTS (actions); ++i)
+    {
+        widget = gtk_ui_manager_get_widget (window->priv->ui_manager, actions[i]);
+        gtk_widget_set_sensitive (widget, activate);
+    }
+}
+
+static void
+rstto_main_activate_go_menu_actions (RsttoMainWindow *window, gboolean activate)
+{
+    GtkWidget   *widget;
+    guint        i;
+    const gchar *actions[] = {
+        "/main-menu/go-menu/forward",
+        "/main-menu/go-menu/back",
+        "/main-menu/go-menu/first",
+        "/main-menu/go-menu/last"
+    };
+
+    for (i = 0; i < G_N_ELEMENTS (actions); ++i)
+    {
+        widget = gtk_ui_manager_get_widget (window->priv->ui_manager, actions[i]);
+        gtk_widget_set_sensitive (widget, activate);
+    }
+}
+
+static void
+rstto_main_activate_view_menu_actions (RsttoMainWindow *window, gboolean activate)
+{
+    GtkWidget   *widget;
+    guint        i;
+    const gchar *actions[] = {
+        "/main-menu/view-menu/set-as-wallpaper",
+        "/main-menu/view-menu/zoom-menu",
+        "/main-menu/view-menu/rotation-menu"
+    };
+
+    widget = gtk_ui_manager_get_widget (window->priv->ui_manager, actions[0]);
+    gtk_widget_set_sensitive (widget, (activate && window->priv->wallpaper_manager) ? TRUE : FALSE);
+    for (i = 1; i < G_N_ELEMENTS (actions); ++i)
+    {
+        widget = gtk_ui_manager_get_widget (window->priv->ui_manager, actions[i]);
+        gtk_widget_set_sensitive (widget, activate);
+    }
+}
+
+static void
+rstto_main_activate_popup_menu_actions (RsttoMainWindow *window, gboolean activate)
+{
+    GtkWidget   *widget;
+    guint        i;
+    const gchar *actions[] = {
+        "/image-viewer-menu/close",
+        "/image-viewer-menu/open-with-menu",
+        "/image-viewer-menu/zoom-in",
+        "/image-viewer-menu/zoom-out",
+        "/image-viewer-menu/zoom-100",
+        "/image-viewer-menu/zoom-fit"
+    };
+
+    for (i = 0; i < G_N_ELEMENTS (actions); ++i)
+    {
+        widget = gtk_ui_manager_get_widget (window->priv->ui_manager, actions[i]);
+        gtk_widget_set_sensitive (widget, activate);
+    }
+}
+
+static void
+rstto_main_activate_toolbar_actions (RsttoMainWindow *window, gboolean activate)
+{
+    GtkWidget   *widget;
+    guint        i;
+    const gchar *actions[] = {
+        "/main-toolbar/save-copy",
+        "/main-toolbar/edit",
+        "/main-toolbar/delete",
+        "/main-toolbar/zoom-in",
+        "/main-toolbar/zoom-out",
+        "/main-toolbar/zoom-fit",
+        "/main-toolbar/zoom-100"
+    };
+
+    for (i = 0; i < G_N_ELEMENTS (actions); ++i)
+    {
+        widget = gtk_ui_manager_get_widget (window->priv->ui_manager, actions[i]);
+        gtk_widget_set_sensitive (widget, activate);
+    }
+}
+
 /**
  * rstto_main_window_update_buttons:
  * @window:
@@ -1639,7 +1770,7 @@ rstto_main_window_update_buttons (RsttoMainWindow *window)
     g_return_if_fail (window->priv->image_list != NULL);
     switch (rstto_image_list_get_n_images (window->priv->image_list))
     {
-        case 0: 
+        case 0:
             if ( gtk_widget_get_visible (GTK_WIDGET (window)) )
             {
                 if ( 0 != (gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window))) & GDK_WINDOW_STATE_FULLSCREEN ))
@@ -1647,25 +1778,16 @@ rstto_main_window_update_buttons (RsttoMainWindow *window)
                     gtk_widget_show (window->priv->toolbar);
                 }
             }
+
             gtk_widget_hide (window->priv->t_bar_s_window);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/save-copy"), FALSE);
-            /*
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/print"), FALSE);
-            */
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/properties"), FALSE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/close"), FALSE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/edit-menu/delete"), FALSE);
-
-            /* Go Menu */
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/forward"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/back"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/first"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/last"), FALSE); 
+            rstto_main_activate_file_menu_actions (window, FALSE);
+            rstto_main_activate_go_menu_actions (window, FALSE);
 
             gtk_action_set_sensitive (window->priv->play_action, FALSE);
             gtk_action_set_sensitive (window->priv->pause_action, FALSE);
+            gtk_widget_set_sensitive (window->priv->forward, FALSE);
+            gtk_widget_set_sensitive (window->priv->back, FALSE);
 
-    
             /* Stop the slideshow if no image is opened */
             if (window->priv->playing == TRUE)
             {
@@ -1691,33 +1813,12 @@ rstto_main_window_update_buttons (RsttoMainWindow *window)
 
                 window->priv->playing = FALSE;
             }
-            
 
-            /* View Menu */
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/set-as-wallpaper"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/zoom-menu"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/rotation-menu"), FALSE);
-
-            /* Toolbar */
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/save-copy"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/edit"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/delete"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/forward"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/back"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-in"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-out"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-fit"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-100"), FALSE);
-
-            /* Image Viewer popup-menu */
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/close"), FALSE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/open-with-menu"), FALSE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-in"), FALSE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-out"), FALSE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-100"), FALSE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-fit"), FALSE);
+            rstto_main_activate_view_menu_actions (window, FALSE);
+            rstto_main_activate_popup_menu_actions (window, FALSE);
+            rstto_main_activate_toolbar_actions (window, FALSE);
             break;
-        case 1: 
+        case 1:
             if (rstto_settings_get_boolean_property (window->priv->settings_manager, "show-thumbnailbar"))
             {
                 if ( 0 == (gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window))) & GDK_WINDOW_STATE_FULLSCREEN ))
@@ -1743,22 +1844,14 @@ rstto_main_window_update_buttons (RsttoMainWindow *window)
             {
                 gtk_widget_hide (window->priv->toolbar);
             }
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/save-copy"), TRUE);
-            /*
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/print"), TRUE);
-            */
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/properties"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/close"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/edit-menu/delete"), TRUE);
-
-            /* Go Menu */
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/forward"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/back"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/first"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/last"), FALSE); 
+
+            rstto_main_activate_file_menu_actions (window, TRUE);
+            rstto_main_activate_go_menu_actions (window, FALSE);
 
             gtk_action_set_sensitive (window->priv->play_action, FALSE);
             gtk_action_set_sensitive (window->priv->pause_action, FALSE);
+            gtk_widget_set_sensitive (window->priv->forward, FALSE);
+            gtk_widget_set_sensitive (window->priv->back, FALSE);
 
             /* Stop the slideshow if only one image is opened */
             if (window->priv->playing == TRUE)
@@ -1790,40 +1883,12 @@ rstto_main_window_update_buttons (RsttoMainWindow *window)
 
                 window->priv->playing = FALSE;
             }
-            
 
-            /* View Menu */
-            if (window->priv->wallpaper_manager)
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/set-as-wallpaper"), TRUE);
-            }
-            else
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/set-as-wallpaper"), FALSE);
-            }
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/zoom-menu"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/rotation-menu"), TRUE);
-
-            /* Toolbar */
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/save-copy"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/edit"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/delete"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/forward"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/back"), FALSE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-in"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-out"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-fit"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-100"), TRUE);
-
-            /* Image Viewer popup-menu */
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/close"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/open-with-menu"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-in"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-out"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-100"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-fit"), TRUE);
+            rstto_main_activate_view_menu_actions (window, TRUE);
+            rstto_main_activate_popup_menu_actions (window, TRUE);
+            rstto_main_activate_toolbar_actions (window, TRUE);
             break;
-        default: 
+        default:
             if (rstto_settings_get_boolean_property (window->priv->settings_manager, "show-thumbnailbar"))
             {
                 if ( 0 == (gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window))) & GDK_WINDOW_STATE_FULLSCREEN ))
@@ -1850,67 +1915,17 @@ rstto_main_window_update_buttons (RsttoMainWindow *window)
                 gtk_widget_hide (window->priv->toolbar);
             }
 
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/save-copy"), TRUE);
-
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/properties"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/file-menu/close"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/edit-menu/delete"), TRUE);
-
-            /* Go Menu */
-            if (rstto_image_list_iter_has_next (window->priv->iter))
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/forward"), TRUE);
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/forward"), TRUE);
-            }
-            else
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/forward"), FALSE);
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/forward"), FALSE);
-            }
-            if (rstto_image_list_iter_has_previous (window->priv->iter))
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/back"), TRUE);
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/back"), TRUE);
-            }
-            else
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/back"), FALSE);
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/back"), FALSE);
-            }
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/first"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/go-menu/last"), TRUE); 
+            rstto_main_activate_file_menu_actions (window, TRUE);
+            rstto_main_activate_go_menu_actions (window, TRUE);
 
             gtk_action_set_sensitive (window->priv->play_action, TRUE);
             gtk_action_set_sensitive (window->priv->pause_action, TRUE);
-            
+            gtk_widget_set_sensitive (window->priv->forward, rstto_image_list_iter_has_next (window->priv->iter) ? TRUE : FALSE);
+            gtk_widget_set_sensitive (window->priv->back, rstto_image_list_iter_has_previous (window->priv->iter) ? TRUE : FALSE);
 
-            /* View Menu */
-            if (window->priv->wallpaper_manager)
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/set-as-wallpaper"), TRUE);
-            }
-            else
-            {
-                gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/set-as-wallpaper"), FALSE);
-            }
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/zoom-menu"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu/view-menu/rotation-menu"), TRUE);
-
-            /* Toolbar */
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/save-copy"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/edit"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/delete"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-in"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-out"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-fit"), TRUE);
-            gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-100"), TRUE);
-
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/close"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/open-with-menu"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-in"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-out"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-100"), TRUE);
-            gtk_widget_set_sensitive ( gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/zoom-fit"), TRUE);
+            rstto_main_activate_view_menu_actions (window, TRUE);
+            rstto_main_activate_popup_menu_actions (window, TRUE);
+            rstto_main_activate_toolbar_actions (window, TRUE);
             break;
     }
 
@@ -2033,38 +2048,17 @@ rstto_main_window_set_navigationbar_position (RsttoMainWindow *window, guint ori
             g_object_ref (window->priv->t_bar_s_window);
 
             gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (window->priv->t_bar_s_window)), window->priv->t_bar_s_window);
-            gtk_table_attach (
-                    GTK_TABLE (window->priv->table),
-                    window->priv->t_bar_s_window,
-                    1,
-                    2,
-                    0,
-                    5,
-                    GTK_SHRINK|GTK_FILL,
-                    GTK_EXPAND|GTK_FILL,
-                    0,
-                    0);
+            gtk_grid_attach (GTK_GRID (window->priv->grid), window->priv->t_bar_s_window, 1, 0, 1, 5);
 
             gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
             gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_CORNER_BOTTOM_RIGHT);
-
             rstto_icon_bar_set_orientation (RSTTO_ICON_BAR(window->priv->thumbnailbar), GTK_ORIENTATION_VERTICAL);
             break;
         case 1: /* Right */
             g_object_ref (window->priv->t_bar_s_window);
 
             gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (window->priv->t_bar_s_window)), window->priv->t_bar_s_window);
-            gtk_table_attach (
-                    GTK_TABLE (window->priv->table),
-                    window->priv->t_bar_s_window,
-                    3,
-                    4,
-                    0,
-                    5,
-                    GTK_SHRINK|GTK_FILL,
-                    GTK_EXPAND|GTK_FILL,
-                    0,
-                    0);
+            gtk_grid_attach (GTK_GRID (window->priv->grid), window->priv->t_bar_s_window, 3, 0, 1, 5);
 
             gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
             gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_CORNER_BOTTOM_LEFT);
@@ -2074,17 +2068,7 @@ rstto_main_window_set_navigationbar_position (RsttoMainWindow *window, guint ori
             g_object_ref (window->priv->t_bar_s_window);
 
             gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (window->priv->t_bar_s_window)), window->priv->t_bar_s_window);
-            gtk_table_attach (
-                    GTK_TABLE (window->priv->table),
-                    window->priv->t_bar_s_window,
-                    0,
-                    5,
-                    1,
-                    2,
-                    GTK_EXPAND|GTK_FILL,
-                    GTK_SHRINK|GTK_FILL,
-                    0,
-                    0);
+            gtk_grid_attach (GTK_GRID (window->priv->grid), window->priv->t_bar_s_window, 0, 1, 5, 1);
 
             gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
             gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_CORNER_BOTTOM_RIGHT);
@@ -2094,21 +2078,10 @@ rstto_main_window_set_navigationbar_position (RsttoMainWindow *window, guint ori
             g_object_ref (window->priv->t_bar_s_window);
 
             gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (window->priv->t_bar_s_window)), window->priv->t_bar_s_window);
-            gtk_table_attach (
-                    GTK_TABLE (window->priv->table),
-                    window->priv->t_bar_s_window,
-                    0,
-                    5,
-                    3,
-                    4,
-                    GTK_EXPAND|GTK_FILL,
-                    GTK_SHRINK|GTK_FILL,
-                    0,
-                    0);
+            gtk_grid_attach (GTK_GRID (window->priv->grid), window->priv->t_bar_s_window, 0, 3, 5, 1);
 
             gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
             gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (window->priv->t_bar_s_window), GTK_CORNER_TOP_RIGHT);
-
             rstto_icon_bar_set_orientation (RSTTO_ICON_BAR(window->priv->thumbnailbar), GTK_ORIENTATION_HORIZONTAL);
             break;
         default:
@@ -2130,8 +2103,12 @@ cb_rstto_main_window_navigationtoolbar_button_press_event (GtkWidget *widget, Gd
 
     if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
     {
+#if GTK_CHECK_VERSION (3, 22, 0)
+        gtk_menu_popup_at_pointer (GTK_MENU (window->priv->position_menu), NULL);
+#else
         gtk_menu_popup (GTK_MENU (window->priv->position_menu), NULL, NULL, NULL, NULL,
                 event->button, event->time);
+#endif
     }
 
     return FALSE;
@@ -2236,9 +2213,11 @@ cb_rstto_main_window_set_as_wallpaper (GtkWidget *widget, RsttoMainWindow *windo
                 _("Configure which system is currently managing your desktop.\n"
                   "This setting determines the method <i>Ristretto</i> will use\n"
                   "to configure the desktop wallpaper."));
-        gtk_misc_set_alignment(
-                GTK_MISC(behaviour_desktop_lbl),
-                0,
+        gtk_label_set_xalign (
+                GTK_LABEL (behaviour_desktop_lbl),
+                0.0);
+        gtk_label_set_yalign (
+                GTK_LABEL (behaviour_desktop_lbl),
                 0.5);
         gtk_box_pack_start (
                 GTK_BOX (content_area),
@@ -2725,24 +2704,25 @@ cb_rstto_main_window_about (GtkWidget *widget, RsttoMainWindow *window)
 
     GtkWidget *about_dialog = gtk_about_dialog_new();
 
-    gtk_about_dialog_set_version((GtkAboutDialog *)about_dialog, PACKAGE_VERSION);
+    gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about_dialog), PACKAGE_VERSION);
 
-    gtk_about_dialog_set_comments((GtkAboutDialog *)about_dialog,
+    gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about_dialog),
         _("Ristretto is an image viewer for the Xfce desktop environment."));
-    gtk_about_dialog_set_website((GtkAboutDialog *)about_dialog,
+    gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about_dialog),
         "https://docs.xfce.org/apps/ristretto/start");
-    gtk_about_dialog_set_logo_icon_name((GtkAboutDialog *)about_dialog,
+    gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(about_dialog),
         "ristretto");
-    gtk_about_dialog_set_authors((GtkAboutDialog *)about_dialog,
+    gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about_dialog),
         authors);
-    gtk_about_dialog_set_translator_credits((GtkAboutDialog *)about_dialog,
+    gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(about_dialog),
         _("translator-credits"));
-    gtk_about_dialog_set_license((GtkAboutDialog *)about_dialog,
+    gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about_dialog),
         xfce_get_license_text(XFCE_LICENSE_TEXT_GPL));
-    gtk_about_dialog_set_copyright((GtkAboutDialog *)about_dialog,
+    gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about_dialog),
         "Copyright \302\251 2006-2012 Stephan Arts\n"
         "Copyright \302\251 2013-2019 Xfce Developers");
 
+    gtk_window_set_transient_for(GTK_WINDOW(about_dialog), GTK_WINDOW(window));
     gtk_dialog_run(GTK_DIALOG(about_dialog));
 
     gtk_widget_destroy(about_dialog);
@@ -3218,7 +3198,7 @@ cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window)
                              * sourcefunc and will be unref-ed by it.
                              */
                             g_object_ref (file);
-                            g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) rstto_main_window_add_file_to_recent_files, file, NULL);
+                            gdk_threads_add_idle_full(G_PRIORITY_LOW, (GSourceFunc) rstto_main_window_add_file_to_recent_files, file, NULL);
                         }
                         g_object_unref (G_OBJECT (r_file));
                         r_file = NULL;
@@ -3261,7 +3241,7 @@ cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window)
                      * sourcefunc and will be unref-ed by it.
                      */
                     g_object_ref (files->data);
-                    g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) rstto_main_window_add_file_to_recent_files, files->data, NULL);
+                    gdk_threads_add_idle_full(G_PRIORITY_LOW, (GSourceFunc) rstto_main_window_add_file_to_recent_files, files->data, NULL);
 
                     /* Point the main iterator to the
                      * correct file
@@ -3288,7 +3268,7 @@ cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window)
 
     if (files)
     {
-        g_slist_free_full (files, (GDestroyNotify) g_object_unref);
+		g_slist_free_full (files, (GDestroyNotify) g_object_unref);
     }
 }
 
@@ -3456,7 +3436,7 @@ cb_rstto_main_window_properties (GtkWidget *widget, RsttoMainWindow *window)
          */
         if ( TRUE == use_thunar_properties )
         {
-            GVariant *unused = NULL;
+			GVariant *unused = NULL;
 
             /* Get the file-uri */
             uri = rstto_file_get_uri(file);
@@ -4034,8 +4014,8 @@ rstto_main_window_launch_editor_chooser (
             NULL);
 
     content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
-    vbox = gtk_vbox_new (FALSE, 0);
-    hbox = gtk_hbox_new (FALSE, 0);
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
     g_icon = g_content_type_get_icon (content_type);
     image = gtk_image_new_from_gicon (g_icon,   GTK_ICON_SIZE_DIALOG);
@@ -4490,7 +4470,7 @@ rstto_main_window_play_slideshow (RsttoMainWindow *window)
             &timeout);
 
     window->priv->playing = TRUE;
-    window->priv->play_timeout_id = g_timeout_add (
+    window->priv->play_timeout_id = gdk_threads_add_timeout (
             g_value_get_uint (&timeout)*1000,
             (GSourceFunc)cb_rstto_main_window_play_slideshow,
             window);
diff --git a/src/monitor_chooser.c b/src/monitor_chooser.c
index 504fafb..45f4282 100644
--- a/src/monitor_chooser.c
+++ b/src/monitor_chooser.c
@@ -62,11 +62,13 @@ rstto_monitor_chooser_finalize(GObject *object);
 static void
 rstto_monitor_chooser_realize(GtkWidget *widget);
 static void
-rstto_monitor_chooser_size_request(GtkWidget *, GtkRequisition *);
+rstto_monitor_chooser_get_preferred_width(GtkWidget *, gint *, gint *);
+static void
+rstto_monitor_chooser_get_preferred_height(GtkWidget *, gint *, gint *);
 static void
 rstto_monitor_chooser_size_allocate(GtkWidget *, GtkAllocation *);
 static gboolean 
-rstto_monitor_chooser_expose(GtkWidget *, GdkEventExpose *);
+rstto_monitor_chooser_draw(GtkWidget *, cairo_t *);
 static gboolean
 rstto_monitor_chooser_paint(GtkWidget *widget);
 
@@ -126,8 +128,6 @@ rstto_monitor_chooser_init(RsttoMonitorChooser *chooser)
     chooser->priv->selected = -1;
     chooser->priv->monitors = g_new0 (Monitor *, 1);
 
-    gtk_widget_set_double_buffered (GTK_WIDGET(chooser), TRUE);
-
     g_signal_connect(G_OBJECT(chooser), "button-press-event", G_CALLBACK(cb_rstto_button_press_event), NULL);
 
     gtk_widget_set_redraw_on_allocate(GTK_WIDGET(chooser), TRUE);
@@ -146,9 +146,10 @@ rstto_monitor_chooser_class_init(RsttoMonitorChooserClass *chooser_class)
 
     parent_class = g_type_class_peek_parent(chooser_class);
 
-    widget_class->expose_event = rstto_monitor_chooser_expose;
+    widget_class->draw = rstto_monitor_chooser_draw;
     widget_class->realize = rstto_monitor_chooser_realize;
-    widget_class->size_request = rstto_monitor_chooser_size_request;
+    widget_class->get_preferred_width = rstto_monitor_chooser_get_preferred_width;
+    widget_class->get_preferred_height = rstto_monitor_chooser_get_preferred_height;
     widget_class->size_allocate = rstto_monitor_chooser_size_allocate;
 
     object_class->finalize = rstto_monitor_chooser_finalize;
@@ -182,7 +183,6 @@ rstto_monitor_chooser_realize(GtkWidget *widget)
     gint attributes_mask;
     GtkAllocation allocation;
     GdkWindow *window;
-    GtkStyle *style;
 
     g_return_if_fail (widget != NULL);
     g_return_if_fail (RSTTO_IS_MONITOR_CHOOSER (widget));
@@ -199,25 +199,26 @@ rstto_monitor_chooser_realize(GtkWidget *widget)
     attributes.window_type = GDK_WINDOW_CHILD;
     attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK;
     attributes.visual = gtk_widget_get_visual (widget);
-    attributes.colormap = gtk_widget_get_colormap (widget);
+    // TODO: comment out for now
+    //attributes.colormap = gtk_widget_get_colormap (widget);
 
-    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    // TODO: comment out for now
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL /*| GDK_WA_COLORMAP*/;
     window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
     gtk_widget_set_window (widget, window);
-
-    style = gtk_style_attach (gtk_widget_get_style (widget), window);
-    gtk_widget_set_style (widget, style);
     gdk_window_set_user_data (window, widget);
-
-    gtk_style_set_background (gtk_widget_get_style (widget), window, GTK_STATE_ACTIVE);
 }
 
+static void
+rstto_monitor_chooser_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width)
+{
+    *minimal_width = *natural_width = 400;
+}
 
 static void
-rstto_monitor_chooser_size_request(GtkWidget *widget, GtkRequisition *requisition)
+rstto_monitor_chooser_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height)
 {
-    requisition->height = 200;
-    requisition->width = 400;
+    *minimal_height = *natural_height = 200;
 }
 
 static void
@@ -235,7 +236,7 @@ rstto_monitor_chooser_size_allocate(GtkWidget *widget, GtkAllocation *allocation
 }
 
 static gboolean
-rstto_monitor_chooser_expose(GtkWidget *widget, GdkEventExpose *event)
+rstto_monitor_chooser_draw(GtkWidget *widget, cairo_t *cr)
 {
     rstto_monitor_chooser_paint (widget);
     return FALSE;
@@ -247,25 +248,16 @@ rstto_monitor_chooser_paint(GtkWidget *widget)
     RsttoMonitorChooser *chooser = RSTTO_MONITOR_CHOOSER (widget);
     cairo_t *ctx = gdk_cairo_create (gtk_widget_get_window (widget));
     Monitor *monitor;
-    GtkAllocation allocation;
 
     gdouble width, height;
     gchar *label = NULL;
     gint row_width = 0;
     gint id = 0;
+    gdouble alloc_width = (gdouble)gtk_widget_get_allocated_width (widget);
+    gdouble alloc_height = (gdouble)gtk_widget_get_allocated_height (widget);
+    GtkStyleContext *context = gtk_widget_get_style_context (widget);
 
-    gtk_widget_get_allocation (widget, &allocation);
-
-    gdk_cairo_set_source_color (
-            ctx,
-            &(gtk_widget_get_style (widget)->bg[GTK_STATE_NORMAL]));
-    cairo_rectangle (
-            ctx,
-            0.0,
-            0.0,
-            (gdouble)allocation.width,
-            (gdouble)allocation.height);
-    cairo_fill (ctx);
+    gtk_render_background (context, ctx, 0, 0, alloc_width, alloc_height);
 
     if (chooser->priv->n_monitors > 1)
     {
@@ -278,12 +270,12 @@ rstto_monitor_chooser_paint(GtkWidget *widget)
             {
                 if (monitor->width > monitor->height)
                 {
-                    width = allocation.width*0.4;
+                    width = alloc_width*0.4;
                     height = width;
                 } 
                 else
                 {
-                    height = allocation.width*0.4;
+                    height = alloc_width*0.4;
                     width = height;
                 }
                 label = g_strdup_printf("%d", id+1);
@@ -291,8 +283,8 @@ rstto_monitor_chooser_paint(GtkWidget *widget)
                 paint_monitor (
                         widget,
                         ctx,
-                        ((gdouble)allocation.width/4) - (width/2.0),
-                        ((gdouble)allocation.height - height)/2.0,
+                        (alloc_width/4) - (width/2.0),
+                        (alloc_height - height)/2.0,
                         width,
                         height,
                         label,
@@ -307,12 +299,12 @@ rstto_monitor_chooser_paint(GtkWidget *widget)
 
                 if (monitor->width > monitor->height)
                 {
-                    width = allocation.width*(0.4/((gdouble)row_width+1));
+                    width = alloc_width*(0.4/((gdouble)row_width+1));
                     height = width;
                 } 
                 else
                 {
-                    height = allocation.width*(0.4/chooser->priv->n_monitors);
+                    height = alloc_width*(0.4/chooser->priv->n_monitors);
                     width = height;
                 }
             
@@ -324,11 +316,11 @@ rstto_monitor_chooser_paint(GtkWidget *widget)
                     paint_monitor (
                             widget,
                             ctx,
-                            ((gdouble)allocation.width/2)+
-                                (((gdouble)allocation.width/2)/
+                            (alloc_width/2)+
+                                ((alloc_width/2)/
                                 (row_width+1))*(id%(row_width)+1)-
                                 (width/2.0),
-                            ((gdouble)allocation.height/
+                            (alloc_height/
                                 (row_width+2)*(id/row_width+1))-
                                 (height/2.0),
                             width,
@@ -342,11 +334,11 @@ rstto_monitor_chooser_paint(GtkWidget *widget)
                     paint_monitor (
                             widget,
                             ctx,
-                            ((gdouble)allocation.width/2)+
-                                (((gdouble)allocation.width/2)/
+                            (alloc_width/2)+
+                                ((alloc_width/2)/
                                 (row_width+1))*((id-1)%(row_width)+1)-
                                 (width/2.0),
-                            ((gdouble)allocation.height/
+                            (alloc_height/
                                 (row_width+2)*((id-1)/row_width+1))-
                                 (height/2.0),
                             width,
@@ -379,8 +371,8 @@ rstto_monitor_chooser_paint(GtkWidget *widget)
             paint_monitor (
                     widget,
                     ctx,
-                    ((gdouble)allocation.width - width)/2.0,
-                    ((gdouble)allocation.height - height)/2.0,
+                    (alloc_width - width)/2.0,
+                    (alloc_height - height)/2.0,
                     width,
                     height,
                     "1",
diff --git a/src/preferences_dialog.c b/src/preferences_dialog.c
index 0b21f71..b272745 100644
--- a/src/preferences_dialog.c
+++ b/src/preferences_dialog.c
@@ -228,7 +228,7 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
     gboolean   bool_limit_quality;
     gchar     *str_desktop_type = NULL;
 
-    GdkColor  *bgcolor;
+    GdkRGBA   *bgcolor;
     GtkWidget *timeout_lbl, *timeout_hscale;
     GtkWidget *display_main_vbox;
     GtkWidget *display_main_lbl;
@@ -270,20 +270,20 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
     /*
      * Configure the display tab
      */
-    display_main_vbox = gtk_vbox_new(FALSE, 0);
+    display_main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     display_main_lbl = gtk_label_new(_("Display"));
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), display_main_vbox, display_main_lbl);
 
     /**
      * Bg-color frame
      */
-    dialog->priv->display_tab.bgcolor_vbox = gtk_vbox_new (FALSE, 0);
+    dialog->priv->display_tab.bgcolor_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->display_tab.bgcolor_frame = xfce_gtk_frame_box_new_with_content(_("Background color"),
                                                                                  dialog->priv->display_tab.bgcolor_vbox);
     gtk_box_pack_start (GTK_BOX (display_main_vbox), dialog->priv->display_tab.bgcolor_frame, FALSE, FALSE, 0);
 
     dialog->priv->display_tab.bgcolor_override_check_button = gtk_check_button_new_with_label (_("Override background color:"));
-    dialog->priv->display_tab.bgcolor_hbox = gtk_hbox_new (FALSE, 4);
+    dialog->priv->display_tab.bgcolor_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
     dialog->priv->display_tab.bgcolor_color_button = gtk_color_button_new();
 
     gtk_box_pack_start (GTK_BOX (dialog->priv->display_tab.bgcolor_hbox), 
@@ -294,7 +294,7 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
                         dialog->priv->display_tab.bgcolor_hbox, FALSE, FALSE, 0);
 
     /* set current value */
-    gtk_color_button_set_color (GTK_COLOR_BUTTON (dialog->priv->display_tab.bgcolor_color_button),
+    gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (dialog->priv->display_tab.bgcolor_color_button),
                                 bgcolor);
 
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->display_tab.bgcolor_override_check_button),
@@ -308,14 +308,15 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
     g_signal_connect (G_OBJECT (dialog->priv->display_tab.bgcolor_color_button), 
                       "color-set", G_CALLBACK (cb_bgcolor_color_set), dialog);
 
-    dialog->priv->display_tab.quality_vbox = gtk_vbox_new(FALSE, 0);
+    dialog->priv->display_tab.quality_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->display_tab.quality_frame = xfce_gtk_frame_box_new_with_content(_("Quality"), dialog->priv->display_tab.quality_vbox);
     gtk_box_pack_start (GTK_BOX (display_main_vbox), dialog->priv->display_tab.quality_frame, FALSE, FALSE, 0);
 
     dialog->priv->display_tab.quality_label = gtk_label_new (
             _("With this option enabled, the maximum image-quality will be limited to the screen-size."));
     gtk_label_set_line_wrap (GTK_LABEL (dialog->priv->display_tab.quality_label), TRUE);
-    gtk_misc_set_alignment(GTK_MISC(dialog->priv->display_tab.quality_label), 0, 0.5);
+    gtk_label_set_xalign (GTK_LABEL (dialog->priv->display_tab.quality_label), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (dialog->priv->display_tab.quality_label), 0.5);
     dialog->priv->display_tab.quality_button = gtk_check_button_new_with_label (_("Limit rendering quality"));
     gtk_container_add (GTK_CONTAINER (dialog->priv->display_tab.quality_vbox), dialog->priv->display_tab.quality_label);
     gtk_container_add (GTK_CONTAINER (dialog->priv->display_tab.quality_vbox), dialog->priv->display_tab.quality_button);
@@ -327,18 +328,19 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
     /*
      * Fullscreen tab
      */
-    fullscreen_main_vbox = gtk_vbox_new(FALSE, 0);
+    fullscreen_main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     fullscreen_main_lbl = gtk_label_new(_("Fullscreen"));
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), fullscreen_main_vbox, fullscreen_main_lbl);
 
 
-    dialog->priv->fullscreen_tab.thumbnail_vbox = gtk_vbox_new(FALSE, 0);
+    dialog->priv->fullscreen_tab.thumbnail_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->fullscreen_tab.thumbnail_frame = xfce_gtk_frame_box_new_with_content(_("Thumbnails"), dialog->priv->fullscreen_tab.thumbnail_vbox);
     gtk_box_pack_start (GTK_BOX (fullscreen_main_vbox), dialog->priv->fullscreen_tab.thumbnail_frame, FALSE, FALSE, 0);
 
     dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_lbl = gtk_label_new(_("The thumbnail bar can be automatically hidden when the window is fullscreen."));
     gtk_label_set_line_wrap (GTK_LABEL (dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_lbl), TRUE);
-    gtk_misc_set_alignment(GTK_MISC(dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_lbl), 0, 0.5);
+    gtk_label_set_xalign (GTK_LABEL (dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_lbl), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_lbl), 0.5);
     dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_check_button = gtk_check_button_new_with_label (_("Hide thumbnail bar when fullscreen"));
     gtk_box_pack_start (GTK_BOX (dialog->priv->fullscreen_tab.thumbnail_vbox), dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_lbl, FALSE, FALSE, 0);
     gtk_box_pack_start (GTK_BOX (dialog->priv->fullscreen_tab.thumbnail_vbox), dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_check_button, FALSE, FALSE, 0);
@@ -346,13 +348,14 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->fullscreen_tab.hide_thumbnails_fullscreen_check_button),
                                   bool_hide_thumbnails_fullscreen);
 
-    dialog->priv->fullscreen_tab.clock_vbox = gtk_vbox_new(FALSE, 0);
+    dialog->priv->fullscreen_tab.clock_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->fullscreen_tab.clock_frame = xfce_gtk_frame_box_new_with_content(_("Clock"), dialog->priv->fullscreen_tab.clock_vbox);
     gtk_box_pack_start (GTK_BOX (fullscreen_main_vbox), dialog->priv->fullscreen_tab.clock_frame, FALSE, FALSE, 0);
 
     dialog->priv->fullscreen_tab.clock_label = gtk_label_new ( _("Show an analog clock that displays the current time when the window is fullscreen"));
     gtk_label_set_line_wrap (GTK_LABEL (dialog->priv->fullscreen_tab.clock_label), TRUE);
-    gtk_misc_set_alignment(GTK_MISC(dialog->priv->fullscreen_tab.clock_label), 0, 0.5);
+    gtk_label_set_xalign (GTK_LABEL (dialog->priv->fullscreen_tab.clock_label), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (dialog->priv->fullscreen_tab.clock_label), 0.5);
     dialog->priv->fullscreen_tab.clock_button = gtk_check_button_new_with_label (_("Show Fullscreen Clock"));
     gtk_container_add (GTK_CONTAINER (dialog->priv->fullscreen_tab.clock_vbox), dialog->priv->fullscreen_tab.clock_label);
     gtk_container_add (GTK_CONTAINER (dialog->priv->fullscreen_tab.clock_vbox), dialog->priv->fullscreen_tab.clock_button);
@@ -369,18 +372,18 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
     /*
      * Slideshow tab
      */
-    slideshow_main_vbox = gtk_vbox_new(FALSE, 0);
+    slideshow_main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     slideshow_main_lbl = gtk_label_new(_("Slideshow"));
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), slideshow_main_vbox, slideshow_main_lbl);
 
-    dialog->priv->slideshow_tab.timeout_vbox = gtk_vbox_new(FALSE, 0);
+    dialog->priv->slideshow_tab.timeout_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->slideshow_tab.timeout_frame = xfce_gtk_frame_box_new_with_content(_("Timeout"), dialog->priv->slideshow_tab.timeout_vbox);
     gtk_box_pack_start (GTK_BOX (slideshow_main_vbox), dialog->priv->slideshow_tab.timeout_frame, FALSE, FALSE, 0);
 
     timeout_lbl = gtk_label_new(_("The time period an individual image is displayed during a slideshow\n(in seconds)"));
-    timeout_hscale = gtk_hscale_new_with_range(1, 60, 1);
-    gtk_misc_set_alignment(GTK_MISC(timeout_lbl), 0, 0.5);
-    gtk_misc_set_padding(GTK_MISC(timeout_lbl), 2, 2);
+    timeout_hscale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 1, 60, 1);
+    gtk_label_set_xalign (GTK_LABEL (timeout_lbl), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (timeout_lbl), 0.5);
 
     gtk_box_pack_start(GTK_BOX(dialog->priv->slideshow_tab.timeout_vbox), timeout_lbl, TRUE, TRUE, 0);
     gtk_box_pack_start(GTK_BOX(dialog->priv->slideshow_tab.timeout_vbox), timeout_hscale, FALSE, TRUE, 0);
@@ -394,11 +397,11 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
             dialog);
 
     
-    control_main_vbox = gtk_vbox_new(FALSE, 0);
+    control_main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     control_main_lbl = gtk_label_new(_("Control"));
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), control_main_vbox, control_main_lbl);
 
-    dialog->priv->control_tab.scroll_vbox = gtk_vbox_new(FALSE, 0);
+    dialog->priv->control_tab.scroll_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->control_tab.scroll_frame = xfce_gtk_frame_box_new_with_content(_("Scroll wheel"), dialog->priv->control_tab.scroll_vbox);
     gtk_box_pack_start (GTK_BOX (control_main_vbox), dialog->priv->control_tab.scroll_frame, FALSE, FALSE, 0);
 
@@ -415,12 +418,12 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
     /*
      * Behaviour tab
      */
-    behaviour_main_vbox = gtk_vbox_new(FALSE, 0);
+    behaviour_main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     behaviour_main_lbl = gtk_label_new(_("Behaviour"));
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), behaviour_main_vbox, behaviour_main_lbl);
 
     /********************************************/
-    dialog->priv->behaviour_tab.startup_vbox = gtk_vbox_new(FALSE, 0);
+    dialog->priv->behaviour_tab.startup_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->behaviour_tab.startup_frame = xfce_gtk_frame_box_new_with_content(_("Startup"), dialog->priv->behaviour_tab.startup_vbox);
     gtk_box_pack_start (GTK_BOX (behaviour_main_vbox), dialog->priv->behaviour_tab.startup_frame, FALSE, FALSE, 0);
     dialog->priv->behaviour_tab.maximize_window_on_startup_check_button = gtk_check_button_new_with_label (_("Maximize window on startup when opening an image"));
@@ -446,7 +449,7 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
             dialog);
 
     /********************************************/
-    dialog->priv->behaviour_tab.desktop_vbox = gtk_vbox_new(FALSE, 4);
+    dialog->priv->behaviour_tab.desktop_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
     dialog->priv->behaviour_tab.desktop_frame = xfce_gtk_frame_box_new_with_content(
             _("Desktop"),
             dialog->priv->behaviour_tab.desktop_vbox);
@@ -462,9 +465,11 @@ rstto_preferences_dialog_init ( RsttoPreferencesDialog *dialog )
             _("Configure which system is currently managing your desktop.\n"
               "This setting determines the method <i>Ristretto</i> will use\n"
               "to configure the desktop wallpaper."));
-    gtk_misc_set_alignment(
-            GTK_MISC(behaviour_desktop_lbl),
-            0,
+    gtk_label_set_xalign (
+            GTK_LABEL (behaviour_desktop_lbl),
+            0.0);
+    gtk_label_set_yalign (
+            GTK_LABEL (behaviour_desktop_lbl),
             0.5);
     gtk_box_pack_start (
             GTK_BOX (dialog->priv->behaviour_tab.desktop_vbox),
@@ -668,11 +673,11 @@ cb_bgcolor_color_set (
 
     /* Code Section */
 
-    g_value_init (&bgcolor_val, GDK_TYPE_COLOR);
+    g_value_init (&bgcolor_val, GDK_TYPE_RGBA);
 
     g_object_get_property (
             G_OBJECT(button),
-            "color",
+            "rgba",
             &bgcolor_val);
     g_object_set_property (
             G_OBJECT(dialog->priv->settings),
diff --git a/src/privacy_dialog.c b/src/privacy_dialog.c
index f936ddc..5ee8d33 100644
--- a/src/privacy_dialog.c
+++ b/src/privacy_dialog.c
@@ -146,11 +146,10 @@ rstto_privacy_dialog_init (RsttoPrivacyDialog *dialog)
             dialog,
             NULL);
 
-    display_main_hbox = gtk_hbox_new(FALSE, 0);
+    display_main_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
     display_main_lbl = gtk_label_new(_("Time range to clear:"));
 
-
-    dialog->priv->cleanup_vbox = gtk_vbox_new(FALSE, 0);
+    dialog->priv->cleanup_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     dialog->priv->cleanup_frame = xfce_gtk_frame_box_new_with_content(_("Cleanup"), dialog->priv->cleanup_vbox);
     dialog->priv->cleanup_timeframe_combo = gtk_combo_box_text_new();
     gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(dialog->priv->cleanup_timeframe_combo), 0, _("Last Hour"));
diff --git a/src/properties_dialog.c b/src/properties_dialog.c
index 7ee01b1..7f7afd5 100644
--- a/src/properties_dialog.c
+++ b/src/properties_dialog.c
@@ -123,10 +123,10 @@ static void
 rstto_properties_dialog_init (RsttoPropertiesDialog *dialog)
 {
     GtkWidget *vbox;
-    GtkWidget *table;
+    GtkWidget *grid;
     /* General tab */
     GtkWidget *general_label;
-    GtkWidget *name_hbox = gtk_hbox_new (FALSE, 4);
+    GtkWidget *name_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
     GtkWidget *name_label = gtk_label_new(NULL);
     GtkWidget *mime_label = gtk_label_new(NULL);
 
@@ -145,28 +145,22 @@ rstto_properties_dialog_init (RsttoPropertiesDialog *dialog)
     dialog->priv->accessed_content_label = gtk_label_new(NULL);
     dialog->priv->size_content_label = gtk_label_new(NULL);
 
-    gtk_misc_set_alignment (
-            GTK_MISC (dialog->priv->mime_content_label),
-            0.0,
-            0.5);
-    gtk_misc_set_alignment (
-            GTK_MISC (dialog->priv->modified_content_label),
-            0.0,
-            0.5);
-    gtk_misc_set_alignment (
-            GTK_MISC (dialog->priv->accessed_content_label),
-            0.0,
-            0.5);
-    gtk_misc_set_alignment (
-            GTK_MISC (dialog->priv->size_content_label),
-            0.0,
-            0.5);
+    gtk_label_set_xalign (GTK_LABEL (dialog->priv->mime_content_label), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (dialog->priv->mime_content_label), 0.5);
+    gtk_label_set_xalign (GTK_LABEL (dialog->priv->modified_content_label), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (dialog->priv->modified_content_label), 0.5);
+    gtk_label_set_xalign (GTK_LABEL (dialog->priv->accessed_content_label), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (dialog->priv->accessed_content_label), 0.5);
+    gtk_label_set_xalign (GTK_LABEL (dialog->priv->size_content_label), 0.0);
+    gtk_label_set_yalign (GTK_LABEL (dialog->priv->size_content_label), 0.5);
 
     vbox = gtk_dialog_get_content_area (
             GTK_DIALOG (dialog));
     dialog->priv->notebook = gtk_notebook_new ();
 
-    table = gtk_table_new (5, 2, FALSE);
+    grid = gtk_grid_new ();
+    gtk_grid_set_column_spacing (GTK_GRID (grid), 4);
+    gtk_grid_set_row_spacing (GTK_GRID (grid), 4);
     gtk_box_pack_start (
             GTK_BOX (name_hbox),
             dialog->priv->image_thumbnail,
@@ -175,138 +169,40 @@ rstto_properties_dialog_init (RsttoPropertiesDialog *dialog)
             GTK_BOX (name_hbox),
             name_label,
             TRUE, TRUE, 0);
-    gtk_label_set_markup (GTK_LABEL(name_label), _("<b>Name:</b>"));
-    gtk_label_set_markup (GTK_LABEL(mime_label), _("<b>Kind:</b>"));
-    gtk_label_set_markup (GTK_LABEL(modified_label), _("<b>Modified:</b>"));
-    gtk_label_set_markup (GTK_LABEL(accessed_label), _("<b>Accessed:</b>"));
-    gtk_label_set_markup (GTK_LABEL(size_label), _("<b>Size:</b>"));
-
-    gtk_misc_set_alignment (GTK_MISC (name_label), 1.0, 0.5);
-    gtk_misc_set_alignment (GTK_MISC (mime_label), 1.0, 0.5);
-    gtk_misc_set_alignment (GTK_MISC (modified_label), 1.0, 0.5);
-    gtk_misc_set_alignment (GTK_MISC (accessed_label), 1.0, 0.5);
-    gtk_misc_set_alignment (GTK_MISC (size_label), 1.0, 0.5);
-
-    gtk_table_attach (
-            GTK_TABLE (table),
-            name_hbox,
-            0,
-            1,
-            0,
-            1,
-            GTK_SHRINK | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-
-    gtk_table_attach (
-            GTK_TABLE (table),
-            dialog->priv->name_entry,
-            1,
-            2,
-            0,
-            1,
-            GTK_EXPAND | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-
-    gtk_table_attach (
-            GTK_TABLE (table),
-            mime_label,
-            0,
-            1,
-            1,
-            2,
-            GTK_SHRINK | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-    gtk_table_attach (
-            GTK_TABLE (table),
-            dialog->priv->mime_content_label,
-            1,
-            2,
-            1,
-            2,
-            GTK_EXPAND | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-
-    gtk_table_attach (
-            GTK_TABLE (table),
-            modified_label,
-            0,
-            1,
-            2,
-            3,
-            GTK_SHRINK | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-    gtk_table_attach (
-            GTK_TABLE (table),
-            dialog->priv->modified_content_label,
-            1,
-            2,
-            2,
-            3,
-            GTK_EXPAND | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-
-    gtk_table_attach (
-            GTK_TABLE (table),
-            accessed_label,
-            0,
-            1,
-            3,
-            4,
-            GTK_SHRINK | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-    gtk_table_attach (
-            GTK_TABLE (table),
-            dialog->priv->accessed_content_label,
-            1,
-            2,
-            3,
-            4,
-            GTK_EXPAND | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-
-    gtk_table_attach (
-            GTK_TABLE (table),
-            size_label,
-            0,
-            1,
-            4,
-            5,
-            GTK_SHRINK | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
-    gtk_table_attach (
-            GTK_TABLE (table),
-            dialog->priv->size_content_label,
-            1,
-            2,
-            4,
-            5,
-            GTK_EXPAND | GTK_FILL,
-            GTK_SHRINK,
-            4,
-            4);
+    gtk_label_set_markup (GTK_LABEL (name_label), _("<b>Name:</b>"));
+    gtk_label_set_markup (GTK_LABEL (mime_label), _("<b>Kind:</b>"));
+    gtk_label_set_markup (GTK_LABEL (modified_label), _("<b>Modified:</b>"));
+    gtk_label_set_markup (GTK_LABEL (accessed_label), _("<b>Accessed:</b>"));
+    gtk_label_set_markup (GTK_LABEL (size_label), _("<b>Size:</b>"));
+
+    gtk_label_set_xalign (GTK_LABEL (name_label), 1.0);
+    gtk_label_set_yalign (GTK_LABEL (name_label), 0.5);
+    gtk_label_set_xalign (GTK_LABEL (mime_label), 1.0);
+    gtk_label_set_yalign (GTK_LABEL (mime_label), 0.5);
+    gtk_label_set_xalign (GTK_LABEL (modified_label), 1.0);
+    gtk_label_set_yalign (GTK_LABEL (modified_label), 0.5);
+    gtk_label_set_xalign (GTK_LABEL (accessed_label), 1.0);
+    gtk_label_set_yalign (GTK_LABEL (accessed_label), 0.5);
+    gtk_label_set_xalign (GTK_LABEL (size_label), 1.0);
+    gtk_label_set_yalign (GTK_LABEL (size_label), 0.5);
+
+    gtk_grid_attach (GTK_GRID (grid), name_hbox,                            0, 0, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), dialog->priv->name_entry,             1, 0, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), mime_label,                           0, 1, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), dialog->priv->mime_content_label,     1, 1, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), modified_label,                       0, 2, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), dialog->priv->modified_content_label, 1, 2, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), accessed_label,                       0, 3, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), dialog->priv->accessed_content_label, 1, 3, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), size_label,                           0, 4, 1, 1);
+    gtk_grid_attach (GTK_GRID (grid), dialog->priv->size_content_label,     1, 4, 1, 1);
 
     general_label = gtk_label_new (_("General"));
-    gtk_notebook_append_page (GTK_NOTEBOOK (dialog->priv->notebook), table, general_label);
+    gtk_notebook_append_page (GTK_NOTEBOOK (dialog->priv->notebook), grid, general_label);
 
-    dialog->priv->image_table = gtk_table_new (5, 2, FALSE);
+    dialog->priv->image_table = gtk_grid_new ();
+    gtk_grid_set_column_spacing (GTK_GRID (dialog->priv->image_table), 4);
+    gtk_grid_set_row_spacing (GTK_GRID (dialog->priv->image_table), 4);
     dialog->priv->image_label = gtk_label_new (_("Image"));
 
     gtk_notebook_append_page (
@@ -321,7 +217,6 @@ rstto_properties_dialog_init (RsttoPropertiesDialog *dialog)
     /* Window should not be resizable */
     gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
 
-
     gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Close"), GTK_RESPONSE_OK);
 }
 
@@ -589,42 +484,36 @@ properties_dialog_set_file (
                 gtk_label_set_markup (
                         GTK_LABEL (exif_label),
                         label_string);
-                gtk_misc_set_alignment (
-                        GTK_MISC (exif_label),
-                        1.0,
+                gtk_label_set_xalign (
+                        GTK_LABEL (exif_label),
+                        1.0);
+                gtk_label_set_yalign (
+                        GTK_LABEL (exif_label),
                         0.5);
                 gtk_label_set_text (
                         GTK_LABEL (exif_content_label),
                         exif_data
                         );
 
-                gtk_table_attach (
-                        GTK_TABLE (dialog->priv->image_table),
+                gtk_grid_attach (
+                        GTK_GRID (dialog->priv->image_table),
                         exif_label,
                         0,
-                        1,
                         i,
-                        i+1,
-                        GTK_SHRINK | GTK_FILL,
-                        GTK_SHRINK,
-                        4,
-                        4);
-                gtk_table_attach (
-                        GTK_TABLE (dialog->priv->image_table),
+                        1,
+                        1);
+                gtk_grid_attach (
+                        GTK_GRID (dialog->priv->image_table),
                         exif_content_label,
                         1,
-                        2,
                         i,
-                        i+1,
-                        GTK_EXPAND | GTK_FILL,
-                        GTK_SHRINK,
-                        4,
-                        4);
+                        1,
+                        1);
                 if (NULL != label_string)
                 {
                     g_free (label_string);
                 }
-            }
+           }
 
             gtk_widget_show_all (dialog->priv->image_table);
         }
diff --git a/src/settings.c b/src/settings.c
index 118fd79..8e80f43 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -121,9 +121,9 @@ struct _RsttoSettingsPriv
     guint     window_height;
     gchar    *last_file_path;
     guint     slideshow_timeout;
-    GdkColor *bgcolor;
+    GdkRGBA  *bgcolor;
     gboolean  bgcolor_override;
-    GdkColor *bgcolor_fullscreen;
+    GdkRGBA  *bgcolor_fullscreen;
     gboolean  wrap_images;
     gchar    *desktop_type;
     gboolean  use_thunar_properties;
@@ -174,8 +174,8 @@ rstto_settings_init (GObject *object)
     }
     
     settings->priv->slideshow_timeout = 5;
-    settings->priv->bgcolor = g_new0 (GdkColor, 1);
-    settings->priv->bgcolor_fullscreen = g_new0 (GdkColor, 1);
+    settings->priv->bgcolor = g_new0 (GdkRGBA, 1);
+    settings->priv->bgcolor_fullscreen = g_new0 (GdkRGBA, 1);
     settings->priv->navigationbar_position = g_strdup ("left");
     settings->priv->show_toolbar = TRUE;
     settings->priv->window_width = 600;
@@ -272,12 +272,12 @@ rstto_settings_init (GObject *object)
             settings,
             "bgcolor-override");
 
-    xfconf_g_property_bind_gdkcolor (
+    xfconf_g_property_bind_gdkrgba (
             settings->priv->channel,
             "/window/bgcolor",
             settings,
             "bgcolor");
-    xfconf_g_property_bind_gdkcolor (
+    xfconf_g_property_bind_gdkrgba (
             settings->priv->channel,
             "/window/bgcolor-fullscreen",
             settings,
@@ -499,7 +499,7 @@ rstto_settings_class_init (GObjectClass *object_class)
             "bgcolor",
             "",
             "",
-            GDK_TYPE_COLOR,
+            GDK_TYPE_RGBA,
             G_PARAM_READWRITE);
     g_object_class_install_property (
             object_class,
@@ -521,7 +521,7 @@ rstto_settings_class_init (GObjectClass *object_class)
             "bgcolor-fullscreen",
             "",
             "",
-            GDK_TYPE_COLOR,
+            GDK_TYPE_RGBA,
             G_PARAM_READWRITE);
     g_object_class_install_property (
             object_class,
@@ -715,7 +715,7 @@ rstto_settings_set_property    (GObject      *object,
                                 const GValue *value,
                                 GParamSpec   *pspec)
 {
-    GdkColor *color;
+    GdkRGBA *color;
     const gchar *str_val = NULL;
     RsttoSettings *settings = RSTTO_SETTINGS (object);
 
@@ -766,6 +766,7 @@ rstto_settings_set_property    (GObject      *object,
             settings->priv->bgcolor->red = color->red;
             settings->priv->bgcolor->green = color->green;
             settings->priv->bgcolor->blue = color->blue;
+            settings->priv->bgcolor->alpha = color->alpha;
             break;
         case PROP_BGCOLOR_OVERRIDE:
             settings->priv->bgcolor_override = g_value_get_boolean (value);
@@ -783,6 +784,7 @@ rstto_settings_set_property    (GObject      *object,
             settings->priv->bgcolor_fullscreen->red = color->red;
             settings->priv->bgcolor_fullscreen->green = color->green;
             settings->priv->bgcolor_fullscreen->blue = color->blue;
+            settings->priv->bgcolor_fullscreen->alpha = color->alpha;
             break;
         case PROP_WRAP_IMAGES:
             settings->priv->wrap_images = g_value_get_boolean (value);
diff --git a/src/thumbnailer.c b/src/thumbnailer.c
index 17318e8..7d2d7ac 100644
--- a/src/thumbnailer.c
+++ b/src/thumbnailer.c
@@ -319,7 +319,7 @@ rstto_thumbnailer_queue_file (
                 file);
     }
 
-    thumbnailer->priv->request_timer_id = g_timeout_add_full (
+    thumbnailer->priv->request_timer_id = gdk_threads_add_timeout_full (
             G_PRIORITY_LOW,
             300,
             (GSourceFunc)rstto_thumbnailer_queue_request_timer,
@@ -365,7 +365,7 @@ rstto_thumbnailer_dequeue_file (
         g_object_unref (file);
     }
 
-    thumbnailer->priv->request_timer_id = g_timeout_add_full (
+    thumbnailer->priv->request_timer_id = gdk_threads_add_timeout_full (
             G_PRIORITY_LOW,
             300,
             (GSourceFunc)rstto_thumbnailer_queue_request_timer,
@@ -429,8 +429,6 @@ rstto_thumbnailer_queue_request_timer (
                 (error->code == G_DBUS_ERROR_SERVICE_UNKNOWN) &&
                 thumbnailer->priv->show_missing_thumbnailer_error == TRUE)
             {
-                GDK_THREADS_ENTER();
-
                 error_dialog = gtk_message_dialog_new_with_markup (
                         NULL,
                         0,
@@ -466,7 +464,6 @@ rstto_thumbnailer_queue_request_timer (
                          FALSE);
                 }
                 gtk_widget_destroy (error_dialog);
-                GDK_THREADS_LEAVE();
             }
         }
         /* TOOO: Nice cleanup */
diff --git a/src/xfce_wallpaper_manager.c b/src/xfce_wallpaper_manager.c
index 3105448..ca98e35 100644
--- a/src/xfce_wallpaper_manager.c
+++ b/src/xfce_wallpaper_manager.c
@@ -248,14 +248,13 @@ rstto_xfce_wallpaper_manager_check_running (RsttoWallpaperManager *self)
 {
     gchar selection_name[100];
     Atom xfce_selection_atom;
-    GdkScreen *gdk_screen = gdk_screen_get_default();
-    gint xscreen = gdk_screen_get_number(gdk_screen);
-    Display *gdk_display = gdk_x11_get_default_xdisplay();
+    gint xscreen = 0;
+    Display *gdk_display = gdk_x11_get_default_xdisplay ();
 
     g_snprintf(selection_name, 100, XFDESKTOP_SELECTION_FMT, xscreen);
 
     xfce_selection_atom = XInternAtom (gdk_display, selection_name, False);
-    if((XGetSelectionOwner(gdk_display, xfce_selection_atom)))
+    if ((XGetSelectionOwner (gdk_display, xfce_selection_atom)))
     {
         return TRUE;
     }
@@ -277,13 +276,12 @@ rstto_xfce_wallpaper_manager_set (RsttoWallpaperManager *self, RsttoFile *file)
     gchar *image_style_prop;
 
     display = gdk_display_get_default ();
-    gdk_screen = gdk_display_get_screen (display,
-            manager->priv->screen);
+    gdk_screen = gdk_display_get_default_screen (display);
 
     workspace_nr = rstto_get_active_workspace_number (gdk_screen);
 
-    monitor_name = gdk_screen_get_monitor_plug_name (gdk_screen,
-            manager->priv->monitor);
+    monitor_name = gdk_monitor_get_model (
+            gdk_display_get_monitor (display, manager->priv->monitor));
 
     /* New properties since xfdesktop >= 4.11 */
     if (monitor_name)
@@ -320,7 +318,6 @@ rstto_xfce_wallpaper_manager_set (RsttoWallpaperManager *self, RsttoFile *file)
         g_free (monitor_name);
     }
 
-
     xfconf_channel_set_string (
             manager->priv->channel,
             image_path_prop,
@@ -402,12 +399,12 @@ rstto_xfce_wallpaper_manager_init (GObject *object)
 {
     RsttoXfceWallpaperManager *manager = RSTTO_XFCE_WALLPAPER_MANAGER (object);
     gint i;
-    GdkScreen *screen = gdk_screen_get_default ();
-    gint n_monitors = gdk_screen_get_n_monitors (screen);
+    GdkDisplay *display = gdk_display_get_default ();
+    gint n_monitors = gdk_display_get_n_monitors (display);
     GdkRectangle monitor_geometry;
     GtkWidget *vbox;
     GtkWidget *style_label = gtk_label_new (_("Style:"));
-    GtkWidget *image_prop_table = gtk_table_new (2, 2, FALSE);
+    GtkWidget *image_prop_grid = gtk_grid_new ();
 
     manager->priv = g_new0(RsttoXfceWallpaperManagerPriv, 1);
     manager->priv->channel = xfconf_channel_new ("xfce4-desktop");
@@ -439,14 +436,13 @@ rstto_xfce_wallpaper_manager_init (GObject *object)
     manager->priv->monitor_chooser = rstto_monitor_chooser_new ();
     manager->priv->style_combo = gtk_combo_box_text_new ();
 
-    gtk_table_set_row_spacings (GTK_TABLE (image_prop_table), 6);
-    gtk_table_set_col_spacings (GTK_TABLE (image_prop_table), 6);
+    gtk_grid_set_row_spacing (GTK_GRID (image_prop_grid), 6);
+    gtk_grid_set_column_spacing (GTK_GRID (image_prop_grid), 6);
 
     for (i = 0; i < n_monitors; ++i)
     {
-        gdk_screen_get_monitor_geometry (
-                screen,
-                i,
+        gdk_monitor_get_geometry (
+                gdk_display_get_monitor (display, i),
                 &monitor_geometry);
         rstto_monitor_chooser_add (
                 RSTTO_MONITOR_CHOOSER (manager->priv->monitor_chooser),
@@ -462,34 +458,27 @@ rstto_xfce_wallpaper_manager_init (GObject *object)
             0);
     gtk_box_pack_start (
             GTK_BOX (vbox),
-            image_prop_table,
+            image_prop_grid,
             FALSE,
             FALSE,
             0);
 
-    gtk_table_attach (
-            GTK_TABLE (image_prop_table),
+    gtk_grid_attach (
+            GTK_GRID (image_prop_grid),
             style_label,
             0,
-            1,
             0,
             1,
-            0,
-            0,
-            0,
-            0);
-    gtk_table_attach (
-            GTK_TABLE (image_prop_table),
+            1);
+    gtk_grid_attach (
+            GTK_GRID (image_prop_grid),
             manager->priv->style_combo,
             1,
-            2,
             0,
             1,
-            GTK_EXPAND|GTK_FILL,
-            0,
-            0,
-            0);
+            1);
 
+    gtk_widget_set_hexpand (manager->priv->style_combo, TRUE);
     gtk_combo_box_text_append_text (
             GTK_COMBO_BOX_TEXT (manager->priv->style_combo),
             _("Auto"));
@@ -513,7 +502,8 @@ rstto_xfce_wallpaper_manager_init (GObject *object)
             GTK_COMBO_BOX (manager->priv->style_combo),
             3);
 
-    manager->priv->screen = gdk_screen_get_number (screen);
+    // there's only one screen in GTK3
+    manager->priv->screen = 0;
 
     gtk_window_set_resizable (GTK_WINDOW (manager->priv->dialog), FALSE);
 
@@ -531,17 +521,13 @@ rstto_xfce_wallpaper_manager_init (GObject *object)
     gtk_toggle_button_set_active (
             GTK_TOGGLE_BUTTON (manager->priv->check_button),
             manager->priv->workspace_mode);
-    gtk_table_attach (
-            GTK_TABLE (image_prop_table),
+    gtk_grid_attach (
+            GTK_GRID (image_prop_grid),
             manager->priv->check_button,
             0,
-            2,
             1,
             2,
-            GTK_EXPAND|GTK_FILL,
-            0,
-            0,
-            0);
+            1);
     g_signal_connect (manager->priv->check_button,
             "toggled",
             G_CALLBACK (cb_workspace_mode_changed),
@@ -680,12 +666,7 @@ rstto_get_active_workspace_number (GdkScreen *screen)
         XFree (prop_ret);
     }
 
-#if GTK_CHECK_VERSION (3, 0, 0)
     gdk_error_trap_pop_ignored ();
-#else
-    if (gdk_error_trap_pop () != 0)
-        return 0;
-#endif
 
     return ws_num;
 }

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list