Trim trailing white spaces.
[geeqie.git] / src / layout_util.c
index b74f9e4..79193b0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Geeqie
  * (C) 2004 John Ellis
- * Copyright (C) 2008 - 2009 The Geeqie Team
+ * Copyright (C) 2008 - 2012 The Geeqie Team
  *
  * Author: John Ellis
  *
@@ -27,6 +27,7 @@
 #include "filedata.h"
 #include "history_list.h"
 #include "image-overlay.h"
+#include "histogram.h"
 #include "img-view.h"
 #include "layout_image.h"
 #include "logwindow.h"
@@ -54,6 +55,7 @@
 
 static gboolean layout_bar_enabled(LayoutWindow *lw);
 static gboolean layout_bar_sort_enabled(LayoutWindow *lw);
+static void layout_util_sync_views(LayoutWindow *lw);
 
 /*
  *-----------------------------------------------------------------------------
@@ -62,10 +64,10 @@ static gboolean layout_bar_sort_enabled(LayoutWindow *lw);
  */
 
 static guint tree_key_overrides[] = {
-       GDK_Page_Up,    GDK_KP_Page_Up,
-       GDK_Page_Down,  GDK_KP_Page_Down,
-       GDK_Home,       GDK_KP_Home,
-       GDK_End,        GDK_KP_End
+       GDK_KEY_Page_Up,        GDK_KEY_KP_Page_Up,
+       GDK_KEY_Page_Down,      GDK_KEY_KP_Page_Down,
+       GDK_KEY_Home,   GDK_KEY_KP_Home,
+       GDK_KEY_End,    GDK_KEY_KP_End
 };
 
 static gboolean layout_key_match(guint keyval)
@@ -83,13 +85,14 @@ static gboolean layout_key_match(guint keyval)
 gboolean layout_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
        LayoutWindow *lw = data;
+       GtkWidget *focused;
        gboolean stop_signal = FALSE;
        gint x = 0;
        gint y = 0;
 
-       if (lw->path_entry && GTK_WIDGET_HAS_FOCUS(lw->path_entry))
+       if (lw->path_entry && gtk_widget_has_focus(lw->path_entry))
                {
-               if (event->keyval == GDK_Escape && lw->dir_fd)
+               if (event->keyval == GDK_KEY_Escape && lw->dir_fd)
                        {
                        gtk_entry_set_text(GTK_ENTRY(lw->path_entry), lw->dir_fd->path);
                        }
@@ -102,7 +105,7 @@ gboolean layout_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer dat
                        return TRUE;
                        }
                }
-       if (lw->vd && lw->options.dir_view_type == DIRVIEW_TREE && GTK_WIDGET_HAS_FOCUS(lw->vd->view) &&
+       if (lw->vd && lw->options.dir_view_type == DIRVIEW_TREE && gtk_widget_has_focus(lw->vd->view) &&
            !layout_key_match(event->keyval) &&
            gtk_widget_event(lw->vd->view, (GdkEvent *)event))
                {
@@ -114,28 +117,23 @@ gboolean layout_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer dat
                return TRUE;
                }
 
-/*
-       if (event->type == GDK_KEY_PRESS && lw->full_screen &&
-           gtk_accel_groups_activate(G_OBJECT(lw->window), event->keyval, event->state))
-               return TRUE;
-*/
-
+       focused = gtk_container_get_focus_child(GTK_CONTAINER(lw->image->widget));
        if (lw->image &&
-           (GTK_WIDGET_HAS_FOCUS(lw->image->widget) || (lw->tools && widget == lw->window) || lw->full_screen) )
+           ((focused && gtk_widget_has_focus(focused)) || (lw->tools && widget == lw->window) || lw->full_screen) )
                {
                stop_signal = TRUE;
                switch (event->keyval)
                        {
-                       case GDK_Left: case GDK_KP_Left:
+                       case GDK_KEY_Left: case GDK_KEY_KP_Left:
                                x -= 1;
                                break;
-                       case GDK_Right: case GDK_KP_Right:
+                       case GDK_KEY_Right: case GDK_KEY_KP_Right:
                                x += 1;
                                break;
-                       case GDK_Up: case GDK_KP_Up:
+                       case GDK_KEY_Up: case GDK_KEY_KP_Up:
                                y -= 1;
                                break;
-                       case GDK_Down: case GDK_KP_Down:
+                       case GDK_KEY_Down: case GDK_KEY_KP_Down:
                                y += 1;
                                break;
                        default:
@@ -149,7 +147,7 @@ gboolean layout_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer dat
                        stop_signal = TRUE;
                        switch (event->keyval)
                                {
-                               case GDK_Menu:
+                               case GDK_KEY_Menu:
                                        layout_image_menu_popup(lw);
                                        break;
                                default:
@@ -263,7 +261,7 @@ static void layout_menu_dir_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
 
-       file_util_create_dir(lw->dir_fd, layout_window(lw), NULL, NULL);
+       if (lw->vd) vd_new_folder(lw->vd, lw->dir_fd);
 }
 
 static void layout_menu_copy_cb(GtkAction *action, gpointer data)
@@ -609,7 +607,7 @@ static void layout_menu_list_cb(GtkRadioAction *action, GtkRadioAction *current,
        LayoutWindow *lw = data;
        
        layout_exit_fullscreen(lw);
-       layout_views_set(lw, lw->options.dir_view_type, (gtk_radio_action_get_current_value(action) == 1) ? FILEVIEW_ICON : FILEVIEW_LIST);
+       layout_views_set(lw, lw->options.dir_view_type, (FileViewType) gtk_radio_action_get_current_value(action));
 }
 
 static void layout_menu_view_dir_as_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
@@ -640,32 +638,92 @@ static void layout_menu_escape_cb(GtkAction *action, gpointer data)
        LayoutWindow *lw = data;
 
        layout_exit_fullscreen(lw);
-
-       /* FIXME:interrupting thumbs no longer allowed */
-#if 0
-       interrupt_thumbs();
-#endif
 }
 
-static void layout_menu_overlay_cb(GtkAction *action, gpointer data)
+static void layout_menu_overlay_toggle_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
 
        image_osd_toggle(lw->image);
+       layout_util_sync_views(lw);
+}
+
+
+static void layout_menu_overlay_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       
+       if (gtk_toggle_action_get_active(action))
+               {
+               OsdShowFlags flags = image_osd_get(lw->image);
+               
+               if ((flags | OSD_SHOW_INFO | OSD_SHOW_STATUS) != flags)
+                       image_osd_set(lw->image, flags | OSD_SHOW_INFO | OSD_SHOW_STATUS);
+               }
+       else
+               {
+               GtkToggleAction *histogram_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(lw->action_group, "ImageHistogram"));
+               
+               image_osd_set(lw->image, OSD_SHOW_NOTHING);
+               gtk_toggle_action_set_active(histogram_action, FALSE); /* this calls layout_menu_histogram_cb */
+               }
+}
+
+static void layout_menu_histogram_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (gtk_toggle_action_get_active(action))
+               {
+               image_osd_set(lw->image, OSD_SHOW_INFO | OSD_SHOW_STATUS | OSD_SHOW_HISTOGRAM);
+               layout_util_sync_views(lw); /* show the overlay state, default channel and mode in the menu */
+               }
+       else
+               {
+               OsdShowFlags flags = image_osd_get(lw->image);
+               if (flags & OSD_SHOW_HISTOGRAM)
+                       image_osd_set(lw->image, flags & ~OSD_SHOW_HISTOGRAM);
+               }
+}
+
+static void layout_menu_histogram_toggle_channel_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       image_osd_histogram_toggle_channel(lw->image);
+       layout_util_sync_views(lw);
+}
+
+static void layout_menu_histogram_toggle_mode_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       image_osd_histogram_toggle_mode(lw->image);
+       layout_util_sync_views(lw);
 }
 
-static void layout_menu_histogram_chan_cb(GtkAction *action, gpointer data)
+static void layout_menu_histogram_channel_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
 {
        LayoutWindow *lw = data;
+       gint channel = gtk_radio_action_get_current_value(action);
+       GtkToggleAction *histogram_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(lw->action_group, "ImageHistogram"));
 
-       image_osd_histogram_chan_toggle(lw->image);
+       if (channel < 0 || channel >= HCHAN_COUNT) return;
+       
+       gtk_toggle_action_set_active(histogram_action, TRUE); /* this calls layout_menu_histogram_cb */
+       image_osd_histogram_set_channel(lw->image, channel);
 }
 
-static void layout_menu_histogram_log_cb(GtkAction *action, gpointer data)
+static void layout_menu_histogram_mode_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
 {
        LayoutWindow *lw = data;
+       gint mode = gtk_radio_action_get_current_value(action);
+       GtkToggleAction *histogram_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(lw->action_group, "ImageHistogram"));
 
-       image_osd_histogram_log_toggle(lw->image);
+       if (mode < 0 || mode > 1) return;
+       
+       gtk_toggle_action_set_active(histogram_action, TRUE); /* this calls layout_menu_histogram_cb */
+       image_osd_histogram_set_mode(lw->image, mode);
 }
 
 static void layout_menu_refresh_cb(GtkAction *action, gpointer data)
@@ -742,10 +800,11 @@ static void layout_menu_bar_sort_cb(GtkToggleAction *action, gpointer data)
        layout_bar_sort_toggle(lw);
 }
 
-static void layout_menu_slideshow_cb(GtkAction *action, gpointer data)
+static void layout_menu_slideshow_cb(GtkToggleAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
 
+       if (layout_image_slideshow_active(lw) == gtk_toggle_action_get_active(action)) return;
        layout_image_slideshow_toggle(lw);
 }
 
@@ -756,6 +815,32 @@ static void layout_menu_slideshow_pause_cb(GtkAction *action, gpointer data)
        layout_image_slideshow_pause_toggle(lw);
 }
 
+
+static void layout_menu_stereo_mode_next_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gint mode = layout_image_stereo_pixbuf_get(lw);
+       
+       /* 0->1, 1->2, 2->3, 3->1 - disable auto, then cycle */
+       mode = mode % 3 + 1;
+       
+       GtkAction *radio = gtk_action_group_get_action(lw->action_group, "StereoAuto");
+       gtk_radio_action_set_current_value(GTK_RADIO_ACTION(radio), mode);
+       
+       /*
+       this is called via fallback in layout_menu_stereo_mode_cb
+       layout_image_stereo_pixbuf_set(lw, mode);
+       */
+
+}
+
+static void layout_menu_stereo_mode_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gint mode = gtk_radio_action_get_current_value(action);
+       layout_image_stereo_pixbuf_set(lw, mode);
+}
+
 static void layout_menu_help_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
@@ -895,6 +980,16 @@ static void layout_menu_sel_mark_minus_cb(GtkAction *action, gpointer data)
        layout_mark_to_selection(lw, mark, MTS_MODE_MINUS);
 }
 
+static void layout_menu_mark_filter_toggle_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gint mark = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "mark_num"));
+       g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
+
+       layout_marks_set(lw, TRUE);
+       layout_mark_filter_toggle(lw, mark);
+}
+
 
 /*
  *-----------------------------------------------------------------------------
@@ -948,7 +1043,7 @@ static void layout_menu_back_cb(GtkAction *action, gpointer data)
        if (!path) return;
        
        /* Open previous path */
-       dir_fd = file_data_new_simple(path);
+       dir_fd = file_data_new_dir(path);
        layout_set_fd(lw, dir_fd);
        file_data_unref(dir_fd);
 }
@@ -965,7 +1060,7 @@ static void layout_menu_home_cb(GtkAction *action, gpointer data)
 
        if (path)
                {
-               FileData *dir_fd = file_data_new_simple(path);
+               FileData *dir_fd = file_data_new_dir(path);
                layout_set_fd(lw, dir_fd);
                file_data_unref(dir_fd);
                }
@@ -981,74 +1076,14 @@ static void layout_menu_home_cb(GtkAction *action, gpointer data)
 static void layout_menu_edit_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
-       GList *list;
        const gchar *key = gtk_action_get_name(action);
        
        if (!editor_window_flag_set(key))
                layout_exit_fullscreen(lw);
 
-       list = layout_selection_list(lw);
-       file_util_start_editor_from_filelist(key, list, lw->window);
-       filelist_free(list);
-}
-
-#if 0
-static void layout_menu_edit_update(LayoutWindow *lw)
-{
-       gint i;
-
-       /* main edit menu */
-
-       if (!lw->action_group) return;
-
-       for (i = 0; i < GQ_EDITOR_GENERIC_SLOTS; i++)
-               {
-               gchar *key;
-               GtkAction *action;
-               const gchar *name;
-       
-               key = g_strdup_printf("Editor%d", i);
-
-               action = gtk_action_group_get_action(lw->action_group, key);
-               g_object_set_data(G_OBJECT(action), "edit_index", GINT_TO_POINTER(i));
-
-               name = editor_get_name(i);
-               if (name)
-                       {
-                       gchar *text = g_strdup_printf(_("_%d %s..."), i, name);
-
-                       g_object_set(action, "label", text,
-                                            "sensitive", TRUE, NULL);
-                       g_free(text);
-                       }
-               else
-                       {
-                       gchar *text;
-
-                       text = g_strdup_printf(_("_%d empty"), i);
-                       g_object_set(action, "label", text, "sensitive", FALSE, NULL);
-                       g_free(text);
-                       }
-
-               g_free(key);
-               }
-}
-
-void layout_edit_update_all(void)
-{
-       GList *work;
-
-       work = layout_window_list;
-       while (work)
-               {
-               LayoutWindow *lw = work->data;
-               work = work->next;
-
-               layout_menu_edit_update(lw);
-               }
+       file_util_start_editor_from_filelist(key, layout_selection_list(lw), layout_get_path(lw), lw->window);
 }
 
-#endif
 
 static void layout_menu_metadata_write_cb(GtkAction *action, gpointer data)
 {
@@ -1067,6 +1102,8 @@ static void layout_color_menu_enable_cb(GtkToggleAction *action, gpointer data)
 #ifdef HAVE_LCMS
        LayoutWindow *lw = data;
 
+       if (layout_image_color_profile_get_use(lw) == gtk_toggle_action_get_active(action)) return;
+
        layout_image_color_profile_set_use(lw, gtk_toggle_action_get_active(action));
        layout_util_sync_color(lw);
        layout_image_refresh(lw);
@@ -1081,6 +1118,7 @@ static void layout_color_menu_use_image_cb(GtkToggleAction *action, gpointer dat
        gboolean use_image;
 
        if (!layout_image_color_profile_get(lw, &input, &use_image)) return;
+       if (use_image == gtk_toggle_action_get_active(action)) return;
        layout_image_color_profile_set(lw, input, gtk_toggle_action_get_active(action));
        layout_util_sync_color(lw);
        layout_image_refresh(lw);
@@ -1216,12 +1254,15 @@ static GtkActionEntry menu_entries[] = {
   { "SelectMenu",      NULL,                   N_("_Select"),                          NULL,                   NULL,                                   NULL },
   { "OrientationMenu", NULL,                   N_("_Orientation"),                     NULL,                   NULL,                                   NULL },
   { "ExternalMenu",    NULL,                   N_("E_xternal Editors"),                NULL,                   NULL,                                   NULL },
+  { "PreferencesMenu", NULL,                   N_("P_references"),                     NULL,                   NULL,                                   NULL },
   { "ViewMenu",                NULL,                   N_("_View"),                            NULL,                   NULL,                                   NULL },
-  { "DirMenu",          NULL,                  N_("_View Directory as"),               NULL,                   NULL,                                   NULL },
+  { "FileDirMenu",     NULL,                   N_("_Files and Folders"),               NULL,                   NULL,                                   NULL },
   { "ZoomMenu",                NULL,                   N_("_Zoom"),                            NULL,                   NULL,                                   NULL },
-  { "ColorMenu",       NULL,                   N_("Color _Management"),                NULL,                   NULL,                                   NULL },
+  { "ColorMenu",       NULL,                   N_("_Color Management"),                NULL,                   NULL,                                   NULL },
   { "ConnectZoomMenu", NULL,                   N_("_Connected Zoom"),                  NULL,                   NULL,                                   NULL },
-  { "SplitMenu",       NULL,                   N_("_Split"),                           NULL,                   NULL,                                   NULL },
+  { "SplitMenu",       NULL,                   N_("Spli_t"),                           NULL,                   NULL,                                   NULL },
+  { "StereoMenu",      NULL,                   N_("Stere_o"),                          NULL,                   NULL,                                   NULL },
+  { "OverlayMenu",     NULL,                   N_("Image _Overlay"),                   NULL,                   NULL,                                   NULL },
   { "HelpMenu",                NULL,                   N_("_Help"),                            NULL,                   NULL,                                   NULL },
 
   { "FirstImage",      GTK_STOCK_GOTO_TOP,     N_("_First Image"),                     "Home",                 N_("First Image"),                      CB(layout_menu_image_first_cb) },
@@ -1238,10 +1279,10 @@ static GtkActionEntry menu_entries[] = {
   { "NewWindow",       GTK_STOCK_NEW,          N_("New _window"),                      "<control>N",           N_("New window"),                       CB(layout_menu_new_window_cb) },
   { "NewCollection",   GTK_STOCK_INDEX,        N_("_New collection"),                  "C",                    N_("New collection"),                   CB(layout_menu_new_cb) },
   { "OpenCollection",  GTK_STOCK_OPEN,         N_("_Open collection..."),              "O",                    N_("Open collection..."),               CB(layout_menu_open_cb) },
-  { "OpenRecent",      NULL,                   N_("Open _recent"),                     NULL,                   N_("Open recent"),                      NULL },
+  { "OpenRecent",      NULL,                   N_("Open recen_t"),                     NULL,                   N_("Open recent"),                      NULL },
   { "Search",          GTK_STOCK_FIND,         N_("_Search..."),                       "F3",                   N_("Search..."),                        CB(layout_menu_search_cb) },
   { "FindDupes",       GTK_STOCK_FIND,         N_("_Find duplicates..."),              "D",                    N_("Find duplicates..."),               CB(layout_menu_dupes_cb) },
-  { "PanView",         NULL,                   N_("Pan _view"),                        "<control>J",           N_("Pan view"),                         CB(layout_menu_pan_cb) },
+  { "PanView",         NULL,                   N_("Pa_n view"),                        "<control>J",           N_("Pan view"),                         CB(layout_menu_pan_cb) },
   { "Print",           GTK_STOCK_PRINT,        N_("_Print..."),                        "<shift>P",             N_("Print..."),                         CB(layout_menu_print_cb) },
   { "NewFolder",       GTK_STOCK_DIRECTORY,    N_("N_ew folder..."),                   "<control>F",           N_("New folder..."),                    CB(layout_menu_dir_cb) },
   { "Copy",            GTK_STOCK_COPY,         N_("_Copy..."),                         "<control>C",           N_("Copy..."),                          CB(layout_menu_copy_cb) },
@@ -1308,9 +1349,9 @@ static GtkActionEntry menu_entries[] = {
   { "FullScreenAlt2",  GTK_STOCK_FULLSCREEN,   N_("F_ull screen"),                     "F11",                  N_("Full screen"),                      CB(layout_menu_fullscreen_cb) },
   { "Escape",          GTK_STOCK_LEAVE_FULLSCREEN,N_("_Leave full screen"),            "Escape",               N_("Leave full screen"),                CB(layout_menu_escape_cb) },
   { "EscapeAlt1",      GTK_STOCK_LEAVE_FULLSCREEN,N_("_Leave full screen"),            "Q",                    N_("Leave full screen"),                CB(layout_menu_escape_cb) },
-  { "ImageOverlay",    NULL,                   N_("_Image Overlay"),                   "I",                    N_("Image Overlay"),                    CB(layout_menu_overlay_cb) },
-  { "HistogramChan",   NULL,                   N_("Histogram _channels"),              "K",                    N_("Histogram channels"),               CB(layout_menu_histogram_chan_cb) },
-  { "HistogramLog",    NULL,                   N_("Histogram _log mode"),              "J",                    N_("Histogram log mode"),               CB(layout_menu_histogram_log_cb) },
+  { "ImageOverlayCycle",NULL,                  N_("_Cycle through overlay modes"),     "I",                    N_("Cycle through Overlay modes"),      CB(layout_menu_overlay_toggle_cb) },
+  { "HistogramChanCycle",NULL,                 N_("Cycle through histogram ch_annels"),"K",                    N_("Cycle through histogram channels"), CB(layout_menu_histogram_toggle_channel_cb) },
+  { "HistogramModeCycle",NULL,                 N_("Cycle through histogram mo_des"),   "J",                    N_("Cycle through histogram modes"),    CB(layout_menu_histogram_toggle_mode_cb) },
   { "HideTools",       NULL,                   N_("_Hide file list"),                  "<control>H",           N_("Hide file list"),                   CB(layout_menu_hide_cb) },
   { "SlideShowPause",  GTK_STOCK_MEDIA_PAUSE,  N_("_Pause slideshow"),                 "P",                    N_("Pause slideshow"),                  CB(layout_menu_slideshow_pause_cb) },
   { "Refresh",         GTK_STOCK_REFRESH,      N_("_Refresh"),                         "R",                    N_("Refresh"),                          CB(layout_menu_refresh_cb) },
@@ -1319,27 +1360,35 @@ static GtkActionEntry menu_entries[] = {
   { "HelpNotes",       NULL,                   N_("_Release notes"),                   NULL,                   N_("Release notes"),                    CB(layout_menu_notes_cb) },
   { "About",           GTK_STOCK_ABOUT,        N_("_About"),                           NULL,                   N_("About"),                            CB(layout_menu_about_cb) },
   { "LogWindow",       NULL,                   N_("_Log Window"),                      NULL,                   N_("Log Window"),                       CB(layout_menu_log_window_cb) },
-  { "ExifWin",         NULL,                   N_("E_xif window"),                     "<control>E",           N_("Exif window"),                      CB(layout_menu_bar_exif_cb) },
+  { "ExifWin",         NULL,                   N_("_Exif window"),                     "<control>E",           N_("Exif window"),                      CB(layout_menu_bar_exif_cb) },
+  { "StereoCycle",     NULL,                   N_("_Cycle through stereo modes"),      NULL,                   N_("Cycle through stereo modes"),       CB(layout_menu_stereo_mode_next_cb) },
 
 };
 
 static GtkToggleActionEntry menu_toggle_entries[] = {
   { "Thumbnails",      PIXBUF_INLINE_ICON_THUMB,N_("Show _Thumbnails"),                "T",                    N_("Show Thumbnails"),                  CB(layout_menu_thumb_cb),        FALSE },
   { "ShowMarks",        NULL,                  N_("Show _Marks"),                      "M",                    N_("Show Marks"),                       CB(layout_menu_marks_cb),        FALSE  },
-  { "ShowInfoPixel",   GTK_STOCK_COLOR_PICKER, N_("Show Pi_xel Info"),                 NULL,                   N_("Show Pixel Info"),                  CB(layout_menu_info_pixel_cb),   FALSE  },
+  { "ShowInfoPixel",   GTK_STOCK_COLOR_PICKER, N_("Pi_xel Info"),                      NULL,                   N_("Show Pixel Info"),                  CB(layout_menu_info_pixel_cb),   FALSE  },
   { "FloatTools",      PIXBUF_INLINE_ICON_FLOAT,N_("_Float file list"),                "L",                    N_("Float file list"),                  CB(layout_menu_float_cb),        FALSE  },
   { "HideToolbar",     NULL,                   N_("Hide tool_bar"),                    NULL,                   N_("Hide toolbar"),                     CB(layout_menu_toolbar_cb),      FALSE  },
-  { "SBar",            NULL,                   N_("_Info"),                            "<control>K",           N_("Info"),                             CB(layout_menu_bar_cb),          FALSE  },
+  { "SBar",            NULL,                   N_("_Info sidebar"),                    "<control>K",           N_("Info sidebar"),                     CB(layout_menu_bar_cb),          FALSE  },
   { "SBarSort",                NULL,                   N_("Sort _manager"),                    "<shift>S",             N_("Sort manager"),                     CB(layout_menu_bar_sort_cb),     FALSE  },
   { "SlideShow",       GTK_STOCK_MEDIA_PLAY,   N_("Toggle _slideshow"),                "S",                    N_("Toggle slideshow"),                 CB(layout_menu_slideshow_cb),    FALSE  },
   { "UseColorProfiles",        GTK_STOCK_SELECT_COLOR, N_("Use _color profiles"),              NULL,                   N_("Use color profiles"),               CB(layout_color_menu_enable_cb), FALSE},
   { "UseImageProfile", NULL,                   N_("Use profile from _image"),          NULL,                   N_("Use profile from image"),           CB(layout_color_menu_use_image_cb), FALSE},
   { "Grayscale",       NULL,                   N_("Toggle _grayscale"),                "<shift>G",             N_("Toggle grayscale"),                 CB(layout_menu_alter_desaturate_cb), FALSE},
+  { "ImageOverlay",    NULL,                   N_("Image _Overlay"),                   NULL,                   N_("Image Overlay"),                    CB(layout_menu_overlay_cb),      FALSE },
+  { "ImageHistogram",  NULL,                   N_("_Show Histogram"),                  NULL,                   N_("Show Histogram"),                   CB(layout_menu_histogram_cb),    FALSE },
 };
 
 static GtkRadioActionEntry menu_radio_entries[] = {
-  { "ViewList",                NULL,                   N_("View Images as _List"),             "<control>L",           N_("View Images as List"),              0 },
-  { "ViewIcons",       NULL,                   N_("View Images as I_cons"),            "<control>I",           N_("View Images as Icons"),             1 }
+  { "ViewList",                NULL,                   N_("Image _List"),                      "<control>L",           N_("View Images as List"),              FILEVIEW_LIST },
+  { "ViewIcons",       NULL,                   N_("I_cons"),                           "<control>I",           N_("View Images as Icons"),             FILEVIEW_ICON }
+};
+
+static GtkRadioActionEntry menu_view_dir_radio_entries[] = {
+  { "FolderList",      NULL,                   N_("Folder Li_st"),                     "<meta>L",              N_("View Folders as List"),             DIRVIEW_LIST },
+  { "FolderTree",      NULL,                   N_("Folder T_ree"),                     "<control>T",           N_("View Folders as Tree"),             DIRVIEW_TREE },
 };
 
 static GtkRadioActionEntry menu_split_radio_entries[] = {
@@ -1358,6 +1407,27 @@ static GtkRadioActionEntry menu_color_radio_entries[] = {
   { "ColorProfile5",   NULL,                   N_("Input _5"),                         NULL,                   N_("Input 5"),                          COLOR_PROFILE_FILE + 3 }
 };
 
+static GtkRadioActionEntry menu_histogram_channel[] = {
+  { "HistogramChanR",  NULL,                   N_("Histogram on _Red"),                NULL,                   N_("Histogram on Red"),         HCHAN_R },
+  { "HistogramChanG",  NULL,                   N_("Histogram on _Green"),              NULL,                   N_("Histogram on Green"),       HCHAN_G },
+  { "HistogramChanB",  NULL,                   N_("Histogram on _Blue"),               NULL,                   N_("Histogram on Blue"),        HCHAN_B },
+  { "HistogramChanRGB",        NULL,                   N_("_Histogram on RGB"),                        NULL,                   N_("Histogram on RGB"),         HCHAN_RGB },
+  { "HistogramChanV",  NULL,                   N_("Histogram on _Value"),              NULL,                   N_("Histogram on Value"),       HCHAN_MAX }
+};
+
+static GtkRadioActionEntry menu_histogram_mode[] = {
+  { "HistogramModeLin",        NULL,                   N_("Li_near Histogram"),                NULL,                   N_("Linear Histogram"),         0 },
+  { "HistogramModeLog",        NULL,                   N_("_Log Histogram"),                   NULL,                   N_("Log Histogram"),            1 },
+};
+
+static GtkRadioActionEntry menu_stereo_mode_entries[] = {
+  { "StereoAuto",      NULL,                   N_("_Auto"),                            NULL,                   N_("Stereo Auto"),              STEREO_PIXBUF_DEFAULT },
+  { "StereoSBS",       NULL,                   N_("_Side by Side"),                    NULL,                   N_("Stereo Side by Side"),      STEREO_PIXBUF_SBS },
+  { "StereoCross",     NULL,                   N_("_Cross"),                           NULL,                   N_("Stereo Cross"),             STEREO_PIXBUF_CROSS },
+  { "StereoOff",       NULL,                   N_("_Off"),                             NULL,                   N_("Stereo Off"),               STEREO_PIXBUF_NONE }
+};
+
+
 #undef CB
 
 static const gchar *menu_ui_description =
@@ -1428,10 +1498,12 @@ static const gchar *menu_ui_description =
 "      <menuitem action='SaveMetadata'/>"
 "      <placeholder name='PropertiesSection'/>"
 "      <separator/>"
-"      <menuitem action='Preferences'/>"
-"      <menuitem action='Editors'/>"
-"      <menuitem action='LayoutConfig'/>"
-"      <menuitem action='Maintenance'/>"
+"        <menu action='PreferencesMenu'>"
+"        <menuitem action='Preferences'/>"
+"        <menuitem action='Editors'/>"
+"        <menuitem action='LayoutConfig'/>"
+"        <menuitem action='Maintenance'/>"
+"      </menu>"
 "      <placeholder name='PreferencesSection'/>"
 "      <separator/>"
 "      <menuitem action='Wallpaper'/>"
@@ -1440,21 +1512,40 @@ static const gchar *menu_ui_description =
 "    <menu action='ViewMenu'>"
 "      <menuitem action='ViewInNewWindow'/>"
 "      <menuitem action='PanView'/>"
+"      <menuitem action='ExifWin'/>"
 "      <placeholder name='WindowSection'/>"
 "      <separator/>"
-"      <menu action='ColorMenu'>"
-"        <menuitem action='UseColorProfiles'/>"
-"        <menuitem action='UseImageProfile'/>"
-"        <menuitem action='ColorProfile0'/>"
-"        <menuitem action='ColorProfile1'/>"
-"        <menuitem action='ColorProfile2'/>"
-"        <menuitem action='ColorProfile3'/>"
-"        <menuitem action='ColorProfile4'/>"
-"        <menuitem action='ColorProfile5'/>"
+"      <menu action='FileDirMenu'>"
+"        <menuitem action='FolderList'/>"
+"        <menuitem action='FolderTree'/>"
+"        <placeholder name='FolderSection'/>"
 "        <separator/>"
-"        <menuitem action='Grayscale'/>"
+"        <menuitem action='ViewList'/>"
+"        <menuitem action='ViewIcons'/>"
+"        <menuitem action='Thumbnails'/>"
+"        <placeholder name='ListSection'/>"
+"        <separator/>"
+"        <menuitem action='FloatTools'/>"
+"        <menuitem action='HideTools'/>"
+"        <menuitem action='HideToolbar'/>"
 "      </menu>"
+"      <placeholder name='DirSection'/>"
+"      <separator/>"
 "      <menu action='ZoomMenu'>"
+"        <menu action='ConnectZoomMenu'>"
+"          <menuitem action='ConnectZoomIn'/>"
+"          <menuitem action='ConnectZoomOut'/>"
+"          <menuitem action='ConnectZoomFit'/>"
+"          <menuitem action='ConnectZoomFillHor'/>"
+"          <menuitem action='ConnectZoomFillVert'/>"
+"          <menuitem action='ConnectZoom100'/>"
+"          <menuitem action='ConnectZoom200'/>"
+"          <menuitem action='ConnectZoom300'/>"
+"          <menuitem action='ConnectZoom400'/>"
+"          <menuitem action='ConnectZoom50'/>"
+"          <menuitem action='ConnectZoom33'/>"
+"          <menuitem action='ConnectZoom25'/>"
+"        </menu>"
 "        <menuitem action='ZoomIn'/>"
 "        <menuitem action='ZoomOut'/>"
 "        <menuitem action='ZoomFit'/>"
@@ -1468,56 +1559,55 @@ static const gchar *menu_ui_description =
 "        <menuitem action='Zoom33'/>"
 "        <menuitem action='Zoom25'/>"
 "      </menu>"
-"      <menu action='ConnectZoomMenu'>"
-"        <menuitem action='ConnectZoomIn'/>"
-"        <menuitem action='ConnectZoomOut'/>"
-"        <menuitem action='ConnectZoomFit'/>"
-"        <menuitem action='ConnectZoomFillHor'/>"
-"        <menuitem action='ConnectZoomFillVert'/>"
-"        <menuitem action='ConnectZoom100'/>"
-"        <menuitem action='ConnectZoom200'/>"
-"        <menuitem action='ConnectZoom300'/>"
-"        <menuitem action='ConnectZoom400'/>"
-"        <menuitem action='ConnectZoom50'/>"
-"        <menuitem action='ConnectZoom33'/>"
-"        <menuitem action='ConnectZoom25'/>"
-"      </menu>"
-"      <placeholder name='ZoomSection'/>"
-"      <separator/>"
 "      <menu action='SplitMenu'>"
 "        <menuitem action='SplitHorizontal'/>"
 "        <menuitem action='SplitVertical'/>"
 "        <menuitem action='SplitQuad'/>"
 "        <menuitem action='SplitSingle'/>"
 "      </menu>"
-"      <separator/>"
-"      <menuitem action='ViewList'/>"
-"      <menuitem action='ViewIcons'/>"
-"      <menuitem action='Thumbnails'/>"
-"      <placeholder name='ListSection'/>"
-"      <separator/>"
-"      <menu action='DirMenu'>"
-"        <menuitem action='FolderList'/>"
-"        <menuitem action='FolderTree'/>"
+"      <menu action='StereoMenu'>"
+"        <menuitem action='StereoAuto'/>"
+"        <menuitem action='StereoSBS'/>"
+"        <menuitem action='StereoCross'/>"
+"        <menuitem action='StereoOff'/>"
+"        <separator/>"
+"        <menuitem action='StereoCycle'/>"
+"      </menu>"
+"      <menu action='ColorMenu'>"
+"        <menuitem action='UseColorProfiles'/>"
+"        <menuitem action='UseImageProfile'/>"
+"        <menuitem action='ColorProfile0'/>"
+"        <menuitem action='ColorProfile1'/>"
+"        <menuitem action='ColorProfile2'/>"
+"        <menuitem action='ColorProfile3'/>"
+"        <menuitem action='ColorProfile4'/>"
+"        <menuitem action='ColorProfile5'/>"
+"        <separator/>"
+"        <menuitem action='Grayscale'/>"
+"      </menu>"
+"      <menu action='OverlayMenu'>"
+"        <menuitem action='ImageOverlay'/>"
+"        <menuitem action='ImageHistogram'/>"
+"        <menuitem action='ImageOverlayCycle'/>"
+"        <separator/>"
+"        <menuitem action='HistogramChanR'/>"
+"        <menuitem action='HistogramChanG'/>"
+"        <menuitem action='HistogramChanB'/>"
+"        <menuitem action='HistogramChanRGB'/>"
+"        <menuitem action='HistogramChanV'/>"
+"        <menuitem action='HistogramChanCycle'/>"
+"        <separator/>"
+"        <menuitem action='HistogramModeLin'/>"
+"        <menuitem action='HistogramModeLog'/>"
+"        <menuitem action='HistogramModeCycle'/>"
 "      </menu>"
-"      <placeholder name='DirSection'/>"
-"      <separator/>"
-"      <menuitem action='ImageOverlay'/>"
-"      <menuitem action='HistogramChan'/>"
-"      <menuitem action='HistogramLog'/>"
 "      <menuitem action='FullScreen'/>"
-"      <placeholder name='OverlaySection'/>"
-"      <separator/>"
-"      <menuitem action='FloatTools'/>"
-"      <menuitem action='HideTools'/>"
-"      <menuitem action='HideToolbar'/>"
-"      <menuitem action='ShowInfoPixel'/>"
-"      <placeholder name='ToolsSection'/>"
+"      <placeholder name='ViewSection'/>"
 "      <separator/>"
 "      <menuitem action='SBar'/>"
-"      <menuitem action='ExifWin'/>"
 "      <menuitem action='SBarSort'/>"
-"      <placeholder name='SideBarSection'/>"
+"      <menuitem action='ShowInfoPixel'/>"
+"      <placeholder name='ToolsSection'/>"
 "      <separator/>"
 "      <menuitem action='SlideShow'/>"
 "      <menuitem action='SlideShowPause'/>"
@@ -1613,11 +1703,12 @@ static void layout_actions_setup_marks(LayoutWindow *lw)
                layout_actions_setup_mark(lw, mark, "ResetMark%d",      _("_Reset mark %d"),                    NULL,           _("Reset mark %d"), G_CALLBACK(layout_menu_res_mark_sel_cb));
                layout_actions_setup_mark(lw, mark, "ToggleMark%d",     _("_Toggle mark %d"),                   "%d",           _("Toggle mark %d"), G_CALLBACK(layout_menu_toggle_mark_sel_cb));
                layout_actions_setup_mark(lw, mark, "ToggleMark%dAlt1", _("_Toggle mark %d"),                   "KP_%d",        _("Toggle mark %d"), G_CALLBACK(layout_menu_toggle_mark_sel_cb));
-               layout_actions_setup_mark(lw, mark, "SelectMark%d",     _("_Select mark %d"),                   "<control>%d",  _("Select mark %d"), G_CALLBACK(layout_menu_sel_mark_cb));
+               layout_actions_setup_mark(lw, mark, "SelectMark%d",     _("Se_lect mark %d"),                   "<control>%d",  _("Select mark %d"), G_CALLBACK(layout_menu_sel_mark_cb));
                layout_actions_setup_mark(lw, mark, "SelectMark%dAlt1", _("_Select mark %d"),                   "<control>KP_%d", _("Select mark %d"), G_CALLBACK(layout_menu_sel_mark_cb));
                layout_actions_setup_mark(lw, mark, "AddMark%d",        _("_Add mark %d"),                      NULL,           _("Add mark %d"), G_CALLBACK(layout_menu_sel_mark_or_cb));
                layout_actions_setup_mark(lw, mark, "IntMark%d",        _("_Intersection with mark %d"),        NULL,           _("Intersection with mark %d"), G_CALLBACK(layout_menu_sel_mark_and_cb));
                layout_actions_setup_mark(lw, mark, "UnselMark%d",      _("_Unselect mark %d"),                 NULL,           _("Unselect mark %d"), G_CALLBACK(layout_menu_sel_mark_minus_cb));
+               layout_actions_setup_mark(lw, mark, "FilterMark%d",     _("_Filter mark %d"),                   NULL,           _("Filter mark %d"), G_CALLBACK(layout_menu_mark_filter_toggle_cb));
 
                g_string_append_printf(desc,
                                "      <menu action='Mark%d'>"
@@ -1629,8 +1720,10 @@ static void layout_actions_setup_marks(LayoutWindow *lw)
                                "        <menuitem action='AddMark%d'/>"
                                "        <menuitem action='IntMark%d'/>"
                                "        <menuitem action='UnselMark%d'/>"
+                               "        <separator/>"
+                               "        <menuitem action='FilterMark%d'/>"
                                "      </menu>",
-                               mark, mark, mark, mark, mark, mark, mark, mark);
+                               mark, mark, mark, mark, mark, mark, mark, mark, mark);
                }
 
        g_string_append(desc,
@@ -1661,7 +1754,7 @@ static GList *layout_actions_editor_menu_path(EditorDescription *editor)
        gint i = 0;
        GList *ret = NULL;
        
-       if (split[0] == NULL) 
+       if (split[0] == NULL)
                {
                g_strfreev(split);
                return NULL;
@@ -1745,6 +1838,16 @@ static void layout_actions_setup_editors(LayoutWindow *lw)
        GList *old_path;
        GString *desc;
        
+       if (lw->ui_editors_id)
+               {
+               gtk_ui_manager_remove_ui(lw->ui_manager, lw->ui_editors_id);
+               }
+
+       if (lw->action_group_editors)
+               {
+               gtk_ui_manager_remove_action_group(lw->ui_manager, lw->action_group_editors);
+               g_object_unref(lw->action_group_editors);
+               }
        lw->action_group_editors = gtk_action_group_new("MenuActionsExternal");
        gtk_ui_manager_insert_action_group(lw->ui_manager, lw->action_group_editors, 1);
 
@@ -1761,9 +1864,14 @@ static void layout_actions_setup_editors(LayoutWindow *lw)
                {
                GList *path;
                EditorDescription *editor = work->data;
-               GtkActionEntry entry = { editor->key, NULL, editor->name, editor->hotkey, editor->comment, G_CALLBACK(layout_menu_edit_cb) };
+               GtkActionEntry entry = { editor->key,
+                                        NULL,
+                                        editor->name,
+                                        editor->hotkey,
+                                        editor->comment ? editor->comment : editor->name,
+                                        G_CALLBACK(layout_menu_edit_cb) };
                
-               if (editor->icon && register_theme_icon_as_stock(editor->key, editor->icon))
+               if (editor->icon)
                        {
                        entry.stock_id = editor->key;
                        }
@@ -1801,6 +1909,7 @@ void layout_actions_setup(LayoutWindow *lw)
        GError *error;
        gint i;
 
+       DEBUG_1("%s layout_actions_setup: start", get_exec_time());
        if (lw->ui_manager) return;
 
        lw->action_group = gtk_action_group_new("MenuActions");
@@ -1822,12 +1931,22 @@ void layout_actions_setup(LayoutWindow *lw)
        gtk_action_group_add_radio_actions(lw->action_group,
                                           menu_color_radio_entries, COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS,
                                           0, G_CALLBACK(layout_color_menu_input_cb), lw);
+       gtk_action_group_add_radio_actions(lw->action_group,
+                                          menu_histogram_channel, G_N_ELEMENTS(menu_histogram_channel),
+                                          0, G_CALLBACK(layout_menu_histogram_channel_cb), lw);
+       gtk_action_group_add_radio_actions(lw->action_group,
+                                          menu_histogram_mode, G_N_ELEMENTS(menu_histogram_mode),
+                                          0, G_CALLBACK(layout_menu_histogram_mode_cb), lw);
+       gtk_action_group_add_radio_actions(lw->action_group,
+                                          menu_stereo_mode_entries, G_N_ELEMENTS(menu_stereo_mode_entries),
+                                          0, G_CALLBACK(layout_menu_stereo_mode_cb), lw);
 
 
        lw->ui_manager = gtk_ui_manager_new();
        gtk_ui_manager_set_add_tearoffs(lw->ui_manager, TRUE);
        gtk_ui_manager_insert_action_group(lw->ui_manager, lw->action_group, 0);
 
+       DEBUG_1("%s layout_actions_setup: add menu", get_exec_time());
        error = NULL;
        if (!gtk_ui_manager_add_ui_from_string(lw->ui_manager, menu_ui_description, -1, &error))
                {
@@ -1836,43 +1955,91 @@ void layout_actions_setup(LayoutWindow *lw)
                exit(EXIT_FAILURE);
                }
        
+       DEBUG_1("%s layout_actions_setup: add toolbar", get_exec_time());
        for (i = 0; i < TOOLBAR_COUNT; i++)
                {
                layout_toolbar_clear(lw, i);
                layout_toolbar_add_default(lw, i);
                }
        
+
+       DEBUG_1("%s layout_actions_setup: marks", get_exec_time());
        layout_actions_setup_marks(lw);
+
+       DEBUG_1("%s layout_actions_setup: editors", get_exec_time());
        layout_actions_setup_editors(lw);
 
+       DEBUG_1("%s layout_actions_setup: status_update_write", get_exec_time());
        layout_util_status_update_write(lw);
        
+       DEBUG_1("%s layout_actions_setup: actions_add_window", get_exec_time());
        layout_actions_add_window(lw, lw->window);
+       DEBUG_1("%s layout_actions_setup: end", get_exec_time());
 }
 
-void layout_editors_reload_all(void)
-{
-       GList *work;
+static gint layout_editors_reload_idle_id = -1;
+static GList *layout_editors_desktop_files = NULL;
 
-       work = layout_window_list;
-       while (work)
+static gboolean layout_editors_reload_idle_cb(gpointer data)
+{
+       if (!layout_editors_desktop_files)
                {
-               LayoutWindow *lw = work->data;
-               work = work->next;
-
-               gtk_ui_manager_remove_ui(lw->ui_manager, lw->ui_editors_id);
-               gtk_ui_manager_remove_action_group(lw->ui_manager, lw->action_group_editors);
-               g_object_unref(lw->action_group_editors);
+               DEBUG_1("%s layout_editors_reload_idle_cb: get_desktop_files", get_exec_time());
+               layout_editors_desktop_files = editor_get_desktop_files();
+               return TRUE;
                }
        
-       editor_load_descriptions();
+       editor_read_desktop_file(layout_editors_desktop_files->data);
+       g_free(layout_editors_desktop_files->data);
+       layout_editors_desktop_files = g_list_delete_link(layout_editors_desktop_files, layout_editors_desktop_files);
        
-       work = layout_window_list;
-       while (work)
+       
+       if (!layout_editors_desktop_files)
                {
-               LayoutWindow *lw = work->data;
-               work = work->next;
-               layout_actions_setup_editors(lw);
+               GList *work;
+               DEBUG_1("%s layout_editors_reload_idle_cb: setup_editors", get_exec_time());
+               editor_table_finish();
+
+               work = layout_window_list;
+               while (work)
+                       {
+                       LayoutWindow *lw = work->data;
+                       work = work->next;
+                       layout_actions_setup_editors(lw);
+                       }
+
+               DEBUG_1("%s layout_editors_reload_idle_cb: setup_editors done", get_exec_time());
+               
+               layout_editors_reload_idle_id = -1;
+               return FALSE;
+               }
+       return TRUE;
+}
+
+void layout_editors_reload_start(void)
+{
+       DEBUG_1("%s layout_editors_reload_start", get_exec_time());
+
+       if (layout_editors_reload_idle_id != -1)
+               {
+               g_source_remove(layout_editors_reload_idle_id);
+               string_list_free(layout_editors_desktop_files);
+               }
+
+       editor_table_clear();
+       layout_editors_reload_idle_id = g_idle_add(layout_editors_reload_idle_cb, NULL);
+}
+       
+void layout_editors_reload_finish(void)
+{
+       if (layout_editors_reload_idle_id != -1)
+               {
+               DEBUG_1("%s layout_editors_reload_finish", get_exec_time());
+               g_source_remove(layout_editors_reload_idle_id);
+               while (layout_editors_reload_idle_id != -1)
+                       {
+                       layout_editors_reload_idle_cb(NULL);
+                       }
                }
 }
 
@@ -1919,7 +2086,7 @@ GtkWidget *layout_actions_toolbar(LayoutWindow *lw, ToolbarType type)
 
 void layout_toolbar_clear(LayoutWindow *lw, ToolbarType type)
 {
-       if (lw->toolbar_merge_id[type]) 
+       if (lw->toolbar_merge_id[type])
                {
                gtk_ui_manager_remove_ui(lw->ui_manager, lw->toolbar_merge_id[type]);
                gtk_ui_manager_ensure_update(lw->ui_manager);
@@ -1950,7 +2117,30 @@ void layout_toolbar_add(LayoutWindow *lw, ToolbarType type, const gchar *action)
                        break;
                }
        
-       gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id[type], path, action, action, GTK_UI_MANAGER_TOOLITEM, FALSE); 
+       
+       if (g_str_has_suffix(action, ".desktop"))
+               {
+               /* this may be called before the external editors are read
+                  create a dummy action for now */
+                 
+               if (!lw->action_group_editors)
+                       {
+                       lw->action_group_editors = gtk_action_group_new("MenuActionsExternal");
+                       gtk_ui_manager_insert_action_group(lw->ui_manager, lw->action_group_editors, 1);
+                       }
+               if (!gtk_action_group_get_action(lw->action_group_editors, action))
+                       {
+                       GtkActionEntry entry = { action,
+                                                GTK_STOCK_MISSING_IMAGE,
+                                                action,
+                                                NULL,
+                                                NULL,
+                                                NULL };
+                       DEBUG_1("Creating temporary action %s", action);
+                       gtk_action_group_add_actions(lw->action_group_editors, &entry, 1, lw);
+                       }
+               }
+       gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id[type], path, action, action, GTK_UI_MANAGER_TOOLITEM, FALSE);
        lw->toolbar_actions[type] = g_list_append(lw->toolbar_actions[type], g_strdup(action));
 }
 
@@ -2028,7 +2218,7 @@ void layout_toolbar_add_from_config(LayoutWindow *lw, ToolbarType type, const gc
                }
 
        layout_toolbar_add(lw, type, action);
-       g_free(action); 
+       g_free(action);
 }
 
 /*
@@ -2153,17 +2343,18 @@ void layout_util_sync_color(LayoutWindow *lw)
 static void layout_util_sync_views(LayoutWindow *lw)
 {
        GtkAction *action;
+       OsdShowFlags osd_flags = image_osd_get(lw->image);
 
        if (!lw->action_group) return;
 
        action = gtk_action_group_get_action(lw->action_group, "FolderTree");
-       radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->options.dir_view_type);
+       gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->options.dir_view_type);
 
        action = gtk_action_group_get_action(lw->action_group, "SplitSingle");
-       radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->split_mode);
+       gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->split_mode);
 
        action = gtk_action_group_get_action(lw->action_group, "ViewIcons");
-       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.file_view_type);
+       gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->options.file_view_type);
 
        action = gtk_action_group_get_action(lw->action_group, "FloatTools");
        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.tools_float);
@@ -2186,6 +2377,27 @@ static void layout_util_sync_views(LayoutWindow *lw)
        action = gtk_action_group_get_action(lw->action_group, "SlideShow");
        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), layout_image_slideshow_active(lw));
 
+       action = gtk_action_group_get_action(lw->action_group, "ImageOverlay");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags != OSD_SHOW_NOTHING);
+
+       action = gtk_action_group_get_action(lw->action_group, "ImageHistogram");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags & OSD_SHOW_HISTOGRAM);
+
+       if (osd_flags & OSD_SHOW_HISTOGRAM)
+               {
+               action = gtk_action_group_get_action(lw->action_group, "HistogramChanR");
+               gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), image_osd_histogram_get_channel(lw->image));
+
+               action = gtk_action_group_get_action(lw->action_group, "HistogramModeLin");
+               gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), image_osd_histogram_get_mode(lw->image));
+               }
+
+       action = gtk_action_group_get_action(lw->action_group, "ConnectZoomMenu");
+       gtk_action_set_sensitive(action, lw->split_mode != SPLIT_NONE);
+
+       action = gtk_action_group_get_action(lw->action_group, "StereoAuto");
+       gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), layout_image_stereo_pixbuf_get(lw));
+
        layout_util_sync_color(lw);
 }
 
@@ -2217,7 +2429,7 @@ void layout_util_sync(LayoutWindow *lw)
 
 static gboolean layout_bar_enabled(LayoutWindow *lw)
 {
-       return lw->bar && GTK_WIDGET_VISIBLE(lw->bar);
+       return lw->bar && gtk_widget_get_visible(lw->bar);
 }
 
 static void layout_bar_destroyed(GtkWidget *widget, gpointer data)
@@ -2225,7 +2437,7 @@ static void layout_bar_destroyed(GtkWidget *widget, gpointer data)
        LayoutWindow *lw = data;
 
        lw->bar = NULL;
-/* 
+/*
     do not call layout_util_sync_views(lw) here
     this is called either when whole layout is destroyed - no need for update
     or when the bar is replaced - sync is called by upper function at the end of whole operation
@@ -2270,7 +2482,7 @@ void layout_bar_set(LayoutWindow *lw, GtkWidget *bar)
 
 
 //     gtk_box_pack_start(GTK_BOX(lw->utility_box), lw->bar, FALSE, FALSE, 0);
-       gtk_paned_pack2(GTK_PANED(lw->utility_paned), lw->bar, FALSE, TRUE); 
+       gtk_paned_pack2(GTK_PANED(lw->utility_paned), lw->bar, FALSE, TRUE);
 
        bar_set_fd(lw->bar, layout_image_get_fd(lw));
 }
@@ -2310,7 +2522,7 @@ static void layout_bar_new_selection(LayoutWindow *lw, gint count)
 
 static gboolean layout_bar_sort_enabled(LayoutWindow *lw)
 {
-       return lw->bar_sort && GTK_WIDGET_VISIBLE(lw->bar_sort);
+       return lw->bar_sort && gtk_widget_get_visible(lw->bar_sort);
 }
 
 
@@ -2320,7 +2532,7 @@ static void layout_bar_sort_destroyed(GtkWidget *widget, gpointer data)
 
        lw->bar_sort = NULL;
 
-/* 
+/*
     do not call layout_util_sync_views(lw) here
     this is called either when whole layout is destroyed - no need for update
     or when the bar is replaced - sync is called by upper function at the end of whole operation
@@ -2403,7 +2615,7 @@ GtkWidget *layout_bars_prepare(LayoutWindow *lw, GtkWidget *image)
        lw->utility_paned = gtk_hpaned_new();
        gtk_box_pack_start(GTK_BOX(lw->utility_box), lw->utility_paned, TRUE, TRUE, 0);
 
-       gtk_paned_pack1(GTK_PANED(lw->utility_paned), image, TRUE, FALSE); 
+       gtk_paned_pack1(GTK_PANED(lw->utility_paned), image, TRUE, FALSE);
        gtk_widget_show(lw->utility_paned);
        
        gtk_widget_show(image);
@@ -2426,7 +2638,7 @@ static void layout_exif_window_destroy(GtkWidget *widget, gpointer data)
 
 void layout_exif_window_new(LayoutWindow *lw)
 {
-       if (lw->exif_window) return; 
+       if (lw->exif_window) return;
        
        lw->exif_window = advanced_exif_new();
        if (!lw->exif_window) return;