diff src/menu.c @ 9:d907d608745f

Sync to GQview 1.5.9 release. ######## DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS! This CVS is never up to date with current development and is provided solely for reference purposes, please use the latest official release package when making any changes or translation updates. ########
author gqview
date Sat, 26 Feb 2005 00:13:35 +0000
parents c0e337a01cb7
children a4c1b7014e6e
line wrap: on
line diff
--- a/src/menu.c	Sat Feb 26 00:07:07 2005 +0000
+++ b/src/menu.c	Sat Feb 26 00:13:35 2005 +0000
@@ -1,370 +1,71 @@
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
-#include "gqview.h"
-
-#include "icons/icon_thumb.xpm"
-#include "icons/icon_home.xpm"
-#include "icons/icon_reload.xpm"
-#include "icons/icon_zoom_in.xpm"
-#include "icons/icon_zoom_out.xpm"
-#include "icons/icon_zoom_fit.xpm"
-#include "icons/icon_zoom_norm.xpm"
-#include "icons/icon_config.xpm"
-#include "icons/icon_float.xpm"
-
 
-static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group,
-				guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data);
-
-static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp);
-
-static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data,
-			      GtkTooltips *tooltips, gchar *tip_text,
-			      GtkSignalFunc func, gpointer data);
+#include "gqview.h"
+#include "menu.h"
 
-static void set_thumbnails(gint mode)
-{
-	if (thumbnails_enabled == mode) return;
-	thumbnails_enabled = mode;
-	gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(thumb_menu_item), thumbnails_enabled);
-	gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thumb_button), thumbnails_enabled);
-	filelist_populate_clist();
-}
+#include "cache_maint.h"
+#include "collect.h"
+#include "collect-dlg.h"
+#include "dupe.h"
+#include "filelist.h"
+#include "img-view.h"
+#include "preferences.h"
+#include "slideshow.h"
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_tabcomp.h"
+#include "ui_menu.h"
+
+static GtkWidget *real_submenu_add_alter(GtkWidget *menu, GCallback func, gpointer data,
+					 GtkAccelGroup *accel_group);
 
 /*
  *-----------------------------------------------------------------------------
- * menu and button callbacks (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void exit_cb(GtkWidget *widget, gpointer data)
-{
-	exit_gqview();
-}
-
-static void about_cb(GtkWidget *widget, gpointer data)
-{
-	show_about_window();
-}
-
-static void create_dir_cb(GtkWidget *widget, gpointer data)
-{
-	file_util_create_dir(current_path);
-}
-
-static void zoom_in_cb(GtkWidget *widget, gpointer data)
-{
-	image_adjust_zoom(1);
-}
-
-static void zoom_out_cb(GtkWidget *widget, gpointer data)
-{
-	image_adjust_zoom(-1);
-}
-
-static void zoom_1_1_cb(GtkWidget *widget, gpointer data)
-{
-	image_set_zoom(1);
-}
-
-static void zoom_fit_cb(GtkWidget *widget, gpointer data)
-{
-	image_set_zoom(0);
-}
-
-static void thumb_menu_cb(GtkWidget *widget, gpointer data)
-{
-	set_thumbnails(GTK_CHECK_MENU_ITEM(widget)->active);
-}
-
-static void thumb_button_cb(GtkWidget *widget, gpointer data)
-{
-	set_thumbnails(GTK_TOGGLE_BUTTON(widget)->active);
-}
-
-static void refresh_cb(GtkWidget *widget, gpointer data)
-{
-	gchar *buf = g_strdup(current_path);
-	filelist_change_to(buf);
-	g_free(buf);
-}
-
-static void float_cb(GtkWidget *widget, gpointer data)
-{
-	toolwindow_float();
-}
-
-static void hide_cb(GtkWidget *widget, gpointer data)
-{
-	toolwindow_hide();
-}
-
-static void slideshow_cb(GtkWidget *widget, gpointer data)
-{
-	slideshow_toggle();
-}
-
-static void home_dir_cb(GtkWidget *widget, gpointer data)
-{
-	gchar *path = homedir();
-	if (path) filelist_change_to(path);
-}
-
-static void config_cb(GtkWidget *widget, gpointer data)
-{
-	show_config_window();
-}
-
-static void remove_thumb_cb(GtkWidget *widget, gpointer data)
-{
-	maintain_thumbnail_dir("/", TRUE);
-}
-
-static void full_screen_cb(GtkWidget *widget, gpointer data)
-{
-	full_screen_toggle();
-}
-
-static void wallpaper_image_cb(GtkWidget *widget, gpointer data)
-{
-	image_to_root();
-}
-
-/*
- *-----------------------------------------------------------------------------
- * image menu callbacks (private)
+ * menu utils
  *-----------------------------------------------------------------------------
  */ 
 
-static void copy_image_cb(GtkWidget *widget, gpointer data)
-{
-	full_screen_stop();
-	file_util_copy(image_get_path(), NULL, current_path);
-}
-
-static void move_image_cb(GtkWidget *widget, gpointer data)
-{
-	full_screen_stop();
-	file_util_move(image_get_path(), NULL, current_path);
-}
-
-static void rename_image_cb(GtkWidget *widget, gpointer data)
-{
-	full_screen_stop();
-	file_util_rename(image_get_path(), NULL);
-}
-
-static void delete_image_cb(GtkWidget *widget, gpointer data)
-{
-	full_screen_stop();
-	file_util_delete(image_get_path(), NULL);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * file menu callbacks (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void copy_file_cb(GtkWidget *widget, gpointer data)
-{
-	file_util_copy(NULL, file_get_selected_list(), current_path);
-}
-
-static void move_file_cb(GtkWidget *widget, gpointer data)
-{
-	file_util_move(NULL, file_get_selected_list(), current_path);
-}
-
-static void rename_file_cb(GtkWidget *widget, gpointer data)
-{
-	file_util_rename(NULL, file_get_selected_list());
-}
-
-static void delete_file_cb(GtkWidget *widget, gpointer data)
-{
-	file_util_delete(NULL, file_get_selected_list());
-}
-
-/*
- *-----------------------------------------------------------------------------
- * filelist popup menu callbacks (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void popup_copy_file_cb(GtkWidget *widget, gpointer data)
-{
-	if (file_clicked_is_selected())
-		{
-		file_util_copy(NULL, file_get_selected_list(), current_path);
-		}
-	else
-		{
-		gchar *path = file_clicked_get_path();
-		file_util_copy(path, NULL, current_path);
-		g_free(path);
-		}
-}
-
-static void popup_move_file_cb(GtkWidget *widget, gpointer data)
-{
-	if (file_clicked_is_selected())
-		{
-		file_util_move(NULL, file_get_selected_list(), current_path);
-		}
-	else
-		{
-		gchar *path = file_clicked_get_path();
-		file_util_move(path, NULL, current_path);
-		g_free(path);
-		}
-}
-
-static void popup_rename_file_cb(GtkWidget *widget, gpointer data)
-{
-	if (file_clicked_is_selected())
-		{
-		file_util_rename(NULL, file_get_selected_list());
-		}
-	else
-		{
-		gchar *path = file_clicked_get_path();
-		file_util_rename(path, NULL);
-		g_free(path);
-		}
-}
-
-static void popup_delete_file_cb(GtkWidget *widget, gpointer data)
-{
-	if (file_clicked_is_selected())
-		{
-		file_util_delete(NULL, file_get_selected_list());
-		}
-	else
-		{
-		gchar *path = file_clicked_get_path();
-		file_util_delete(path, NULL);
-		g_free(path);
-		}
-}
-
-static void edit_image_cb(GtkWidget *widget, gpointer data)
-{
-	gint n = GPOINTER_TO_INT(data);
-	start_editor_from_image(n);
-}
-
-static void edit_list_cb(GtkWidget *widget, gpointer data)
-{
-	gint n = GPOINTER_TO_INT(data);
-	start_editor_from_list(n);
-}
-
-static void edit_full_cb(GtkWidget *widget, gpointer data)
-{
-	gint n = GPOINTER_TO_INT(data);
-	full_screen_stop();
-	start_editor_from_image(n);
-}
-
-static void edit_view_cb(GtkWidget *widget, gpointer data)
-{
-	gint n = GPOINTER_TO_INT(data);
-	view_window_active_edit(n);
-}
-
-static void wallpaper_view_cb(GtkWidget *widget, gpointer data)
-{
-	gint n = GPOINTER_TO_INT(data);
-	view_window_active_to_root(n);
-}
-
-static void popup_edit_list_cb(GtkWidget *widget, gpointer data)
-{
-	gint n = GPOINTER_TO_INT(data);
-
-	if (file_clicked_is_selected())
-		{
-		start_editor_from_list(n);
-		}
-	else
-		{
-		gchar *path;
-		start_editor_from_file(n, path);
-		g_free(path);
-		}
-}
-
-static void new_window_file_cb(GtkWidget *widget, gpointer data)
-{
-	gchar *path = file_clicked_get_path();
-	view_window_new(path);
-	g_free(path);
-}
-
-static void new_window_image_cb(GtkWidget *widget, gpointer data)
-{
-	view_window_new(image_get_path());
-}
-
-static void menu_file_popup_hide_cb(GtkWidget *widget, gpointer data)
-{
-	file_clist_highlight_unset();
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- * menu addition utilities (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group,
-				guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data)
+static GtkWidget *add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group,
+				guint accel_key, guint accel_mods, GCallback func, gpointer data)
 {
 	GtkWidget *item;
 
 	item = gtk_menu_item_new_with_label(label);
 	gtk_widget_add_accelerator (item, "activate", accel_group, accel_key, accel_mods, GTK_ACCEL_VISIBLE);
-	gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data);
-	gtk_menu_append(GTK_MENU(menu), item);
+	g_signal_connect(G_OBJECT(item), "activate", func, data);
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
 	gtk_widget_show(item);
+
+	return item;
 }
 
-void add_menu_popup_item(GtkWidget *menu, gchar *label,
-			 GtkSignalFunc func, gpointer data)
+gpointer submenu_item_get_data(GtkWidget *menu)
 {
-	GtkWidget *item;
+	if (!menu->parent || !GTK_IS_MENU(menu->parent)) return NULL;
 
-	item = gtk_menu_item_new_with_label(label);
-	gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data);
-	gtk_menu_append(GTK_MENU(menu), item);
-	gtk_widget_show(item);
-}
-
-void add_menu_divider(GtkWidget *menu)
-{
-	GtkWidget *item = gtk_menu_item_new();
-        gtk_menu_append(GTK_MENU(menu),item);
-        gtk_widget_show(item);
+	return g_object_get_data(G_OBJECT(menu->parent), "submenu_data");
 }
 
 /*
  *-----------------------------------------------------------------------------
- * edit menu routines
+ * edit menu
  *-----------------------------------------------------------------------------
  */ 
 
-static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp)
+static void add_edit_items(GtkWidget *menu, GCallback func, GtkAccelGroup *accel_grp)
 {
 	gint i;
-	for (i = 0; i < 8; i++)
+	for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
 		{
 		if (editor_command[i] && strlen(editor_command[i]) > 0)
 			{
@@ -376,313 +77,185 @@
 			if (accel_grp)
 				add_menu_item(menu, text, accel_grp, i + 49, GDK_CONTROL_MASK, func, GINT_TO_POINTER(i));
 			else
-				add_menu_popup_item(menu, text, func, GINT_TO_POINTER(i));
+				menu_item_add_simple(menu, text, func, GINT_TO_POINTER(i));
 			g_free(text);
 			}
 		}
 }
 
-void update_edit_menus(GtkAccelGroup *accel_grp)
+GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GCallback func, gpointer data)
 {
-	GtkWidget *menu;
-
-	/* main edit menu */
-
-	menu = gtk_menu_new();
-	add_edit_items(menu, edit_list_cb, accel_grp);
-	add_menu_divider(menu);
-	add_menu_item(menu, _("Options..."), accel_grp, 'O', GDK_CONTROL_MASK, config_cb, NULL);
-	add_menu_divider(menu);
-	add_menu_item(menu, _("Remove old thumbnails"), accel_grp, 'T', GDK_CONTROL_MASK, remove_thumb_cb, NULL);
-	add_menu_divider(menu);
-	add_menu_item(menu, _("Set as wallpaper"), accel_grp, 'W', GDK_CONTROL_MASK, wallpaper_image_cb, NULL);
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu);
-
-	/* file edit popup */
-	menu = gtk_menu_new();
-	add_edit_items(menu, popup_edit_list_cb, NULL);
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_filelist_edit), menu);
-
-	/* image edit popup */
-	menu = gtk_menu_new();
-	add_edit_items(menu, edit_image_cb, NULL);
-	add_menu_divider(menu);
-	add_menu_popup_item(menu, _("Set as wallpaper"), wallpaper_image_cb, NULL);
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_image_edit), menu);
-
-	/* full screen edit popup */
-	menu = gtk_menu_new();
-	add_edit_items(menu, edit_full_cb, NULL);
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_full_edit), menu);
+	GtkWidget *item;
+	GtkWidget *submenu;
 
-	/* view edit popup */
-	menu = gtk_menu_new();
-	add_edit_items(menu, edit_view_cb, NULL);
-	add_menu_divider(menu);
-	add_menu_popup_item(menu, _("Set as wallpaper"), wallpaper_view_cb, NULL);
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_view_edit), menu);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * menu bar setup routines
- *-----------------------------------------------------------------------------
- */ 
-
-GtkWidget *create_menu_bar(GtkAccelGroup *accel_grp)
-{
-	GtkWidget *bar;
-	GtkWidget *menu;
-
-	bar = gtk_menu_bar_new();
-
-	/* file menu */
-	menu_file = gtk_menu_item_new_with_label(_("File"));
-	gtk_widget_show(menu_file);
-
-	menu = gtk_menu_new();
-	add_menu_item(menu, _("Create Dir..."), accel_grp, 'N', GDK_CONTROL_MASK, create_dir_cb, NULL);
-	add_menu_divider(menu);
-	add_menu_item(menu, _("Copy..."), accel_grp, 'C', GDK_CONTROL_MASK, copy_file_cb, NULL);
-	add_menu_item(menu, _("Move..."), accel_grp, 'M', GDK_CONTROL_MASK, move_file_cb, NULL);
-	add_menu_item(menu, _("Rename..."), accel_grp, 'R', GDK_CONTROL_MASK, rename_file_cb, NULL);
-	add_menu_item(menu, _("Delete..."), accel_grp, 'D', GDK_CONTROL_MASK, delete_file_cb, NULL);
-	add_menu_divider(menu);
-	add_menu_item(menu, _("Exit"), accel_grp, 'Q', GDK_CONTROL_MASK, exit_cb, NULL);
-
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_file),menu);
-	gtk_menu_bar_append(GTK_MENU_BAR(bar),menu_file);
+	item = menu_item_add(menu, _("_Edit"), NULL, NULL);
 
-	/* edit menu */
-	menu_edit = gtk_menu_item_new_with_label(_("Edit"));
-	gtk_widget_show(menu_edit);
-
-	menu = gtk_menu_new();
-
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu);
-	gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_edit);
-
-	/* view menu */
-	menu_view = gtk_menu_item_new_with_label(_("View"));
-	gtk_widget_show(menu_view);
-
-	menu = gtk_menu_new();
-	add_menu_item(menu, _("Zoom in"), accel_grp, '=', FALSE, zoom_in_cb, NULL);
-	add_menu_item(menu, _("Zoom out"), accel_grp, '-', FALSE, zoom_out_cb, NULL);
-	add_menu_item(menu, _("Zoom 1:1"), accel_grp, 'Z', FALSE, zoom_1_1_cb, NULL);
-	add_menu_item(menu, _("Fit image to window"), accel_grp, 'X', FALSE, zoom_fit_cb, NULL);
-	add_menu_divider(menu);
-
-	add_menu_item(menu, _("Full screen"), accel_grp, 'V', FALSE, full_screen_cb, NULL);
-	thumb_menu_item = gtk_check_menu_item_new_with_label(_("Thumbnails"));
-	gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(thumb_menu_item), thumbnails_enabled);
-	gtk_widget_add_accelerator (thumb_menu_item, "activate", accel_grp, 'T', FALSE, GTK_ACCEL_VISIBLE);
-	gtk_signal_connect (GTK_OBJECT (thumb_menu_item), "activate",(GtkSignalFunc) thumb_menu_cb, thumb_menu_item);
-	gtk_menu_append(GTK_MENU(menu), thumb_menu_item);
-	gtk_widget_show(thumb_menu_item);
-
-	add_menu_divider(menu);
-	add_menu_item(menu, _("Refresh Lists"), accel_grp, 'R', FALSE, refresh_cb, NULL);
-	add_menu_item(menu, _("(Un)Float file list"), accel_grp, 'F', FALSE, float_cb, NULL);
-	add_menu_item(menu, _("(Un)Hide file list"), accel_grp, 'H', FALSE, hide_cb, NULL);
-
-	add_menu_divider(menu);
-	add_menu_item(menu, _("Toggle slideshow"), accel_grp, 'S', FALSE, slideshow_cb, NULL);
+	submenu = gtk_menu_new();
+	g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
+	add_edit_items(submenu, func, NULL);
 
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_view), menu);
-	gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_view);
-
-	/* help menu */
-	menu_help = gtk_menu_item_new_with_label(_("Help"));
-	gtk_widget_show(menu_help);
-
-	menu = gtk_menu_new();
-	add_menu_item(menu, _("About"), accel_grp, 'A', GDK_CONTROL_MASK, about_cb, NULL);
-
-	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_help), menu);
-	gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_help);
-
-	return bar;
-}
+	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
 
-/*
- *-----------------------------------------------------------------------------
- * menu file list routines (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void create_menu_file_list_popup()
-{
-	menu_file_popup = gtk_menu_new();
-	gtk_signal_connect(GTK_OBJECT(menu_file_popup), "hide", (GtkSignalFunc) menu_file_popup_hide_cb, NULL);
+	if (menu_item) *menu_item = item;
 
-	menu_filelist_edit = gtk_menu_item_new_with_label(_("Edit"));
-	gtk_menu_append(GTK_MENU(menu_file_popup), menu_filelist_edit);
-	gtk_widget_show(menu_filelist_edit);
-
-	add_menu_popup_item(menu_file_popup, _("View in new window"), new_window_file_cb, NULL);
-
-	add_menu_divider(menu_file_popup);
-	add_menu_popup_item(menu_file_popup, _("Copy..."), popup_copy_file_cb, NULL);
-	add_menu_popup_item(menu_file_popup, _("Move..."), popup_move_file_cb, NULL);
-	add_menu_popup_item(menu_file_popup, _("Rename..."), popup_rename_file_cb, NULL);
-	add_menu_popup_item(menu_file_popup, _("Delete..."), popup_delete_file_cb, NULL);
-	add_menu_divider(menu_file_popup);
-	add_menu_popup_item(menu_file_popup, _("Refresh"), refresh_cb, NULL);
+	return submenu;
 }
 
 /*
  *-----------------------------------------------------------------------------
- * menu image routines (private)
+ * sorting
  *-----------------------------------------------------------------------------
- */ 
+ */
 
-static void create_menu_image_popup()
+gchar *sort_type_get_text(SortType method)
 {
-	menu_image_popup = gtk_menu_new();
+	switch (method)
+		{
+		case SORT_SIZE:
+			return _("Sort by size");
+			break;
+		case SORT_TIME:
+			return _("Sort by date");
+			break;
+		case SORT_NONE:
+			return _("Unsorted");
+			break;
+		case SORT_PATH:
+			return _("Sort by path");
+			break;
+		case SORT_NUMBER:
+			return _("Sort by number");
+			break;
+		case SORT_NAME:
+		default:
+			return _("Sort by name");
+			break;
+		}
 
-	add_menu_popup_item(menu_image_popup, _("Zoom in"), zoom_in_cb, NULL);
-	add_menu_popup_item(menu_image_popup, _("Zoom out"), zoom_out_cb, NULL);
-	add_menu_popup_item(menu_image_popup, _("Zoom 1:1"), zoom_1_1_cb, NULL);
-	add_menu_popup_item(menu_image_popup, _("Fit image to window"), zoom_fit_cb, NULL);
-	add_menu_divider(menu_image_popup);
+	return "";
+}
 
-	menu_image_edit = gtk_menu_item_new_with_label(_("Edit"));
-	gtk_menu_append(GTK_MENU(menu_image_popup), menu_image_edit);
-	gtk_widget_show(menu_image_edit);
+static void submenu_add_sort_item(GtkWidget *menu, GCallback func, SortType type,
+				  gint show_current, SortType show_type)
+{
+	if (show_current)
+		{
+		menu_item_add_check(menu, sort_type_get_text(type), (type == show_type),
+				    func, GINT_TO_POINTER((gint)type));
+		}
+	else
+		{
+		menu_item_add(menu, sort_type_get_text(type),
+			      func, GINT_TO_POINTER((gint)type));
+		}
+}
 
-	add_menu_popup_item(menu_image_popup, _("View in new window"), new_window_image_cb, NULL);
+GtkWidget *submenu_add_sort(GtkWidget *menu, GCallback func, gpointer data,
+			    gint include_none, gint include_path,
+			    gint show_current, SortType type)
+{
+	GtkWidget *submenu;
 
-	add_menu_divider(menu_image_popup);
-	add_menu_popup_item(menu_image_popup, _("Copy..."), copy_image_cb, NULL);
-	add_menu_popup_item(menu_image_popup, _("Move..."), move_image_cb, NULL);
-	add_menu_popup_item(menu_image_popup, _("Rename..."), rename_image_cb, NULL);
-	add_menu_popup_item(menu_image_popup, _("Delete..."), delete_image_cb, NULL);
-	add_menu_divider(menu_image_popup);
-	add_menu_popup_item(menu_image_popup, _("(Un)Hide file list"), hide_cb, NULL);
-	add_menu_popup_item(menu_image_popup, _("Full screen"), full_screen_cb, NULL);
+	submenu = gtk_menu_new();
+	g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
+
+	submenu_add_sort_item(submenu, func, SORT_NAME, show_current, type);
+#ifdef HAVE_STRVERSCMP
+	submenu_add_sort_item(submenu, func, SORT_NUMBER, show_current, type);
+#endif
+	submenu_add_sort_item(submenu, func, SORT_TIME, show_current, type);
+	submenu_add_sort_item(submenu, func, SORT_SIZE, show_current, type);
+	if (include_path) submenu_add_sort_item(submenu, func, SORT_PATH, show_current, type);
+	if (include_none) submenu_add_sort_item(submenu, func, SORT_NONE, show_current, type);
+
+	if (menu)
+		{
+		GtkWidget *item;
+
+		item = menu_item_add(menu, _("Sort"), NULL, NULL);
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+		return item;
+		}
+
+	return submenu;
 }
 
 /*
  *-----------------------------------------------------------------------------
- * menu full screen routines (private)
+ * altering
  *-----------------------------------------------------------------------------
- */ 
+ */
 
-/* this re-grabs the keyboard when the menu closes, needed for override redirect */
-static void menu_full_popup_hide_cb(GtkWidget *widget, gpointer data)
+gchar *alter_type_get_text(AlterType type)
 {
-	if (full_screen_window)
+	switch (type)
 		{
-		gdk_keyboard_grab(full_screen_window->window, TRUE, GDK_CURRENT_TIME);
+		case ALTER_ROTATE_90:
+			return _("_Rotate clockwise");
+			break;
+		case ALTER_ROTATE_90_CC:
+			return _("Rotate _counterclockwise");
+			break;
+		case ALTER_ROTATE_180:
+			return _("Rotate _180");
+			break;
+		case ALTER_MIRROR:
+			return _("_Mirror");
+			break;
+		case ALTER_FLIP:
+			return _("_Flip");
+			break;
+		default:
+			break;
+		}
+
+	return "";
+}
+
+static void submenu_add_alter_item(GtkWidget *menu, GCallback func, AlterType type,
+				   GtkAccelGroup *accel_group, guint accel_key, guint accel_mods)
+{
+	if (accel_group)
+		{
+		add_menu_item(menu, alter_type_get_text(type), accel_group,
+			      accel_key, accel_mods, func, GINT_TO_POINTER((gint)type));
+		
+		}
+	else
+		{
+		menu_item_add(menu, alter_type_get_text(type), func, GINT_TO_POINTER((gint)type));
 		}
 }
 
-static void create_menu_full_screen_popup()
+static GtkWidget *real_submenu_add_alter(GtkWidget *menu, GCallback func, gpointer data,
+					 GtkAccelGroup *accel_group)
 {
-	menu_window_full = gtk_menu_new();
-	add_menu_popup_item(menu_window_full, _("Zoom in"), zoom_in_cb, NULL);
-	add_menu_popup_item(menu_window_full, _("Zoom out"), zoom_out_cb, NULL);
-	add_menu_popup_item(menu_window_full, _("Zoom 1:1"), zoom_1_1_cb, NULL);
-	add_menu_popup_item(menu_window_full, _("Fit image to window"), zoom_fit_cb, NULL);
-	add_menu_divider(menu_window_full);
+	GtkWidget *submenu;
 
-	menu_window_full_edit = gtk_menu_item_new_with_label(_("Edit"));
-	gtk_menu_append(GTK_MENU(menu_window_full), menu_window_full_edit);
-	gtk_widget_show(menu_window_full_edit);
+	submenu = gtk_menu_new();
+	g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
 
-	add_menu_divider(menu_window_full);
-	add_menu_popup_item(menu_window_full, _("Copy..."), copy_image_cb, NULL);
-	add_menu_popup_item(menu_window_full, _("Move..."), move_image_cb, NULL);
-	add_menu_popup_item(menu_window_full, _("Rename..."), rename_image_cb, NULL);
-	add_menu_popup_item(menu_window_full, _("Delete..."), delete_image_cb, NULL);
-
-	add_menu_divider(menu_window_full);
-	add_menu_popup_item(menu_window_full, _("Exit full screen"), full_screen_cb, NULL);
+	submenu_add_alter_item(submenu, func, ALTER_ROTATE_90, accel_group, ']', 0);
+	submenu_add_alter_item(submenu, func, ALTER_ROTATE_90_CC, accel_group, '[', 0);
+	submenu_add_alter_item(submenu, func, ALTER_ROTATE_180, accel_group, 'R', GDK_SHIFT_MASK);
+	submenu_add_alter_item(submenu, func, ALTER_MIRROR, accel_group, 'M', GDK_SHIFT_MASK);
+	submenu_add_alter_item(submenu, func, ALTER_FLIP, accel_group, 'F', GDK_SHIFT_MASK);
 
-	gtk_signal_connect(GTK_OBJECT(menu_window_full), "hide", (GtkSignalFunc) menu_full_popup_hide_cb, NULL);
-}
+	if (menu)
+		{
+		GtkWidget *item;
 
-void create_menu_popups()
-{
-	create_menu_file_list_popup();
-	create_menu_image_popup();
-	create_menu_full_screen_popup();
-	create_menu_view_popup();
+		item = menu_item_add(menu, _("_Adjust"), NULL, NULL);
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+		return item;
+		}
+
+	return submenu;
 }
 
-/*
- *-----------------------------------------------------------------------------
- * toolbar routines
- *-----------------------------------------------------------------------------
- */ 
-
-static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data,
-			      GtkTooltips *tooltips, gchar *tip_text,
-			      GtkSignalFunc func, gpointer data)
+GtkWidget *submenu_add_alter(GtkWidget *menu, GCallback func, gpointer data)
 {
-	GtkWidget *button;
-	GtkStyle *style;
-	GtkWidget *pixmapwid;
-	GdkPixmap *pixmap;
-	GdkBitmap *mask;
-
-	style = gtk_widget_get_style(mainwindow);
-
-	button = gtk_button_new ();
-	gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) func, thumb_button);
-	gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
-	gtk_widget_show (button);
-	gtk_tooltips_set_tip (tooltips, button, tip_text, NULL);
-
-	pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window,  &mask,
-                 &style->bg[GTK_STATE_NORMAL], (gchar **)pixmap_data);
-	pixmapwid = gtk_pixmap_new(pixmap, mask);
-	gtk_widget_show(pixmapwid);
-	gtk_container_add(GTK_CONTAINER(button), pixmapwid);
+	return real_submenu_add_alter(menu, func, data, NULL);
 }
 
-GtkWidget *create_button_bar(GtkTooltips *tooltips)
-{
-	GtkWidget *hbox;
-	GtkStyle *style;
-	GtkWidget *pixmapwid;
-	GdkPixmap *pixmap;
-	GdkBitmap *mask;
 
-	style = gtk_widget_get_style(mainwindow);
-	hbox = gtk_hbox_new(FALSE, 0);
-
-	thumb_button = gtk_toggle_button_new ();
-	gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thumb_button), thumbnails_enabled);
-	gtk_signal_connect (GTK_OBJECT (thumb_button), "clicked",(GtkSignalFunc) thumb_button_cb, thumb_button);
-	gtk_box_pack_start (GTK_BOX (hbox), thumb_button, FALSE, FALSE, 0);
-	gtk_widget_show (thumb_button);
-	gtk_tooltips_set_tip (tooltips, thumb_button, _("Create thumbnails"), NULL);
-
-	pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window,  &mask,
-                 &style->bg[GTK_STATE_NORMAL], (gchar **)icon_thumb_xpm );
-	pixmapwid = gtk_pixmap_new(pixmap, mask);
-	gtk_widget_show(pixmapwid);
-	gtk_container_add(GTK_CONTAINER(thumb_button), pixmapwid);
-
-	add_button_to_bar(hbox, (gchar **)icon_home_xpm,
-			 tooltips, _("Change to home directory"), home_dir_cb, NULL);
-	add_button_to_bar(hbox, (gchar **)icon_reload_xpm,
-			 tooltips, _("Refresh file list"), refresh_cb, NULL);
-	add_button_to_bar(hbox, (gchar **)icon_zoom_in_xpm,
-			 tooltips, _("Zoom in"), zoom_in_cb, NULL);
-	add_button_to_bar(hbox, (gchar **)icon_zoom_out_xpm,
-			 tooltips, _("Zoom out"), zoom_out_cb, NULL);
-	add_button_to_bar(hbox, (gchar **)icon_zoom_fit_xpm,
-			 tooltips, _("Fit image to window"), zoom_fit_cb, NULL);
-	add_button_to_bar(hbox, (gchar **)icon_zoom_norm_xpm,
-			 tooltips, _("Set zoom 1:1"), zoom_1_1_cb, NULL);
-	add_button_to_bar(hbox, (gchar **)icon_config_xpm,
-			 tooltips, _("Configure options"), config_cb, NULL);
-	add_button_to_bar(hbox, (gchar **)icon_float_xpm,
-			 tooltips, _("Float Controls"), float_cb, NULL);
-
-	return hbox;
-}
-