diff options
author | Alexander Larsson <alexl@redhat.com> | 2004-11-16 19:09:00 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2004-11-16 19:09:00 +0000 |
commit | b3d0666b403d31bc2fae5b12324c277f5c8730dc (patch) | |
tree | eb71b219949ed3cbddb37d8451ba37e53876a04d | |
parent | 473eeb2523579bb7b6c281cad06033cbaac0f2c5 (diff) | |
download | nautilus-b3d0666b403d31bc2fae5b12324c277f5c8730dc.tar.gz |
Remove bonoboui dependencies
2004-11-16 Alexander Larsson <alexl@redhat.com>
* configure.in:
Remove bonoboui dependencies
* libnautilus-private/Makefile.am:
* libnautilus-private/nautilus-bonobo-extensions.[ch]:
* libnautilus-private/nautilus-bonobo-ui.h:
Remove unneeded files
* libnautilus-private/nautilus-clipboard.c:
Comment out for now.
* libnautilus-private/nautilus-directory-metafile-monitor.c:
* libnautilus-private/nautilus-metafile.c:
* src/nautilus-application.c:
* src/nautilus-history-sidebar.c:
* src/nautilus-information-panel.c:
* src/nautilus-main.c: (main):
* src/nautilus-notes-viewer.c:
* src/nautilus-sidebar-title.c:
* src/file-manager/fm-properties-window.c:
Remove bonobo includes
* libnautilus-private/nautilus-file-utilities.[ch]:
(nautilus_get_ui_directory), (nautilus_ui_file):
Util functions for ui files.
* libnautilus-private/nautilus-view.[ch]:
* libnautilus-private/nautilus-window-info.[ch]:
Remove bonoboui methods
* src/Makefile.am:
Add new files, remove some old ones
Move ui files to datadir/nautilus/ui
* src/nautilus-actions.h:
New file with action names
* src/nautilus-arrow-toolbutton.[ch]:
New widget for back/forward buttons.
* src/nautilus-desktop-window.c:
* src/nautilus-navigation-window-menus.c:
* src/nautilus-navigation-window-ui.xml:
* src/nautilus-navigation-window.[ch]:
* src/nautilus-shell-ui.xml:
* src/nautilus-spatial-window-ui.xml:
* src/nautilus-spatial-window.c:
* src/nautilus-window-manage-views.[ch]:
* src/nautilus-window-menus.c:
* src/nautilus-window-private.h:
* src/nautilus-window-toolbars.c:
* src/nautilus-window.[ch]:
Initial port to GtkUIManager
* src/nautilus-profiler.[ch]:
Remove
* src/file-manager/Makefile.am:
* src/file-manager/fm-actions.h:
New file with action names
* src/file-manager/fm-desktop-icon-view.c:
* src/file-manager/fm-directory-view.[ch]:
* src/file-manager/fm-icon-view.c:
* src/file-manager/fm-list-view.c:
* src/file-manager/nautilus-desktop-icon-view-ui.xml:
* src/file-manager/nautilus-directory-view-ui.xml:
* src/file-manager/nautilus-icon-view-ui.xml:
* src/file-manager/nautilus-list-view-ui.xml:
Initial port of views to GtkUIManager
54 files changed, 3593 insertions, 4809 deletions
@@ -1,3 +1,76 @@ +2004-11-16 Alexander Larsson <alexl@redhat.com> + + * configure.in: + Remove bonoboui dependencies + + * libnautilus-private/Makefile.am: + * libnautilus-private/nautilus-bonobo-extensions.[ch]: + * libnautilus-private/nautilus-bonobo-ui.h: + Remove unneeded files + + * libnautilus-private/nautilus-clipboard.c: + Comment out for now. + + * libnautilus-private/nautilus-directory-metafile-monitor.c: + * libnautilus-private/nautilus-metafile.c: + * src/nautilus-application.c: + * src/nautilus-history-sidebar.c: + * src/nautilus-information-panel.c: + * src/nautilus-main.c: (main): + * src/nautilus-notes-viewer.c: + * src/nautilus-sidebar-title.c: + * src/file-manager/fm-properties-window.c: + Remove bonobo includes + + * libnautilus-private/nautilus-file-utilities.[ch]: + (nautilus_get_ui_directory), (nautilus_ui_file): + Util functions for ui files. + + * libnautilus-private/nautilus-view.[ch]: + * libnautilus-private/nautilus-window-info.[ch]: + Remove bonoboui methods + + * src/Makefile.am: + Add new files, remove some old ones + Move ui files to datadir/nautilus/ui + + * src/nautilus-actions.h: + New file with action names + + * src/nautilus-arrow-toolbutton.[ch]: + New widget for back/forward buttons. + + * src/nautilus-desktop-window.c: + * src/nautilus-navigation-window-menus.c: + * src/nautilus-navigation-window-ui.xml: + * src/nautilus-navigation-window.[ch]: + * src/nautilus-shell-ui.xml: + * src/nautilus-spatial-window-ui.xml: + * src/nautilus-spatial-window.c: + * src/nautilus-window-manage-views.[ch]: + * src/nautilus-window-menus.c: + * src/nautilus-window-private.h: + * src/nautilus-window-toolbars.c: + * src/nautilus-window.[ch]: + Initial port to GtkUIManager + + * src/nautilus-profiler.[ch]: + Remove + + * src/file-manager/Makefile.am: + * src/file-manager/fm-actions.h: + New file with action names + + * src/file-manager/fm-desktop-icon-view.c: + * src/file-manager/fm-directory-view.[ch]: + * src/file-manager/fm-icon-view.c: + * src/file-manager/fm-list-view.c: + * src/file-manager/nautilus-desktop-icon-view-ui.xml: + * src/file-manager/nautilus-directory-view-ui.xml: + * src/file-manager/nautilus-icon-view-ui.xml: + * src/file-manager/nautilus-list-view-ui.xml: + Initial port of views to GtkUIManager + 2004-11-09 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-bonobo-extensions.[ch]: diff --git a/configure.in b/configure.in index f5a6de7da..5bf299716 100644 --- a/configure.in +++ b/configure.in @@ -5,7 +5,6 @@ dnl =========================================================================== ART_REQUIRED=2.3.10 BONOBO_ACTIVATION_REQUIRED=2.1.0 BONOBO_REQUIRED=2.1.0 -BONOBO_UI_REQUIRED=2.2.0 EEL_REQUIRED=2.8.2 ESOUND_REQUIRED=0.2.27 GLIB_REQUIRED=2.3.0 @@ -24,7 +23,6 @@ EXIF_REQUIRED=0.5.12 AC_SUBST(ART_REQUIRED) AC_SUBST(BONOBO_ACTIVATION_REQUIRED) AC_SUBST(BONOBO_REQUIRED) -AC_SUBST(BONOBO_UI_REQUIRED) AC_SUBST(EEL_REQUIRED) AC_SUBST(ESOUND_REQUIRED) AC_SUBST(GLIB_REQUIRED) @@ -86,7 +84,6 @@ PKG_CHECK_MODULES(ALL, \ gtk+-2.0 >= $GTK_REQUIRED \ libart-2.0 >= $ART_REQUIRED \ libbonobo-2.0 >= $BONOBO_REQUIRED \ - libbonoboui-2.0 >= $BONOBO_UI_REQUIRED \ libgnome-2.0 >= $GNOME_REQUIRED \ libgnomeui-2.0 >= $GNOME_UI_REQUIRED \ librsvg-2.0 >= $RSVG_REQUIRED \ @@ -285,7 +282,7 @@ LIBEGG_CFLAGS="`$PKG_CONFIG --cflags $LIBEGG_MODULES`" AC_SUBST(LIBEGG_CFLAGS) dnl libnautilus (must list bonobo-activation and libbonobo because idldir does not respect "requires") -LIBNAUTILUS_MODULES="eel-2.0 bonobo-activation-2.0 libbonobo-2.0 libbonoboui-2.0" +LIBNAUTILUS_MODULES="eel-2.0 bonobo-activation-2.0 libbonobo-2.0" LIBNAUTILUS_CFLAGS="`$PKG_CONFIG --cflags $LIBNAUTILUS_MODULES`" AC_SUBST(LIBNAUTILUS_CFLAGS) LIBNAUTILUS_LIBS="`$PKG_CONFIG --libs $LIBNAUTILUS_MODULES`" @@ -301,7 +298,7 @@ LIBNAUTILUS_EXTENSION_LIBS="`$PKG_CONFIG --libs $LIBNAUTILUS_EXTENSION_MODULES`" AC_SUBST(LIBNAUTILUS_EXTENSION_LIBS) dnl core nautilus (must list bonobo-activation and libbonobo because idldir does not respect "requires") -CORE_MODULES="eel-2.0 librsvg-2.0 bonobo-activation-2.0 libbonobo-2.0 libbonoboui-2.0 esound gnome-desktop-2.0 $EXTRA_CORE_MODULES" +CORE_MODULES="eel-2.0 librsvg-2.0 bonobo-activation-2.0 libbonobo-2.0 esound gnome-desktop-2.0 $EXTRA_CORE_MODULES" CORE_CFLAGS="`$PKG_CONFIG --cflags $CORE_MODULES` $x_cflags" AC_SUBST(CORE_CFLAGS) CORE_LIBS="`$PKG_CONFIG --libs $CORE_MODULES` $CDDA_LIBS $LIBJPEG $x_libs" @@ -310,7 +307,7 @@ CORE_IDL_INCLUDES="`$PKG_CONFIG --variable=idldir $CORE_MODULES | $srcdir/add-in AC_SUBST(CORE_IDL_INCLUDES) dnl typical components -COMPONENT_MODULES="eel-2.0 libbonoboui-2.0 gnome-vfs-module-2.0 gnome-desktop-2.0" +COMPONENT_MODULES="eel-2.0 gnome-vfs-module-2.0 gnome-desktop-2.0" COMPONENT_CFLAGS="`$PKG_CONFIG --cflags $COMPONENT_MODULES`" AC_SUBST(COMPONENT_CFLAGS) COMPONENT_LIBS="`$PKG_CONFIG --libs $COMPONENT_MODULES`" @@ -338,7 +335,7 @@ dnl -DBONOBO_DISABLE_DEPRECATED AC_SUBST(DISABLE_DEPRECATED_CFLAGS) dnl libbackground -PKG_CHECK_MODULES(CAPPLET, "gtk+-2.0 gconf-2.0 libgnomeui-2.0 libbonoboui-2.0") +PKG_CHECK_MODULES(CAPPLET, "gtk+-2.0 gconf-2.0 libgnomeui-2.0") dnl ========================================================================== dnl ============================================== diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am index 705ca8da5..8ddffe2a0 100644 --- a/libnautilus-private/Makefile.am +++ b/libnautilus-private/Makefile.am @@ -51,9 +51,6 @@ libnautilus_private_la_SOURCES = \ $(nautilus_metafile_server_idl_sources) \ nautilus-audio-player.c \ nautilus-audio-player.h \ - nautilus-bonobo-extensions.c \ - nautilus-bonobo-extensions.h \ - nautilus-bonobo-ui.h \ nautilus-bookmark.c \ nautilus-bookmark.h \ nautilus-cell-renderer-pixbuf-emblem.c \ diff --git a/libnautilus-private/nautilus-bonobo-extensions.c b/libnautilus-private/nautilus-bonobo-extensions.c deleted file mode 100644 index 4353b1415..000000000 --- a/libnautilus-private/nautilus-bonobo-extensions.c +++ /dev/null @@ -1,676 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* nautilus-bonobo-extensions.c - implementation of new functions that conceptually - belong in bonobo. Perhaps some of these will be - actually rolled into bonobo someday. - - Copyright (C) 2000, 2001 Eazel, Inc. - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - Authors: John Sullivan <sullivan@eazel.com> - Darin Adler <darin@bentspoon.com> -*/ - -#include <config.h> -#include "nautilus-bonobo-extensions.h" - -#include "nautilus-icon-factory.h" - -#include <eel/eel-string.h> -#include <eel/eel-gnome-extensions.h> -#include <eel/eel-debug.h> -#include <bonobo/bonobo-ui-util.h> -#include <gtk/gtkmain.h> -#include <libgnomevfs/gnome-vfs-utils.h> - -struct NautilusBonoboActivationHandle { - NautilusBonoboActivationHandle **early_completion_hook; - NautilusBonoboActivationCallback callback; - gpointer callback_data; - Bonobo_Unknown activated_object; - gboolean cancel; - guint idle_id; - guint timeout_id; -}; - -typedef enum { - NUMBERED_MENU_ITEM_PLAIN, - NUMBERED_MENU_ITEM_TOGGLE, - NUMBERED_MENU_ITEM_RADIO -} NumberedMenuItemType; - -void -nautilus_bonobo_set_accelerator (BonoboUIComponent *ui, - const char *path, - const char *accelerator) -{ - bonobo_ui_component_set_prop (ui, path, "accel", accelerator, NULL); -} - -void -nautilus_bonobo_set_label (BonoboUIComponent *ui, - const char *path, - const char *label) -{ - bonobo_ui_component_set_prop (ui, path, "label", label, NULL); -} - -void -nautilus_bonobo_set_tip (BonoboUIComponent *ui, - const char *path, - const char *tip) -{ - bonobo_ui_component_set_prop (ui, path, "tip", tip, NULL); -} - -void -nautilus_bonobo_set_sensitive (BonoboUIComponent *ui, - const char *path, - gboolean sensitive) -{ - bonobo_ui_component_set_prop (ui, path, "sensitive", sensitive ? "1" : "0", NULL); -} - -void -nautilus_bonobo_set_toggle_state (BonoboUIComponent *ui, - const char *path, - gboolean state) -{ - bonobo_ui_component_set_prop (ui, path, "state", state ? "1" : "0", NULL); -} - -void -nautilus_bonobo_set_hidden (BonoboUIComponent *ui, - const char *path, - gboolean hidden) -{ - bonobo_ui_component_set_prop (ui, path, "hidden", hidden ? "1" : "0", NULL); -} - -char * -nautilus_bonobo_get_label (BonoboUIComponent *ui, - const char *path) -{ - return bonobo_ui_component_get_prop (ui, path, "label", NULL); -} - -gboolean -nautilus_bonobo_get_hidden (BonoboUIComponent *ui, - const char *path) -{ - char *value; - gboolean hidden; - CORBA_Environment ev; - - g_return_val_if_fail (BONOBO_IS_UI_COMPONENT (ui), FALSE); - g_return_val_if_fail (path != NULL, FALSE); - - CORBA_exception_init (&ev); - value = bonobo_ui_component_get_prop (ui, path, "hidden", &ev); - CORBA_exception_free (&ev); - - if (value == NULL) { - /* No hidden attribute means not hidden. */ - hidden = FALSE; - } else { - /* Anything other than "0" counts as TRUE */ - hidden = strcmp (value, "0") != 0; - } - - g_free (value); - - return hidden; -} - -static char * -get_numbered_menu_item_name (guint index) -{ - return g_strdup_printf ("%u", index); -} - -char * -nautilus_bonobo_get_numbered_menu_item_path (BonoboUIComponent *ui, - const char *container_path, - guint index) -{ - char *item_name; - char *item_path; - - g_return_val_if_fail (BONOBO_IS_UI_COMPONENT (ui), NULL); - g_return_val_if_fail (container_path != NULL, NULL); - - item_name = get_numbered_menu_item_name (index); - item_path = g_strconcat (container_path, "/", item_name, NULL); - g_free (item_name); - - return item_path; -} - -char * -nautilus_bonobo_get_numbered_menu_item_command (BonoboUIComponent *ui, - const char *container_path, - guint index) -{ - char *command_name; - char *path; - - g_return_val_if_fail (BONOBO_IS_UI_COMPONENT (ui), NULL); - g_return_val_if_fail (container_path != NULL, NULL); - - path = nautilus_bonobo_get_numbered_menu_item_path (ui, container_path, index); - command_name = gnome_vfs_escape_string (path); - g_free (path); - - return command_name; -} - -guint -nautilus_bonobo_get_numbered_menu_item_index_from_command (const char *command) -{ - char *path; - char *index_string; - int index; - gboolean got_index; - - path = gnome_vfs_unescape_string (command, NULL); - index_string = strrchr (path, '/'); - - if (index_string == NULL) { - got_index = FALSE; - } else { - got_index = eel_str_to_int (index_string + 1, &index); - } - g_free (path); - - g_return_val_if_fail (got_index, 0); - - return index; -} - -char * -nautilus_bonobo_get_numbered_menu_item_container_path_from_command (const char *command) -{ - char *path; - char *index_string; - char *container_path; - - path = gnome_vfs_unescape_string (command, NULL); - index_string = strrchr (path, '/'); - - container_path = index_string == NULL - ? NULL - : g_strndup (path, index_string - path); - g_free (path); - - return container_path; -} - -static void -add_numbered_menu_item_internal (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - NumberedMenuItemType type, - GdkPixbuf *pixbuf, - const char *radio_group_name) -{ - char *xml_item, *xml_command; - char *command_name; - char *item_name, *pixbuf_data; - char *path; - - g_assert (BONOBO_IS_UI_COMPONENT (ui)); - g_assert (container_path != NULL); - g_assert (label != NULL); - g_assert (type == NUMBERED_MENU_ITEM_PLAIN || pixbuf == NULL); - g_assert (type == NUMBERED_MENU_ITEM_RADIO || radio_group_name == NULL); - g_assert (type != NUMBERED_MENU_ITEM_RADIO || radio_group_name != NULL); - - item_name = get_numbered_menu_item_name (index); - command_name = nautilus_bonobo_get_numbered_menu_item_command - (ui, container_path, index); - - switch (type) { - case NUMBERED_MENU_ITEM_TOGGLE: - xml_item = g_strdup_printf ("<menuitem name=\"%s\" id=\"%s\" type=\"toggle\"/>\n", - item_name, command_name); - break; - case NUMBERED_MENU_ITEM_RADIO: - xml_item = g_strdup_printf ("<menuitem name=\"%s\" id=\"%s\" type=\"radio\" group=\"%s\"/>\n", - item_name, command_name, radio_group_name); - break; - case NUMBERED_MENU_ITEM_PLAIN: - if (pixbuf != NULL) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - xml_item = g_strdup_printf ("<menuitem name=\"%s\" verb=\"%s\" pixtype=\"pixbuf\" pixname=\"%s\"/>\n", - item_name, command_name, pixbuf_data); - g_free (pixbuf_data); - } else { - xml_item = g_strdup_printf ("<menuitem name=\"%s\" verb=\"%s\"/>\n", - item_name, command_name); - } - break; - default: - g_assert_not_reached (); - xml_item = NULL; /* keep compiler happy */ - } - - g_free (item_name); - - bonobo_ui_component_set (ui, container_path, xml_item, NULL); - - g_free (xml_item); - - path = nautilus_bonobo_get_numbered_menu_item_path (ui, container_path, index); - nautilus_bonobo_set_label (ui, path, label); - g_free (path); - - /* Make the command node here too, so callers can immediately set - * properties on it (otherwise it doesn't get created until some - * time later). - */ - xml_command = g_strdup_printf ("<cmd name=\"%s\"/>\n", command_name); - bonobo_ui_component_set (ui, "/commands", xml_command, NULL); - g_free (xml_command); - - g_free (command_name); -} - -/* Add a menu item specified by number into a given path. Used for - * dynamically creating a related series of menu items. Each index - * must be unique (normal use is to call this in a loop, and - * increment the index for each item). - */ -void -nautilus_bonobo_add_numbered_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf) -{ - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - - add_numbered_menu_item_internal (ui, container_path, index, label, - NUMBERED_MENU_ITEM_PLAIN, pixbuf, NULL); -} - -/* Add a menu item specified by number into a given path. Used for - * dynamically creating a related series of toggle menu items. Each index - * must be unique (normal use is to call this in a loop, and - * increment the index for each item). - */ -void -nautilus_bonobo_add_numbered_toggle_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label) -{ - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - - add_numbered_menu_item_internal (ui, container_path, index, label, - NUMBERED_MENU_ITEM_TOGGLE, NULL, NULL); -} - -/* Add a menu item specified by number into a given path. Used for - * dynamically creating a related series of radio menu items. Each index - * must be unique (normal use is to call this in a loop, and - * increment the index for each item). - */ -void -nautilus_bonobo_add_numbered_radio_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - const char *radio_group_name) -{ - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - - add_numbered_menu_item_internal (ui, container_path, index, label, - NUMBERED_MENU_ITEM_RADIO, NULL, radio_group_name); -} - -void -nautilus_bonobo_add_submenu (BonoboUIComponent *ui, - const char *path, - const char *label, - GdkPixbuf *pixbuf) -{ - char *xml_string, *name, *pixbuf_data, *submenu_path; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (path != NULL); - g_return_if_fail (label != NULL); - g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); - - /* Labels may contain characters that are illegal in names. So - * we create the name by URI-encoding the label. - */ - name = gnome_vfs_escape_string (label); - - if (pixbuf != NULL) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - xml_string = g_strdup_printf ("<submenu name=\"%s\" pixtype=\"pixbuf\" pixname=\"%s\"/>\n", - name, pixbuf_data); - g_free (pixbuf_data); - } else { - xml_string = g_strdup_printf ("<submenu name=\"%s\"/>\n", name); - } - - bonobo_ui_component_set (ui, path, xml_string, NULL); - - g_free (xml_string); - - submenu_path = g_strconcat (path, "/", name, NULL); - nautilus_bonobo_set_label (ui, submenu_path, label); - g_free (submenu_path); - - g_free (name); -} - -void -nautilus_bonobo_add_menu_separator (BonoboUIComponent *ui, const char *path) -{ - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (path != NULL); - - bonobo_ui_component_set (ui, path, "<separator/>", NULL); -} - -static void -remove_commands (BonoboUIComponent *ui, const char *container_path) -{ - BonoboUINode *path_node; - BonoboUINode *child_node; - char *verb_name; - char *id_name; - - path_node = bonobo_ui_component_get_tree (ui, container_path, TRUE, NULL); - if (path_node == NULL) { - return; - } - - bonobo_ui_component_freeze (ui, NULL); - - for (child_node = bonobo_ui_node_children (path_node); - child_node != NULL; - child_node = bonobo_ui_node_next (child_node)) { - verb_name = bonobo_ui_node_get_attr (child_node, "verb"); - if (verb_name != NULL) { - bonobo_ui_component_remove_verb (ui, verb_name); - bonobo_ui_node_free_string (verb_name); - } else { - /* Only look for an id if there's no verb */ - id_name = bonobo_ui_node_get_attr (child_node, "id"); - if (id_name != NULL) { - bonobo_ui_component_remove_listener (ui, id_name); - bonobo_ui_node_free_string (id_name); - } - } - } - - bonobo_ui_component_thaw (ui, NULL); - - bonobo_ui_node_free (path_node); -} - -/** - * nautilus_bonobo_remove_menu_items_and_verbs - * - * Removes all menu items contained in a menu or placeholder, and - * their verbs. - * - * @uih: The BonoboUIHandler for this menu item. - * @container_path: The standard bonobo-style path specifier for this placeholder or submenu. - */ -void -nautilus_bonobo_remove_menu_items_and_commands (BonoboUIComponent *ui, - const char *container_path) -{ - char *remove_wildcard; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - - remove_commands (ui, container_path); - - /* For speed, remove menu items themselves all in one fell swoop, - * though we removed the verbs one-by-one. - */ - remove_wildcard = g_strdup_printf ("%s/*", container_path); - bonobo_ui_component_rm (ui, remove_wildcard, NULL); - g_free (remove_wildcard); -} - -/* Call to set the user-visible label of a command to a string - * containing an underscore accelerator. The underscore is stripped - * off before setting the label of the toolitem, because toolbar - * button labels shouldn't have the underscore. - */ -void -nautilus_bonobo_set_label_for_toolitem_and_command (BonoboUIComponent *ui, - const char *toolitem_path, - const char *command_path, - const char *label_with_underscore) -{ - char *label_no_underscore; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (toolitem_path != NULL); - g_return_if_fail (command_path != NULL); - g_return_if_fail (label_with_underscore != NULL); - - label_no_underscore = eel_str_strip_chr (label_with_underscore, '_'); - nautilus_bonobo_set_label (ui, - command_path, - label_with_underscore); - nautilus_bonobo_set_label (ui, - toolitem_path, - label_no_underscore); - - g_free (label_no_underscore); -} - -static char * -get_extension_menu_item_xml (NautilusMenuItem *item) -{ - GString *ui_xml; - char *pixbuf_data; - GdkPixbuf *pixbuf; - char *name; - char *icon; - - ui_xml = g_string_new (""); - - g_object_get (G_OBJECT (item), "name", &name, "icon", &icon, NULL); - - g_string_append_printf (ui_xml, - "<menuitem name=\"%s\" verb=\"%s\"", - name, name); - - if (icon) { - pixbuf = nautilus_icon_factory_get_pixbuf_from_name - (icon, - NULL, - NAUTILUS_ICON_SIZE_FOR_MENUS, - NULL); - if (pixbuf) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - g_string_append_printf (ui_xml, " pixtype=\"pixbuf\" pixname=\"%s\"", pixbuf_data); - g_free (pixbuf_data); - g_object_unref (pixbuf); - } - } - g_string_append (ui_xml, "/>"); - - g_free (name); - g_free (icon); - - return g_string_free (ui_xml, FALSE); -} - -static void -extension_action_callback (BonoboUIComponent *component, - gpointer callback_data, const char *path) -{ - nautilus_menu_item_activate (NAUTILUS_MENU_ITEM (callback_data)); -} - -char * -nautilus_bonobo_get_extension_item_command_xml (NautilusMenuItem *item) -{ - char *name; - char *label; - char *tip; - gboolean sensitive; - char *xml; - - g_object_get (G_OBJECT (item), - "name", &name, "label", &label, - "tip", &tip, "sensitive", &sensitive, - NULL); - - xml = g_strdup_printf ("<cmd name=\"%s\" label=\"%s\" tip=\"%s\" sensitive=\"%s\"/>", - name, label, tip, sensitive ? "1" : "0"); - - g_free (name); - g_free (label); - g_free (tip); - - return xml; -} - -void -nautilus_bonobo_add_extension_item_command (BonoboUIComponent *ui, - NautilusMenuItem *item) -{ - char *xml; - char *name; - GClosure *closure; - - xml = nautilus_bonobo_get_extension_item_command_xml (item); - - bonobo_ui_component_set (ui, "/commands", xml, NULL); - - g_free (xml); - - g_object_get (G_OBJECT (item), "name", &name, NULL); - - closure = g_cclosure_new - (G_CALLBACK (extension_action_callback), - g_object_ref (item), - (GClosureNotify)g_object_unref); - - bonobo_ui_component_add_verb_full (ui, name, closure); - - g_free (name); -} - -void -nautilus_bonobo_add_extension_item (BonoboUIComponent *ui, - const char *path, - NautilusMenuItem *item) -{ - char *item_xml; - - item_xml = get_extension_menu_item_xml (item); - - bonobo_ui_component_set (ui, path, item_xml, NULL); - - g_free (item_xml); -} - -static char * -get_extension_toolbar_item_xml (NautilusMenuItem *item) -{ - GString *ui_xml; - char *pixbuf_data; - GdkPixbuf *pixbuf; - char *name; - char *icon; - gboolean priority; - - ui_xml = g_string_new (""); - - - g_object_get (item, - "name", &name, "priority", &priority, - "icon", &icon, - NULL); - g_string_append_printf (ui_xml, - "<toolitem name=\"%s\" verb=\"%s\"", - name, name); - - if (priority) { - g_string_append (ui_xml, " priority=\"1\""); - } - - if (icon) { - pixbuf = nautilus_icon_factory_get_pixbuf_from_name - (icon, - NULL, - NAUTILUS_ICON_SIZE_FOR_MENUS, - NULL); - if (pixbuf) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - g_string_append_printf (ui_xml, " pixtype=\"pixbuf\" pixname=\"%s\"", pixbuf_data); - g_free (pixbuf_data); - g_object_unref (pixbuf); - } - } - g_string_append (ui_xml, "/>"); - - g_free (name); - g_free (icon); - - return g_string_free (ui_xml, FALSE); -} - -void -nautilus_bonobo_add_extension_toolbar_item (BonoboUIComponent *ui, - const char *path, - NautilusMenuItem *item) -{ - char *item_xml; - - item_xml = get_extension_toolbar_item_xml (item); - - bonobo_ui_component_set (ui, path, item_xml, NULL); - - g_free (item_xml); -} - -Bonobo_RegistrationResult -nautilus_bonobo_activation_register_for_display (const char *iid, - Bonobo_Unknown ref) -{ - const char *display_name; - GSList *reg_env ; - Bonobo_RegistrationResult result; - - display_name = gdk_display_get_name (gdk_display_get_default()); - reg_env = bonobo_activation_registration_env_set (NULL, - "DISPLAY", display_name); - result = bonobo_activation_register_active_server (iid, ref, reg_env); - bonobo_activation_registration_env_free (reg_env); - return result; -} diff --git a/libnautilus-private/nautilus-bonobo-extensions.h b/libnautilus-private/nautilus-bonobo-extensions.h deleted file mode 100644 index 19e180b04..000000000 --- a/libnautilus-private/nautilus-bonobo-extensions.h +++ /dev/null @@ -1,123 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* nautilus-bonobo-extensions.h - interface for new functions that conceptually - belong in bonobo. Perhaps some of these will be - actually rolled into bonobo someday. - - Copyright (C) 2000 Eazel, Inc. - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - Author: John Sullivan <sullivan@eazel.com> -*/ - -#ifndef NAUTILUS_BONOBO_EXTENSIONS_H -#define NAUTILUS_BONOBO_EXTENSIONS_H - -#include <bonobo/bonobo-ui-component.h> -#include <bonobo/bonobo-xobject.h> -#include <bonobo/bonobo-generic-factory.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <libnautilus-extension/nautilus-menu-item.h> - -typedef struct NautilusBonoboActivationHandle NautilusBonoboActivationHandle; - -typedef void (*NautilusBonoboActivationCallback) (NautilusBonoboActivationHandle *handle, - Bonobo_Unknown activated_object, - gpointer callback_data); - -typedef CORBA_Object (*NautilusBonoboCreateObject) (const char *iid, - gpointer callback_data); - -void nautilus_bonobo_set_accelerator (BonoboUIComponent *ui, - const char *path, - const char *accelerator); -char * nautilus_bonobo_get_label (BonoboUIComponent *ui, - const char *path); -void nautilus_bonobo_set_label (BonoboUIComponent *ui, - const char *path, - const char *label); -void nautilus_bonobo_set_tip (BonoboUIComponent *ui, - const char *path, - const char *tip); -void nautilus_bonobo_set_sensitive (BonoboUIComponent *ui, - const char *path, - gboolean sensitive); -void nautilus_bonobo_set_toggle_state (BonoboUIComponent *ui, - const char *path, - gboolean state); -void nautilus_bonobo_set_hidden (BonoboUIComponent *ui, - const char *path, - gboolean hidden); -gboolean nautilus_bonobo_get_hidden (BonoboUIComponent *ui, - const char *path); -void nautilus_bonobo_add_numbered_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf); -void nautilus_bonobo_add_numbered_toggle_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label); -void nautilus_bonobo_add_numbered_radio_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - const char *radio_group_name); -char * nautilus_bonobo_get_numbered_menu_item_command (BonoboUIComponent *ui, - const char *container_path, - guint index); -char * nautilus_bonobo_get_numbered_menu_item_path (BonoboUIComponent *ui, - const char *container_path, - guint index); - -guint nautilus_bonobo_get_numbered_menu_item_index_from_command -(const char *command); -char * nautilus_bonobo_get_numbered_menu_item_container_path_from_command -(const char *command); -void nautilus_bonobo_add_submenu (BonoboUIComponent *ui, - const char *container_path, - const char *label, - GdkPixbuf *pixbuf); -void nautilus_bonobo_add_menu_separator (BonoboUIComponent *ui, - const char *path); -void nautilus_bonobo_remove_menu_items_and_commands (BonoboUIComponent *ui, - const char *container_path); -void nautilus_bonobo_set_label_for_toolitem_and_command (BonoboUIComponent *ui, - const char *toolitem_path, - const char *command_path, - const char *label_with_underscore); -void nautilus_bonobo_set_icon (BonoboUIComponent *ui, - const char *path, - const char *icon_relative_path); -void nautilus_bonobo_add_extension_item_command (BonoboUIComponent *ui, - NautilusMenuItem *item); -char *nautilus_bonobo_get_extension_item_command_xml (NautilusMenuItem *item); - -void nautilus_bonobo_add_extension_item (BonoboUIComponent *ui, - const char *path, - NautilusMenuItem *item); -void nautilus_bonobo_add_extension_toolbar_item (BonoboUIComponent *ui, - const char *path, - NautilusMenuItem *item); -Bonobo_RegistrationResult nautilus_bonobo_activation_register_for_display (const char *iid, - Bonobo_Unknown ref); - - - -#endif /* NAUTILUS_BONOBO_EXTENSIONS_H */ diff --git a/libnautilus-private/nautilus-bonobo-ui.h b/libnautilus-private/nautilus-bonobo-ui.h deleted file mode 100644 index 41fa3747d..000000000 --- a/libnautilus-private/nautilus-bonobo-ui.h +++ /dev/null @@ -1,130 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: 8; c-basic-offset: 8 -*- */ - -/* - * libnautilus: A library for nautilus view implementations. - * - * Copyright (C) 2000 Eazel, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Author: Maciej Stachowiak <mjs@eazel.com> - * - */ - -/* nautilus-bonobo-ui.h: bonobo UI paths usable by Nautilus components - * for merging menus and toolbars. - */ - -#ifndef NAUTILUS_BONOBO_UI_H -#define NAUTILUS_BONOBO_UI_H - -/** - * Components can use these menu paths with BonoboUIContainer calls to - * place entire new menus. - */ - -#define NAUTILUS_MENU_PATH_FILE_MENU "/menu/File" -#define NAUTILUS_MENU_PATH_EDIT_MENU "/menu/Edit" -#define NAUTILUS_MENU_PATH_VIEW_MENU "/menu/View" -#define NAUTILUS_MENU_PATH_GO_MENU "/menu/Go" -#define NAUTILUS_MENU_PATH_BOOKMARKS_MENU "/menu/Bookmarks" -#define NAUTILUS_MENU_PATH_PROFILER "/menu/Profiler" -#define NAUTILUS_MENU_PATH_HELP_MENU "/menu/Help" - -/** - * Components can use these menu item paths with BonoboUIContainer calls to - * merge over certain existing items. Only items that we expect to be - * merged over are listed here, to avoid making public details that might - * change later. - */ - -#define NAUTILUS_MENU_PATH_CUT_ITEM "/menu/Edit/Cut" -#define NAUTILUS_MENU_PATH_COPY_ITEM "/menu/Edit/Copy" -#define NAUTILUS_MENU_PATH_PASTE_ITEM "/menu/Edit/Paste" -#define NAUTILUS_MENU_PATH_CLEAR_ITEM "/menu/Edit/Clear" -#define NAUTILUS_MENU_PATH_SELECT_ALL_ITEM "/menu/Edit/Select All" - -#define NAUTILUS_COMMAND_CUT "/commands/Cut" -#define NAUTILUS_COMMAND_COPY "/commands/Copy" -#define NAUTILUS_COMMAND_PASTE "/commands/Paste" -#define NAUTILUS_COMMAND_CLEAR "/commands/Clear" -#define NAUTILUS_COMMAND_SELECT_ALL "/commands/Select All" - -/** - * Components can use these placeholder paths with BonoboUIContainer calls to - * insert new items in well-defined positions. - */ - -/* Use the "new items" placeholder to insert menu items like "New xxx" */ -#define NAUTILUS_MENU_PATH_NEW_ITEMS_PLACEHOLDER "/menu/File/New Items Placeholder" - -/** - * Use the "open" placeholder to insert menu items dealing with opening the - * selected item, like "Open", "Open in New Window", etc. - */ -#define NAUTILUS_MENU_PATH_OPEN_PLACEHOLDER "/menu/File/Open Placeholder" - -/** - * Use the "file items" placeholder to insert other File menu items dealing with - * individual files, such as "Show Properties" and "Rename" - */ -#define NAUTILUS_MENU_PATH_FILE_ITEMS_PLACEHOLDER "/menu/File/File Items Placeholder" - -/** - * Use the "global file items" placeholder to insert other File menu items - * dealing with nautilus as a whole, such as "Empty Trash". - */ -#define NAUTILUS_MENU_PATH_GLOBAL_FILE_ITEMS_PLACEHOLDER "/menu/File/Global File Items Placeholder" - -/** - * Use the "global edit items" placeholder to insert other Edit menu items - * dealing with nautilus as a whole, such as "Icon Captions...". - */ -#define NAUTILUS_MENU_PATH_GLOBAL_EDIT_ITEMS_PLACEHOLDER "/menu/Edit/Global Edit Items Placeholder" - -/** - * Use the "edit items" placeholder to insert other Edit menu items dealing with - * individual files, such as "Remove Custom Image" - */ -#define NAUTILUS_MENU_PATH_EDIT_ITEMS_PLACEHOLDER "/menu/Edit/Edit Items Placeholder" - -/** - * Use the "show/hide" placeholder to insert other View menu items that - * control the visibility of some piece of the UI, such as "Show/Hide Status Bar". - */ -#define NAUTILUS_MENU_PATH_SHOW_HIDE_PLACEHOLDER "/menu/View/Show Hide Placeholder" - -/** - * Use the "view items" placeholder to insert other View menu items that - * are specific to a component, such as the Icon View's layout options. - */ -#define NAUTILUS_MENU_PATH_VIEW_ITEMS_PLACEHOLDER "/menu/View/View Items Placeholder" - -/* Use the "extra help items" placeholder to add help-related items */ -#define NAUTILUS_MENU_PATH_EXTRA_HELP_ITEMS_PLACEHOLDER "/menu/Help/Extra Help Items" - -/* This holds the zooming-related items in the context menu */ -#define NAUTILUS_POPUP_PATH_ZOOM_ITEMS_PLACEHOLDER "/popups/background/Zoom Items" - -/* Components can use these paths with BonoboUIHandler calls to - * locate toolbars and toolbar items for the purpose of merging. - * Note: Not all Nautilus toolbars or toolbar items are necessarily published - * here; these are the ones whose existence components can count on. - */ - -/* Main toolbar */ -#define NAUTILUS_TOOLBAR_PATH_MAIN_TOOLBAR "/Main" - -#endif /* NAUTILUS_BONOBO_UI_H */ diff --git a/libnautilus-private/nautilus-clipboard.c b/libnautilus-private/nautilus-clipboard.c index 9e595e103..669fb9b15 100644 --- a/libnautilus-private/nautilus-clipboard.c +++ b/libnautilus-private/nautilus-clipboard.c @@ -30,7 +30,6 @@ #include <config.h> #include "nautilus-clipboard.h" -#include "nautilus-bonobo-ui.h" #include <bonobo/bonobo-ui-util.h> #include <gtk/gtkinvisible.h> #include <gtk/gtkmain.h> @@ -40,6 +39,8 @@ typedef void (* EditableFunction) (GtkEditable *editable); +#ifdef BONOBO_DONE + static void disconnect_set_up_in_control_handlers (GtkObject *object, gpointer callback_data); static void selection_changed_callback (GtkWidget *widget, @@ -401,11 +402,14 @@ initialize_clipboard_component_with_callback_data (GtkEditable *target, return target_data; } +#endif + void nautilus_clipboard_set_up_editable (GtkEditable *target, Bonobo_UIContainer ui_container, gboolean shares_selection_changes) { +#ifdef BONOBO_DONE TargetCallbackData *target_data; g_return_if_fail (GTK_IS_EDITABLE (target)); @@ -429,8 +433,11 @@ nautilus_clipboard_set_up_editable (GtkEditable *target, * already in focus. */ focus_changed_callback (GTK_WIDGET (target), NULL, target_data); +#endif } +#ifdef BONOBO_DONE + static gboolean widget_was_set_up_with_selection_sensitivity (GtkWidget *widget) { @@ -464,11 +471,14 @@ control_destroyed_callback (GtkObject *object, disconnect_set_up_in_control_handlers (object, callback_data); } +#endif + void nautilus_clipboard_set_up_editable_in_control (GtkEditable *target, BonoboControl *control, gboolean shares_selection_changes) { +#ifdef BONOBO_DONE g_return_if_fail (GTK_IS_EDITABLE (target)); g_return_if_fail (BONOBO_IS_CONTROL (control)); @@ -493,8 +503,11 @@ nautilus_clipboard_set_up_editable_in_control (GtkEditable *target, G_CALLBACK (first_focus_callback), control); g_signal_connect (target, "destroy", G_CALLBACK (control_destroyed_callback), control); +#endif } +#ifdef BONOBO_DONE + static void disconnect_set_up_in_control_handlers (GtkObject *object, gpointer callback_data) @@ -510,3 +523,5 @@ disconnect_set_up_in_control_handlers (GtkObject *object, G_CALLBACK (control_destroyed_callback), callback_data); } + +#endif diff --git a/libnautilus-private/nautilus-directory-metafile-monitor.c b/libnautilus-private/nautilus-directory-metafile-monitor.c index 3cc32d56a..4297d0f18 100644 --- a/libnautilus-private/nautilus-directory-metafile-monitor.c +++ b/libnautilus-private/nautilus-directory-metafile-monitor.c @@ -28,7 +28,6 @@ #include <eel/eel-gtk-macros.h> #include <eel/eel-glib-extensions.h> -#include "nautilus-bonobo-extensions.h" struct NautilusMetafileMonitorDetails { NautilusDirectory *directory; diff --git a/libnautilus-private/nautilus-file-utilities.c b/libnautilus-private/nautilus-file-utilities.c index 578eaf8ce..6264735d8 100644 --- a/libnautilus-private/nautilus-file-utilities.c +++ b/libnautilus-private/nautilus-file-utilities.c @@ -342,6 +342,25 @@ nautilus_pixmap_file (const char *partial_path) } char * +nautilus_get_ui_directory (void) +{ + return g_strdup (DATADIR "/nautilus/ui"); +} + +char * +nautilus_ui_file (const char *partial_path) +{ + char *path; + + path = g_build_filename (DATADIR "/nautilus/ui", partial_path, NULL); + if (g_file_test (path, G_FILE_TEST_EXISTS)) { + return path; + } + g_free (path); + return NULL; +} + +char * nautilus_get_data_file_path (const char *partial_path) { char *path; diff --git a/libnautilus-private/nautilus-file-utilities.h b/libnautilus-private/nautilus-file-utilities.h index 5b71e461d..cefe46750 100644 --- a/libnautilus-private/nautilus-file-utilities.h +++ b/libnautilus-private/nautilus-file-utilities.h @@ -66,6 +66,10 @@ char * nautilus_pixmap_file (const char *partial_path); /* Locate a file in either the uers directory or the datadir. */ char * nautilus_get_data_file_path (const char *partial_path); + +char *nautilus_get_ui_directory (void); +char *nautilus_ui_file (const char *partial_path); + /* Return an allocated file name that is guranteed to be unique. */ char * nautilus_unique_temporary_file_name (void); char * nautilus_find_file_in_gnome_path (char *file); diff --git a/libnautilus-private/nautilus-metafile.c b/libnautilus-private/nautilus-metafile.c index af703e224..97130e6d4 100644 --- a/libnautilus-private/nautilus-metafile.c +++ b/libnautilus-private/nautilus-metafile.c @@ -23,7 +23,6 @@ #include <config.h> #include "nautilus-metafile.h" -#include "nautilus-bonobo-extensions.h" #include "nautilus-directory.h" #include "nautilus-directory.h" #include "nautilus-file-private.h" diff --git a/libnautilus-private/nautilus-view.c b/libnautilus-private/nautilus-view.c index 67935c381..bad36efc8 100644 --- a/libnautilus-private/nautilus-view.c +++ b/libnautilus-private/nautilus-view.c @@ -249,53 +249,3 @@ nautilus_view_get_zoom_level (NautilusView *view) return (* NAUTILUS_VIEW_GET_IFACE (view)->get_zoom_level) (view); } - - -static void -nautilus_ui_component_free (BonoboUIComponent *ui_component) -{ - bonobo_ui_component_unset_container (ui_component, NULL); - bonobo_object_unref (BONOBO_OBJECT (ui_component)); -} - -static BonoboUIComponent * -nautilus_view_get_ui_component (NautilusView *view) -{ - BonoboUIComponent *ui_component; - - ui_component = g_object_get_data (G_OBJECT (view), - "nautilus-view-ui-component"); - - if (ui_component == NULL) { - ui_component = bonobo_ui_component_new_default (); - g_object_set_data_full (G_OBJECT (view), - "nautilus-view-ui-component", - ui_component, - (GDestroyNotify) nautilus_ui_component_free); - } - - return ui_component; -} - - -BonoboUIComponent * -nautilus_view_set_up_ui (NautilusView *view, - Bonobo_UIContainer ui_container, - const char *datadir, - const char *ui_file_name, - const char *application_name) -{ - BonoboUIComponent *ui_component; - - /* Get the UI component that's pre-made by the control. */ - ui_component = nautilus_view_get_ui_component (view); - - /* Connect the UI component to the control frame's UI container. */ - bonobo_ui_component_set_container (ui_component, ui_container, NULL); - - /* Set up the UI from an XML file. */ - bonobo_ui_util_set_ui (ui_component, datadir, ui_file_name, application_name, NULL); - - return ui_component; -} - diff --git a/libnautilus-private/nautilus-view.h b/libnautilus-private/nautilus-view.h index dfc98186f..0d3ab39d6 100644 --- a/libnautilus-private/nautilus-view.h +++ b/libnautilus-private/nautilus-view.h @@ -52,6 +52,7 @@ struct _NautilusViewIface /* emitted when the view-specific title as returned by get_title changes */ void (* title_changed) (NautilusView *view); + /* BONOBOTODO: remove this? */ void (* zoom_parameters_changed)(NautilusView *view); void (* zoom_level_changed) (NautilusView *view); @@ -142,15 +143,6 @@ gboolean nautilus_view_can_zoom_in (NautilusView *v gboolean nautilus_view_can_zoom_out (NautilusView *view); NautilusZoomLevel nautilus_view_get_zoom_level (NautilusView *view); -/* Temporary bonoboui stuff: */ -BonoboUIComponent * nautilus_view_set_up_ui (NautilusView *view, - Bonobo_UIContainer ui_container, - const char *datadir, - const char *ui_file_name, - const char *application_name); - - - G_END_DECLS #endif /* NAUTILUS_VIEW_H */ diff --git a/libnautilus-private/nautilus-window-info.c b/libnautilus-private/nautilus-window-info.c index 6b8b6e679..cc2e98298 100644 --- a/libnautilus-private/nautilus-window-info.c +++ b/libnautilus-private/nautilus-window-info.c @@ -251,11 +251,11 @@ nautilus_window_info_set_hidden_files_mode (NautilusWindowInfo *window, mode); } -Bonobo_UIContainer -nautilus_window_info_get_ui_container (NautilusWindowInfo *window) +GtkUIManager * +nautilus_window_info_get_ui_manager (NautilusWindowInfo *window) { g_return_val_if_fail (NAUTILUS_IS_WINDOW_INFO (window), CORBA_OBJECT_NIL); - return (* NAUTILUS_WINDOW_INFO_GET_IFACE (window)->get_ui_container) (window); + return (* NAUTILUS_WINDOW_INFO_GET_IFACE (window)->get_ui_manager) (window); } diff --git a/libnautilus-private/nautilus-window-info.h b/libnautilus-private/nautilus-window-info.h index c2002862e..ba6bfe3c5 100644 --- a/libnautilus-private/nautilus-window-info.h +++ b/libnautilus-private/nautilus-window-info.h @@ -27,7 +27,7 @@ #include <glib-object.h> #include <libnautilus-private/nautilus-view.h> -#include <bonobo/bonobo-ui-util.h> +#include <gtk/gtkuimanager.h> G_BEGIN_DECLS @@ -128,9 +128,7 @@ struct _NautilusWindowInfoIface NautilusWindowOpenFlags flags, GList *selection); void (* close_window) (NautilusWindowInfo *window); - - /* Temporary bonoboui stuff: */ - Bonobo_UIContainer (* get_ui_container) (NautilusWindowInfo *window); + GtkUIManager * (* get_ui_manager) (NautilusWindowInfo *window); }; GType nautilus_window_info_get_type (void); @@ -158,9 +156,7 @@ GList * nautilus_window_info_get_selection NautilusWindowShowHiddenFilesMode nautilus_window_info_get_hidden_files_mode (NautilusWindowInfo *window); void nautilus_window_info_set_hidden_files_mode (NautilusWindowInfo *window, NautilusWindowShowHiddenFilesMode mode); - -/* temporary BonoboUI stuff */ -Bonobo_UIContainer nautilus_window_info_get_ui_container (NautilusWindowInfo *window); +GtkUIManager * nautilus_window_info_get_ui_manager (NautilusWindowInfo *window); G_END_DECLS diff --git a/src/Makefile.am b/src/Makefile.am index a613dcb5b..e7a19a4b5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,8 +52,11 @@ nautilus_shell_interface_idl_sources = \ nautilus_SOURCES = \ $(nautilus_shell_interface_idl_sources) \ + nautilus-actions.h \ nautilus-application.c \ nautilus-application.h \ + nautilus-arrow-toolbutton.c \ + nautilus-arrow-toolbutton.h \ nautilus-bookmark-list.c \ nautilus-bookmark-list.h \ nautilus-bookmark-parsing.c \ @@ -82,6 +85,8 @@ nautilus_SOURCES = \ nautilus-location-entry.h \ nautilus-main.c \ nautilus-main.h \ + nautilus-navigation-action.c \ + nautilus-navigation-action.h \ nautilus-navigation-bar.c \ nautilus-navigation-bar.h \ nautilus-navigation-window-menus.c \ @@ -89,8 +94,6 @@ nautilus_SOURCES = \ nautilus-navigation-window.h \ nautilus-notes-viewer.c \ nautilus-notes-viewer.h \ - nautilus-profiler.c \ - nautilus-profiler.h \ nautilus-property-browser.c \ nautilus-property-browser.h \ nautilus-self-check-functions.c \ @@ -139,7 +142,7 @@ server_DATA = $(server_in_files:.server.in=.server) @INTLTOOL_SERVER_RULE@ -uidir = $(datadir)/gnome-2.0/ui +uidir = $(datadir)/nautilus/ui ui_DATA = \ nautilus-shell-ui.xml \ nautilus-navigation-window-ui.xml \ diff --git a/src/file-manager/Makefile.am b/src/file-manager/Makefile.am index 5f19ec508..afcf82a43 100644 --- a/src/file-manager/Makefile.am +++ b/src/file-manager/Makefile.am @@ -15,6 +15,7 @@ INCLUDES = \ libnautilus_file_manager_la_SOURCES= \ + fm-actions.h \ fm-desktop-icon-view.c \ fm-desktop-icon-view.h \ fm-directory-view.c \ @@ -41,7 +42,7 @@ libnautilus_file_manager_la_SOURCES= \ $(NULL) -uidir = $(datadir)/gnome-2.0/ui +uidir = $(datadir)/nautilus/ui ui_DATA = \ nautilus-desktop-icon-view-ui.xml \ nautilus-directory-view-ui.xml \ diff --git a/src/file-manager/fm-actions.h b/src/file-manager/fm-actions.h new file mode 100644 index 000000000..b81b7fbb2 --- /dev/null +++ b/src/file-manager/fm-actions.h @@ -0,0 +1,66 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* fm-actions.h + * + * Copyright (C) 2004 Red Hat, Inc + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson < alexl@redhat.com> + */ + +#ifndef FM_ACTIONS_H +#define FM_ACTIONS_H + +#define FM_ACTION_OPEN "Open" +#define FM_ACTION_OPEN_ALTERNATE "OpenAlternate" +#define FM_ACTION_OTHER_APPLICATION1 "OtherApplication1" +#define FM_ACTION_OTHER_APPLICATION2 "OtherApplication2" +#define FM_ACTION_NEW_FOLDER "New Folder" +#define FM_ACTION_PROPERTIES "Properties" +#define FM_ACTION_NO_TEMPLATES "No Templates" +#define FM_ACTION_EMPTY_TRASH "Empty Trash" +#define FM_ACTION_CUT_FILES "Cut Files" +#define FM_ACTION_COPY_FILES "Copy Files" +#define FM_ACTION_PASTE_FILES "Paste Files" +#define FM_ACTION_PASTE_FILES_INTO "Paste Files Into" +#define FM_ACTION_NEW_LAUNCHER "New Launcher" +#define FM_ACTION_EDIT_LAUNCHER "Edit Launcher" +#define FM_ACTION_RENAME "Rename" +#define FM_ACTION_DUPLICATE "Duplicate" +#define FM_ACTION_CREATE_LINK "Create Link" +#define FM_ACTION_SELECT_ALL "Select All" +#define FM_ACTION_TRASH "Trash" +#define FM_ACTION_DELETE "Delete" +#define FM_ACTION_SHOW_HIDDEN_FILES "Show Hidden Files" +#define FM_ACTION_RESET_BACKGROUND "Reset Background" +#define FM_ACTION_CONNECT_TO_SERVER_LINK "Connect To Server Link" +#define FM_ACTION_MOUNT_VOLUME "Mount Volume" +#define FM_ACTION_UNMOUNT_VOLUME "Unmount Volume" +#define FM_ACTION_SCRIPTS "Scripts" +#define FM_ACTION_NEW_DOCUMENTS "New Documents" +#define FM_ACTION_EMPTY_TRASH_CONDITIONAL "Empty Trash Conditional" +#define FM_ACTION_MANUAL_LAYOUT "Manual Layout" +#define FM_ACTION_TIGHTER_LAYOUT "Tighter Layout" +#define FM_ACTION_REVERSED_ORDER "Reversed Order" +#define FM_ACTION_CLEAN_UP "Clean Up" +#define FM_ACTION_KEEP_ALIGNED "Keep Aligned" +#define FM_ACTION_ARRANGE_ITEMS "Arrange Items" +#define FM_ACTION_STRETCH "Stretch" +#define FM_ACTION_UNSTRETCH "Unstretch" +#define FM_ACTION_ZOOM_ITEMS "Zoom Items" + +#endif /* FM_ACTIONS_H */ diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c index 1d8963c54..2c40b2442 100644 --- a/src/file-manager/fm-desktop-icon-view.c +++ b/src/file-manager/fm-desktop-icon-view.c @@ -27,9 +27,9 @@ #include <config.h> #include "fm-icon-container.h" #include "fm-desktop-icon-view.h" +#include "fm-actions.h" #include <X11/Xatom.h> -#include <bonobo/bonobo-ui-util.h> #include <gtk/gtkmain.h> #include <dirent.h> #include <eel/eel-glib-extensions.h> @@ -45,7 +45,6 @@ #include <libgnome/gnome-i18n.h> #include <libgnome/gnome-util.h> #include <libgnomevfs/gnome-vfs.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-desktop-icon-file.h> #include <libnautilus-private/nautilus-directory-background.h> #include <libnautilus-private/nautilus-directory-notify.h> @@ -82,8 +81,8 @@ struct FMDesktopIconViewDetails { - BonoboUIComponent *ui; GdkWindow *root_window; + GtkActionGroup *desktop_action_group; /* For the desktop rescanning */ @@ -244,12 +243,6 @@ fm_desktop_icon_view_destroy (GtkObject *object) default_zoom_level_changed, icon_view); - /* Clean up details */ - if (icon_view->details->ui != NULL) { - bonobo_ui_component_unset_container (icon_view->details->ui, NULL); - bonobo_object_unref (icon_view->details->ui); - icon_view->details->ui = NULL; - } GTK_OBJECT_CLASS (parent_class)->destroy (object); } @@ -559,7 +552,7 @@ fm_desktop_icon_view_init (FMDesktopIconView *desktop_icon_view) } static void -new_terminal_callback (BonoboUIComponent *component, gpointer data, const char *verb) +action_new_terminal_callback (GtkAction *action, gpointer data) { g_assert (FM_DIRECTORY_VIEW (data)); @@ -567,7 +560,7 @@ new_terminal_callback (BonoboUIComponent *component, gpointer data, const char * } static void -new_launcher_callback (BonoboUIComponent *component, gpointer data, const char *verb) +action_new_launcher_callback (GtkAction *action, gpointer data) { char *desktop_directory; @@ -585,9 +578,8 @@ new_launcher_callback (BonoboUIComponent *component, gpointer data, const char * } static void -change_background_callback (BonoboUIComponent *component, - gpointer data, - const char *verb) +action_change_background_callback (GtkAction *action, + gpointer data) { g_assert (FM_DIRECTORY_VIEW (data)); @@ -599,25 +591,14 @@ change_background_callback (BonoboUIComponent *component, } static void -empty_trash_callback (BonoboUIComponent *component, - gpointer data, - const char *verb) +action_empty_trash_conditional_callback (GtkAction *action, + gpointer data) { g_assert (FM_IS_DIRECTORY_VIEW (data)); nautilus_file_operations_empty_trash (GTK_WIDGET (data)); } -static void -reset_background_callback (BonoboUIComponent *component, - gpointer data, - const char *verb) -{ - eel_background_reset - (fm_directory_view_get_background - (FM_DIRECTORY_VIEW (data))); -} - static gboolean trash_link_is_selection (FMDirectoryView *view) { @@ -649,6 +630,7 @@ real_update_menus (FMDirectoryView *view) FMDesktopIconView *desktop_view; char *label; gboolean include_empty_trash; + GtkAction *action; g_assert (FM_IS_DESKTOP_ICON_VIEW (view)); @@ -656,59 +638,72 @@ real_update_menus (FMDirectoryView *view) desktop_view = FM_DESKTOP_ICON_VIEW (view); - bonobo_ui_component_freeze (desktop_view->details->ui, NULL); - /* Empty Trash */ include_empty_trash = trash_link_is_selection (view); - nautilus_bonobo_set_hidden - (desktop_view->details->ui, - DESKTOP_COMMAND_EMPTY_TRASH_CONDITIONAL, - !include_empty_trash); + action = gtk_action_group_get_action (desktop_view->details->desktop_action_group, + FM_ACTION_EMPTY_TRASH_CONDITIONAL); + gtk_action_set_visible (action, + include_empty_trash); if (include_empty_trash) { label = g_strdup (_("Empty Trash")); - nautilus_bonobo_set_label - (desktop_view->details->ui, - DESKTOP_COMMAND_EMPTY_TRASH_CONDITIONAL, - label); - nautilus_bonobo_set_sensitive - (desktop_view->details->ui, - DESKTOP_COMMAND_EMPTY_TRASH_CONDITIONAL, - !nautilus_trash_monitor_is_empty ()); + g_object_set (action , "label", label, NULL); + gtk_action_set_sensitive (action, + !nautilus_trash_monitor_is_empty ()); g_free (label); } - - bonobo_ui_component_thaw (desktop_view->details->ui, NULL); } +static GtkActionEntry desktop_view_entries[] = { + { "New Terminal", NULL, /* name, stock id */ + N_("Open T_erminal"), NULL, /* label, accelerator */ + N_("Open a new GNOME terminal window"), /* tooltip */ + G_CALLBACK (action_new_terminal_callback) }, + { "New Launcher Desktop", NULL, /* name, stock id */ + N_("Create L_auncher"), NULL, /* label, accelerator */ + N_("Create a new launcher"), /* tooltip */ + G_CALLBACK (action_new_launcher_callback) }, + { "Change Background", NULL, /* name, stock id */ + N_("Change Desktop _Background"), NULL, /* label, accelerator */ + N_("Show a window that lets you set your desktop background's pattern or color"), /* tooltip */ + G_CALLBACK (action_change_background_callback) }, + { "Empty Trash Conditional", NULL, /* name, stock id */ + N_("Empty Trash"), NULL, /* label, accelerator */ + N_("Delete all items in the Trash"), /* tooltip */ + G_CALLBACK (action_empty_trash_conditional_callback) }, +}; + static void real_merge_menus (FMDirectoryView *view) { FMDesktopIconView *desktop_view; - Bonobo_UIContainer ui_container; - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("Change Background", change_background_callback), - BONOBO_UI_VERB ("Empty Trash Conditional", empty_trash_callback), - BONOBO_UI_VERB ("New Terminal", new_terminal_callback), - BONOBO_UI_VERB ("New Launcher Desktop", new_launcher_callback), - BONOBO_UI_VERB ("Reset Background", reset_background_callback), - BONOBO_UI_VERB_END - }; + GtkUIManager *ui_manager; + GtkActionGroup *action_group; + GError *error; + char *file; EEL_CALL_PARENT (FM_DIRECTORY_VIEW_CLASS, merge_menus, (view)); desktop_view = FM_DESKTOP_ICON_VIEW (view); - desktop_view->details->ui = bonobo_ui_component_new ("Desktop Icon View"); - - ui_container = fm_directory_view_get_bonobo_ui_container (view); - bonobo_ui_component_set_container (desktop_view->details->ui, - ui_container, NULL); - bonobo_object_release_unref (ui_container, NULL); - bonobo_ui_util_set_ui (desktop_view->details->ui, - DATADIR, - "nautilus-desktop-icon-view-ui.xml", - "nautilus", NULL); - bonobo_ui_component_add_verb_list_with_data (desktop_view->details->ui, verbs, view); + ui_manager = fm_directory_view_get_ui_manager (view); + + action_group = gtk_action_group_new ("DesktopViewActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + desktop_view->details->desktop_action_group = action_group; + gtk_action_group_add_actions (action_group, + desktop_view_entries, G_N_ELEMENTS (desktop_view_entries), + view); + + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ + + error = NULL; + file = nautilus_ui_file ("nautilus-desktop-icon-view-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (ui_manager, file, &error)) { + g_error ("building menus failed: %s", error->message); + g_error_free (error); + } + g_free (file); } static gboolean diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index ebd5f58fb..ee8b5ce7e 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -32,13 +32,10 @@ #include "fm-directory-view.h" #include "fm-list-view.h" +#include "fm-actions.h" #include "fm-error-reporting.h" #include "fm-properties-window.h" #include <libgnome/gnome-url.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-window.h> -#include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-exception.h> #include <eel/eel-alert-dialog.h> #include <eel/eel-background.h> #include <eel/eel-glib-extensions.h> @@ -58,6 +55,7 @@ #include <gtk/gtkstock.h> #include <gtk/gtkmessagedialog.h> #include <gtk/gtkhbox.h> +#include <gtk/gtktoggleaction.h> #include <gtk/gtkentry.h> #include <libgnome/gnome-i18n.h> #include <libgnome/gnome-util.h> @@ -71,7 +69,6 @@ #include <libgnomevfs/gnome-vfs-utils.h> #include <libnautilus-private/nautilus-recent.h> #include <libnautilus-extension/nautilus-menu-provider.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-clipboard-monitor.h> #include <libnautilus-private/nautilus-desktop-icon-file.h> #include <libnautilus-private/nautilus-desktop-directory.h> @@ -91,10 +88,8 @@ #include <libnautilus-private/nautilus-program-choosing.h> #include <libnautilus-private/nautilus-trash-directory.h> #include <libnautilus-private/nautilus-trash-monitor.h> -#include <libnautilus-private/nautilus-bonobo-ui.h> #include <unistd.h> - /* Number of seconds until cancel dialog shows up */ #define DELAY_UNTIL_CANCEL_MSECS 5000 @@ -113,77 +108,49 @@ /* MOD2 is num lock -- I would include MOD3-5 if I was sure they were not lock keys */ #define ALL_NON_LOCK_MODIFIER_KEYS (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK) -/* Paths to use when referring to bonobo menu items. Paths used by - * subclasses are in fm-directory-view.h - */ -#define FM_DIRECTORY_VIEW_COMMAND_RENAME "/commands/Rename" -#define FM_DIRECTORY_VIEW_COMMAND_OPEN "/commands/Open" -#define FM_DIRECTORY_VIEW_COMMAND_OPEN_ALTERNATE "/commands/OpenAlternate" -#define FM_DIRECTORY_VIEW_COMMAND_OPEN_WITH "/commands/Open With" -#define FM_DIRECTORY_VIEW_COMMAND_NEW_FOLDER "/commands/New Folder" -#define FM_DIRECTORY_VIEW_COMMAND_NEW_LAUNCHER "/commands/New Launcher" -#define FM_DIRECTORY_VIEW_COMMAND_EDIT_LAUNCHER "/commands/Edit Launcher" -#define FM_DIRECTORY_VIEW_COMMAND_DELETE "/commands/Delete" -#define FM_DIRECTORY_VIEW_COMMAND_TRASH "/commands/Trash" -#define FM_DIRECTORY_VIEW_COMMAND_EMPTY_TRASH "/commands/Empty Trash" -#define FM_DIRECTORY_VIEW_COMMAND_DUPLICATE "/commands/Duplicate" -#define FM_DIRECTORY_VIEW_COMMAND_CREATE_LINK "/commands/Create Link" -#define FM_DIRECTORY_VIEW_COMMAND_PROPERTIES "/commands/Properties" -#define FM_DIRECTORY_VIEW_COMMAND_OTHER_APPLICATION "/commands/OtherApplication" -#define FM_DIRECTORY_VIEW_COMMAND_CUT_FILES "/commands/Cut Files" -#define FM_DIRECTORY_VIEW_COMMAND_COPY_FILES "/commands/Copy Files" -#define FM_DIRECTORY_VIEW_COMMAND_PASTE_FILES "/commands/Paste Files" -#define FM_DIRECTORY_VIEW_COMMAND_PASTE_FILES_INTO "/commands/Paste Files Into" -#define FM_DIRECTORY_VIEW_COMMAND_MOUNT_VOLUME_CONDITIONAL "/commands/Mount Volume Conditional" -#define FM_DIRECTORY_VIEW_COMMAND_UNMOUNT_VOLUME_CONDITIONAL "/commands/Unmount Volume Conditional" -#define FM_DIRECTORY_VIEW_COMMAND_PROTECT_VOLUME_CONDITIONAL "/commands/Protect Conditional" -#define FM_DIRECTORY_VIEW_COMMAND_FORMAT_VOLUME_CONDITIONAL "/commands/Format Conditional" -#define FM_DIRECTORY_VIEW_COMMAND_MEDIA_PROPERTIES_VOLUME_CONDITIONAL "/commands/Media Properties Conditional" -#define FM_DIRECTORY_VIEW_COMMAND_CONNECT_TO_SERVER_LINK_CONDITIONAL "/commands/Connect To Server Link Conditional" - -#define FM_DIRECTORY_VIEW_MENU_PATH_OPEN_WITH "/menu/File/Open Placeholder/Open With" -#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS "/menu/File/New Items Placeholder/New Documents" -#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_NO_TEMPLATES "/menu/File/New Items Placeholder/New Documents/No Templates" -#define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS "/menu/File/Open Placeholder/Scripts" -#define FM_DIRECTORY_VIEW_MENU_PATH_TRASH "/menu/Edit/Dangerous File Items Placeholder/Trash" -#define FM_DIRECTORY_VIEW_MENU_PATH_DELETE "/menu/Edit/Dangerous File Items Placeholder/Delete" -#define FM_DIRECTORY_VIEW_MENU_PATH_EMPTY_TRASH "/menu/File/Global File Items Placeholder/Empty Trash" -#define FM_DIRECTORY_VIEW_MENU_PATH_CREATE_LINK "/menu/Edit/File Items Placeholder/Create Link" -#define FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER "/menu/File/Open Placeholder/Open With/Applications Placeholder" -#define FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER "/menu/File/Open Placeholder/Applications Placeholder" -#define FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION_PLACEHOLDER "/menu/File/Open Placeholder/OtherApplicationPlaceholder" -#define FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION "/menu/File/Open Placeholder/OtherApplicationPlaceholder/OtherApplication" -#define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER "/menu/File/Open Placeholder/Scripts/Scripts Placeholder" -#define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_SEPARATOR "/menu/File/Open Placeholder/Scripts/After Scripts" -#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_PLACEHOLDER "/menu/File/New Items Placeholder/New Documents/New Documents Placeholder" -#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_SEPARATOR "/menu/File/New Items Placeholder/New Documents/After New Documents" -#define FM_DIRECTORY_VIEW_MENU_PATH_CUT_FILES "/menu/Edit/Cut" -#define FM_DIRECTORY_VIEW_MENU_PATH_COPY_FILES "/menu/Edit/Copy" -#define FM_DIRECTORY_VIEW_MENU_PATH_PASTE_FILES "/menu/Edit/Paste" -#define FM_DIRECTORY_VIEW_MENU_PATH_EXTENSION_ACTIONS_PLACEHOLDER "/menu/Edit/Extension Actions" - -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND "/popups/background" -#define FM_DIRECTORY_VIEW_POPUP_PATH_SELECTION "/popups/selection" - -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS "/popups/background/Before Zoom Items/Scripts" -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS_PLACEHOLDER "/popups/background/Before Zoom Items/Scripts/Scripts Placeholder" -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS_SEPARATOR "/popups/background/Before Zoom Items/Scripts/After Scripts" -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS "/popups/background/Before Zoom Items/New Documents" -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_NO_TEMPLATES "/popups/background/Before Zoom Items/New Documents/No Templates" -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_PLACEHOLDER "/popups/background/Before Zoom Items/New Documents/New Documents Placeholder" -#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_SEPARATOR "/popups/background/Before Zoom Items/New Documents/After New Documents" - -#define FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER "/popups/selection/Open Placeholder/Open With/Applications Placeholder" -#define FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER "/popups/selection/Open Placeholder/Applications Placeholder" -#define FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_PLACEHOLDER "/popups/selection/Open Placeholder" -#define FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION_PLACEHOLDER "/popups/selection/Open Placeholder/OtherApplicationPlaceholder" -#define FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION "/popups/selection/Open Placeholder/OtherApplicationPlaceholder/OtherApplication" - -#define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_PLACEHOLDER "/popups/selection/Open Placeholder/Scripts/Scripts Placeholder" -#define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_SEPARATOR "/popups/selection/Open Placeholder/Scripts/After Scripts" -#define FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_WITH "/popups/selection/Open Placeholder/Open With" -#define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS "/popups/selection/Open Placeholder/Scripts" -#define FM_DIRECTORY_VIEW_POPUP_PATH_EXTENSION_ACTIONS "/popups/selection/Extension Actions" +#define FM_DIRECTORY_VIEW_MENU_PATH_OPEN_WITH "/MenuBar/File/Open Placeholder/Open With" +#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS "/MenuBar/File/New Items Placeholder/New Documents" +#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_NO_TEMPLATES "/MenuBar/File/New Items Placeholder/New Documents/No Templates" +#define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS "/MenuBar/File/Open Placeholder/Scripts" +#define FM_DIRECTORY_VIEW_MENU_PATH_TRASH "/MenuBar/Edit/Dangerous File Items Placeholder/Trash" +#define FM_DIRECTORY_VIEW_MENU_PATH_DELETE "/MenuBar/Edit/Dangerous File Items Placeholder/Delete" +#define FM_DIRECTORY_VIEW_MENU_PATH_EMPTY_TRASH "/MenuBar/File/Global File Items Placeholder/Empty Trash" +#define FM_DIRECTORY_VIEW_MENU_PATH_CREATE_LINK "/MenuBar/Edit/File Items Placeholder/Create Link" +#define FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER "/MenuBar/File/Open Placeholder/Open With/Applications Placeholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER "/MenuBar/File/Open Placeholder/Applications Placeholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION_PLACEHOLDER "/MenuBar/File/Open Placeholder/OtherApplicationPlaceholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION "/MenuBar/File/Open Placeholder/OtherApplicationPlaceholder/OtherApplication" +#define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER "/MenuBar/File/Open Placeholder/Scripts/Scripts Placeholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_SEPARATOR "/MenuBar/File/Open Placeholder/Scripts/After Scripts" +#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_PLACEHOLDER "/MenuBar/File/New Items Placeholder/New Documents/New Documents Placeholder" +#define FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_SEPARATOR "/MenuBar/File/New Items Placeholder/New Documents/After New Documents" +#define FM_DIRECTORY_VIEW_MENU_PATH_CUT_FILES "/MenuBar/Edit/Cut" +#define FM_DIRECTORY_VIEW_MENU_PATH_COPY_FILES "/MenuBar/Edit/Copy" +#define FM_DIRECTORY_VIEW_MENU_PATH_PASTE_FILES "/MenuBar/Edit/Paste" +#define FM_DIRECTORY_VIEW_MENU_PATH_EXTENSION_ACTIONS_PLACEHOLDER "/MenuBar/Edit/Extension Actions" + +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND "/background" +#define FM_DIRECTORY_VIEW_POPUP_PATH_SELECTION "/selection" + +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS "/background/Before Zoom Items/Scripts" +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS_PLACEHOLDER "/background/Before Zoom Items/Scripts/Scripts Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS_SEPARATOR "/background/Before Zoom Items/Scripts/After Scripts" +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS "/background/Before Zoom Items/New Documents" +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_NO_TEMPLATES "/background/Before Zoom Items/New Documents/No Templates" +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_PLACEHOLDER "/background/Before Zoom Items/New Documents/New Documents Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_SEPARATOR "/background/Before Zoom Items/New Documents/After New Documents" + +#define FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER "/selection/Open Placeholder/Open With/Applications Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER "/selection/Open Placeholder/Applications Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_PLACEHOLDER "/selection/Open Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION_PLACEHOLDER "/selection/Open Placeholder/OtherApplicationPlaceholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION "/selection/Open Placeholder/OtherApplicationPlaceholder/OtherApplication" + +#define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_PLACEHOLDER "/selection/Open Placeholder/Scripts/Scripts Placeholder" +#define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_SEPARATOR "/selection/Open Placeholder/Scripts/After Scripts" +#define FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_WITH "/selection/Open Placeholder/Open With" +#define FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS "/selection/Open Placeholder/Scripts" +#define FM_DIRECTORY_VIEW_POPUP_PATH_EXTENSION_ACTIONS "/selection/Extension Actions" #define MAX_MENU_LEVELS 5 @@ -228,11 +195,19 @@ struct FMDirectoryViewDetails NautilusWindowInfo *window; NautilusDirectory *model; NautilusFile *directory_as_file; - BonoboUIComponent *ui; + GtkActionGroup *dir_action_group; GList *scripts_directory_list; + GtkActionGroup *scripts_action_group; + guint scripts_merge_id; + GList *templates_directory_list; + GtkActionGroup *templates_action_group; + guint templates_merge_id; + GtkActionGroup *extensions_menu_action_group; + guint extensions_menu_merge_id; + guint display_selection_idle_id; guint update_menus_timeout_id; guint update_status_idle_id; @@ -261,7 +236,6 @@ struct FMDirectoryViewDetails * after it finishes loading the directory and its view. */ gboolean loading; - gboolean menus_merged; gboolean menu_states_untrustworthy; gboolean scripts_invalid; gboolean templates_invalid; @@ -283,6 +257,8 @@ struct FMDirectoryViewDetails gboolean send_selection_change_to_shell; NautilusFile *file_monitored_for_open_with; + GtkActionGroup *open_with_action_group; + guint open_with_merge_id; }; typedef enum { @@ -380,6 +356,29 @@ static gboolean activate_check_mime_types (FMDirectoryView NautilusFile *file, gboolean warn_on_mismatch); +static void action_open_scripts_folder_callback (GtkAction *action, + gpointer callback_data); +static void action_cut_files_callback (GtkAction *action, + gpointer callback_data); +static void action_copy_files_callback (GtkAction *action, + gpointer callback_data); +static void action_paste_files_callback (GtkAction *action, + gpointer callback_data); +static void action_rename_callback (GtkAction *action, + gpointer callback_data); +static void action_show_hidden_files_callback (GtkAction *action, + gpointer callback_data); +static void action_reset_background_callback (GtkAction *action, + gpointer callback_data); +static void action_paste_files_into_callback (GtkAction *action, + gpointer callback_data); +static void action_connect_to_server_link_callback (GtkAction *action, + gpointer data); +static void action_mount_volume_callback (GtkAction *action, + gpointer data); +static void action_unmount_volume_callback (GtkAction *action, + gpointer data); + EEL_CLASS_BOILERPLATE (FMDirectoryView, fm_directory_view, GTK_TYPE_SCROLLED_WINDOW) EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (fm_directory_view, add_file) @@ -585,7 +584,8 @@ selection_not_empty_in_menu_callback (FMDirectoryView *view, GList *selection) } static void -open_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_open_callback (GtkAction *action, + gpointer callback_data) { GList *selection; FMDirectoryView *view; @@ -600,7 +600,8 @@ open_callback (BonoboUIComponent *component, gpointer callback_data, const char } static void -open_close_parent_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_open_close_parent_callback (GtkAction *action, + gpointer callback_data) { GList *selection; FMDirectoryView *view; @@ -616,7 +617,8 @@ open_close_parent_callback (BonoboUIComponent *component, gpointer callback_data static void -open_alternate_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_open_alternate_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; GList *selection; @@ -777,7 +779,8 @@ open_with_other_program (FMDirectoryView *view) } static void -other_application_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_other_application_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -800,8 +803,10 @@ edit_launcher (FMDirectoryView *view, g_free (uri); } + /* BONOBOTODO: do we use this anymore? */ static void -edit_launcher_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_edit_launcher_callback (GtkAction *action, + gpointer callback_data) { GList *selection; FMDirectoryView *view; @@ -830,7 +835,8 @@ trash_or_delete_selected_files (FMDirectoryView *view) } static void -trash_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_trash_callback (GtkAction *action, + gpointer callback_data) { trash_or_delete_selected_files (FM_DIRECTORY_VIEW (callback_data)); } @@ -909,7 +915,8 @@ delete_selected_files (FMDirectoryView *view) } static void -delete_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_delete_callback (GtkAction *action, + gpointer callback_data) { if (!show_delete_command_auto_value) { return; @@ -918,7 +925,8 @@ delete_callback (BonoboUIComponent *component, gpointer callback_data, const cha } static void -duplicate_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_duplicate_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; GList *selection; @@ -942,7 +950,8 @@ duplicate_callback (BonoboUIComponent *component, gpointer callback_data, const } static void -create_link_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_create_link_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; GList *selection; @@ -962,9 +971,8 @@ create_link_callback (BonoboUIComponent *component, gpointer callback_data, cons } static void -bonobo_menu_select_all_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_select_all_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -1041,9 +1049,8 @@ select_pattern (FMDirectoryView *view) } static void -bonobo_menu_select_pattern_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_select_pattern_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -1051,9 +1058,8 @@ bonobo_menu_select_pattern_callback (BonoboUIComponent *component, } static void -reset_to_defaults_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_reset_to_defaults_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -1062,10 +1068,7 @@ reset_to_defaults_callback (BonoboUIComponent *component, static void -show_hidden_files_toggle_callback (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, +action_show_hidden_files_callback (GtkAction *action, gpointer callback_data) { FMDirectoryView *directory_view; @@ -1073,13 +1076,9 @@ show_hidden_files_toggle_callback (BonoboUIComponent *component, g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); directory_view = FM_DIRECTORY_VIEW (callback_data); - - if (strcmp (state, "") == 0) { - /* State goes blank when component is removed; ignore this. */ - return; - } - directory_view->details->show_hidden_files = strcmp (state, "1") == 0; + directory_view->details->show_hidden_files = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + if (directory_view->details->show_hidden_files) { mode = NAUTILUS_WINDOW_SHOW_HIDDEN_FILES_ENABLE; } else { @@ -1092,9 +1091,8 @@ show_hidden_files_toggle_callback (BonoboUIComponent *component, } static void -bonobo_menu_empty_trash_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_empty_trash_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -1102,7 +1100,8 @@ bonobo_menu_empty_trash_callback (BonoboUIComponent *component, } static void -new_folder_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_new_folder_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -1110,7 +1109,8 @@ new_folder_callback (BonoboUIComponent *component, gpointer callback_data, const } static void -new_empty_file_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_new_empty_file_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -1118,7 +1118,8 @@ new_empty_file_callback (BonoboUIComponent *component, gpointer callback_data, c } static void -new_launcher_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_new_launcher_callback (GtkAction *action, + gpointer callback_data) { char *parent_uri; FMDirectoryView *view; @@ -1139,7 +1140,8 @@ new_launcher_callback (BonoboUIComponent *component, gpointer callback_data, con } static void -open_properties_window_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_properties_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; GList *selection; @@ -1214,34 +1216,6 @@ we_are_in_vfolder_desktop_dir (FMDirectoryView *view) } } -static void -parent_set_callback (GtkWidget *widget, - GtkWidget *previous_parent, - gpointer callback_data) -{ - FMDirectoryView *view; - - g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); - - view = FM_DIRECTORY_VIEW (callback_data); - - if (widget->parent != NULL) { - /* Add new menu items and perhaps whole menus */ - fm_directory_view_merge_menus (view); - - /* Set initial sensitivity, wording, toggle state, etc. */ - fm_directory_view_update_menus (view); - - /* initialise show hidden mode */ - fm_directory_view_init_show_hidden_files (view); - } - - /* - * Nothing to do on deactivate case, which never happens because - * of the way Nautilus content views are handled. - */ -} - /* Preferences changed callbacks */ static void text_attribute_names_changed_callback (gpointer callback_data) @@ -1492,7 +1466,17 @@ static void fm_directory_view_set_parent_window (FMDirectoryView *directory_view, NautilusWindowInfo *window) { - directory_view->details->window = window; + + directory_view->details->window = window; + + /* Add new menu items and perhaps whole menus */ + fm_directory_view_merge_menus (directory_view); + + /* Set initial sensitivity, wording, toggle state, etc. */ + fm_directory_view_update_menus (directory_view); + + /* initialise show hidden mode */ + fm_directory_view_init_show_hidden_files (directory_view); } static GtkWidget * @@ -1639,8 +1623,6 @@ fm_directory_view_init (FMDirectoryView *view) view->details->sort_directories_first = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_SORT_DIRECTORIES_FIRST); - g_signal_connect_object (view, "parent_set", - G_CALLBACK (parent_set_callback), view, 0); g_signal_connect_object (nautilus_trash_monitor_get (), "trash_state_changed", G_CALLBACK (fm_directory_view_trash_state_changed_callback), view, 0); @@ -1721,8 +1703,6 @@ fm_directory_view_destroy (GtkObject *object) fm_directory_view_ignore_hidden_file_preferences (view); - eel_remove_weak_pointer (&view->details->ui); - EEL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object)); } @@ -2052,7 +2032,8 @@ done_loading (FMDirectoryView *view) } static void -reset_background_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_reset_background_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_DIRECTORY_VIEW (callback_data)); @@ -2488,7 +2469,7 @@ static gboolean update_menus_timeout_callback (gpointer data) { FMDirectoryView *view; - + view = FM_DIRECTORY_VIEW (data); g_object_ref (G_OBJECT (view)); @@ -2912,25 +2893,10 @@ fm_directory_view_get_item_count (FMDirectoryView *view) get_item_count, (view)); } -/** - * fm_directory_view_get_bonobo_ui_container: - * - * Get the BonoboUIContainer for this FMDirectoryView. - * This is normally called only by subclasses in order to - * install and modify bonobo menus and such. - * @view: FMDirectoryView of interest. - * - * Return value: BonoboUIContainer for this view. - * - **/ -Bonobo_UIContainer -fm_directory_view_get_bonobo_ui_container (FMDirectoryView *view) +GtkUIManager * +fm_directory_view_get_ui_manager (FMDirectoryView *view) { - Bonobo_UIContainer ui_container; - g_return_val_if_fail (FM_IS_DIRECTORY_VIEW (view), NULL); - - ui_container = nautilus_window_info_get_ui_container (view->details->window); - return bonobo_object_dup_ref (ui_container, NULL); + return nautilus_window_info_get_ui_manager (view->details->window); } /** @@ -3565,7 +3531,8 @@ fm_directory_view_get_directory_as_file (FMDirectoryView *view) } static void -bonobo_launch_application_callback (BonoboUIComponent *component, gpointer callback_data, const char *path) +open_with_launch_application_callback (GtkAction *action, + gpointer callback_data) { ApplicationLaunchParameters *launch_parameters; @@ -3574,108 +3541,176 @@ bonobo_launch_application_callback (BonoboUIComponent *component, gpointer callb (launch_parameters->application, launch_parameters->file, launch_parameters->directory_view); -} +} -static void -add_numbered_menu_item (BonoboUIComponent *ui, - const char *parent_path, - const char *label, - const char *tip, - int index, - GdkPixbuf *pixbuf, - gpointer callback, - gpointer callback_data, - GDestroyNotify destroy_notify) +static char * +escape_action_name (const char *action_name, + const char *prefix) { - char *escaped_parent_path, *escaped_label, *verb_name, *item_path; + GString *s; - if (parent_path == NULL) { - return; + if (action_name == NULL) { + return NULL; } - escaped_parent_path = eel_str_double_underscores (parent_path); + s = g_string_new (prefix); - escaped_label = eel_str_double_underscores (label); - nautilus_bonobo_add_numbered_menu_item - (ui, - escaped_parent_path, - index, - escaped_label, - pixbuf); - g_free (escaped_label); + while (*action_name != 0) { + switch (*action_name) { + case '\\': + g_string_append (s, "\\\\"); + break; + case '/': + g_string_append (s, "\\s"); + break; + case '&': + g_string_append (s, "\\a"); + break; + case '"': + g_string_append (s, "\\q"); + break; + default: + g_string_append_c (s, *action_name); + } + + action_name ++; + } + return g_string_free (s, FALSE); +} - item_path = nautilus_bonobo_get_numbered_menu_item_path - (ui, escaped_parent_path, index); - nautilus_bonobo_set_tip (ui, item_path, tip); - g_free (item_path); +static char * +escape_action_path (const char *action_path) +{ + GString *s; + + if (action_path == NULL) { + return NULL; + } + + s = g_string_sized_new (strlen (action_path) + 2); - verb_name = nautilus_bonobo_get_numbered_menu_item_command - (ui, escaped_parent_path, index); - bonobo_ui_component_add_verb_full (ui, verb_name, - g_cclosure_new (callback, callback_data, - (GClosureNotify) destroy_notify)); - g_free (verb_name); + while (*action_path != 0) { + switch (*action_path) { + case '\\': + g_string_append (s, "\\\\"); + break; + case '&': + g_string_append (s, "\\a"); + break; + case '"': + g_string_append (s, "\\q"); + break; + default: + g_string_append_c (s, *action_path); + } - g_free (escaped_parent_path); + action_path ++; + } + return g_string_free (s, FALSE); } + static void -add_submenu (BonoboUIComponent *ui, +add_submenu (GtkUIManager *ui_manager, + GtkActionGroup *action_group, + guint merge_id, const char *parent_path, + const char *uri, const char *label, GdkPixbuf *pixbuf) { - char *escaped_parent_path, *escaped_label; - + char *escaped_label; + char *action_name; + char *submenu_name; + char *escaped_submenu_name; + GtkAction *action; + if (parent_path != NULL) { - escaped_parent_path = eel_str_double_underscores (parent_path); + action_name = escape_action_name (uri, "submenu_"); + submenu_name = g_path_get_basename (uri); + escaped_submenu_name = escape_action_path (submenu_name); escaped_label = eel_str_double_underscores (label); - nautilus_bonobo_add_submenu (ui, escaped_parent_path, escaped_label, pixbuf); + + action = gtk_action_new (action_name, + escaped_label, + NULL, + NULL); + g_object_set_data_full (G_OBJECT (action), "menu-icon", + g_object_ref (pixbuf), + g_object_unref); + + g_object_set (action, "hide-if-empty", FALSE, NULL); + + gtk_action_group_add_action (action_group, + action); + g_object_unref (action); + + gtk_ui_manager_add_ui (ui_manager, + merge_id, + parent_path, + escaped_submenu_name, + action_name, + GTK_UI_MANAGER_MENU, + FALSE); + g_free (action_name); g_free (escaped_label); - g_free (escaped_parent_path); + g_free (submenu_name); + g_free (escaped_submenu_name); } } static void -add_application_to_bonobo_menu (FMDirectoryView *directory_view, - GnomeVFSMimeApplication *application, - NautilusFile *file, - int index, - const char *menu_placeholder, - const char *popup_placeholder) +add_application_to_open_with_menu (FMDirectoryView *view, + GnomeVFSMimeApplication *application, + NautilusFile *file, + int index, + const char *menu_placeholder, + const char *popup_placeholder) { ApplicationLaunchParameters *launch_parameters; char *tip; char *label; + char *action_name; + GtkAction *action; launch_parameters = application_launch_parameters_new - (application, file, directory_view); + (application, file, view); label = g_strdup_printf (_("Open with \"%s\""), application->name); tip = g_strdup_printf (_("Use \"%s\" to open the selected item"), application->name); - add_numbered_menu_item (directory_view->details->ui, - menu_placeholder, - label, - tip, - index, - NULL, - bonobo_launch_application_callback, - launch_parameters, - (GDestroyNotify) application_launch_parameters_free); - + action_name = g_strdup_printf ("open_with_%d", index); - /* Use same launch parameters and no DestroyNotify for popup item, which has same - * lifetime as the item in the File menu in the menu bar. - */ - add_numbered_menu_item (directory_view->details->ui, - popup_placeholder, - label, - tip, - index, - NULL, - bonobo_launch_application_callback, - launch_parameters, - NULL); + action = gtk_action_new (action_name, + label, + tip, + NULL); + + g_signal_connect_data (action, "activate", + G_CALLBACK (open_with_launch_application_callback), + launch_parameters, + (GClosureNotify)application_launch_parameters_free, 0); + + gtk_action_group_add_action (view->details->open_with_action_group, + action); + g_object_unref (action); + + gtk_ui_manager_add_ui (nautilus_window_info_get_ui_manager (view->details->window), + view->details->open_with_merge_id, + menu_placeholder, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + gtk_ui_manager_add_ui (nautilus_window_info_get_ui_manager (view->details->window), + view->details->open_with_merge_id, + popup_placeholder, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + g_free (action_name); g_free (label); g_free (tip); } @@ -3816,7 +3851,7 @@ get_activation_action (NautilusFile *file) } static void -reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) +reset_open_with_menu (FMDirectoryView *view, GList *selection) { GList *applications, *node; NautilusFile *file; @@ -3825,17 +3860,34 @@ reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) int num_applications; int index; gboolean other_applications_visible; + GtkUIManager *ui_manager; + guint merge_id; + GtkActionGroup *action_group; + GtkAction *action; /* Clear any previous inserted items in the applications and viewers placeholders */ - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_SUBMENU_PLACEHOLDER); + + ui_manager = nautilus_window_info_get_ui_manager (view->details->window); + if (view->details->open_with_merge_id != 0) { + gtk_ui_manager_remove_ui (ui_manager, + view->details->open_with_merge_id); + view->details->open_with_merge_id = 0; + } + + if (view->details->open_with_action_group != NULL) { + gtk_ui_manager_remove_action_group (ui_manager, + view->details->open_with_action_group); + view->details->open_with_action_group = NULL; + } + merge_id = gtk_ui_manager_new_merge_id (ui_manager); + view->details->open_with_merge_id = merge_id; + action_group = gtk_action_group_new ("OpenWithGroup"); + view->details->open_with_action_group = action_group; + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ + num_applications = 0; /* This menu is only displayed when there's one selected item. */ @@ -3889,11 +3941,11 @@ reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) popup_path = FM_DIRECTORY_VIEW_POPUP_PATH_APPLICATIONS_PLACEHOLDER; } - add_application_to_bonobo_menu (view, - node->data, - file, - index, - menu_path,popup_path); + add_application_to_open_with_menu (view, + node->data, + file, + index, + menu_path, popup_path); } gnome_vfs_mime_application_list_free (applications); @@ -3902,28 +3954,21 @@ reset_bonobo_open_with_menu (FMDirectoryView *view, GList *selection) submenu_visible = (num_applications > 3); } - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OTHER_APPLICATION, - !other_applications_visible); - - /* It's OK to set the visibility of the menu items (rather than the verbs) - * here because these are submenu titles, not items with verbs. - */ - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_OPEN_WITH, - !submenu_visible); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_OPEN_WITH, - !submenu_visible); - - - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_OTHER_APPLICATION_PLACEHOLDER, - submenu_visible); - - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_OTHER_APPLICATION_PLACEHOLDER, - submenu_visible); + if (submenu_visible) { + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_OTHER_APPLICATION1); + gtk_action_set_visible (action, other_applications_visible); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_OTHER_APPLICATION2); + gtk_action_set_visible (action, FALSE); + } else { + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_OTHER_APPLICATION1); + gtk_action_set_visible (action, FALSE); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_OTHER_APPLICATION2); + gtk_action_set_visible (action, other_applications_visible); + } } static GList * @@ -3960,6 +4005,7 @@ typedef struct GList *selection; } ExtensionActionCallbackData; + static void extension_action_callback_data_free (ExtensionActionCallbackData *data) { @@ -4014,8 +4060,8 @@ extension_action_slow_mime_types_ready_callback (GList *selection, } static void -extension_action_callback (BonoboUIComponent *component, - gpointer callback_data, const char *path) +extension_action_callback (GtkAction *action, + gpointer callback_data) { ExtensionActionCallbackData *data; @@ -4028,37 +4074,67 @@ extension_action_callback (BonoboUIComponent *component, callback_data); } -static void -add_extension_command_for_files (FMDirectoryView *view, - NautilusMenuItem *item, - GList *files) +static GtkAction * +add_extension_action_for_files (FMDirectoryView *view, + NautilusMenuItem *item, + GList *files) { - char *xml; - char *name; + char *name, *label, *tip, *icon; + gboolean sensitive, priority; + GtkAction *action; + GdkPixbuf *pixbuf; ExtensionActionCallbackData *data; - GClosure *closure; - - xml = nautilus_bonobo_get_extension_item_command_xml (item); - - bonobo_ui_component_set (view->details->ui, "/commands", xml, NULL); - - g_free (xml); + + g_object_get (G_OBJECT (item), + "name", &name, "label", &label, + "tip", &tip, "icon", &icon, + "sensitive", &sensitive, + "priority", &priority, + NULL); + + action = gtk_action_new (name, + label, + tip, + icon); + + /* TODO: This should really use themed icons, but that + doesn't work here yet */ + if (icon != NULL) { + pixbuf = nautilus_icon_factory_get_pixbuf_from_name + (icon, + NULL, + NAUTILUS_ICON_SIZE_FOR_MENUS, + NULL); + if (pixbuf != NULL) { + g_object_set_data_full (G_OBJECT (action), "menu-icon", + pixbuf, + g_object_unref); + } + } - g_object_get (G_OBJECT (item), "name", &name, NULL); + gtk_action_set_sensitive (action, sensitive); + g_object_set (action, "is-important", priority, NULL); data = g_new0 (ExtensionActionCallbackData, 1); data->item = g_object_ref (item); data->view = view; data->selection = nautilus_file_list_copy (files); - closure = g_cclosure_new - (G_CALLBACK (extension_action_callback), - data, - (GClosureNotify)extension_action_callback_data_free); - - bonobo_ui_component_add_verb_full (view->details->ui, name, closure); + g_signal_connect_data (action, "activate", + G_CALLBACK (extension_action_callback), + data, + (GClosureNotify)extension_action_callback_data_free, 0); + + gtk_action_group_add_action (view->details->extensions_menu_action_group, + GTK_ACTION (action)); + g_object_unref (action); g_free (name); + g_free (label); + g_free (tip); + g_free (icon); + + return action; } static void @@ -4182,20 +4258,34 @@ add_extension_menu_items (FMDirectoryView *view, GList *files, GList *menu_items) { + GtkUIManager *ui_manager; GList *l; + + ui_manager = nautilus_window_info_get_ui_manager (view->details->window); + for (l = menu_items; l; l = l->next) { NautilusMenuItem *item; + GtkAction *action; item = NAUTILUS_MENU_ITEM (l->data); - add_extension_command_for_files (view, item, files); - - nautilus_bonobo_add_extension_item (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_EXTENSION_ACTIONS, - item); - nautilus_bonobo_add_extension_item (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_EXTENSION_ACTIONS_PLACEHOLDER, - item); + action = add_extension_action_for_files (view, item, files); + + gtk_ui_manager_add_ui (ui_manager, + view->details->extensions_menu_merge_id, + FM_DIRECTORY_VIEW_POPUP_PATH_EXTENSION_ACTIONS, + gtk_action_get_name (action), + gtk_action_get_name (action), + GTK_UI_MANAGER_MENUITEM, + FALSE); + + gtk_ui_manager_add_ui (ui_manager, + view->details->extensions_menu_merge_id, + FM_DIRECTORY_VIEW_MENU_PATH_EXTENSION_ACTIONS_PLACEHOLDER, + gtk_action_get_name (action), + gtk_action_get_name (action), + GTK_UI_MANAGER_MENUITEM, + FALSE); } } @@ -4247,12 +4337,32 @@ reset_extension_actions_menu (FMDirectoryView *view, GList *selection) GList *unique_selection; GList *items; GList *l; - + GtkUIManager *ui_manager; + guint merge_id; + GtkActionGroup *action_group; + /* Clear any previous inserted items in the extension actions placeholder */ - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_EXTENSION_ACTIONS); - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_EXTENSION_ACTIONS_PLACEHOLDER); + ui_manager = nautilus_window_info_get_ui_manager (view->details->window); + + if (view->details->extensions_menu_merge_id != 0) { + gtk_ui_manager_remove_ui (ui_manager, + view->details->extensions_menu_merge_id); + view->details->extensions_menu_merge_id = 0; + } + + if (view->details->extensions_menu_action_group != NULL) { + gtk_ui_manager_remove_action_group (ui_manager, + view->details->extensions_menu_action_group); + view->details->extensions_menu_action_group = NULL; + } + + merge_id = gtk_ui_manager_new_merge_id (ui_manager); + view->details->extensions_menu_merge_id = merge_id; + action_group = gtk_action_group_new ("DirExtensionsMenuGroup"); + view->details->extensions_menu_action_group = action_group; + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ /* only query for the unique files */ unique_selection = get_unique_files (selection); @@ -4413,7 +4523,7 @@ unset_script_environment_variables (void) } static void -run_script_callback (BonoboUIComponent *component, gpointer callback_data, const char *path) +run_script_callback (GtkAction *action, gpointer callback_data) { ScriptLaunchParameters *launch_parameters; GdkScreen *screen; @@ -4472,63 +4582,87 @@ run_script_callback (BonoboUIComponent *component, gpointer callback_data, const static void add_script_to_scripts_menus (FMDirectoryView *directory_view, - NautilusFile *file, - int index, - const char *menu_path, - const char *popup_path, - const char *popup_bg_path) + NautilusFile *file, + const char *menu_path, + const char *popup_path, + const char *popup_bg_path) { ScriptLaunchParameters *launch_parameters; char *tip; char *name; + char *uri; + char *action_name; + char *escaped_label; GdkPixbuf *pixbuf; + GtkUIManager *ui_manager; + GtkAction *action; name = nautilus_file_get_display_name (file); + uri = nautilus_file_get_uri (file); tip = g_strdup_printf (_("Run \"%s\" on any selected items"), name); launch_parameters = script_launch_parameters_new (file, directory_view); pixbuf = nautilus_icon_factory_get_pixbuf_for_file (file, NULL, NAUTILUS_ICON_SIZE_FOR_MENUS); - add_numbered_menu_item (directory_view->details->ui, - menu_path, - name, - tip, - index, - pixbuf, - run_script_callback, - launch_parameters, - (GDestroyNotify) script_launch_parameters_free); - - /* Use same launch parameters and no DestroyNotify for popup item, which has same - * lifetime as the item in the File menu in the menu bar. - */ - add_numbered_menu_item (directory_view->details->ui, - popup_path, - name, - tip, - index, - pixbuf, - run_script_callback, - launch_parameters, - NULL); - add_numbered_menu_item (directory_view->details->ui, - popup_bg_path, - name, - tip, - index, - pixbuf, - run_script_callback, - launch_parameters, - NULL); + action_name = escape_action_name (uri, "script_"); + escaped_label = eel_str_double_underscores (name); + + action = gtk_action_new (action_name, + escaped_label, + tip, + NULL); + + g_object_set_data_full (G_OBJECT (action), "menu-icon", + g_object_ref (pixbuf), + g_object_unref); + + g_signal_connect_data (action, "activate", + G_CALLBACK (run_script_callback), + launch_parameters, + (GClosureNotify)script_launch_parameters_free, 0); + + gtk_action_group_add_action (directory_view->details->scripts_action_group, + action); + g_object_unref (action); + + ui_manager = nautilus_window_info_get_ui_manager (directory_view->details->window); + + gtk_ui_manager_add_ui (ui_manager, + directory_view->details->scripts_merge_id, + menu_path, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + gtk_ui_manager_add_ui (ui_manager, + directory_view->details->scripts_merge_id, + popup_path, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + gtk_ui_manager_add_ui (ui_manager, + directory_view->details->scripts_merge_id, + popup_bg_path, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + g_object_unref (pixbuf); g_free (name); + g_free (uri); g_free (tip); + g_free (action_name); + g_free (escaped_label); } static void add_submenu_to_directory_menus (FMDirectoryView *directory_view, + GtkActionGroup *action_group, + guint merge_id, NautilusFile *file, const char *menu_path, const char *popup_path, @@ -4536,15 +4670,20 @@ add_submenu_to_directory_menus (FMDirectoryView *directory_view, { char *name; GdkPixbuf *pixbuf; + char *uri; + GtkUIManager *ui_manager; + ui_manager = nautilus_window_info_get_ui_manager (directory_view->details->window); + uri = nautilus_file_get_uri (file); name = nautilus_file_get_display_name (file); pixbuf = nautilus_icon_factory_get_pixbuf_for_file (file, NULL, NAUTILUS_ICON_SIZE_FOR_MENUS); - add_submenu (directory_view->details->ui, menu_path, name, pixbuf); - add_submenu (directory_view->details->ui, popup_path, name, pixbuf); - add_submenu (directory_view->details->ui, popup_bg_path, name, pixbuf); + add_submenu (ui_manager, action_group, merge_id, menu_path, uri, name, pixbuf); + add_submenu (ui_manager, action_group, merge_id, popup_path, uri, name, pixbuf); + add_submenu (ui_manager, action_group, merge_id, popup_bg_path, uri, name, pixbuf); g_object_unref (pixbuf); g_free (name); + g_free (uri); } static gboolean @@ -4581,10 +4720,9 @@ update_directory_in_scripts_menu (FMDirectoryView *view, NautilusDirectory *dire NautilusDirectory *dir; char *uri; char *escaped_path; - int i; uri = nautilus_directory_get_uri (directory); - escaped_path = gnome_vfs_escape_path_string (uri + scripts_directory_uri_length); + escaped_path = escape_action_path (uri + scripts_directory_uri_length); g_free (uri); menu_path = g_strconcat (FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER, escaped_path, @@ -4604,12 +4742,11 @@ update_directory_in_scripts_menu (FMDirectoryView *view, NautilusDirectory *dire file_list = nautilus_file_list_sort_by_display_name (filtered); any_scripts = FALSE; - i = 0; for (node = file_list; node != NULL; node = node->next) { file = node->data; if (file_is_launchable (file)) { - add_script_to_scripts_menus (view, file, i++, menu_path, popup_path, popup_bg_path); + add_script_to_scripts_menus (view, file, menu_path, popup_path, popup_bg_path); any_scripts = TRUE; } else if (nautilus_file_is_directory (file)) { uri = nautilus_file_get_uri (file); @@ -4618,7 +4755,10 @@ update_directory_in_scripts_menu (FMDirectoryView *view, NautilusDirectory *dire add_directory_to_scripts_directory_list (view, dir); nautilus_directory_unref (dir); - add_submenu_to_directory_menus (view, file, menu_path, popup_path, popup_bg_path); + add_submenu_to_directory_menus (view, + view->details->scripts_action_group, + view->details->scripts_merge_id, + file, menu_path, popup_path, popup_bg_path); any_scripts = TRUE; } @@ -4642,18 +4782,35 @@ update_scripts_menu (FMDirectoryView *view) GList *sorted_copy, *node; NautilusDirectory *directory; char *uri; + GtkUIManager *ui_manager; + guint merge_id; + GtkActionGroup *action_group; + GtkAction *action; /* There is a race condition here. If we don't mark the scripts menu as valid before we begin our task then we can lose script menu updates that occur before we finish. */ view->details->scripts_invalid = FALSE; - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS_PLACEHOLDER); + ui_manager = nautilus_window_info_get_ui_manager (view->details->window); + if (view->details->scripts_merge_id != 0) { + gtk_ui_manager_remove_ui (ui_manager, + view->details->scripts_merge_id); + view->details->scripts_merge_id = 0; + } + + if (view->details->scripts_action_group != NULL) { + gtk_ui_manager_remove_action_group (ui_manager, + view->details->scripts_action_group); + view->details->scripts_action_group = NULL; + } + + merge_id = gtk_ui_manager_new_merge_id (ui_manager); + view->details->scripts_merge_id = merge_id; + action_group = gtk_action_group_new ("ScriptsGroup"); + view->details->scripts_action_group = action_group; + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ /* As we walk through the directories, remove any that no longer belong. */ any_scripts = FALSE; @@ -4672,28 +4829,12 @@ update_scripts_menu (FMDirectoryView *view) } nautilus_directory_list_free (sorted_copy); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS, - !any_scripts); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS, - !any_scripts); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS, - !any_scripts); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_SEPARATOR, - !any_scripts); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_SEPARATOR, - !any_scripts); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_SCRIPTS_SEPARATOR, - !any_scripts); -} - -static void -create_template_callback (BonoboUIComponent *component, gpointer callback_data, const char *path) + action = gtk_action_group_get_action (view->details->dir_action_group, FM_ACTION_SCRIPTS); + gtk_action_set_visible (action, any_scripts); +} + +static void +create_template_callback (GtkAction *action, gpointer callback_data) { CreateTemplateParameters *parameters; @@ -4702,22 +4843,23 @@ create_template_callback (BonoboUIComponent *component, gpointer callback_data, fm_directory_view_new_file (parameters->directory_view, parameters->file); } - static void add_template_to_templates_menus (FMDirectoryView *directory_view, NautilusFile *file, - int index, const char *menu_path, const char *popup_bg_path) { - char *tip; - char *name; - char *dot; + char *tip, *uri, *name; + char *dot, *escaped_label; GdkPixbuf *pixbuf; + char *action_name; CreateTemplateParameters *parameters; + GtkUIManager *ui_manager; + GtkAction *action; + name = nautilus_file_get_display_name (file); - + uri = nautilus_file_get_uri (file); tip = g_strdup_printf (_("Create Document from template \"%s\""), name); /* Remove extension */ @@ -4729,33 +4871,53 @@ add_template_to_templates_menus (FMDirectoryView *directory_view, pixbuf = nautilus_icon_factory_get_pixbuf_for_file (file, NULL, NAUTILUS_ICON_SIZE_FOR_MENUS); + action_name = escape_action_name (uri, "template_"); + escaped_label = eel_str_double_underscores (name); + parameters = create_template_parameters_new (file, directory_view); - add_numbered_menu_item (directory_view->details->ui, - menu_path, - name, - tip, - index, - pixbuf, - create_template_callback, - parameters, - (GDestroyNotify) create_templates_parameters_free); - - /* Use same uri and no DestroyNotify for popup item, which has same - * lifetime as the item in the File menu in the menu bar. - */ - add_numbered_menu_item (directory_view->details->ui, - popup_bg_path, - name, - tip, - index, - pixbuf, - create_template_callback, - parameters, - NULL); + action = gtk_action_new (action_name, + escaped_label, + tip, + NULL); + + g_object_set_data_full (G_OBJECT (action), "menu-icon", + g_object_ref (pixbuf), + g_object_unref); + + g_signal_connect_data (action, "activate", + G_CALLBACK (create_template_callback), + parameters, + (GClosureNotify)create_templates_parameters_free, 0); + + gtk_action_group_add_action (directory_view->details->templates_action_group, + action); + g_object_unref (action); + + ui_manager = nautilus_window_info_get_ui_manager (directory_view->details->window); + + gtk_ui_manager_add_ui (ui_manager, + directory_view->details->templates_merge_id, + menu_path, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + gtk_ui_manager_add_ui (ui_manager, + directory_view->details->templates_merge_id, + popup_bg_path, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + g_object_unref (pixbuf); + g_free (escaped_label); g_free (name); g_free (tip); + g_free (uri); + g_free (action_name); } @@ -4793,18 +4955,16 @@ update_directory_in_templates_menu (FMDirectoryView *view, NautilusDirectory *di NautilusDirectory *dir; char *escaped_path; char *uri; - int i; uri = nautilus_directory_get_uri (directory); - escaped_path = gnome_vfs_escape_path_string (uri + templates_directory_uri_length); + escaped_path = escape_action_path (uri + templates_directory_uri_length); g_free (uri); menu_path = g_strconcat (FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_PLACEHOLDER, escaped_path, NULL); popup_bg_path = g_strconcat (FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_PLACEHOLDER, escaped_path, - NULL);; - + NULL); g_free (escaped_path); file_list = nautilus_directory_get_file_list (directory); @@ -4814,7 +4974,6 @@ update_directory_in_templates_menu (FMDirectoryView *view, NautilusDirectory *di file_list = nautilus_file_list_sort_by_display_name (filtered); any_templates = FALSE; - i = 0; for (node = file_list; node != NULL; node = node->next) { file = node->data; @@ -4825,13 +4984,16 @@ update_directory_in_templates_menu (FMDirectoryView *view, NautilusDirectory *di add_directory_to_templates_directory_list (view, dir); nautilus_directory_unref (dir); - add_submenu_to_directory_menus (view, file, menu_path, NULL, popup_bg_path); + add_submenu_to_directory_menus (view, + view->details->templates_action_group, + view->details->templates_merge_id, + file, menu_path, NULL, popup_bg_path); any_templates = TRUE; } g_free (uri); } else if (nautilus_file_can_read (file)) { - add_template_to_templates_menus (view, file, i++, menu_path, popup_bg_path); + add_template_to_templates_menus (view, file, menu_path, popup_bg_path); any_templates = TRUE; } } @@ -4852,17 +5014,36 @@ update_templates_menu (FMDirectoryView *view) gboolean any_templates; GList *sorted_copy, *node; NautilusDirectory *directory; + GtkUIManager *ui_manager; char *uri; + guint merge_id; + GtkActionGroup *action_group; + GtkAction *action; /* There is a race condition here. If we don't mark the scripts menu as valid before we begin our task then we can lose template menu updates that occur before we finish. */ view->details->templates_invalid = FALSE; - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_PLACEHOLDER); + ui_manager = nautilus_window_info_get_ui_manager (view->details->window); + if (view->details->templates_merge_id != 0) { + gtk_ui_manager_remove_ui (ui_manager, + view->details->templates_merge_id); + view->details->templates_merge_id = 0; + } + + if (view->details->templates_action_group != NULL) { + gtk_ui_manager_remove_action_group (ui_manager, + view->details->templates_action_group); + view->details->templates_action_group = NULL; + } + + merge_id = gtk_ui_manager_new_merge_id (ui_manager); + view->details->templates_merge_id = merge_id; + action_group = gtk_action_group_new ("TemplatesGroup"); + view->details->templates_action_group = action_group; + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ /* As we walk through the directories, remove any that no longer belong. */ any_templates = FALSE; @@ -4881,19 +5062,14 @@ update_templates_menu (FMDirectoryView *view) } nautilus_directory_list_free (sorted_copy); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS_NO_TEMPLATES, - any_templates); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS_NO_TEMPLATES, - any_templates); + action = gtk_action_group_get_action (view->details->dir_action_group, FM_ACTION_NO_TEMPLATES); + gtk_action_set_visible (action, !any_templates); } static void -open_scripts_folder_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_open_scripts_folder_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; @@ -4923,21 +5099,6 @@ open_scripts_folder_callback (BonoboUIComponent *component, fm_directory_view_get_containing_window (view)); } -static BonoboWindow * -get_bonobo_window (FMDirectoryView *view) -{ - GtkWidget *window; - - /* Note: This works only because we are in the same process - * as the Nautilus shell. Bonobo components in their own - * processes can't do this. - */ - window = gtk_widget_get_ancestor (GTK_WIDGET (view), BONOBO_TYPE_WINDOW); - g_assert (window != NULL); - - return BONOBO_WINDOW (window); -} - static void popup_menu_hidden (FMDirectoryView *view) { @@ -4947,18 +5108,19 @@ popup_menu_hidden (FMDirectoryView *view) static GtkMenu * create_popup_menu (FMDirectoryView *view, const char *popup_path) { - GtkMenu *menu; + GtkWidget *menu; - menu = GTK_MENU (gtk_menu_new ()); - gtk_menu_set_screen (menu, gtk_widget_get_screen (GTK_WIDGET (view))); + menu = gtk_ui_manager_get_widget (nautilus_window_info_get_ui_manager (view->details->window), + popup_path); + gtk_menu_set_screen (GTK_MENU (menu), + gtk_widget_get_screen (GTK_WIDGET (view))); gtk_widget_show (GTK_WIDGET (menu)); - bonobo_window_add_popup (get_bonobo_window (view), menu, popup_path); - + /* BONOBOTODO: This is likely still needed, but perhaps not? */ g_signal_connect_object (menu, "hide", G_CALLBACK (popup_menu_hidden), G_OBJECT (view), G_CONNECT_SWAPPED); - - return menu; + + return GTK_MENU (menu); } typedef struct { @@ -5120,17 +5282,15 @@ copy_or_cut_files (FMDirectoryView *view, } static void -copy_files_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_copy_files_callback (GtkAction *action, + gpointer callback_data) { copy_or_cut_files (callback_data, FALSE); } static void -cut_files_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_cut_files_callback (GtkAction *action, + gpointer callback_data) { copy_or_cut_files (callback_data, TRUE); } @@ -5239,9 +5399,8 @@ paste_into_clipboard_received_callback (GtkClipboard *clipboard, } static void -paste_files_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_paste_files_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; @@ -5254,9 +5413,8 @@ paste_files_callback (BonoboUIComponent *component, } static void -paste_files_into_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_paste_files_into_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; @@ -5269,7 +5427,8 @@ paste_files_into_callback (BonoboUIComponent *component, } static void -rename_file_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_rename_callback (GtkAction *action, + gpointer callback_data) { FMDirectoryView *view; NautilusFile *file; @@ -5300,9 +5459,8 @@ drive_mounted_callback (gboolean succeeded, static void -mount_volume_callback (BonoboUIComponent *component, - gpointer data, - const char *verb) +action_mount_volume_callback (GtkAction *action, + gpointer data) { NautilusFile *file; GList *selection; @@ -5366,9 +5524,8 @@ volume_or_drive_unmounted_callback (gboolean succeeded, static void -unmount_volume_callback (BonoboUIComponent *component, - gpointer data, - const char *verb) +action_unmount_volume_callback (GtkAction *action, + gpointer data) { NautilusFile *file; GList *selection; @@ -5451,9 +5608,8 @@ entry_activate_callback (GtkEntry *entry, } static void -connect_to_server_link_callback (BonoboUIComponent *component, - gpointer data, - const char *verb) +action_connect_to_server_link_callback (GtkAction *action, + gpointer data) { NautilusFile *file; GList *selection; @@ -5540,6 +5696,7 @@ fm_directory_view_init_show_hidden_files (FMDirectoryView *view) NautilusWindowShowHiddenFilesMode mode; gboolean show_hidden_changed; gboolean show_hidden_default_setting; + GtkAction *action; if (view->details->ignore_hidden_file_preferences) { return; @@ -5567,9 +5724,10 @@ fm_directory_view_init_show_hidden_files (FMDirectoryView *view) } } - nautilus_bonobo_set_toggle_state (view->details->ui, - "/commands/Show Hidden Files", - view->details->show_hidden_files); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_SHOW_HIDDEN_FILES); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + view->details->show_hidden_files); if (show_hidden_changed && (view->details->model != NULL)) { load_directory (view, view->details->model); @@ -5577,69 +5735,176 @@ fm_directory_view_init_show_hidden_files (FMDirectoryView *view) } +static GtkActionEntry directory_view_entries[] = { + { "New Documents", NULL, N_("Create _Document") }, /* name, stock id, label */ + { "Open With", NULL, N_("Open Wit_h"), /* name, stock id, label */ + NULL, N_("Choose a program with which to open the selected item") }, + { "Scripts", NULL, N_("_Scripts"), /* name, stock id, label */ + NULL, N_("Run or manage scripts from ~/.gnome2/nautilus-scripts") }, + { "Properties", GTK_STOCK_PROPERTIES, /* name, stock id */ + N_("_Properties"), "<alt>Return", /* label, accelerator */ + N_("View or modify the properties of each selected item"), /* tooltip */ + G_CALLBACK (action_properties_callback) }, + { "New Folder", NULL, /* name, stock id */ + N_("Create _Folder"), "<control><shift>N", /* label, accelerator */ + N_("Create a new empty folder inside this folder"), /* tooltip */ + G_CALLBACK (action_new_folder_callback) }, + { "No Templates", NULL, N_("No templates Installed") }, /* name, stock id, label */ + { "New Empty File", NULL, /* name, stock id */ + N_("_Empty File"), NULL, /* label, accelerator */ + N_("Create a new empty file inside this folder"), /* tooltip */ + G_CALLBACK (action_new_empty_file_callback) }, + { "New Launcher", NULL, /* name, stock id */ + N_("Create L_auncher"), NULL, /* label, accelerator */ + N_("Create a new launcher"), /* tooltip */ + G_CALLBACK (action_new_launcher_callback) }, + { "Open", GTK_STOCK_OPEN, /* name, stock id */ + N_("_Open"), "<control>o", /* label, accelerator */ + N_("Open the selected item in this window"), /* tooltip */ + G_CALLBACK (action_open_callback) }, + { "OpenAlternate", NULL, /* name, stock id */ + N_("Open in Navigation Window"), "<control><shift>o", /* label, accelerator */ + N_("Open each selected item in a navigation window"), /* tooltip */ + G_CALLBACK (action_open_alternate_callback) }, + { "OtherApplication1", NULL, /* name, stock id */ + N_("Open with Other _Application..."), NULL, /* label, accelerator */ + N_("Choose another application with which to open the selected item"), /* tooltip */ + G_CALLBACK (action_other_application_callback) }, + { "OtherApplication2", NULL, /* name, stock id */ + N_("Open with Other _Application..."), NULL, /* label, accelerator */ + N_("Choose another application with which to open the selected item"), /* tooltip */ + G_CALLBACK (action_other_application_callback) }, + { "Edit Launcher", NULL, /* name, stock id */ + N_("Edit Launcher"), NULL, /* label, accelerator */ + N_("Edit the launcher information"), /* tooltip */ + G_CALLBACK (action_edit_launcher_callback) }, + { "Open Scripts Folder", NULL, /* name, stock id */ + N_("_Open Scripts Folder"), NULL, /* label, accelerator */ + N_("Show the folder containing the scripts that appear in this menu"), /* tooltip */ + G_CALLBACK (action_open_scripts_folder_callback) }, + { "Empty Trash", NULL, /* name, stock id */ + N_("_Empty Trash"), NULL, /* label, accelerator */ + N_("Delete all items in the Trash"), /* tooltip */ + G_CALLBACK (action_empty_trash_callback) }, + { "Cut Files", GTK_STOCK_CUT, /* name, stock id */ + N_("Cu_t Files"), "<control>x", /* label, accelerator */ + N_("Prepare the selected files to be moved with a Paste Files command"), /* tooltip */ + G_CALLBACK (action_cut_files_callback) }, + { "Copy Files", GTK_STOCK_COPY, /* name, stock id */ + N_("_Copy Files"), "<control>c", /* label, accelerator */ + N_("Prepare the selected files to be copied with a Paste Files command"), /* tooltip */ + G_CALLBACK (action_copy_files_callback) }, + { "Paste Files", GTK_STOCK_PASTE, /* name, stock id */ + N_("_Paste Files"), "<control>v", /* label, accelerator */ + N_("Move or copy files previously selected by a Cut Files or Copy Files command"), /* tooltip */ + G_CALLBACK (action_paste_files_callback) }, + { "Paste Files Into", GTK_STOCK_PASTE, /* name, stock id */ + N_("_Paste Files Into Folder"), NULL, /* label, accelerator */ + N_("Move or copy files previously selected by a Cut Files or Copy Files command into the selected folder"), /* tooltip */ + G_CALLBACK (action_paste_files_into_callback) }, + { "Select All", NULL, /* name, stock id */ + N_("_Select _All Files"), "<control>A", /* label, accelerator */ + N_("Select all items in this window"), /* tooltip */ + G_CALLBACK (action_select_all_callback) }, + { "Select Pattern", NULL, /* name, stock id */ + N_("Select _Pattern"), "<control>S", /* label, accelerator */ + N_("Select items in this window matching a given pattern"), /* tooltip */ + G_CALLBACK (action_select_pattern_callback) }, + { "Duplicate", NULL, /* name, stock id */ + N_("D_uplicate"), NULL, /* label, accelerator */ + N_("Duplicate each selected item"), /* tooltip */ + G_CALLBACK (action_duplicate_callback) }, + { "Create Link", NULL, /* name, stock id */ + N_("Ma_ke Link"), "<control>M", /* label, accelerator */ + N_("Create a symbolic link for each selected item"), /* tooltip */ + G_CALLBACK (action_create_link_callback) }, + { "Rename", NULL, /* name, stock id */ + N_("_Rename..."), "F2", /* label, accelerator */ + N_("Rename selected item"), /* tooltip */ + G_CALLBACK (action_rename_callback) }, + { "Trash", GTK_STOCK_DELETE, /* name, stock id */ + N_("Mo_ve to Trash"), "<control>T", /* label, accelerator */ + N_("Move each selected item to the Trash"), /* tooltip */ + G_CALLBACK (action_trash_callback) }, + { "Delete", NULL, /* name, stock id */ + N_("_Delete"), "<shift>Delete", /* label, accelerator */ + N_("Delete each selected item, without moving to the Trash"), /* tooltip */ + G_CALLBACK (action_delete_callback) }, + { "Reset to Defaults", NULL, /* name, stock id */ + N_("Reset View to _Defaults"), NULL, /* label, accelerator */ + N_("Reset sorting order and zoom level to match preferences for this view"), /* tooltip */ + G_CALLBACK (action_reset_to_defaults_callback) }, + { "Reset Background", NULL, /* name, stock id */ + N_("Use _Default Background"), NULL, /* label, accelerator */ + N_("Use the default background for this location"), /* tooltip */ + G_CALLBACK (action_reset_background_callback) }, + { "Connect To Server Link", NULL, /* name, stock id */ + N_("Connect To This Server"), NULL, /* label, accelerator */ + N_("Make a permanent connection to this server"), /* tooltip */ + G_CALLBACK (action_connect_to_server_link_callback) }, + { "Mount Volume", NULL, /* name, stock id */ + N_("_Mount Volume"), NULL, /* label, accelerator */ + N_("Mount the selected volume"), /* tooltip */ + G_CALLBACK (action_mount_volume_callback) }, + { "Unmount Volume", NULL, /* name, stock id */ + N_("_Unmount Volume"), NULL, /* label, accelerator */ + N_("Unmount the selected volume"), /* tooltip */ + G_CALLBACK (action_unmount_volume_callback) }, + { "OpenCloseParent", NULL, /* name, stock id */ + N_("Open File and Close window"), "<alt><shift>Down", /* label, accelerator */ + NULL, /* tooltip */ + G_CALLBACK (action_open_close_parent_callback) }, +}; + +static GtkToggleActionEntry directory_view_toggle_entries[] = { + { "Show Hidden Files", NULL, /* name, stock id */ + N_("Show _Hidden Files"), NULL, /* label, accelerator */ + N_("Toggles the display of hidden files in the current window"), /* tooltip */ + G_CALLBACK (action_show_hidden_files_callback), + TRUE }, +}; + static void real_merge_menus (FMDirectoryView *view) { - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("Rename", rename_file_callback), - BONOBO_UI_VERB ("Copy Files", copy_files_callback), - BONOBO_UI_VERB ("Create Link", create_link_callback), - BONOBO_UI_VERB ("Cut Files", cut_files_callback), - BONOBO_UI_VERB ("Delete", delete_callback), - BONOBO_UI_VERB ("Duplicate", duplicate_callback), - BONOBO_UI_VERB ("Empty Trash", bonobo_menu_empty_trash_callback), - BONOBO_UI_VERB ("New Folder", new_folder_callback), - BONOBO_UI_VERB ("New Empty File", new_empty_file_callback), - BONOBO_UI_VERB ("New Launcher", new_launcher_callback), - BONOBO_UI_VERB ("Open Scripts Folder", open_scripts_folder_callback), - BONOBO_UI_VERB ("Open", open_callback), - BONOBO_UI_VERB ("OpenCloseParent", open_close_parent_callback), - BONOBO_UI_VERB ("OpenAlternate", open_alternate_callback), - BONOBO_UI_VERB ("OtherApplication", other_application_callback), - BONOBO_UI_VERB ("Edit Launcher", edit_launcher_callback), - BONOBO_UI_VERB ("Paste Files", paste_files_callback), - BONOBO_UI_VERB ("Paste Files Into", paste_files_into_callback), - BONOBO_UI_VERB ("Reset Background", reset_background_callback), - BONOBO_UI_VERB ("Reset to Defaults", reset_to_defaults_callback), - BONOBO_UI_VERB ("Select All", bonobo_menu_select_all_callback), - BONOBO_UI_VERB ("Select Pattern", bonobo_menu_select_pattern_callback), - BONOBO_UI_VERB ("Properties", open_properties_window_callback), - BONOBO_UI_VERB ("Trash", trash_callback), - BONOBO_UI_VERB ("Mount Volume Conditional", mount_volume_callback), - BONOBO_UI_VERB ("Unmount Volume Conditional", unmount_volume_callback), - BONOBO_UI_VERB ("Connect To Server Link Conditional", connect_to_server_link_callback), - BONOBO_UI_VERB_END - }; - - view->details->ui = nautilus_view_set_up_ui (NAUTILUS_VIEW (view), - nautilus_window_info_get_ui_container (view->details->window), - DATADIR, - "nautilus-directory-view-ui.xml", - "nautilus"); - eel_add_weak_pointer (&view->details->ui); - - bonobo_ui_component_add_verb_list_with_data (view->details->ui, verbs, view); - - bonobo_ui_component_add_listener - (view->details->ui, - "Show Hidden Files", - show_hidden_files_toggle_callback, - view); - - nautilus_bonobo_set_toggle_state (view->details->ui, - "/commands/Show Hidden Files", - view->details->show_hidden_files); - + GtkUIManager *ui_manager; + char *file; + GError *error; + GtkActionGroup *action_group; + GtkAction *action; + + ui_manager = nautilus_window_info_get_ui_manager (view->details->window); + + action_group = gtk_action_group_new ("DirViewActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + view->details->dir_action_group = action_group; + gtk_action_group_add_actions (action_group, + directory_view_entries, G_N_ELEMENTS (directory_view_entries), + view); + gtk_action_group_add_toggle_actions (action_group, + directory_view_toggle_entries, G_N_ELEMENTS (directory_view_toggle_entries), + view); + + action = gtk_action_group_get_action (action_group, FM_ACTION_NO_TEMPLATES); + gtk_action_set_sensitive (action, FALSE); + + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ + + error = NULL; + file = nautilus_ui_file ("nautilus-directory-view-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (ui_manager, file, &error)) { + g_error ("building menus failed: %s", error->message); + g_error_free (error); + } + g_free (file); + + g_signal_connect_object (fm_directory_view_get_background (view), "settings_changed", G_CALLBACK (schedule_update_menus), G_OBJECT (view), G_CONNECT_SWAPPED); - /* Do one-time state changes here; context-dependent ones go in update_menus */ - if (!fm_directory_view_supports_zooming (view)) { - nautilus_bonobo_set_hidden - (view->details->ui, NAUTILUS_POPUP_PATH_ZOOM_ITEMS_PLACEHOLDER, TRUE); - } - + view->details->scripts_invalid = TRUE; view->details->templates_invalid = TRUE; } @@ -5654,7 +5919,10 @@ clipboard_targets_received (GtkClipboard *clipboard, GdkAtom *targets; int n_targets; int i; - + GList *selection; + int count; + GtkAction *action; + view = FM_DIRECTORY_VIEW (user_data); can_paste = FALSE; @@ -5667,30 +5935,38 @@ clipboard_targets_received (GtkClipboard *clipboard, g_free (targets); } + + + selection = fm_directory_view_get_selection (view); + count = g_list_length (selection); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_PASTE_FILES); + gtk_action_set_sensitive (action, + can_paste && !fm_directory_view_is_read_only (view)); - if (view->details->ui != NULL) { - GList *selection; - int count; - - selection = fm_directory_view_get_selection (view); - count = g_list_length (selection); - - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_PASTE_FILES, - can_paste && !fm_directory_view_is_read_only (view)); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_PASTE_FILES_INTO, - can_paste && count == 1 && nautilus_file_is_directory (NAUTILUS_FILE (selection->data)) && nautilus_file_can_write (NAUTILUS_FILE (selection->data))); - - nautilus_file_list_free (selection); - } + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_PASTE_FILES_INTO); + gtk_action_set_sensitive (action, + can_paste && count == 1 && + nautilus_file_is_directory (NAUTILUS_FILE (selection->data)) && + nautilus_file_can_write (NAUTILUS_FILE (selection->data))); + + nautilus_file_list_free (selection); + g_object_unref (view); } static gboolean showing_trash_directory (FMDirectoryView *view) { - return nautilus_file_is_in_trash (fm_directory_view_get_directory_as_file (view)); + NautilusFile *file; + + file = fm_directory_view_get_directory_as_file (view); + if (file != NULL) { + return nautilus_file_is_in_trash (file); + } + return FALSE; } static gboolean @@ -5758,21 +6034,16 @@ real_update_menus_volumes (FMDirectoryView *view, NautilusFile *file; gboolean show_mount; gboolean show_unmount; - gboolean show_properties; - gboolean show_format; - gboolean show_protect; gboolean unmount_is_eject; gboolean show_connect; GnomeVFSVolume *volume; GnomeVFSDrive *drive; + GtkAction *action; char *uri; show_mount = FALSE; show_unmount = FALSE; unmount_is_eject = FALSE; - show_properties = FALSE; - show_format = FALSE; - show_protect = FALSE; show_connect = FALSE; if (selection_count == 1) { @@ -5807,31 +6078,24 @@ real_update_menus_volumes (FMDirectoryView *view, } - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_CONNECT_TO_SERVER_LINK_CONDITIONAL, - !show_connect); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_CONNECT_TO_SERVER_LINK); + gtk_action_set_visible (action, show_connect); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_MOUNT_VOLUME); + gtk_action_set_visible (action, show_mount); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_UNMOUNT_VOLUME); + gtk_action_set_visible (action, show_unmount); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_MOUNT_VOLUME_CONDITIONAL, - !show_mount); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_UNMOUNT_VOLUME_CONDITIONAL, - !show_unmount); if (show_unmount) { - nautilus_bonobo_set_label (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_UNMOUNT_VOLUME_CONDITIONAL, - unmount_is_eject? _("E_ject"):_("_Unmount Volume")); + g_object_set (action, "label", + unmount_is_eject? _("E_ject"):_("_Unmount Volume"), + NULL); } - - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_PROTECT_VOLUME_CONDITIONAL, - !show_protect); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_FORMAT_VOLUME_CONDITIONAL, - !show_format); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_MEDIA_PROPERTIES_VOLUME_CONDITIONAL, - !show_properties); + } static void @@ -5842,6 +6106,7 @@ real_update_paste_menu (FMDirectoryView *view, gboolean can_paste_files_into; gboolean selection_is_read_only; gboolean is_read_only; + GtkAction *action; selection_is_read_only = selection_count == 1 && !nautilus_file_can_write (NAUTILUS_FILE (selection->data)); @@ -5850,16 +6115,15 @@ real_update_paste_menu (FMDirectoryView *view, can_paste_files_into = selection_count == 1 && nautilus_file_is_directory (NAUTILUS_FILE (selection->data)); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_PASTE_FILES); + gtk_action_set_sensitive (action, !is_read_only); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_PASTE_FILES_INTO, - !can_paste_files_into); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_PASTE_FILES_INTO, - !selection_is_read_only); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_PASTE_FILES, - is_read_only); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_PASTE_FILES_INTO); + gtk_action_set_visible (action, can_paste_files_into); + gtk_action_set_sensitive (action, !selection_is_read_only); if (!selection_is_read_only || !is_read_only) { /* Ask the clipboard */ g_object_ref (view); /* Need to keep the object alive until we get the reply */ @@ -5876,17 +6140,10 @@ clipboard_changed_callback (NautilusClipboardMonitor *monitor, FMDirectoryView * GList *selection; gint selection_count; - if (view->details->ui == NULL) { - return; - } selection = fm_directory_view_get_selection (view); selection_count = g_list_length (selection); - bonobo_ui_component_freeze (view->details->ui, NULL); - real_update_paste_menu (view, selection, selection_count); - - bonobo_ui_component_thaw (view->details->ui, NULL); nautilus_file_list_free (selection); @@ -5897,7 +6154,7 @@ real_update_menus (FMDirectoryView *view) { GList *selection; gint selection_count; - const char *tip, *accelerator, *label; + const char *tip, *label; char *label_with_underscore; gboolean selection_contains_special_link; gboolean is_read_only; @@ -5910,13 +6167,10 @@ real_update_menus (FMDirectoryView *view) gboolean vfolder_directory; gboolean show_open_alternate; gboolean can_open; - ActivationAction action; + ActivationAction activation_action; EelBackground *background; + GtkAction *action; - if (view->details->ui == NULL) { - return; - } - selection = fm_directory_view_get_selection (view); selection_count = g_list_length (selection); @@ -5935,20 +6189,19 @@ real_update_menus (FMDirectoryView *view) vfolder_directory = we_are_in_vfolder_desktop_dir (view); - bonobo_ui_component_freeze (view->details->ui, NULL); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_RENAME); + gtk_action_set_sensitive (action, + selection_count == 1 && + fm_directory_view_can_rename_file (view, selection->data)); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_RENAME, - selection_count == 1 && - fm_directory_view_can_rename_file (view, selection->data)); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_NEW_FOLDER); + gtk_action_set_sensitive (action, can_create_files); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_NEW_FOLDER, - can_create_files); - - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OPEN, - selection_count != 0); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_OPEN); + gtk_action_set_sensitive (action, selection_count != 0); label_with_underscore = NULL; can_open = TRUE; @@ -5957,12 +6210,12 @@ real_update_menus (FMDirectoryView *view) file = NAUTILUS_FILE (selection->data); - action = get_activation_action (file); + activation_action = get_activation_action (file); /* Only use the default app for open if there is not a mime mismatch, otherwise we can't use it in the open with menu */ - if (action == ACTIVATION_ACTION_OPEN_IN_APPLICATION && + if (activation_action == ACTIVATION_ACTION_OPEN_IN_APPLICATION && activate_check_mime_types (view, file, FALSE)) { GnomeVFSMimeApplication *app; @@ -5976,23 +6229,24 @@ real_update_menus (FMDirectoryView *view) } } } + + g_object_set (action, "label", + label_with_underscore ? label_with_underscore : _("_Open"), + NULL); + gtk_action_set_visible (action, can_open); - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OPEN, - label_with_underscore ? label_with_underscore : _("_Open")); - nautilus_bonobo_set_hidden - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OPEN, - !can_open); g_free (label_with_underscore); if (nautilus_window_info_get_window_type (view->details->window) == NAUTILUS_WINDOW_NAVIGATION) { show_open_alternate = TRUE; - label_with_underscore = g_strdup_printf (ngettext("Open in New Window", - "Open in %d New Windows", - selection_count), - selection_count); + if (selection_count == 0) { + label_with_underscore = g_strdup (_("Open in New Window")); + } else { + label_with_underscore = g_strdup_printf (ngettext("Open in New Window", + "Open in %d New Windows", + selection_count), + selection_count); + } } else { show_open_alternate = file_list_all_are_folders (selection); if (selection_count <= 1) { @@ -6001,159 +6255,130 @@ real_update_menus (FMDirectoryView *view) label_with_underscore = g_strdup_printf (_("Browse Folders")); } } - - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OPEN_ALTERNATE, - label_with_underscore); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_OPEN_ALTERNATE); + g_object_set (action, "label", + label_with_underscore, + NULL); g_free (label_with_underscore); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OPEN_ALTERNATE, - selection_count != 0); - - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_OPEN_ALTERNATE, - !show_open_alternate); + gtk_action_set_sensitive (action, selection_count != 0); + gtk_action_set_visible (action, show_open_alternate); /* Broken into its own function just for convenience */ - reset_bonobo_open_with_menu (view, selection); + reset_open_with_menu (view, selection); reset_extension_actions_menu (view, selection); if (all_selected_items_in_trash (view)) { label = _("_Delete from Trash"); - accelerator = "*ctl*t"; tip = _("Delete all selected items permanently"); show_separate_delete_command = FALSE; } else { label = _("Mo_ve to Trash"); - accelerator = "*ctl*t"; tip = _("Move each selected item to the Trash"); show_separate_delete_command = show_delete_command_auto_value; } - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_TRASH, - label); - nautilus_bonobo_set_accelerator (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_TRASH, - accelerator); - nautilus_bonobo_set_tip (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_TRASH, - tip); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_TRASH, - can_delete_files); - - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_DELETE, - !show_separate_delete_command); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_TRASH); + g_object_set (action, + "label", label, + "tooltip", tip, + NULL); + gtk_action_set_sensitive (action, can_delete_files); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_DELETE); + gtk_action_set_visible (action, show_separate_delete_command); + if (show_separate_delete_command) { - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_DELETE, _("_Delete")); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_DELETE, - can_delete_files); + g_object_set (action, + "label", _("_Delete"), + NULL); + gtk_action_set_sensitive (action, can_delete_files); } - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_DUPLICATE, - can_duplicate_files); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_DUPLICATE); + gtk_action_set_sensitive (action, can_duplicate_files); background = fm_directory_view_get_background (view); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_RESET_BACKGROUND, - background != NULL - && nautilus_file_background_is_set (background)); - - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_CREATE_LINK, - selection_count > 1 - ? _("Ma_ke Links") - : _("Ma_ke Link")); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_CREATE_LINK, - can_link_files); - - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_PROPERTIES, - selection_count != 0 - && fm_directory_view_supports_properties (view)); - - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_EMPTY_TRASH, - _("_Empty Trash")); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_EMPTY_TRASH, - !nautilus_trash_monitor_is_empty ()); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_EMPTY_TRASH, - !should_show_empty_trash (view)); - - nautilus_bonobo_set_sensitive (view->details->ui, - NAUTILUS_COMMAND_SELECT_ALL, - !fm_directory_view_is_empty (view)); - - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_CUT_FILES, - selection_count == 1 - ? _("Cu_t File") - : _("Cu_t Files")); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_CUT_FILES, - can_delete_files); - - nautilus_bonobo_set_label - (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_COPY_FILES, - selection_count == 1 - ? _("_Copy File") - : _("_Copy Files")); - - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_COPY_FILES, - can_copy_files); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_RESET_BACKGROUND); + gtk_action_set_sensitive (action, + background != NULL && + nautilus_file_background_is_set (background)); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_CREATE_LINK); + gtk_action_set_sensitive (action, can_link_files); + g_object_set (action, "label", + selection_count > 1 + ? _("Ma_ke Links") + : _("Ma_ke Link"), + NULL); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_PROPERTIES); + gtk_action_set_sensitive (action, + selection_count != 0 && + fm_directory_view_supports_properties (view)); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_EMPTY_TRASH); + g_object_set (action, + "label", _("_Empty Trash"), + NULL); + gtk_action_set_sensitive (action, !nautilus_trash_monitor_is_empty ()); + gtk_action_set_visible (action, should_show_empty_trash (view)); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_SELECT_ALL); + gtk_action_set_sensitive (action, !fm_directory_view_is_empty (view)); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_CUT_FILES); + g_object_set (action, "label", + selection_count == 1 + ? _("Cu_t File") + : _("Cu_t Files"), + NULL); + gtk_action_set_sensitive (action, can_delete_files); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_COPY_FILES); + g_object_set (action, "label", + selection_count == 1 + ? _("_Copy File") + : _("_Copy Files"), + NULL); + gtk_action_set_sensitive (action, can_copy_files); real_update_paste_menu (view, selection, selection_count); - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_NEW_LAUNCHER, - ! vfolder_directory); - - nautilus_bonobo_set_hidden (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_EDIT_LAUNCHER, - ! vfolder_directory); - - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_NEW_LAUNCHER, - can_create_files); - - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_COMMAND_EDIT_LAUNCHER, - selection_count == 1); - + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_NEW_LAUNCHER); + gtk_action_set_visible (action, vfolder_directory); + gtk_action_set_sensitive (action, can_create_files); + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_EDIT_LAUNCHER); + gtk_action_set_visible (action, vfolder_directory); + gtk_action_set_sensitive (action, selection_count == 1); real_update_menus_volumes (view, selection, selection_count); - - bonobo_ui_component_thaw (view->details->ui, NULL); nautilus_file_list_free (selection); if (view->details->scripts_invalid) { update_scripts_menu (view); } - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_MENU_PATH_NEW_DOCUMENTS, - can_create_files); - nautilus_bonobo_set_sensitive (view->details->ui, - FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND_NEW_DOCUMENTS, - can_create_files); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_NEW_DOCUMENTS); + gtk_action_set_sensitive (action, can_create_files); + if (can_create_files && view->details->templates_invalid) { update_templates_menu (view); } @@ -6224,8 +6449,7 @@ schedule_update_menus (FMDirectoryView *view) view->details->menu_states_untrustworthy = TRUE; - if (view->details->menus_merged - && view->details->update_menus_timeout_id == 0) { + if (view->details->update_menus_timeout_id == 0) { view->details->update_menus_timeout_id = g_timeout_add (300, update_menus_timeout_callback, view); } @@ -6978,11 +7202,6 @@ fm_directory_view_merge_menus (FMDirectoryView *view) { g_return_if_fail (FM_IS_DIRECTORY_VIEW (view)); - /* Remember that the menus have been merged so that we - * won't try to update them before merging them. - */ - view->details->menus_merged = TRUE; - EEL_CALL_METHOD (FM_DIRECTORY_VIEW_CLASS, view, merge_menus, (view)); @@ -7195,7 +7414,13 @@ fm_directory_view_is_empty (FMDirectoryView *view) static gboolean real_is_read_only (FMDirectoryView *view) { - return !nautilus_file_can_write (fm_directory_view_get_directory_as_file (view)); + NautilusFile *file; + + file = fm_directory_view_get_directory_as_file (view); + if (file != NULL) { + return !nautilus_file_can_write (file); + } + return FALSE; } gboolean @@ -7314,6 +7539,7 @@ filtering_changed_callback (gpointer callback_data) FMDirectoryView *directory_view; gboolean new_show_hidden; NautilusWindowShowHiddenFilesMode mode; + GtkAction *action; directory_view = FM_DIRECTORY_VIEW (callback_data); new_show_hidden = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES); @@ -7324,9 +7550,11 @@ filtering_changed_callback (gpointer callback_data) && mode == NAUTILUS_WINDOW_SHOW_HIDDEN_FILES_DEFAULT) { directory_view->details->show_hidden_files = new_show_hidden; directory_view->details->show_backup_files = new_show_hidden; - nautilus_bonobo_set_toggle_state (directory_view->details->ui, - "/commands/Show Hidden Files", - directory_view->details->show_hidden_files); + + action = gtk_action_group_get_action (directory_view->details->dir_action_group, + FM_ACTION_SHOW_HIDDEN_FILES); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + directory_view->details->show_hidden_files); /* Reload the current uri so that the filtering changes take place. */ if (directory_view->details->model != NULL) { diff --git a/src/file-manager/fm-directory-view.h b/src/file-manager/fm-directory-view.h index c97c057c6..c6c4e92b6 100644 --- a/src/file-manager/fm-directory-view.h +++ b/src/file-manager/fm-directory-view.h @@ -40,15 +40,10 @@ #include <eel/eel-string-list.h> #include <libnautilus-private/nautilus-view.h> #include <libnautilus-private/nautilus-window-info.h> -#include <bonobo/bonobo-ui-component.h> typedef struct FMDirectoryView FMDirectoryView; typedef struct FMDirectoryViewClass FMDirectoryViewClass; - -/* Bonobo command paths that are used by subclasses. Others are defined in fm-directory-view.c */ -#define FM_DIRECTORY_VIEW_COMMAND_RESET_BACKGROUND "/commands/Reset Background" - #define FM_TYPE_DIRECTORY_VIEW (fm_directory_view_get_type ()) #define FM_DIRECTORY_VIEW(obj) (GTK_CHECK_CAST ((obj), FM_TYPE_DIRECTORY_VIEW, FMDirectoryView)) #define FM_DIRECTORY_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), FM_TYPE_DIRECTORY_VIEW, FMDirectoryViewClass)) @@ -357,7 +352,7 @@ gboolean fm_directory_view_confirm_multiple_windows (FMDirect void fm_directory_view_queue_file_change (FMDirectoryView *view, NautilusFile *file); void fm_directory_view_notify_selection_changed (FMDirectoryView *view); -Bonobo_UIContainer fm_directory_view_get_bonobo_ui_container (FMDirectoryView *view); +GtkUIManager * fm_directory_view_get_ui_manager (FMDirectoryView *view); EelStringList * fm_directory_view_get_emblem_names_to_exclude (FMDirectoryView *view); NautilusDirectory *fm_directory_view_get_model (FMDirectoryView *view); GtkWindow *fm_directory_view_get_containing_window (FMDirectoryView *view); diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index c5cecdd96..fc9e75402 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -25,11 +25,11 @@ #include <config.h> #include "fm-icon-view.h" +#include "fm-actions.h" #include "fm-icon-container.h" #include "fm-desktop-icon-view.h" #include "fm-error-reporting.h" #include <stdlib.h> -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-background.h> #include <eel/eel-glib-extensions.h> #include <eel/eel-gtk-extensions.h> @@ -43,6 +43,7 @@ #include <gtk/gtkmenu.h> #include <gtk/gtkmenuitem.h> #include <gtk/gtkradiomenuitem.h> +#include <gtk/gtkradioaction.h> #include <gtk/gtksignal.h> #include <gtk/gtkwindow.h> #include <libgnome/gnome-i18n.h> @@ -56,7 +57,6 @@ #include <libgnomevfs/gnome-vfs-utils.h> #include <libgnomevfs/gnome-vfs-xfer.h> #include <libnautilus-private/nautilus-audio-player.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-directory-background.h> #include <libnautilus-private/nautilus-directory.h> #include <libnautilus-private/nautilus-dnd.h> @@ -68,7 +68,6 @@ #include <libnautilus-private/nautilus-link.h> #include <libnautilus-private/nautilus-metadata.h> #include <libnautilus-private/nautilus-sound.h> -#include <libnautilus-private/nautilus-bonobo-ui.h> #include <libnautilus-private/nautilus-view-factory.h> #include <libnautilus-private/nautilus-clipboard.h> #include <locale.h> @@ -81,36 +80,12 @@ #define USE_OLD_AUDIO_PREVIEW 1 #define READ_CHUNK_SIZE 16384 -/* Paths to use when creating & referring to Bonobo menu items */ -#define MENU_PATH_STRETCH_ICON "/menu/Edit/Edit Items Placeholder/Stretch" -#define MENU_PATH_UNSTRETCH_ICONS "/menu/Edit/Edit Items Placeholder/Unstretch" -#define MENU_PATH_LAY_OUT "/menu/View/View Items Placeholder/Arrange Items" -#define MENU_PATH_MANUAL_LAYOUT "/menu/View/View Items Placeholder/Arrange Items/Manual Layout" -#define MENU_PATH_TIGHTER_LAYOUT "/menu/View/View Items Placeholder/Arrange Items/Tighter Layout" -#define MENU_PATH_SORT_REVERSED "/menu/View/View Items Placeholder/Arrange Items/Reversed Order" -#define MENU_PATH_CLEAN_UP "/menu/View/View Items Placeholder/Clean Up" - -#define POPUP_PATH_LAY_OUT "/popups/background/Before Zoom Items/View Items/Arrange Items" - -#define POPUP_PATH_ICON_APPEARANCE "/popups/selection/Icon Appearance Items" - -#define COMMAND_PREFIX "/commands/" -#define COMMAND_STRETCH_ICON "/commands/Stretch" -#define COMMAND_UNSTRETCH_ICONS "/commands/Unstretch" -#define COMMAND_TIGHTER_LAYOUT "/commands/Tighter Layout" -#define COMMAND_SORT_REVERSED "/commands/Reversed Order" -#define COMMAND_CLEAN_UP "/commands/Clean Up" -#define COMMAND_KEEP_ALIGNED "/commands/Keep Aligned" - -#define ID_MANUAL_LAYOUT "Manual Layout" -#define ID_TIGHTER_LAYOUT "Tighter Layout" -#define ID_SORT_REVERSED "Reversed Order" -#define ID_KEEP_ALIGNED "Keep Aligned" +#define POPUP_PATH_ICON_APPEARANCE "/selection/Icon Appearance Items" typedef struct { NautilusFileSortType sort_type; const char *metadata_text; - const char *id; + const char *action; const char *menu_label; const char *menu_hint; } SortCriterion; @@ -127,14 +102,13 @@ struct FMIconViewDetails GList *icons_not_positioned; guint react_to_icon_change_idle_id; - gboolean menus_ready; gboolean loading; const SortCriterion *sort; gboolean sort_reversed; - BonoboUIComponent *ui; + GtkActionGroup *icon_action_group; NautilusAudioPlayerData *audio_player_data; int audio_preview_timeout; @@ -191,27 +165,27 @@ static gboolean default_sort_in_reverse_order = FALSE; static int preview_sound_auto_value; static gboolean gnome_esd_enabled_auto_value; -static void fm_icon_view_set_directory_sort_by (FMIconView *icon_view, - NautilusFile *file, - const char *sort_by); -static void fm_icon_view_set_zoom_level (FMIconView *view, - NautilusZoomLevel new_level, - gboolean always_emit); -static void fm_icon_view_update_click_mode (FMIconView *icon_view); -static void fm_icon_view_set_directory_tighter_layout (FMIconView *icon_view, - NautilusFile *file, - gboolean tighter_layout); -static const SortCriterion *get_sort_criterion_by_id (const char *id); -static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type); -static void set_sort_criterion_by_id (FMIconView *icon_view, - const char *id); -static gboolean set_sort_reversed (FMIconView *icon_view, - gboolean new_value); -static void switch_to_manual_layout (FMIconView *view); -static void preview_audio (FMIconView *icon_view, - NautilusFile *file, - gboolean start_flag); -static void update_layout_menus (FMIconView *view); +static void fm_icon_view_set_directory_sort_by (FMIconView *icon_view, + NautilusFile *file, + const char *sort_by); +static void fm_icon_view_set_zoom_level (FMIconView *view, + NautilusZoomLevel new_level, + gboolean always_emit); +static void fm_icon_view_update_click_mode (FMIconView *icon_view); +static void fm_icon_view_set_directory_tighter_layout (FMIconView *icon_view, + NautilusFile *file, + gboolean tighter_layout); +static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type); +static void set_sort_criterion_by_sort_type (FMIconView *icon_view, + NautilusFileSortType sort_type); +static gboolean set_sort_reversed (FMIconView *icon_view, + gboolean new_value); +static void switch_to_manual_layout (FMIconView *view); +static void preview_audio (FMIconView *icon_view, + NautilusFile *file, + gboolean start_flag); +static void update_layout_menus (FMIconView *view); + static void fm_icon_view_iface_init (NautilusViewIface *iface); @@ -226,15 +200,6 @@ fm_icon_view_destroy (GtkObject *object) icon_view = FM_ICON_VIEW (object); - /* don't try to update menus during the destroy process */ - icon_view->details->menus_ready = FALSE; - - if (icon_view->details->ui != NULL) { - bonobo_ui_component_unset_container (icon_view->details->ui, NULL); - bonobo_object_unref (icon_view->details->ui); - icon_view->details->ui = NULL; - } - if (icon_view->details->react_to_icon_change_idle_id != 0) { g_source_remove (icon_view->details->react_to_icon_change_idle_id); icon_view->details->react_to_icon_change_idle_id = 0; @@ -354,7 +319,8 @@ set_sort_criterion (FMIconView *icon_view, const SortCriterion *sort) } static void -show_stretch_handles_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_stretch_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_ICON_VIEW (callback_data)); @@ -363,7 +329,8 @@ show_stretch_handles_callback (BonoboUIComponent *component, gpointer callback_d } static void -unstretch_icons_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_unstretch_callback (GtkAction *action, + gpointer callback_data) { g_assert (FM_IS_ICON_VIEW (callback_data)); @@ -398,7 +365,7 @@ fm_icon_view_real_clean_up (FMIconView *icon_view) } static void -clean_up_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +action_clean_up_callback (GtkAction *action, gpointer callback_data) { fm_icon_view_clean_up (FM_ICON_VIEW (callback_data)); } @@ -415,21 +382,13 @@ set_tighter_layout (FMIconView *icon_view, gboolean new_value) } static void -tighter_layout_state_changed_callback (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) +action_tighter_layout_callback (GtkAction *action, + gpointer user_data) { - g_assert (strcmp (path, ID_TIGHTER_LAYOUT) == 0); g_assert (FM_IS_ICON_VIEW (user_data)); - if (strcmp (state, "") == 0) { - /* State goes blank when component is removed; ignore this. */ - return; - } - - set_tighter_layout (FM_ICON_VIEW (user_data), strcmp (state, "1") == 0); + set_tighter_layout (FM_ICON_VIEW (user_data), + gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); } @@ -448,16 +407,21 @@ fm_icon_view_using_tighter_layout (FMIconView *icon_view) } static void -handle_radio_item (FMIconView *view, - const char *id) +action_sort_radio_callback (GtkAction *action, + GtkRadioAction *current, + FMIconView *view) { + NautilusFileSortType sort_type; + + sort_type = gtk_radio_action_get_current_value (current); + /* Note that id might be a toggle item. * Ignore non-sort ids so that they don't cause sorting. */ - if (strcmp (id, ID_MANUAL_LAYOUT) == 0) { + if (sort_type == NAUTILUS_FILE_SORT_NONE) { switch_to_manual_layout (view); - } else if (get_sort_criterion_by_id (id) != NULL) { - set_sort_criterion_by_id (view, id); + } else { + set_sort_criterion_by_sort_type (view, sort_type); } } @@ -626,55 +590,46 @@ fm_icon_view_supports_labels_beside_icons (FMIconView *view) static void update_layout_menus (FMIconView *view) { - char *path; gboolean is_auto_layout; - - if (!view->details->menus_ready) { + GtkAction *action; + const char *action_name; + + if (view->details->icon_action_group == NULL) { return; } is_auto_layout = fm_icon_view_using_auto_layout (view); - bonobo_ui_component_freeze (view->details->ui, NULL); - if (fm_icon_view_supports_auto_layout (view)) { /* Mark sort criterion. */ - path = g_strconcat (COMMAND_PREFIX, - is_auto_layout ? view->details->sort->id : ID_MANUAL_LAYOUT, - NULL); - nautilus_bonobo_set_toggle_state (view->details->ui, path, TRUE); - g_free (path); - - /* Set the checkmark for the "tighter layout" item */ - nautilus_bonobo_set_toggle_state - (view->details->ui, COMMAND_TIGHTER_LAYOUT, fm_icon_view_using_tighter_layout (view)); - - /* Set the checkmark for the "reversed order" item */ - nautilus_bonobo_set_toggle_state - (view->details->ui, COMMAND_SORT_REVERSED, view->details->sort_reversed); - - /* Sort order isn't relevant for manual layout. */ - nautilus_bonobo_set_sensitive - (view->details->ui, COMMAND_SORT_REVERSED, is_auto_layout); + action_name = is_auto_layout ? view->details->sort->action : FM_ACTION_MANUAL_LAYOUT; + action = gtk_action_group_get_action (view->details->icon_action_group, + action_name); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + + action = gtk_action_group_get_action (view->details->icon_action_group, + FM_ACTION_TIGHTER_LAYOUT); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + fm_icon_view_using_tighter_layout (view)); + action = gtk_action_group_get_action (view->details->icon_action_group, + FM_ACTION_REVERSED_ORDER); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + view->details->sort_reversed); + gtk_action_set_sensitive (action, is_auto_layout); } /* Clean Up is only relevant for manual layout */ - nautilus_bonobo_set_sensitive - (view->details->ui, COMMAND_CLEAN_UP, !is_auto_layout); + action = gtk_action_group_get_action (view->details->icon_action_group, + FM_ACTION_CLEAN_UP); + gtk_action_set_sensitive (action, !is_auto_layout); - - nautilus_bonobo_set_hidden (view->details->ui, - COMMAND_KEEP_ALIGNED, - !fm_icon_view_supports_keep_aligned (view)); - - nautilus_bonobo_set_toggle_state - (view->details->ui, COMMAND_KEEP_ALIGNED, - nautilus_icon_container_is_keep_aligned (get_icon_container (view))); - - nautilus_bonobo_set_sensitive - (view->details->ui, COMMAND_KEEP_ALIGNED, !is_auto_layout); - - bonobo_ui_component_thaw (view->details->ui, NULL); + action = gtk_action_group_get_action (view->details->icon_action_group, + FM_ACTION_KEEP_ALIGNED); + gtk_action_set_visible (action, + fm_icon_view_supports_keep_aligned (view)); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + nautilus_icon_container_is_keep_aligned (get_icon_container (view))); + gtk_action_set_sensitive (action, !is_auto_layout); } @@ -1019,20 +974,6 @@ get_sort_criterion_by_metadata_text (const char *metadata_text) } static const SortCriterion * -get_sort_criterion_by_id (const char *id) -{ - guint i; - - /* Figure out what the new sort setting should be. */ - for (i = 0; i < G_N_ELEMENTS (sort_criteria); i++) { - if (strcmp (sort_criteria[i].id, id) == 0) { - return &sort_criteria[i]; - } - } - return NULL; -} - -static const SortCriterion * get_sort_criterion_by_sort_type (NautilusFileSortType sort_type) { guint i; @@ -1158,6 +1099,9 @@ fm_icon_view_begin_loading (FMDirectoryView *view) nautilus_icon_container_set_auto_layout (get_icon_container (icon_view), fm_icon_view_get_directory_auto_layout (icon_view, file)); + + /* e.g. keep aligned may have changed */ + update_layout_menus (icon_view); } static void @@ -1318,16 +1262,15 @@ fm_icon_view_get_item_count (FMDirectoryView *view) return count; } - static void -set_sort_criterion_by_id (FMIconView *icon_view, const char *id) +set_sort_criterion_by_sort_type (FMIconView *icon_view, + NautilusFileSortType sort_type) { const SortCriterion *sort; g_assert (FM_IS_ICON_VIEW (icon_view)); - g_assert (id != NULL); - sort = get_sort_criterion_by_id (id); + sort = get_sort_criterion_by_sort_type (sort_type); g_return_if_fail (sort != NULL); if (sort == icon_view->details->sort @@ -1339,50 +1282,32 @@ set_sort_criterion_by_id (FMIconView *icon_view, const char *id) nautilus_icon_container_sort (get_icon_container (icon_view)); } + static void -sort_reversed_state_changed_callback (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) +action_reversed_order_callback (GtkAction *action, + gpointer user_data) { FMIconView *icon_view; - g_assert (strcmp (path, ID_SORT_REVERSED) == 0); - icon_view = FM_ICON_VIEW (user_data); - if (strcmp (state, "") == 0) { - /* State goes blank when component is removed; ignore this. */ - return; - } - - if (set_sort_reversed (icon_view, strcmp (state, "1") == 0)) { + if (set_sort_reversed (icon_view, + gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))) { nautilus_icon_container_sort (get_icon_container (icon_view)); } } static void -keep_aligned_state_changed_callback (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) +action_keep_aligned_callback (GtkAction *action, + gpointer user_data) { FMIconView *icon_view; NautilusFile *file; gboolean keep_aligned; - g_assert (strcmp (path, ID_KEEP_ALIGNED) == 0); - icon_view = FM_ICON_VIEW (user_data); - if (strcmp (state, "") == 0) { - /* State goes blank when component is removed; ignore this. */ - return; - } - - keep_aligned = strcmp (state, "1") == 0 ? TRUE : FALSE; + keep_aligned = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); file = fm_directory_view_get_directory_as_file (FM_DIRECTORY_VIEW (icon_view)); fm_icon_view_set_directory_keep_aligned (icon_view, @@ -1452,87 +1377,142 @@ fm_icon_view_start_renaming_file (FMDirectoryView *view, NautilusFile *file) (get_icon_container (FM_ICON_VIEW (view))); } -static void -handle_ui_event (BonoboUIComponent *ui, - const char *id, - Bonobo_UIComponent_EventType type, - const char *state, - FMIconView *view) -{ - if (type == Bonobo_UIComponent_STATE_CHANGED - && strcmp (state, "1") == 0) { - handle_radio_item (view, id); - } -} +static GtkActionEntry icon_view_entries[] = { + { "Arrange Items", NULL, N_("Arran_ge Items") }, /* name, stock id, label */ + { "Stretch", NULL, /* name, stock id */ + N_("Str_etch Icon"), NULL, /* label, accelerator */ + N_("Make the selected icon stretchable"), /* tooltip */ + G_CALLBACK (action_stretch_callback) }, + { "Unstretch", NULL, /* name, stock id */ + N_("Restore Icons' Original Si_zes"), NULL, /* label, accelerator */ + N_("Restore each selected icon to its original size"), /* tooltip */ + G_CALLBACK (action_unstretch_callback) }, + { "Clean Up", NULL, /* name, stock id */ + N_("Clean _Up by Name"), NULL, /* label, accelerator */ + N_("Reposition icons to better fit in the window and avoaction overlapping"), /* tooltip */ + G_CALLBACK (action_clean_up_callback) }, +}; + +static GtkToggleActionEntry icon_view_toggle_entries[] = { + { "Tighter Layout", NULL, /* name, stock id */ + N_("Compact _Layout"), NULL, /* label, accelerator */ + N_("Toggle using a tighter layout scheme"), /* tooltip */ + G_CALLBACK (action_tighter_layout_callback), + 0 }, + { "Reversed Order", NULL, /* name, stock id */ + N_("Re_versed Order"), NULL, /* label, accelerator */ + N_("Display icons in the opposite order"), /* tooltip */ + G_CALLBACK (action_reversed_order_callback), + 0 }, + { "Keep Aligned", NULL, /* name, stock id */ + N_("_Keep Aligned"), NULL, /* label, accelerator */ + N_("Keep icons lined up on a grid"), /* tooltip */ + G_CALLBACK (action_keep_aligned_callback), + 0 }, +}; + +static GtkRadioActionEntry arrange_radio_entries[] = { + { "Manual Layout", NULL, + N_("_Manually"), NULL, + N_("Leave icons wherever they are dropped"), + NAUTILUS_FILE_SORT_NONE }, + { "Sort by Name", NULL, + N_("By _Name"), NULL, + N_("Keep icons sorted by name in rows"), + NAUTILUS_FILE_SORT_BY_DISPLAY_NAME }, + { "Sort by Size", NULL, + N_("By _Size"), NULL, + N_("Keep icons sorted by size in rows"), + NAUTILUS_FILE_SORT_BY_SIZE }, + { "Sort by Type", NULL, + N_("By _Type"), NULL, + N_("Keep icons sorted by type in rows"), + NAUTILUS_FILE_SORT_BY_TYPE }, + { "Sort by Modification Date", NULL, + N_("By Modification _Date"), NULL, + N_("Keep icons sorted by modification date in rows"), + NAUTILUS_FILE_SORT_BY_MTIME }, + { "Sort by Emblems", NULL, + N_("By _Emblems"), NULL, + N_("Keep icons sorted by emblems in rows"), + NAUTILUS_FILE_SORT_BY_EMBLEMS }, +}; static void fm_icon_view_merge_menus (FMDirectoryView *view) { FMIconView *icon_view; - Bonobo_UIContainer ui_container; - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("Stretch", show_stretch_handles_callback), - BONOBO_UI_VERB ("Unstretch", unstretch_icons_callback), - BONOBO_UI_VERB ("Clean Up", clean_up_callback), - BONOBO_UI_VERB_END - }; + GtkUIManager *ui_manager; + GtkActionGroup *action_group; + GtkAction *action; + GError *error; + char *file; g_assert (FM_IS_ICON_VIEW (view)); - FM_DIRECTORY_VIEW_CLASS (fm_icon_view_parent_class)->merge_menus(view); + FM_DIRECTORY_VIEW_CLASS (fm_icon_view_parent_class)->merge_menus (view); icon_view = FM_ICON_VIEW (view); - icon_view->details->ui = bonobo_ui_component_new ("Icon View"); - g_signal_connect_object (icon_view->details->ui, - "ui_event", G_CALLBACK (handle_ui_event), icon_view, 0); - ui_container = fm_directory_view_get_bonobo_ui_container (view); - bonobo_ui_component_set_container (icon_view->details->ui, - ui_container, NULL); - bonobo_object_release_unref (ui_container, NULL); - bonobo_ui_util_set_ui (icon_view->details->ui, - DATADIR, - "nautilus-icon-view-ui.xml", - "nautilus", NULL); - - bonobo_ui_component_add_verb_list_with_data (icon_view->details->ui, verbs, view); - - bonobo_ui_component_add_listener (icon_view->details->ui, ID_TIGHTER_LAYOUT, tighter_layout_state_changed_callback, view); - bonobo_ui_component_add_listener (icon_view->details->ui, ID_SORT_REVERSED, sort_reversed_state_changed_callback, view); - bonobo_ui_component_add_listener (icon_view->details->ui, ID_KEEP_ALIGNED, keep_aligned_state_changed_callback, view); - icon_view->details->menus_ready = TRUE; + ui_manager = fm_directory_view_get_ui_manager (FM_DIRECTORY_VIEW (icon_view)); + + action_group = gtk_action_group_new ("IconViewActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + icon_view->details->icon_action_group = action_group; + gtk_action_group_add_actions (action_group, + icon_view_entries, G_N_ELEMENTS (icon_view_entries), + icon_view); + gtk_action_group_add_toggle_actions (action_group, + icon_view_toggle_entries, G_N_ELEMENTS (icon_view_toggle_entries), + icon_view); + gtk_action_group_add_radio_actions (action_group, + arrange_radio_entries, + G_N_ELEMENTS (arrange_radio_entries), + -1, + G_CALLBACK (action_sort_radio_callback), + icon_view); + + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ + + error = NULL; + file = nautilus_ui_file ("nautilus-icon-view-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (ui_manager, file, &error)) { + g_error ("building menus failed: %s", error->message); + g_error_free (error); + } + g_free (file); - bonobo_ui_component_freeze (icon_view->details->ui, NULL); - /* Do one-time state-setting here; context-dependent state-setting * is done in update_menus. */ if (!fm_icon_view_supports_auto_layout (icon_view)) { - nautilus_bonobo_set_hidden - (icon_view->details->ui, POPUP_PATH_LAY_OUT, TRUE); + action = gtk_action_group_get_action (action_group, + FM_ACTION_ARRANGE_ITEMS); + gtk_action_set_visible (action, FALSE); } if (FM_IS_DESKTOP_ICON_VIEW (icon_view)) { - bonobo_ui_component_set (icon_view->details->ui, - POPUP_PATH_ICON_APPEARANCE, - "<menuitem name=\"Stretch\" verb=\"Stretch\"/>", - NULL); - bonobo_ui_component_set (icon_view->details->ui, - POPUP_PATH_ICON_APPEARANCE, - "<menuitem name=\"Unstretch\" verb=\"Unstretch\"/>", - NULL); + guint merge_id; + + merge_id = gtk_ui_manager_new_merge_id (ui_manager); + gtk_ui_manager_add_ui (ui_manager, + merge_id, + POPUP_PATH_ICON_APPEARANCE, + FM_ACTION_STRETCH, + FM_ACTION_STRETCH, + GTK_UI_MANAGER_MENUITEM, + FALSE); + gtk_ui_manager_add_ui (ui_manager, + merge_id, + POPUP_PATH_ICON_APPEARANCE, + FM_ACTION_UNSTRETCH, + FM_ACTION_UNSTRETCH, + GTK_UI_MANAGER_MENUITEM, + FALSE); } - nautilus_bonobo_set_hidden - (icon_view->details->ui, POPUP_PATH_ICON_APPEARANCE, TRUE); - - nautilus_bonobo_set_hidden - (icon_view->details->ui, POPUP_PATH_ICON_APPEARANCE, - !FM_IS_DESKTOP_ICON_VIEW (view)); - update_layout_menus (icon_view); - - bonobo_ui_component_thaw (icon_view->details->ui, NULL); } static void @@ -1541,47 +1521,34 @@ fm_icon_view_update_menus (FMDirectoryView *view) FMIconView *icon_view; GList *selection; int selection_count; + GtkAction *action; NautilusIconContainer *icon_container; icon_view = FM_ICON_VIEW (view); - /* don't update if the menus aren't ready */ - if (!icon_view->details->menus_ready) { - return; - } - FM_DIRECTORY_VIEW_CLASS (fm_icon_view_parent_class)->update_menus(view); - /* don't update if we have no remote BonoboUIContainer */ - if (bonobo_ui_component_get_container (icon_view->details->ui) - == CORBA_OBJECT_NIL) { - return; - } - selection = fm_directory_view_get_selection (view); selection_count = g_list_length (selection); icon_container = get_icon_container (icon_view); - bonobo_ui_component_freeze (icon_view->details->ui, NULL); - - nautilus_bonobo_set_sensitive (icon_view->details->ui, - COMMAND_STRETCH_ICON, - selection_count == 1 - && icon_container != NULL - && !nautilus_icon_container_has_stretch_handles (icon_container)); - - nautilus_bonobo_set_label - (icon_view->details->ui, - COMMAND_UNSTRETCH_ICONS, - eel_g_list_more_than_one_item (selection) - ? _("Restore Icons' Original Si_zes") - : _("Restore Icon's Original Si_ze")); - nautilus_bonobo_set_sensitive (icon_view->details->ui, - COMMAND_UNSTRETCH_ICONS, - icon_container != NULL - && nautilus_icon_container_is_stretched (icon_container)); - - bonobo_ui_component_thaw (icon_view->details->ui, NULL); + action = gtk_action_group_get_action (icon_view->details->icon_action_group, + FM_ACTION_STRETCH); + gtk_action_set_sensitive (action, + selection_count == 1 + && icon_container != NULL + && !nautilus_icon_container_has_stretch_handles (icon_container)); + + action = gtk_action_group_get_action (icon_view->details->icon_action_group, + FM_ACTION_UNSTRETCH); + g_object_set (action, "label", + eel_g_list_more_than_one_item (selection) + ? _("Restore Icons' Original Si_zes") + : _("Restore Icon's Original Si_ze"), + NULL); + gtk_action_set_sensitive (action, + icon_container != NULL + && nautilus_icon_container_is_stretched (icon_container)); nautilus_file_list_free (selection); } diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c index fdaf8bf2f..12eaa8210 100644 --- a/src/file-manager/fm-list-view.c +++ b/src/file-manager/fm-list-view.c @@ -32,7 +32,6 @@ #include "fm-error-reporting.h" #include "fm-list-model.h" #include <string.h> -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-cell-renderer-pixbuf-list.h> #include <eel/eel-vfs-extensions.h> #include <eel/eel-glib-extensions.h> @@ -57,6 +56,7 @@ #include <libnautilus-private/nautilus-directory-background.h> #include <libnautilus-private/nautilus-dnd.h> #include <libnautilus-private/nautilus-file-dnd.h> +#include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-global-preferences.h> #include <libnautilus-private/nautilus-icon-dnd.h> #include <libnautilus-private/nautilus-icon-factory.h> @@ -78,6 +78,7 @@ typedef struct { struct FMListViewDetails { GtkTreeView *tree_view; FMListModel *model; + GtkActionGroup *list_action_group; GtkTreeViewColumn *file_name_column; int file_name_column_num; @@ -105,7 +106,6 @@ struct FMListViewDetails { /* typeahead selection state */ TypeSelectState *type_select_state; - BonoboUIComponent *ui; gboolean menus_ready; GHashTable *columns; @@ -1601,9 +1601,8 @@ create_column_editor (FMListView *view) } static void -visible_columns_callback (BonoboUIComponent *component, - gpointer callback_data, - const char *verb) +action_visible_columns_callback (GtkAction *action, + gpointer callback_data) { FMListView *list_view; @@ -1619,31 +1618,45 @@ visible_columns_callback (BonoboUIComponent *component, } } +static GtkActionEntry list_view_entries[] = { + { "Visible Columns", NULL, /* name, stock id */ + N_("Visible _Columns..."), NULL, /* label, accelerator */ + N_("Select the columns visible in this folder"), /* tooltip */ + G_CALLBACK (action_visible_columns_callback) }, +}; + static void fm_list_view_merge_menus (FMDirectoryView *view) { FMListView *list_view; - Bonobo_UIContainer ui_container; - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("Visible Columns", visible_columns_callback), - BONOBO_UI_VERB_END - }; - + GtkUIManager *ui_manager; + GtkActionGroup *action_group; + GError *error; + char *file; + EEL_CALL_PARENT (FM_DIRECTORY_VIEW_CLASS, merge_menus, (view)); list_view = FM_LIST_VIEW (view); - list_view->details->ui = bonobo_ui_component_new ("List View"); - ui_container = fm_directory_view_get_bonobo_ui_container (view); - bonobo_ui_component_set_container (list_view->details->ui, - ui_container, NULL); - bonobo_object_release_unref (ui_container, NULL); - bonobo_ui_util_set_ui (list_view->details->ui, - DATADIR, - "nautilus-list-view-ui.xml", - "nautilus", NULL); + ui_manager = fm_directory_view_get_ui_manager (view); + + action_group = gtk_action_group_new ("ListViewActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + list_view->details->list_action_group = action_group; + gtk_action_group_add_actions (action_group, + list_view_entries, G_N_ELEMENTS (list_view_entries), + list_view); - bonobo_ui_component_add_verb_list_with_data (list_view->details->ui, verbs, view); + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ + + error = NULL; + file = nautilus_ui_file ("nautilus-list-view-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (ui_manager, file, &error)) { + g_error ("building menus failed: %s", error->message); + g_error_free (error); + } + g_free (file); list_view->details->menus_ready = TRUE; } @@ -2005,12 +2018,6 @@ fm_list_view_dispose (GObject *object) list_view->details->drag_dest = NULL; } - if (list_view->details->ui != NULL) { - bonobo_ui_component_unset_container (list_view->details->ui, NULL); - bonobo_object_unref (list_view->details->ui); - list_view->details->ui = NULL; - } - G_OBJECT_CLASS (parent_class)->dispose (object); } diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index e25793163..7ee0da117 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -77,8 +77,6 @@ #include <libnautilus-private/nautilus-undo-signal-handlers.h> #include <libnautilus-private/nautilus-mime-actions.h> #include <libnautilus-private/nautilus-undo.h> -#include <bonobo/bonobo-widget.h> -#include <bonobo/bonobo-exception.h> #include <string.h> static GHashTable *windows; diff --git a/src/file-manager/nautilus-desktop-icon-view-ui.xml b/src/file-manager/nautilus-desktop-icon-view-ui.xml index b1417c7df..470e5d5b9 100644 --- a/src/file-manager/nautilus-desktop-icon-view-ui.xml +++ b/src/file-manager/nautilus-desktop-icon-view-ui.xml @@ -1,60 +1,23 @@ -<Root> -<commands> - <cmd name="Change Background" - _label="Change Desktop _Background" - _tip="Show a window that lets you set your desktop background's pattern or color"/> - <cmd name="Close" sensitive="0"/> - <cmd name="Add Bookmark" sensitive="0"/> - <cmd name="Empty Trash Conditional" - _label="Empty Trash" - _tip="Delete all items in the Trash"/> - <cmd name="New Terminal" - _label="Open T_erminal" - _tip="Open a new GNOME terminal window"/> - <cmd name="New Launcher Desktop" - _label="Create L_auncher" - _tip="Create a new launcher"/> - <cmd name="Reset Background" - _label="Use _Default Background" - _tip="Use the default desktop background"/> -</commands> -<menu> - <!-- By re-labelling these submenus to names without underscores, we - prevent the user from bringing up the otherwise-invisible menu bar - menus on the desktop from the keyboard. Setting the labels to "" in - code does not work (presumably Bonobo bug), but doing so here does. - --> - <submenu name="File" label=""/> - <submenu name="Edit" label=""/> - <submenu name="View" label=""/> - <submenu name="Go" label=""/> - <submenu name="Bookmarks" label=""/> - <submenu name="Profiler" label=""/> - <submenu name="Help" label=""/> - <submenu name="Preferences" label=""/> -</menu> -<popups> - <popup name="background"> - <placeholder name="Before Zoom Items"> - <placeholder name="New Window Items"> - <menuitem name="New Terminal" verb="New Terminal"/> - </placeholder> - <placeholder name="New Object Items"> - <menuitem name="New Launcher" verb="New Launcher Desktop"/> - </placeholder> +<ui> +<popup name="background"> + <placeholder name="Before Zoom Items"> + <placeholder name="New Window Items"> + <menuitem name="New Terminal" action="New Terminal"/> </placeholder> - <placeholder name="After Zoom Items"> - <placeholder name="Background Items"> - <menuitem name="Use Default Background" verb="Reset Background"/> - <menuitem name="Change Background" verb="Change Background"/> - </placeholder> + <placeholder name="New Object Items"> + <menuitem name="New Launcher" action="New Launcher Desktop"/> </placeholder> - </popup> - - <popup name="selection"> - <placeholder name="Empty Trash Holder" delimit="top"> - <menuitem name="Empty Trash" verb="Empty Trash Conditional"/> + </placeholder> + <placeholder name="After Zoom Items"> + <placeholder name="Background Items"> + <menuitem name="Change Background" action="Change Background"/> </placeholder> - </popup> -</popups> -</Root> + </placeholder> +</popup> + +<popup name="selection"> + <placeholder name="Empty Trash Holder"> + <menuitem name="Empty Trash" action="Empty Trash Conditional"/> + </placeholder> +</popup> +</ui> diff --git a/src/file-manager/nautilus-directory-view-ui.xml b/src/file-manager/nautilus-directory-view-ui.xml index bac7f6969..f0deab266 100644 --- a/src/file-manager/nautilus-directory-view-ui.xml +++ b/src/file-manager/nautilus-directory-view-ui.xml @@ -1,4 +1,5 @@ -<Root> +<ui> +<!-- <commands> <cmd name="Rename" _label="_Rename..." @@ -91,264 +92,220 @@ _label="Connect To This Server" _tip="Make a permanent connection to this server"/> </commands> +--> +<!-- <keybindings> - <accel name="*Control*BackSpace" verb="Trash"/> - <accel name="*Control*T" verb="Trash"/> - <accel name="KP_Delete" verb="Trash"/> - <accel name="Delete" verb="Trash"/> - <accel name="*Shift*KP_Delete" verb="Delete"/> - <accel name="*Shift*Delete" verb="Delete"/> - <accel name="*Alt*Down" verb="Open"/> - <accel name="*Alt**Shift*Down" verb="OpenCloseParent"/> - <accel name="*Control*i" verb="Properties"/> - <accel name="*Shift**Control*n" verb="New Folder"/> - <accel name="*Control*o" verb="Open"/> - <accel name="*Control**Shift*o" verb="OpenAlternate"/> - <accel name="*Alt*Return" verb="Properties"/> - <accel name="*Control*x" verb="Cut Files"/> - <accel name="*Control*c" verb="Copy Files"/> - <accel name="*Control*v" verb="Paste Files"/> - <accel name="*Control*m" verb="Create Link"/> - <accel name="F2" verb="Rename"/> - <accel name="*Control*a" verb="Select All"/> - <accel name="*Control*s" verb="Select Pattern"/> + <accel name="*Control*BackSpace" action="Trash"/> + <accel name="*Control*T" action="Trash"/> + <accel name="KP_Delete" action="Trash"/> + <accel name="Delete" action="Trash"/> + <accel name="*Shift*KP_Delete" action="Delete"/> + <accel name="*Shift*Delete" action="Delete"/> + <accel name="*Alt*Down" action="Open"/> + <accel name="*Alt**Shift*Down" action="OpenCloseParent"/> + <accel name="*Control*i" action="Properties"/> + <accel name="*Shift**Control*n" action="New Folder"/> + <accel name="*Control*o" action="Open"/> + <accel name="*Control**Shift*o" action="OpenAlternate"/> + <accel name="*Alt*Return" action="Properties"/> + <accel name="*Control*x" action="Cut Files"/> + <accel name="*Control*c" action="Copy Files"/> + <accel name="*Control*v" action="Paste Files"/> + <accel name="*Control*m" action="Create Link"/> + <accel name="F2" action="Rename"/> + <accel name="*Control*a" action="Select All"/> + <accel name="*Control*s" action="Select Pattern"/> </keybindings> -<menu> - <submenu name="File"> +--> +<accelerator action="OpenCloseParent"/> + +<menubar name="MenuBar"> + <menu action="File"> <placeholder name="New Items Placeholder"> <menuitem name="New Folder" - accel="*Shift**Control*n" - verb="New Folder"/> - <submenu name="New Documents" - _label="Create _Document"> + action="New Folder"/> + <menu action="New Documents"> <menuitem name="No Templates" - _label="No templates Installed" - sensitive="0"/> - <placeholder name="New Documents Placeholder" delimit="none"/> + action="No Templates"/> + <placeholder name="New Documents Placeholder"/> <separator name="After New Documents"/> <menuitem name="New Empty File" - verb="New Empty File"/> - </submenu> + action="New Empty File"/> + </menu> <menuitem name="New Launcher" - pixtype="stock" pixname="gtk-new" - verb="New Launcher"/> + action="New Launcher"/> </placeholder> <placeholder name="Open Placeholder"> <menuitem name="Open" - accel="*Control*o" - pixtype="stock" pixname="gtk-open" - verb="Open"/> + action="Open"/> <menuitem name="OpenAlternate" - accel="*Control**Shift*o" - verb="OpenAlternate"/> - <placeholder name="Applications Placeholder" delimit="top"/> - <submenu name="Open With" - _label="Open Wit_h" - _tip="Choose a program with which to open the selected item"> - <placeholder name="Applications Placeholder" delimit="none"/> + action="OpenAlternate"/> + <placeholder name="Applications Placeholder"/> + <menu action="Open With"> + <placeholder name="Applications Placeholder"/> <separator/> <menuitem name="OtherApplication" - verb="OtherApplication"/> - </submenu> + action="OtherApplication1"/> + </menu> <placeholder name="OtherApplicationPlaceholder"> <menuitem name="OtherApplication" - verb="OtherApplication"/> + action="OtherApplication2"/> </placeholder> <menuitem name="Edit Launcher" - verb="Edit Launcher"/> - <submenu name="Scripts" - _label="_Scripts" - _tip="Run or manage scripts from ~/Nautilus/scripts"> - <placeholder name="Scripts Placeholder" delimit="none"/> + action="Edit Launcher"/> + <menu action="Scripts"> + <placeholder name="Scripts Placeholder"/> <separator name="After Scripts"/> <menuitem name="Open Scripts Folder" - verb="Open Scripts Folder"/> - </submenu> + action="Open Scripts Folder"/> + </menu> </placeholder> <placeholder name="File Items Placeholder"> <menuitem name="Properties" - pixtype="stock" pixname="gtk-properties" - accel="*Alt*Return" - verb="Properties"/> + action="Properties"/> </placeholder> <placeholder name="Global File Items Placeholder"> <menuitem name="Empty Trash" - verb="Empty Trash"/> + action="Empty Trash"/> </placeholder> - </submenu> + </menu> - <submenu name="Edit"> + <menu action="Edit"> <menuitem name="Cut" - accel="*Control*x" - pixtype="stock" pixname="gtk-cut" - verb="Cut Files"/> + action="Cut Files"/> <menuitem name="Copy" - accel="*Control*c" - pixtype="stock" pixname="gtk-copy" - verb="Copy Files"/> + action="Copy Files"/> <menuitem name="Paste" - accel="*Control*v" - pixtype="stock" pixname="gtk-paste" - verb="Paste Files"/> + action="Paste Files"/> <placeholder name="Select Items"> <menuitem name="Select All" - accel="*Control*a" - verb="Select All"/> + action="Select All"/> <menuitem name="Select Pattern" - accel="*Control*s" - verb="Select Pattern"/> + action="Select Pattern"/> </placeholder> <placeholder name="File Items Placeholder"> <menuitem name="Duplicate" - verb="Duplicate"/> + action="Duplicate"/> <menuitem name="Create Link" - accel="*Control*m" - verb="Create Link"/> + action="Create Link"/> <menuitem name="Rename" - accel="F2" - verb="Rename"/> + action="Rename"/> </placeholder> <placeholder name="Dangerous File Items Placeholder"> <menuitem name="Trash" - pixtype="stock" pixname="gtk-delete" - verb="Trash"/> + action="Trash"/> <menuitem name="Delete" - accel="*Shift*Delete" - verb="Delete"/> + action="Delete"/> </placeholder> <placeholder name="Extension Actions"/> - </submenu> + </menu> - <submenu name="View"> + <menu action="View"> <placeholder name="View Preferences Placeholder"> <menuitem name="Reset to Defaults" - verb="Reset to Defaults"/> + action="Reset to Defaults"/> <menuitem name="Show Hidden Files" - type="toggle" - accel="*Control*h" - verb="Show Hidden Files"/> + action="Show Hidden Files"/> </placeholder> - </submenu> -</menu> -<popups> - <popup name="background"> - <placeholder name="Before Zoom Items"> - <placeholder name="New Object Items"> - <menuitem name="New Folder" - verb="New Folder"/> - <menuitem name="New Launcher" - pixtype="stock" pixname="gtk-new" - verb="New Launcher"/> - </placeholder> - <submenu name="New Documents" - _label="Create _Document"> - <menuitem name="No Templates" - _label="No templates Installed" - sensitive="0"/> - <placeholder name="New Documents Placeholder" delimit="none"/> - <separator name="After New Documents"/> - <menuitem name="New Empty File" - verb="New Empty File"/> - </submenu> - <submenu name="Scripts" - _label="_Scripts" - _tip="Run or manage scripts from ~/Nautilus/scripts" - tearoff="0"> - <placeholder name="Scripts Placeholder" delimit="none"/> - <separator name="After Scripts"/> - <menuitem name="Open Scripts Folder" verb="Open Scripts Folder"/> - </submenu> - <placeholder name="View Items" delimit="top"/> - <placeholder name="File Clipboard Actions" delimit="top"> - <menuitem name="Paste Files" - pixtype="stock" pixname="gtk-paste" - verb="Paste Files"/> - </placeholder> - </placeholder> - <placeholder name="After Zoom Items"> - <placeholder name="Background Items" delimit="none"> - <menuitem name="Use Default Background" verb="Reset Background"/> - </placeholder> - </placeholder> - </popup> - - <popup name="selection" tearoff="0"> - <placeholder name="Open Placeholder" delimit="none"> - <menuitem name="Open" - pixtype="stock" pixname="gtk-open" - verb="Open"/> - <menuitem name="OpenAlternate" - verb="OpenAlternate"/> - <placeholder name="Applications Placeholder" delimit="top"/> - <submenu name="Open With" - _label="Open Wit_h" - tearoff="0" - _tip="Choose a program with which to open the selected item"> - <placeholder name="Applications Placeholder" delimit="none"/> - <separator/> - <menuitem name="OtherApplication" verb="OtherApplication"/> - </submenu> - <placeholder name="OtherApplicationPlaceholder"> - <menuitem name="OtherApplication" - verb="OtherApplication"/> - </placeholder> - <menuitem name="Edit Launcher" - verb="Edit Launcher"/> - <submenu name="Scripts" - _label="_Scripts" - _tip="Run or manage scripts from ~/Nautilus/scripts" - tearoff="0"> - <placeholder name="Scripts Placeholder" delimit="none"/> - <separator name="After Scripts"/> - <menuitem name="Open Scripts Folder" verb="Open Scripts Folder"/> - </submenu> - + </menu> +</menubar> +<popup name="background"> + <placeholder name="Before Zoom Items"> + <placeholder name="New Object Items"> + <menuitem name="New Folder" + action="New Folder"/> + <menuitem name="New Launcher" + action="New Launcher"/> </placeholder> - <placeholder name="File Clipboard Actions" delimit="top"> - <menuitem name="Cut Files" - pixtype="stock" pixname="gtk-cut" - verb="Cut Files"/> - <menuitem name="Copy Files" - pixtype="stock" pixname="gtk-copy" - verb="Copy Files"/> - <menuitem name="Paste Files Into" - pixtype="stock" pixname="gtk-paste" - verb="Paste Files Into"/> + <menu action="New Documents"> + <menuitem name="No Templates" + action="No Templates"/> + <placeholder name="New Documents Placeholder"/> + <separator name="After New Documents"/> + <menuitem name="New Empty File" + action="New Empty File"/> + </menu> + <menu action="Scripts"> + <placeholder name="Scripts Placeholder"/> + <separator name="After Scripts"/> + <menuitem name="Open Scripts Folder" + action="Open Scripts Folder"/> + </menu> + <placeholder name="View Items"/> + <placeholder name="File Clipboard Actions"> + <menuitem name="Paste Files" + action="Paste Files"/> </placeholder> - <placeholder name="File Actions" delimit="top"> - <menuitem name="Create Link" verb="Create Link"/> - <menuitem name="Rename" verb="Rename"/> + </placeholder> + <placeholder name="After Zoom Items"> + <placeholder name="Background Items"> + <menuitem name="Use Default Background" + action="Reset Background"/> </placeholder> - <placeholder name="Dangerous File Actions" delimit="top"> - <menuitem name="Trash" - pixtype="stock" pixname="gtk-delete" - verb="Trash"/> - <menuitem name="Delete" verb="Delete"/> + </placeholder> +</popup> + +<popup name="selection"> + <placeholder name="Open Placeholder"> + <menuitem name="Open" action="Open"/> + <menuitem name="OpenAlternate" + action="OpenAlternate"/> + <placeholder name="Applications Placeholder"/> + <menu action="Open With"> + <placeholder name="Applications Placeholder"/> + <separator/> + <menuitem name="OtherApplication" action="OtherApplication1"/> + </menu> + <placeholder name="OtherApplicationPlaceholder"> + <menuitem name="OtherApplication" + action="OtherApplication2"/> </placeholder> + <menuitem name="Edit Launcher" + action="Edit Launcher"/> + <menu action="Scripts"> + <placeholder name="Scripts Placeholder"/> + <separator name="After Scripts"/> + <menuitem name="Open Scripts Folder" + action="Open Scripts Folder"/> + </menu> - <placeholder name="Icon Appearance Items" delimit="top"> - </placeholder> + </placeholder> + <placeholder name="File Clipboard Actions"> + <menuitem name="Cut Files" + action="Cut Files"/> + <menuitem name="Copy Files" + action="Copy Files"/> + <menuitem name="Paste Files Into" + action="Paste Files Into"/> + </placeholder> + <placeholder name="File Actions"> + <menuitem name="Create Link" action="Create Link"/> + <menuitem name="Rename" action="Rename"/> + </placeholder> + <placeholder name="Dangerous File Actions"> + <menuitem name="Trash" + action="Trash"/> + <menuitem name="Delete" action="Delete"/> + </placeholder> + + <placeholder name="Icon Appearance Items"> + </placeholder> - <placeholder name="Extension Actions" delimit="top"/> - <separator/> + <placeholder name="Extension Actions"/> + <separator/> - <menuitem name="Properties" - pixtype="stock" pixname="gtk-properties" - verb="Properties"/> - <placeholder name="Removabel Media Holder" delimit="top"> - <menuitem name="Mount Volume" verb="Mount Volume Conditional"/> - <menuitem name="Unmount Volume" verb="Unmount Volume Conditional"/> - <menuitem name="Protect Media" verb="Protect Conditional"/> - <menuitem name="Format Media" verb="Format Conditional"/> - <menuitem name="Media Properties" verb="Media Properties Conditional"/> - </placeholder> - <menuitem name="Connect To Server Link" verb="Connect To Server Link Conditional"/> - </popup> -</popups> -</Root> + <menuitem name="Properties" + action="Properties"/> + <placeholder name="Removabel Media Holder"> + <menuitem name="Mount Volume" action="Mount Volume"/> + <menuitem name="Unmount Volume" action="Unmount Volume"/> + </placeholder> + <menuitem name="Connect To Server Link" action="Connect To Server Link"/> +</popup> +</ui> diff --git a/src/file-manager/nautilus-icon-view-ui.xml b/src/file-manager/nautilus-icon-view-ui.xml index 15206ec7e..dde7078c2 100644 --- a/src/file-manager/nautilus-icon-view-ui.xml +++ b/src/file-manager/nautilus-icon-view-ui.xml @@ -1,138 +1,77 @@ -<Root> -<commands> - <cmd name="Stretch" - _label="Str_etch Icon" - _tip="Make the selected icon stretchable"/> - <cmd name="Unstretch" - _label="Restore Icons' Original Si_zes" - _tip="Restore each selected icon to its original size"/> - <cmd name="Manual Layout" - _label="_Manually" - _tip="Leave icons wherever they are dropped"/> - <cmd name="Sort by Name" - _label="By _Name" - _tip="Keep icons sorted by name in rows"/> - <cmd name="Sort by Size" - _label="By _Size" - _tip="Keep icons sorted by size in rows"/> - <cmd name="Sort by Type" - _label="By _Type" - _tip="Keep icons sorted by type in rows"/> - <cmd name="Sort by Modification Date" - _label="By Modification _Date" - _tip="Keep icons sorted by modification date in rows"/> - <cmd name="Sort by Emblems" - _label="By _Emblems" - _tip="Keep icons sorted by emblems in rows"/> - <cmd name="Keep Aligned" - _label="_Keep Aligned" - _tip="Keep icons lined up on a grid"/> - <cmd name="Tighter Layout" - _label="Compact _Layout" - _tip="Toggle using a tighter layout scheme"/> - <cmd name="Reversed Order" - _label="Re_versed Order" - _tip="Display icons in the opposite order"/> - <cmd name="Clean Up" - _label="Clean _Up by Name" - _tip="Reposition icons to better fit in the window and avoid overlapping"/> -</commands> -<menu> - <submenu name="Edit"> +<ui> +<menubar name="MenuBar"> + <menu action="Edit"> <placeholder name="Edit Items Placeholder"> <menuitem name="Stretch" - verb="Stretch"/> + action="Stretch"/> <menuitem name="Unstretch" - verb="Unstretch"/> + action="Unstretch"/> </placeholder> - </submenu> - - <submenu name="View"> + </menu> + <menu action="View"> <placeholder name="View Items Placeholder"> - <submenu name="Arrange Items" _label="Arran_ge Items"> + <menu action="Arrange Items"> <menuitem name="Manual Layout" - type="radio" group="layout group" - id="Manual Layout"/> + action="Manual Layout"/> <placeholder name="Auto Layout"> <menuitem name="Sort by Name" - type="radio" group="layout group" - id="Sort by Name"/> + action="Sort by Name"/> <menuitem name="Sort by Size" - type="radio" group="layout group" - id="Sort by Size"/> + action="Sort by Size"/> <menuitem name="Sort by Type" - type="radio" group="layout group" - id="Sort by Type"/> + action="Sort by Type"/> <menuitem name="Sort by Modification Date" - type="radio" group="layout group" - id="Sort by Modification Date"/> + action="Sort by Modification Date"/> <menuitem name="Sort by Emblems" - type="radio" group="layout group" - id="Sort by Emblems"/> + action="Sort by Emblems"/> </placeholder> <separator/> <menuitem name="Tighter Layout" - id="Tighter Layout" - type="toggle"/> + action="Tighter Layout"/> <menuitem name="Reversed Order" - id="Reversed Order" - type="toggle"/> - </submenu> + action="Reversed Order"/> + </menu> <menuitem name="Clean Up" - verb="Clean Up"/> + action="Clean Up"/> <menuitem name="Keep Aligned" - id="Keep Aligned" - type="toggle"/> + action="Keep Aligned"/> </placeholder> - </submenu> -</menu> -<popups> - <popup name="background"> - <placeholder name="Before Zoom Items"> - <placeholder name="View Items"> - <submenu name="Arrange Items" _label="Arran_ge Items" tearoff="0"> - <menuitem name="Manual Layout" - type="radio" group="context menu layout group" - id="Manual Layout"/> - <placeholder name="Auto Layout"> - <menuitem name="Sort by Name" - type="radio" group="context menu layout group" - id="Sort by Name"/> - <menuitem name="Sort by Size" - type="radio" group="context menu layout group" - id="Sort by Size"/> - <menuitem name="Sort by Type" - type="radio" group="context menu layout group" - id="Sort by Type"/> - <menuitem name="Sort by Modification Date" - type="radio" group="context menu layout group" - id="Sort by Modification Date"/> - <menuitem name="Sort by Emblems" - type="radio" group="context menu layout group" - id="Sort by Emblems"/> - </placeholder> - <separator/> - - <menuitem name="Tighter Layout" - id="Tighter Layout" - type="toggle"/> - <menuitem name="Reversed Order" - id="Reversed Order" - type="toggle"/> - </submenu> - - <menuitem name="Clean Up" verb="Clean Up"/> - <menuitem name="Keep Aligned" - id="Keep Aligned" - type="toggle"/> - </placeholder> - </placeholder> - </popup> - <popup name="selection"> - <placeholder name="Icon Appearance Items"> + </menu> +</menubar> +<popup name="background"> + <placeholder name="Before Zoom Items"> + <placeholder name="View Items"> + <menu action="Arrange Items"> + <menuitem name="Manual Layout" + action="Manual Layout"/> + <placeholder name="Auto Layout"> + <menuitem name="Sort by Name" + action="Sort by Name"/> + <menuitem name="Sort by Size" + action="Sort by Size"/> + <menuitem name="Sort by Type" + action="Sort by Type"/> + <menuitem name="Sort by Modification Date" + action="Sort by Modification Date"/> + <menuitem name="Sort by Emblems" + action="Sort by Emblems"/> + </placeholder> + <separator/> + <menuitem name="Tighter Layout" + action="Tighter Layout"/> + <menuitem name="Reversed Order" + action="Reversed Order"/> + </menu> + <menuitem name="Clean Up" action="Clean Up"/> + <menuitem name="Keep Aligned" + action="Keep Aligned"/> </placeholder> - </popup> -</popups> -</Root> + </placeholder> +</popup> +<popup name="selection"> + <placeholder name="Icon Appearance Items"> + </placeholder> +</popup> +</ui> diff --git a/src/file-manager/nautilus-list-view-ui.xml b/src/file-manager/nautilus-list-view-ui.xml index 3c59dfec7..b6f847ea6 100644 --- a/src/file-manager/nautilus-list-view-ui.xml +++ b/src/file-manager/nautilus-list-view-ui.xml @@ -1,16 +1,11 @@ -<Root> -<commands> - <cmd name="Visible Columns" - _label="Visible _Columns..." - _tip="Select the columns visible in this folder"/> -</commands> -<menu> - <submenu name="View"> +<ui> +<menubar name="MenuBar"> + <menu action="View"> <placeholder name="View Items Placeholder"> <menuitem name="Visible Columns" - verb="Visible Columns"/> + action="Visible Columns"/> </placeholder> - </submenu> -</menu> -</Root> + </menu> +</menubar> +</ui> diff --git a/src/nautilus-actions.h b/src/nautilus-actions.h new file mode 100644 index 000000000..c27af81dc --- /dev/null +++ b/src/nautilus-actions.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * Nautilus + * + * Copyright (C) 2004 Red Hat, Inc. + * + * Nautilus is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * Nautilus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Authors: Alexander Larsson <alexl@redhat.com> + * + */ + +#ifndef NAUTILUS_ACTIONS_H +#define NAUTILUS_ACTIONS_H + +#define NAUTILUS_ACTION_STOP "Stop" +#define NAUTILUS_ACTION_RELOAD "Reload" +#define NAUTILUS_ACTION_BACK "Back" +#define NAUTILUS_ACTION_UP "Up" +#define NAUTILUS_ACTION_FORWARD "Forward" +#define NAUTILUS_ACTION_SHOW_HIDE_SIDEBAR "Show Hide Sidebar" +#define NAUTILUS_ACTION_SHOW_HIDE_STATUSBAR "Show Hide Statusbar" +#define NAUTILUS_ACTION_SHOW_HIDE_LOCATION_BAR "Show Hide Location Bar" +#define NAUTILUS_ACTION_GO_TO_BURN_CD "Go to Burn CD" +#define NAUTILUS_ACTION_ZOOM_IN "Zoom In" +#define NAUTILUS_ACTION_ZOOM_OUT "Zoom Out" +#define NAUTILUS_ACTION_ZOOM_NORMAL "Zoom Normal" + +#endif /* NAUTILUS_ACTIONS_H */ diff --git a/src/nautilus-application.c b/src/nautilus-application.c index 56044ee6b..a83a946be 100644 --- a/src/nautilus-application.c +++ b/src/nautilus-application.c @@ -79,7 +79,6 @@ #include <libnautilus-private/nautilus-metafile-factory.h> #include <libnautilus-private/nautilus-module.h> #include <libnautilus-private/nautilus-sound.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-undo-manager.h> #include <libnautilus-private/nautilus-desktop-link-monitor.h> #include <libnautilus-private/nautilus-directory-private.h> @@ -428,6 +427,23 @@ initialize_kde_trash_hack (void) g_free (desktop_dir); } + +static Bonobo_RegistrationResult +nautilus_bonobo_activation_register_for_display (const char *iid, + Bonobo_Unknown ref) +{ + const char *display_name; + GSList *reg_env ; + Bonobo_RegistrationResult result; + + display_name = gdk_display_get_name (gdk_display_get_default()); + reg_env = bonobo_activation_registration_env_set (NULL, + "DISPLAY", display_name); + result = bonobo_activation_register_active_server (iid, ref, reg_env); + bonobo_activation_registration_env_free (reg_env); + return result; +} + void nautilus_application_startup (NautilusApplication *application, gboolean kill_shell, diff --git a/src/nautilus-arrow-toolbutton.c b/src/nautilus-arrow-toolbutton.c new file mode 100644 index 000000000..c2005f102 --- /dev/null +++ b/src/nautilus-arrow-toolbutton.c @@ -0,0 +1,299 @@ +/* + * Copyright (C) 2002 Christophe Fergeau + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Based on ephy-arrow-toolbutton.c from Epiphany + */ + +#include <config.h> + +#include "nautilus-arrow-toolbutton.h" + +#include <gtk/gtkarrow.h> +#include <gtk/gtkhbox.h> +#include <gtk/gtktogglebutton.h> +#include <gtk/gtkmenu.h> +#include <gtk/gtkmain.h> +#include <gdk/gdkkeysyms.h> + +#define NAUTILUS_ARROW_TOOLBUTTON_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), NAUTILUS_TYPE_ARROW_TOOLBUTTON, NautilusArrowToolButtonPrivate)) + +struct NautilusArrowToolButtonPrivate +{ + GtkWidget *arrow_widget; + GtkWidget *button; + GtkMenu *menu; +}; + +enum NautilusArrowToolButtonSignalsEnum { + NAUTILUS_ARROW_TOOL_BUTTON_MENU_ACTIVATED, + NAUTILUS_ARROW_TOOL_BUTTON_LAST_SIGNAL +}; + +/* GObject boilerplate code */ +static void nautilus_arrow_toolbutton_init (NautilusArrowToolButton *arrow_toolbutton); +static void nautilus_arrow_toolbutton_class_init (NautilusArrowToolButtonClass *klass); +static void nautilus_arrow_toolbutton_finalize (GObject *object); + +static GObjectClass *parent_class = NULL; + +static gint NautilusArrowToolButtonSignals[NAUTILUS_ARROW_TOOL_BUTTON_LAST_SIGNAL]; + +GType +nautilus_arrow_toolbutton_get_type (void) +{ + static GType nautilus_arrow_toolbutton_type = 0; + + if (nautilus_arrow_toolbutton_type == 0) { + static const GTypeInfo our_info = { + sizeof (NautilusArrowToolButtonClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) nautilus_arrow_toolbutton_class_init, + NULL, + NULL, /* class_data */ + sizeof (NautilusArrowToolButton), + 0, /* n_preallocs */ + (GInstanceInitFunc) nautilus_arrow_toolbutton_init + }; + + nautilus_arrow_toolbutton_type = g_type_register_static (GTK_TYPE_TOOL_BUTTON, + "NautilusArrowToolButton", + &our_info, 0); + } + + return nautilus_arrow_toolbutton_type; +} + + +static gboolean +nautilus_arrow_toolbutton_set_tooltip (GtkToolItem *tool_item, + GtkTooltips *tooltips, + const char *tip_text, + const char *tip_private) +{ + NautilusArrowToolButton *button = NAUTILUS_ARROW_TOOLBUTTON (tool_item); + + g_return_val_if_fail (NAUTILUS_IS_ARROW_TOOLBUTTON (button), FALSE); + + gtk_tooltips_set_tip (tooltips, button->priv->arrow_widget, tip_text, tip_private); + gtk_tooltips_set_tip (tooltips, button->priv->button, tip_text, tip_private); + + return TRUE; +} + +static void +nautilus_arrow_toolbutton_class_init (NautilusArrowToolButtonClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkToolItemClass *tool_item_class = GTK_TOOL_ITEM_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + object_class->finalize = nautilus_arrow_toolbutton_finalize; + + tool_item_class->set_tooltip = nautilus_arrow_toolbutton_set_tooltip; + + NautilusArrowToolButtonSignals[NAUTILUS_ARROW_TOOL_BUTTON_MENU_ACTIVATED] = + g_signal_new + ("menu-activated", G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP, + G_STRUCT_OFFSET (NautilusArrowToolButtonClass, menu_activated), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + g_type_class_add_private (object_class, sizeof (NautilusArrowToolButtonPrivate)); +} + +static void +button_state_changed_cb (GtkWidget *widget, + GtkStateType previous_state, + NautilusArrowToolButton *b) +{ + NautilusArrowToolButtonPrivate *p = b->priv; + GtkWidget *button; + GtkStateType state = GTK_WIDGET_STATE (widget); + + button = (widget == p->arrow_widget) ? p->button : p->arrow_widget; + + g_signal_handlers_block_by_func + (G_OBJECT (button), + G_CALLBACK (button_state_changed_cb), + b); + if (state == GTK_STATE_PRELIGHT && + previous_state != GTK_STATE_ACTIVE) { + gtk_widget_set_state (button, state); + } else if (state == GTK_STATE_NORMAL) { + gtk_widget_set_state (button, state); + } else if (state == GTK_STATE_ACTIVE) { + gtk_widget_set_state (button, GTK_STATE_NORMAL); + } + g_signal_handlers_unblock_by_func + (G_OBJECT (button), + G_CALLBACK (button_state_changed_cb), + b); +} + +static void +menu_position_under_widget (GtkMenu *menu, + gint *x, + gint *y, + gboolean *push_in, + gpointer user_data) +{ + GtkWidget *w = GTK_WIDGET (user_data); + gint screen_width, screen_height; + GtkRequisition requisition; + gboolean rtl; + + rtl = (gtk_widget_get_direction (w) == GTK_TEXT_DIR_RTL); + + gdk_window_get_origin (w->window, x, y); + gtk_widget_size_request (GTK_WIDGET (menu), &requisition); + + /* FIXME multihead */ + screen_width = gdk_screen_width (); + screen_height = gdk_screen_height (); + + if (rtl) + { + *x += w->allocation.x + w->allocation.width - requisition.width; + } + else + { + *x += w->allocation.x; + } + + *y += w->allocation.y + w->allocation.height; + + *x = CLAMP (*x, 0, MAX (0, screen_width - requisition.width)); + *y = CLAMP (*y, 0, MAX (0, screen_height - requisition.height)); +} + + +static void +popup_menu_under_arrow (NautilusArrowToolButton *b, GdkEventButton *event) +{ + NautilusArrowToolButtonPrivate *p = b->priv; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (p->arrow_widget), TRUE); + + g_signal_emit (b, NautilusArrowToolButtonSignals[NAUTILUS_ARROW_TOOL_BUTTON_MENU_ACTIVATED], 0); + gtk_menu_popup (p->menu, NULL, NULL, menu_position_under_widget, b, + event ? event->button : 0, + event ? event->time : gtk_get_current_event_time ()); +} + +static void +menu_deactivated_cb (GtkMenuShell *ms, NautilusArrowToolButton *b) +{ + NautilusArrowToolButtonPrivate *p = b->priv; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (p->arrow_widget), FALSE); +} + +static gboolean +arrow_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, NautilusArrowToolButton *b) +{ + popup_menu_under_arrow (b, event); + return TRUE; +} + +static gboolean +arrow_key_press_event_cb (GtkWidget *widget, GdkEventKey *event, NautilusArrowToolButton *b) +{ + if (event->keyval == GDK_space + || event->keyval == GDK_KP_Space + || event->keyval == GDK_Return + || event->keyval == GDK_KP_Enter + || event->keyval == GDK_Menu) { + popup_menu_under_arrow (b, NULL); + } + + return FALSE; +} + +static void +nautilus_arrow_toolbutton_init (NautilusArrowToolButton *arrowtb) +{ + GtkWidget *hbox; + GtkWidget *arrow; + GtkWidget *arrow_button; + GtkWidget *real_button; + + arrowtb->priv = NAUTILUS_ARROW_TOOLBUTTON_GET_PRIVATE (arrowtb); + + gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (arrowtb), FALSE); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox); + real_button = GTK_BIN (arrowtb)->child; + g_object_ref (real_button); + gtk_container_remove (GTK_CONTAINER (arrowtb), real_button); + gtk_container_add (GTK_CONTAINER (hbox), real_button); + gtk_container_add (GTK_CONTAINER (arrowtb), hbox); + g_object_unref (real_button); + + arrow_button = gtk_toggle_button_new (); + gtk_widget_show (arrow_button); + arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT); + gtk_widget_show (arrow); + gtk_button_set_relief (GTK_BUTTON (arrow_button), GTK_RELIEF_NONE); + gtk_container_add (GTK_CONTAINER (arrow_button), arrow); + + gtk_box_pack_end (GTK_BOX (hbox), arrow_button, + FALSE, FALSE, 0); + + arrowtb->priv->button = real_button; + arrowtb->priv->arrow_widget = arrow_button; + + arrowtb->priv->menu = GTK_MENU (gtk_menu_new ()); + g_object_ref (arrowtb->priv->menu); + gtk_object_sink (GTK_OBJECT (arrowtb->priv->menu)); + + g_signal_connect (arrowtb->priv->menu, "deactivate", + G_CALLBACK (menu_deactivated_cb), arrowtb); + + g_signal_connect (real_button, "state_changed", + G_CALLBACK (button_state_changed_cb), + arrowtb); + g_signal_connect (arrow_button, "state_changed", + G_CALLBACK (button_state_changed_cb), + arrowtb); + g_signal_connect (arrow_button, "key_press_event", + G_CALLBACK (arrow_key_press_event_cb), + arrowtb); + g_signal_connect (arrow_button, "button_press_event", + G_CALLBACK (arrow_button_press_event_cb), + arrowtb); +} + +static void +nautilus_arrow_toolbutton_finalize (GObject *object) +{ + NautilusArrowToolButton *arrow_toolbutton = NAUTILUS_ARROW_TOOLBUTTON (object); + + g_object_unref (arrow_toolbutton->priv->menu); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +GtkMenuShell * +nautilus_arrow_toolbutton_get_menu (NautilusArrowToolButton *b) +{ + return GTK_MENU_SHELL (b->priv->menu); +} diff --git a/src/nautilus-arrow-toolbutton.h b/src/nautilus-arrow-toolbutton.h new file mode 100644 index 000000000..dd82be308 --- /dev/null +++ b/src/nautilus-arrow-toolbutton.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2002 Christophe Fergeau + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Based on ephy-arrow-toolbutton.h from Epiphany + */ + +#ifndef NAUTILUS_ARROW_TOOLBUTTON_H +#define NAUTILUS_ARROW_TOOLBUTTON_H + +#include <glib.h> +#include <gtk/gtkmenushell.h> +#include <gtk/gtktoolbutton.h> + +G_BEGIN_DECLS + +#define NAUTILUS_TYPE_ARROW_TOOLBUTTON (nautilus_arrow_toolbutton_get_type ()) +#define NAUTILUS_ARROW_TOOLBUTTON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), NAUTILUS_TYPE_ARROW_TOOLBUTTON, NautilusArrowToolButton)) +#define NAUTILUS_ARROW_TOOLBUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), NAUTILUS_TYPE_ARROW_TOOLBUTTON, NautilusArrowToolButtonClass)) +#define NAUTILUS_IS_ARROW_TOOLBUTTON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), NAUTILUS_TYPE_ARROW_TOOLBUTTON)) +#define NAUTILUS_IS_ARROW_TOOLBUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), NAUTILUS_TYPE_ARROW_TOOLBUTTON)) +#define NAUTILUS_ARROW_TOOLBUTTON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NAUTILUS_TYPE_ARROW_TOOLBUTTON, NautilusArrowToolButtonClass)) + +typedef struct NautilusArrowToolButtonClass NautilusArrowToolButtonClass; +typedef struct NautilusArrowToolButton NautilusArrowToolButton; +typedef struct NautilusArrowToolButtonPrivate NautilusArrowToolButtonPrivate; + +struct NautilusArrowToolButton +{ + GtkToolButton parent; + + /*< private >*/ + NautilusArrowToolButtonPrivate *priv; +}; + +struct NautilusArrowToolButtonClass +{ + GtkToolButtonClass parent_class; + + void (*menu_activated) (NautilusArrowToolButton *b); +}; + +GType nautilus_arrow_toolbutton_get_type (void); + +GtkMenuShell *nautilus_arrow_toolbutton_get_menu (NautilusArrowToolButton *b); + +G_END_DECLS; + +#endif /* NAUTILUS_ARROW_TOOLBUTTON_H */ diff --git a/src/nautilus-desktop-window.c b/src/nautilus-desktop-window.c index 99709f4d2..9799a821e 100644 --- a/src/nautilus-desktop-window.c +++ b/src/nautilus-desktop-window.c @@ -34,7 +34,6 @@ #include <libgnome/gnome-macros.h> #include <libgnomevfs/gnome-vfs-utils.h> #include <libnautilus-private/nautilus-file-utilities.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #define STATUS_BAR_PATH "/status" #define MENU_BAR_PATH "/menu" @@ -63,6 +62,9 @@ nautilus_desktop_window_instance_init (NautilusDesktopWindow *window) g_object_set_data (G_OBJECT (window), "is_desktop_window", GINT_TO_POINTER (1)); + + gtk_widget_hide (NAUTILUS_WINDOW (window)->details->statusbar); + gtk_widget_hide (NAUTILUS_WINDOW (window)->details->menubar); } static gint @@ -360,17 +362,6 @@ real_get_title (NautilusWindow *window) } static void -real_merge_menus (NautilusWindow *window) -{ - EEL_CALL_PARENT (NAUTILUS_WINDOW_CLASS, merge_menus, (window)); - - nautilus_bonobo_set_hidden (window->details->shell_ui, - STATUS_BAR_PATH, TRUE); - nautilus_bonobo_set_hidden (window->details->shell_ui, - MENU_BAR_PATH, TRUE); -} - -static void nautilus_desktop_window_class_init (NautilusDesktopWindowClass *class) { G_OBJECT_CLASS (class)->finalize = finalize; @@ -384,8 +375,6 @@ nautilus_desktop_window_class_init (NautilusDesktopWindowClass *class) NAUTILUS_WINDOW_CLASS (class)->add_current_location_to_history_list = real_add_current_location_to_history_list; - NAUTILUS_WINDOW_CLASS (class)->merge_menus - = real_merge_menus; NAUTILUS_WINDOW_CLASS (class)->get_title = real_get_title; } diff --git a/src/nautilus-history-sidebar.c b/src/nautilus-history-sidebar.c index 88cd73555..52351b002 100644 --- a/src/nautilus-history-sidebar.c +++ b/src/nautilus-history-sidebar.c @@ -27,7 +27,6 @@ #include <config.h> -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-debug.h> #include <eel/eel-gtk-extensions.h> #include <eel/eel-glib-extensions.h> diff --git a/src/nautilus-information-panel.c b/src/nautilus-information-panel.c index 89d68ab36..0dbc59857 100644 --- a/src/nautilus-information-panel.c +++ b/src/nautilus-information-panel.c @@ -28,10 +28,6 @@ #include "nautilus-sidebar-title.h" -#include <bonobo/bonobo-property-bag-client.h> -#include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-exception.h> - #include <eel/eel-background.h> #include <eel/eel-glib-extensions.h> #include <eel/eel-gtk-extensions.h> diff --git a/src/nautilus-main.c b/src/nautilus-main.c index 4dc524e9e..0545a46e1 100644 --- a/src/nautilus-main.c +++ b/src/nautilus-main.c @@ -36,7 +36,6 @@ #include "nautilus-window.h" #include <bonobo-activation/bonobo-activation.h> #include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-ui-main.h> #include <dlfcn.h> #include <eel/eel-debug.h> #include <eel/eel-glib-extensions.h> @@ -345,7 +344,6 @@ main (int argc, char *argv[]) } eel_debug_shut_down (); - bonobo_ui_debug_shutdown (); /* If told to restart, exec() myself again. This is used when * the program is told to restart with CORBA, for example when diff --git a/src/nautilus-navigation-window-menus.c b/src/nautilus-navigation-window-menus.c index bbbf64123..2b6327825 100644 --- a/src/nautilus-navigation-window-menus.c +++ b/src/nautilus-navigation-window-menus.c @@ -29,6 +29,8 @@ #include <locale.h> +#include "nautilus-actions.h" +#include "nautilus-navigation-action.h" #include "nautilus-application.h" #include "nautilus-bookmark-list.h" #include "nautilus-bookmark-parsing.h" @@ -38,7 +40,6 @@ #include "nautilus-signaller.h" #include "nautilus-window-manage-views.h" #include "nautilus-window-private.h" -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-debug.h> #include <eel/eel-glib-extensions.h> #include <eel/eel-gnome-extensions.h> @@ -57,71 +58,43 @@ #include <libgnomevfs/gnome-vfs-file-info.h> #include <libgnomevfs/gnome-vfs-utils.h> #include <libgnomevfs/gnome-vfs-ops.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-icon-factory.h> #include <libnautilus-private/nautilus-undo-manager.h> -#include <libnautilus-private/nautilus-bonobo-ui.h> -#ifdef ENABLE_PROFILER -#include "nautilus-profiler.h" -#endif - -#define STATIC_BOOKMARKS_FILE_NAME "static_bookmarks.xml" - -/* Private menu definitions; others are in <libnautilus-private/nautilus-bonobo-ui.h>. - * These are not part of the published set, either because they are - * development-only or because we expect to change them and - * don't want other code relying on their existence. - */ - -#define MENU_PATH_SHOW_HIDE_SIDEBAR "/menu/View/Show Hide Placeholder/Show Hide Sidebar" -#define MENU_PATH_SHOW_HIDE_LOCATION_BAR "/menu/View/Show Hide Placeholder/Show Hide Location Bar" - -#define MENU_PATH_HISTORY_PLACEHOLDER "/menu/Go/History Placeholder" -#define MENU_PATH_BUILT_IN_BOOKMARKS_PLACEHOLDER "/menu/Bookmarks/Built-in Bookmarks Placeholder" -#define MENU_PATH_BOOKMARKS_PLACEHOLDER "/menu/Bookmarks/Bookmarks Placeholder" - -#define COMMAND_SHOW_HIDE_SIDEBAR "/commands/Show Hide Sidebar" -#define COMMAND_SHOW_HIDE_LOCATION_BAR "/commands/Show Hide Location Bar" -#define COMMAND_SHOW_HIDE_STATUS_BAR "/commands/Show Hide Statusbar" - -#define ID_SHOW_HIDE_SIDEBAR "Show Hide Sidebar" -#define ID_SHOW_HIDE_LOCATION_BAR "Show Hide Location Bar" +#define MENU_PATH_HISTORY_PLACEHOLDER "/MenuBar/Other Menus/Go/History Placeholder" +#define MENU_PATH_BOOKMARKS_PLACEHOLDER "/MenuBar/Other Menus/Bookmarks/Bookmarks Placeholder" #define RESPONSE_FORGET 1000 static GtkWindow *bookmarks_window = NULL; static NautilusBookmarkList *bookmarks = NULL; +static void schedule_refresh_go_menu (NautilusNavigationWindow *window); static void append_dynamic_bookmarks (NautilusNavigationWindow *window); -static NautilusBookmarkList *get_bookmark_list (void); -static void refresh_bookmarks_menu (NautilusNavigationWindow *window); static void schedule_refresh_bookmarks_menu (NautilusNavigationWindow *window); -static void edit_bookmarks (NautilusNavigationWindow *window); +static void refresh_bookmarks_menu (NautilusNavigationWindow *window); static void add_bookmark_for_current_location (NautilusNavigationWindow *window); -static void schedule_refresh_go_menu (NautilusWindow *window); +static void edit_bookmarks (NautilusNavigationWindow *window); +static NautilusBookmarkList *get_bookmark_list (void); static void -file_menu_close_all_windows_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_close_all_windows_callback (GtkAction *action, + gpointer user_data) { nautilus_application_close_all_navigation_windows (); } static void -go_menu_back_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_back_callback (GtkAction *action, + gpointer user_data) { nautilus_navigation_window_go_back (NAUTILUS_NAVIGATION_WINDOW (user_data)); } static void -go_menu_forward_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_forward_callback (GtkAction *action, + gpointer user_data) { nautilus_navigation_window_go_forward (NAUTILUS_NAVIGATION_WINDOW (user_data)); } @@ -175,30 +148,21 @@ forget_history_if_confirmed (NautilusWindow *window) } static void -go_menu_forget_history_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_clear_history_callback (GtkAction *action, + gpointer user_data) { forget_history_if_confirmed (NAUTILUS_WINDOW (user_data)); } static void -view_menu_show_hide_sidebar_state_changed_callback (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) +action_show_hide_sidebar_callback (GtkAction *action, + gpointer user_data) { NautilusNavigationWindow *window; window = NAUTILUS_NAVIGATION_WINDOW (user_data); - if (strcmp (state, "") == 0) { - /* State goes blank when component is removed; ignore this. */ - return; - } - - if (!strcmp (state, "1")) { + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) { nautilus_navigation_window_show_sidebar (window); } else { nautilus_navigation_window_hide_sidebar (window); @@ -206,78 +170,72 @@ view_menu_show_hide_sidebar_state_changed_callback (BonoboUIComponent *component } static void -view_menu_show_hide_location_bar_state_changed_callback (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) +action_show_hide_location_bar_callback (GtkAction *action, + gpointer user_data) { NautilusNavigationWindow *window; window = NAUTILUS_NAVIGATION_WINDOW (user_data); - if (strcmp (state, "") == 0) { - /* State goes blank when component is removed; ignore this. */ - return; - } - - if (!strcmp (state, "1")) { + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) { nautilus_navigation_window_show_location_bar (window, TRUE); } else { nautilus_navigation_window_hide_location_bar (window, TRUE); } } +static void +action_show_hide_statusbar_callback (GtkAction *action, + gpointer user_data) +{ + NautilusNavigationWindow *window; + + window = NAUTILUS_NAVIGATION_WINDOW (user_data); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) { + nautilus_navigation_window_show_status_bar (window); + } else { + nautilus_navigation_window_hide_status_bar (window); + } +} + void nautilus_navigation_window_update_show_hide_menu_items (NautilusNavigationWindow *window) { - g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); - - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); + GtkAction *action; - bonobo_ui_component_freeze (NAUTILUS_WINDOW (window)->details->shell_ui, NULL); - - nautilus_bonobo_set_toggle_state (NAUTILUS_WINDOW (window)->details->shell_ui, - COMMAND_SHOW_HIDE_SIDEBAR, - nautilus_navigation_window_sidebar_showing (window)); - nautilus_bonobo_set_toggle_state (NAUTILUS_WINDOW (window)->details->shell_ui, - COMMAND_SHOW_HIDE_LOCATION_BAR, - nautilus_navigation_window_location_bar_showing (window)); + g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); - bonobo_ui_component_thaw (NAUTILUS_WINDOW (window)->details->shell_ui, - NULL); + action = gtk_action_group_get_action (window->details->navigation_action_group, + NAUTILUS_ACTION_SHOW_HIDE_SIDEBAR); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + nautilus_navigation_window_sidebar_showing (window)); + + action = gtk_action_group_get_action (window->details->navigation_action_group, + NAUTILUS_ACTION_SHOW_HIDE_LOCATION_BAR); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + nautilus_navigation_window_location_bar_showing (window)); - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); + action = gtk_action_group_get_action (window->details->navigation_action_group, + NAUTILUS_ACTION_SHOW_HIDE_STATUSBAR); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + nautilus_navigation_window_status_bar_showing (window)); } static void -bookmarks_menu_add_bookmark_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_add_bookmark_callback (GtkAction *action, + gpointer user_data) { add_bookmark_for_current_location (NAUTILUS_NAVIGATION_WINDOW (user_data)); } static void -bookmarks_menu_edit_bookmarks_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_edit_bookmarks_callback (GtkAction *action, + gpointer user_data) { edit_bookmarks (NAUTILUS_NAVIGATION_WINDOW (user_data)); } - -static void -append_separator (NautilusNavigationWindow *window, const char *path) -{ - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - - nautilus_bonobo_add_menu_separator - (NAUTILUS_WINDOW (window)->details->shell_ui, path); - - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); -} - static void free_bookmark_list (void) { @@ -347,63 +305,6 @@ show_bogus_bookmark_window (NautilusWindow *window, g_free (detail); } -static void -create_menu_item_from_node (NautilusNavigationWindow *window, - xmlNodePtr node, - const char *menu_path, - int *index) -{ - NautilusBookmark *bookmark; - xmlChar *xml_folder_name; - int sub_index; - char *sub_menu_path, *escaped_name; - - g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); - - if (node->type != XML_ELEMENT_NODE) { - return; - } - - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - - if (strcmp (node->name, "bookmark") == 0) { - bookmark = nautilus_bookmark_new_from_node (node); - nautilus_menus_append_bookmark_to_menu - (NAUTILUS_WINDOW (window), - NAUTILUS_WINDOW (window)->details->shell_ui, - bookmark, - menu_path, - *index, - G_CALLBACK (schedule_refresh_bookmarks_menu), - show_bogus_bookmark_window); - g_object_unref (bookmark); - } else if (strcmp (node->name, "separator") == 0) { - append_separator (window, menu_path); - } else if (strcmp (node->name, "folder") == 0) { - xml_folder_name = eel_xml_get_property_translated (node, "name"); - nautilus_bonobo_add_submenu (NAUTILUS_WINDOW (window)->details->shell_ui, menu_path, xml_folder_name, NULL); - - /* Construct path and make sure it is escaped properly */ - escaped_name = gnome_vfs_escape_string (xml_folder_name); - sub_menu_path = g_strdup_printf ("%s/%s", menu_path, escaped_name); - g_free (escaped_name); - - for (node = eel_xml_get_children (node), sub_index = 0; - node != NULL; - node = node->next) { - create_menu_item_from_node (window, node, sub_menu_path, &sub_index); - } - g_free (sub_menu_path); - xmlFree (xml_folder_name); - } else { - g_warning ("found unknown node '%s', ignoring", node->name); - } - - (*index)++; - - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); -} - static GtkWindow * get_or_create_bookmarks_window (GObject *undo_manager_source) { @@ -462,16 +363,8 @@ refresh_bookmarks_menu (NautilusNavigationWindow *window) /* Unregister any pending call to this function. */ nautilus_navigation_window_remove_bookmarks_menu_callback (window); - g_object_ref (G_OBJECT (window)); - bonobo_ui_component_freeze - (NAUTILUS_WINDOW (window)->details->shell_ui, NULL); - nautilus_navigation_window_remove_bookmarks_menu_items (window); - append_dynamic_bookmarks (window); - - bonobo_ui_component_thaw (NAUTILUS_WINDOW (window)->details->shell_ui, NULL); - g_object_unref (G_OBJECT (window)); } /** @@ -500,7 +393,7 @@ nautilus_navigation_window_initialize_bookmarks_menu (NautilusNavigationWindow * } void -nautilus_window_remove_go_menu_callback (NautilusWindow *window) +nautilus_navigation_window_remove_go_menu_callback (NautilusNavigationWindow *window) { if (window->details->refresh_go_menu_idle_id != 0) { g_source_remove (window->details->refresh_go_menu_idle_id); @@ -509,15 +402,21 @@ nautilus_window_remove_go_menu_callback (NautilusWindow *window) } void -nautilus_window_remove_go_menu_items (NautilusWindow *window) +nautilus_navigation_window_remove_go_menu_items (NautilusNavigationWindow *window) { - nautilus_window_ui_freeze (window); - - nautilus_bonobo_remove_menu_items_and_commands - (window->details->shell_ui, - MENU_PATH_HISTORY_PLACEHOLDER); - - nautilus_window_ui_thaw (window); + GtkUIManager *ui_manager; + + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + if (window->details->go_menu_merge_id != 0) { + gtk_ui_manager_remove_ui (ui_manager, + window->details->go_menu_merge_id); + window->details->go_menu_merge_id = 0; + } + if (window->details->go_menu_action_group != NULL) { + gtk_ui_manager_remove_action_group (ui_manager, + window->details->go_menu_action_group); + window->details->go_menu_action_group = NULL; + } } /** @@ -527,53 +426,61 @@ nautilus_window_remove_go_menu_items (NautilusWindow *window) * @window: The NautilusWindow whose Go menu will be refreshed. **/ static void -refresh_go_menu (NautilusWindow *window) +refresh_go_menu (NautilusNavigationWindow *window) { + GtkUIManager *ui_manager; GList *node; int index; - g_assert (NAUTILUS_IS_WINDOW (window)); + g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); /* Unregister any pending call to this function. */ - nautilus_window_remove_go_menu_callback (window); - - bonobo_ui_component_freeze (window->details->shell_ui, NULL); + nautilus_navigation_window_remove_go_menu_callback (window); /* Remove old set of history items. */ - nautilus_window_remove_go_menu_items (window); + nautilus_navigation_window_remove_go_menu_items (window); + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + + window->details->go_menu_merge_id = gtk_ui_manager_new_merge_id (ui_manager); + window->details->go_menu_action_group = gtk_action_group_new ("GoMenuGroup"); + + gtk_ui_manager_insert_action_group (ui_manager, + window->details->go_menu_action_group, + -1); + + /* Add in a new set of history items. */ for (node = nautilus_get_history_list (), index = 0; node != NULL && index < 10; node = node->next, index++) { nautilus_menus_append_bookmark_to_menu - (window, - window->details->shell_ui, + (NAUTILUS_WINDOW (window), NAUTILUS_BOOKMARK (node->data), MENU_PATH_HISTORY_PLACEHOLDER, index, + window->details->go_menu_action_group, + window->details->go_menu_merge_id, G_CALLBACK (schedule_refresh_go_menu), show_bogus_bookmark_window); } - - bonobo_ui_component_thaw (window->details->shell_ui, NULL); } static gboolean refresh_go_menu_idle_callback (gpointer data) { - g_assert (NAUTILUS_IS_WINDOW (data)); + g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (data)); - refresh_go_menu (NAUTILUS_WINDOW (data)); + refresh_go_menu (NAUTILUS_NAVIGATION_WINDOW (data)); /* Don't call this again (unless rescheduled) */ return FALSE; } static void -schedule_refresh_go_menu (NautilusWindow *window) +schedule_refresh_go_menu (NautilusNavigationWindow *window) { - g_assert (NAUTILUS_IS_WINDOW (window)); + g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); if (window->details->refresh_go_menu_idle_id == 0) { window->details->refresh_go_menu_idle_id @@ -599,6 +506,128 @@ nautilus_navigation_window_initialize_go_menu (NautilusNavigationWindow *window) G_CALLBACK (schedule_refresh_go_menu), window, G_CONNECT_SWAPPED); } +static void +action_new_window_callback (GtkAction *action, + gpointer user_data) +{ + NautilusWindow *current_window; + NautilusWindow *new_window; + + current_window = NAUTILUS_WINDOW (user_data); + new_window = nautilus_application_create_navigation_window ( + current_window->application, + gtk_window_get_screen (GTK_WINDOW (current_window))); + nautilus_window_go_home (new_window); +} + +static void +action_go_to_location_callback (GtkAction *action, + gpointer user_data) +{ + NautilusWindow *window; + + window = NAUTILUS_WINDOW (user_data); + + nautilus_window_prompt_for_location (window); +} + +static GtkActionEntry navigation_entries[] = { + { "Go", NULL, N_("_Go") }, /* name, stock id, label */ + { "Bookmarks", NULL, N_("_Bookmarks") }, /* name, stock id, label */ + { "New Window", NULL, N_("Open New _Window"), /* name, stock id, label */ + "<control>L", N_("Open another Nautilus window for the displayed location"), + G_CALLBACK (action_new_window_callback) }, + { "Close All Windows", NULL, N_("Close _All Windows"), /* name, stock id, label */ + "<control><shift>W", N_("Close all Navigation windows"), + G_CALLBACK (action_close_all_windows_callback) }, + { "Go to Location", NULL, N_("_Location..."), /* name, stock id, label */ + "<control>L", N_("Specify a location to open"), + G_CALLBACK (action_go_to_location_callback) }, + { "Clear History", NULL, N_("_Clear History"), /* name, stock id, label */ + NULL, N_("Clear contents of Go menu and Back/Forward lists"), + G_CALLBACK (action_clear_history_callback) }, + { "Add Bookmark", GTK_STOCK_ADD, N_("_Add Bookmark"), /* name, stock id, label */ + "<control>d", N_("Add a bookmark for the current location to this menu"), + G_CALLBACK (action_add_bookmark_callback) }, + { "Edit Bookmarks", NULL, N_("_Edit Bookmarks"), /* name, stock id, label */ + "<control>b", N_("Display a window that allows editing the bookmarks in this menu"), + G_CALLBACK (action_edit_bookmarks_callback) }, +}; + +static GtkToggleActionEntry navigation_toggle_entries[] = { + { "Show Hide Sidebar", NULL, /* name, stock id */ + N_("_Side Pane"), "F9", /* label, accelerator */ + N_("Change the visibility of this window's sidebar"), /* tooltip */ + G_CALLBACK (action_show_hide_sidebar_callback), + TRUE}, /* is_active */ + { "Show Hide Location Bar", NULL, /* name, stock id */ + N_("Location _Bar"), NULL, /* label, accelerator */ + N_("Change the visibility of this window's location bar"), /* tooltip */ + G_CALLBACK (action_show_hide_location_bar_callback), + TRUE }, /* is_active */ + { "Show Hide Statusbar", NULL, /* name, stock id */ + N_("St_atusbar"), NULL, /* label, accelerator */ + N_("Change the visibility of this window's statusbar"), /* tooltip */ + G_CALLBACK (action_show_hide_statusbar_callback), + TRUE }, /* is_active */ +}; + +void +nautilus_navigation_window_initialize_actions (NautilusNavigationWindow *window) +{ + GtkActionGroup *action_group; + GtkUIManager *ui_manager; + GtkAction *action; + + action_group = gtk_action_group_new ("NavigationActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + window->details->navigation_action_group = action_group; + gtk_action_group_add_actions (action_group, + navigation_entries, G_N_ELEMENTS (navigation_entries), + window); + gtk_action_group_add_toggle_actions (action_group, + navigation_toggle_entries, G_N_ELEMENTS (navigation_toggle_entries), + window); + + action = g_object_new (NAUTILUS_TYPE_NAVIGATION_ACTION, + "name", "Back", + "label", _("_Back"), + "stock_id", GTK_STOCK_GO_BACK, + "tooltip", _("Go to the previous visited location"), + "window", window, + "direction", NAUTILUS_NAVIGATION_DIRECTION_BACK, + "is_important", TRUE, + NULL); + g_signal_connect (action, "activate", + G_CALLBACK (action_back_callback), window); + gtk_action_group_add_action_with_accel (action_group, + action, + "<alt>Left"); + g_object_unref (action); + + action = g_object_new (NAUTILUS_TYPE_NAVIGATION_ACTION, + "name", "Forward", + "label", _("_Forward"), + "stock_id", GTK_STOCK_GO_FORWARD, + "tooltip", _("Go to the next visited location"), + "window", window, + "direction", NAUTILUS_NAVIGATION_DIRECTION_FORWARD, + "is_important", TRUE, + NULL); + g_signal_connect (action, "activate", + G_CALLBACK (action_forward_callback), window); + gtk_action_group_add_action_with_accel (action_group, + action, + "<alt>Right"); + g_object_unref (action); + + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui_manager */ +} + + /** * nautilus_window_initialize_menus * @@ -606,56 +635,27 @@ nautilus_navigation_window_initialize_go_menu (NautilusNavigationWindow *window) * @window: A recently-created NautilusWindow. */ void -nautilus_navigation_window_initialize_menus_part_1 (NautilusNavigationWindow *navigation_window) +nautilus_navigation_window_initialize_menus (NautilusNavigationWindow *window) { - NautilusWindow *window; - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("Close All Windows", file_menu_close_all_windows_callback), - BONOBO_UI_VERB ("Back", go_menu_back_callback), - BONOBO_UI_VERB ("Forward", go_menu_forward_callback), - BONOBO_UI_VERB ("Clear History", go_menu_forget_history_callback), - BONOBO_UI_VERB ("Add Bookmark", bookmarks_menu_add_bookmark_callback), - BONOBO_UI_VERB ("Edit Bookmarks", bookmarks_menu_edit_bookmarks_callback), - - BONOBO_UI_VERB_END - }; - - window = NAUTILUS_WINDOW (navigation_window); - - nautilus_window_ui_freeze (window); - - bonobo_ui_component_freeze (window->details->shell_ui, NULL); - - nautilus_navigation_window_update_show_hide_menu_items (navigation_window); - - bonobo_ui_component_add_verb_list_with_data (window->details->shell_ui, - verbs, window); - - bonobo_ui_component_add_listener - (window->details->shell_ui, - ID_SHOW_HIDE_SIDEBAR, - view_menu_show_hide_sidebar_state_changed_callback, - window); - bonobo_ui_component_add_listener - (window->details->shell_ui, - ID_SHOW_HIDE_LOCATION_BAR, - view_menu_show_hide_location_bar_state_changed_callback, - window); - - bonobo_ui_component_thaw (window->details->shell_ui, NULL); + GtkUIManager *ui_manager; + GError *error; + char *file; + + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); - nautilus_window_ui_thaw (window); -} + error = NULL; + file = nautilus_ui_file ("nautilus-navigation-window-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (ui_manager, file, &error)) { + g_error ("building menus failed: %s", error->message); + g_error_free (error); + } + g_free (file); -void -nautilus_navigation_window_initialize_menus_part_2 (NautilusNavigationWindow *window) -{ - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); + nautilus_navigation_window_update_show_hide_menu_items (window); nautilus_navigation_window_initialize_go_menu (window); nautilus_navigation_window_initialize_bookmarks_menu (window); - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); } void @@ -670,16 +670,19 @@ nautilus_navigation_window_remove_bookmarks_menu_callback (NautilusNavigationWin void nautilus_navigation_window_remove_bookmarks_menu_items (NautilusNavigationWindow *window) { - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - - nautilus_bonobo_remove_menu_items_and_commands - (NAUTILUS_WINDOW (window)->details->shell_ui, - MENU_PATH_BUILT_IN_BOOKMARKS_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (NAUTILUS_WINDOW (window)->details->shell_ui, - MENU_PATH_BOOKMARKS_PLACEHOLDER); - - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); + GtkUIManager *ui_manager; + + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + if (window->details->bookmarks_merge_id != 0) { + gtk_ui_manager_remove_ui (ui_manager, + window->details->bookmarks_merge_id); + window->details->bookmarks_merge_id = 0; + } + if (window->details->bookmarks_action_group != NULL) { + gtk_ui_manager_remove_action_group (ui_manager, + window->details->bookmarks_action_group); + window->details->bookmarks_action_group = NULL; + } } static void @@ -688,20 +691,33 @@ append_dynamic_bookmarks (NautilusNavigationWindow *window) NautilusBookmarkList *bookmarks; guint bookmark_count; guint index; - + GtkUIManager *ui_manager; + g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); + g_assert (window->details->bookmarks_merge_id == 0); + g_assert (window->details->bookmarks_action_group == NULL); bookmarks = get_bookmark_list (); + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + + window->details->bookmarks_merge_id = gtk_ui_manager_new_merge_id (ui_manager); + window->details->bookmarks_action_group = gtk_action_group_new ("BookmarksGroup"); + + gtk_ui_manager_insert_action_group (ui_manager, + window->details->bookmarks_action_group, + -1); + /* append new set of bookmarks */ bookmark_count = nautilus_bookmark_list_length (bookmarks); for (index = 0; index < bookmark_count; ++index) { nautilus_menus_append_bookmark_to_menu (NAUTILUS_WINDOW (window), - NAUTILUS_WINDOW (window)->details->shell_ui, nautilus_bookmark_list_item_at (bookmarks, index), MENU_PATH_BOOKMARKS_PLACEHOLDER, index, + window->details->bookmarks_action_group, + window->details->bookmarks_merge_id, G_CALLBACK (schedule_refresh_bookmarks_menu), show_bogus_bookmark_window); } @@ -729,3 +745,5 @@ schedule_refresh_bookmarks_menu (NautilusNavigationWindow *window) window); } } + + diff --git a/src/nautilus-navigation-window-ui.xml b/src/nautilus-navigation-window-ui.xml index 2de31422d..5828dc738 100644 --- a/src/nautilus-navigation-window-ui.xml +++ b/src/nautilus-navigation-window-ui.xml @@ -1,179 +1,105 @@ -<Root> +<ui> -<!-- A description of each placeholder's purpose is in libnautilus/nautilus-bonobo-ui.h --> - -<commands> - <!-- We define commands here for (at least) all the items - for which we share tip or sensitivity state between more - than one item (usually 1 menuitem and 1 toolitem. - --> - +<!-- <cmd name="Back" accel="*Alt*Left" _tip="Go to the previous visited location"/> <cmd name="Forward" accel="*Alt*Right" _tip="Go to the next visited location"/> -</commands> +--> -<menu> - <submenu name="File"> +<menubar name="MenuBar"> + <menu action="File"> <placeholder name="New Items Placeholder"> <menuitem name="New Window" - _label="Open New _Window" - _tip="Open another Nautilus window for the displayed location" - accel="*Control*N" - verb="New Window"/> + action="New Window"/> </placeholder> - <placeholder name="Location Placeholder"> - <menuitem name="Connect to Server" - _label="Connect to _Server..." - verb="Connect to Server"/> - </placeholder> <placeholder name="Close Items Placeholder"> <menuitem name="Close All Windows" - _label="Close _All Windows" - _tip="Close all Navigation windows" - accel="*Control**Shift*w" - verb="Close All Windows"/> + action="Close All Windows"/> </placeholder> - </submenu> - <submenu name="View" _label="_View"> - <placeholder name="Show Hide Placeholder" delimit="top"> + </menu> + <menu action="View"> + <placeholder name="Show Hide Placeholder"> <menuitem name="Show Hide Sidebar" - type="toggle" - _label="_Side Pane" - _tip="Change the visibility of this window's sidebar" - accel="F9" - id="Show Hide Sidebar"/> + action="Show Hide Sidebar"/> <menuitem name="Show Hide Location Bar" - type="toggle" - _label="Location _Bar" - _tip="Change the visibility of this window's location bar" - id="Show Hide Location Bar"/> + action="Show Hide Location Bar"/> <menuitem name="Show Hide Statusbar" - type="toggle" - _label="St_atusbar" - _tip="Change the visibility of this window's statusbar" - id="Show Hide Statusbar"/> + action="Show Hide Statusbar"/> </placeholder> - </submenu> - - <submenu name="Go" _label="_Go"> - <placeholder name="Navigation Items"> - <menuitem name="Up" - _label="_Up" - accel="*Alt*Up" - pixtype="stock" pixname="gtk-go-up" - verb="Up"/> - <menuitem name="Back" - _label="_Back" - pixtype="stock" pixname="gtk-go-back" - verb="Back"/> - <menuitem name="Forward" - _label="_Forward" - pixtype="stock" pixname="gtk-go-forward" - verb="Forward"/> - </placeholder> - <separator/> - <menuitem name="Home" - _label="_Home" - accel="*Alt*Home" - pixtype="stock" pixname="gtk-home" - verb="Home"/> - <menuitem name="Computer" - _label="_Computer" - pixtype="stock" pixname="gnome-fs-client" - verb="Go to Computer"/> - <menuitem name="Go to Templates" - _label="_Templates" - _tip="Go to templates folder" - verb="Go to Templates"/> - <menuitem name="Go to Trash" - _label="_Trash" - _tip="Go to the trash folder" - verb="Go to Trash"/> - <menuitem name="Go to Burn CD" - _label="CD _Creator" - _tip="Go to the CD/DVD Creator" - verb="Go to Burn CD"/> - <menuitem name="Go to Location" - _label="_Location..." - accel="*Control*l" - verb="Go to Location"/> + </menu> - <separator/> + <placeholder name="Other Menus"> + <menu action="Go"> + <placeholder name="Navigation Items"> + <menuitem name="Up" + action="Up"/> + <menuitem name="Back" + action="Back"/> + <menuitem name="Forward" + action="Forward"/> + </placeholder> + <separator/> + <menuitem name="Home" + action="Home"/> + <menuitem name="Computer" + action="Go to Computer"/> + <menuitem name="Go to Templates" + action="Go to Templates"/> + <menuitem name="Go to Trash" + action="Go to Trash"/> + <menuitem name="Go to Burn CD" + action="Go to Burn CD"/> + <menuitem name="Go to Location" + action="Go to Location"/> - <menuitem name="Clear History" - _label="_Clear History" - _tip="Clear contents of Go menu and Back/Forward lists" - verb="Clear History"/> + <separator/> - <placeholder name="History Placeholder" delimit="top"/> - </submenu> + <menuitem name="Clear History" + action="Clear History"/> + <placeholder name="History Placeholder"/> + </menu> - <submenu name="Bookmarks" _label="_Bookmarks"> - <menuitem name="Add Bookmark" - _label="_Add Bookmark" - _tip="Add a bookmark for the current location to this menu" - accel="*Control*d" - pixtype="stock" pixname="gtk-add" - verb="Add Bookmark"/> - <menuitem name="Edit Bookmarks" - _label="_Edit Bookmarks" - _tip="Display a window that allows editing the bookmarks in this menu" - accel="*Control*b" - verb="Edit Bookmarks"/> + <menu action="Bookmarks"> + <menuitem name="Add Bookmark" + action="Add Bookmark"/> + <menuitem name="Edit Bookmark" + action="Edit Bookmarks"/> - <placeholder name="Built-in Bookmarks Placeholder" delimit="top"/> - <placeholder name="Bookmarks Placeholder" delimit="top"/> - </submenu> -</menu> - -<dockitem name="Location Bar" behavior="exclusive,never vertical"> - <control name="Wrapper" behavior="expandable"/> -</dockitem> + <placeholder name="Bookmarks Placeholder"/> + </menu> + </placeholder> +</menubar> -<dockitem name="Toolbar" behavior="exclusive"> +<toolbar name="Toolbar"> <toolitem name="Back" - _label="Back" - priority="1" - pixtype="stock" pixname="gtk-go-back" - verb="Back"/> - <control name="BackMenu"/> + action="Back"/> +<!-- <control name="BackMenu"/> --> <toolitem name="Forward" - _label="Forward" - pixtype="stock" pixname="gtk-go-forward" - verb="Forward"/> - <control name="ForwardMenu"/> + action="Forward"/> +<!-- <control name="ForwardMenu"/> --> + <toolitem name="Up" - _label="Up" - pixtype="stock" pixname="gtk-go-up" - verb="Up"/> - <toolitem name="Stop" _label="Stop" - pixtype="stock" pixname="gtk-stop" - verb="Stop"/> + action="Up"/> + <toolitem name="Stop" + action="Stop"/> <toolitem name="Reload" - _label="Reload" - pixtype="stock" pixname="gtk-refresh" - verb="Reload"/> + action="Reload"/> <separator/> <toolitem name="Home" - _label="Home" - priority="1" - pixtype="stock" pixname="gtk-home" - verb="Home"/> + action="Home"/> <toolitem name="Computer" - _label="Computer" - priority="1" - pixtype="stock" pixname="gnome-fs-client" - verb="Go to Computer"/> + action="Go to Computer"/> - <placeholder name="Extra Buttons Placeholder" delimit="top"> + <placeholder name="Extra Buttons Placeholder"> <placeholder name="Extension Actions"/> </placeholder> +<!-- <control name="SpaceWrapper" behavior="expandable"/> <control name="ThrobberWrapper" behavior="pack-end"/> -</dockitem> -</Root> +--> +</toolbar> +</ui> diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index 40efce909..18551f3e6 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -31,6 +31,7 @@ #include <config.h> #include "nautilus-window-private.h" +#include "nautilus-actions.h" #include "nautilus-application.h" #include "nautilus-bookmarks-window.h" #include "nautilus-main.h" @@ -38,9 +39,6 @@ #include "nautilus-location-bar.h" #include "nautilus-window-manage-views.h" #include "nautilus-zoom-control.h" -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-property-bag-client.h> -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-accessibility.h> #include <eel/eel-debug.h> #include <eel/eel-gdk-extensions.h> @@ -65,7 +63,6 @@ #include <libgnomeui/gnome-window-icon.h> #include <libgnomevfs/gnome-vfs-uri.h> #include <libgnomevfs/gnome-vfs-utils.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-file-attributes.h> #include <libnautilus-private/nautilus-global-preferences.h> @@ -77,7 +74,6 @@ #include <libnautilus-private/nautilus-sidebar.h> #include <libnautilus-private/nautilus-theme.h> #include <libnautilus-private/nautilus-view-factory.h> -#include <libnautilus-private/nautilus-bonobo-ui.h> #include <libnautilus-private/nautilus-clipboard.h> #include <libnautilus-private/nautilus-undo.h> #include <libnautilus-private/nautilus-module.h> @@ -110,10 +106,14 @@ enum { static int side_pane_width_auto_value = SIDE_PANE_MINIMUM_WIDTH; -static void add_sidebar_panels (NautilusNavigationWindow *window); -static void load_view_as_menu (NautilusWindow *window); -static void side_panel_image_changed_callback (NautilusSidebar *side_panel, - gpointer callback_data); +static void add_sidebar_panels (NautilusNavigationWindow *window); +static void load_view_as_menu (NautilusWindow *window); +static void side_panel_image_changed_callback (NautilusSidebar *side_panel, + gpointer callback_data); +static void navigation_bar_location_changed_callback (GtkWidget *widget, + const char *uri, + NautilusNavigationWindow *window); + GNOME_CLASS_BOILERPLATE (NautilusNavigationWindow, nautilus_navigation_window, NautilusWindow, NAUTILUS_TYPE_WINDOW) @@ -121,6 +121,11 @@ GNOME_CLASS_BOILERPLATE (NautilusNavigationWindow, nautilus_navigation_window, static void nautilus_navigation_window_instance_init (NautilusNavigationWindow *window) { + GtkUIManager *ui_manager; + GtkWidget *toolbar; + GtkWidget *location_bar_box; + GtkWidget *view_as_menu_vbox; + window->details = g_new0 (NautilusNavigationWindowDetails, 1); window->details->tooltips = gtk_tooltips_new (); @@ -128,23 +133,89 @@ nautilus_navigation_window_instance_init (NautilusNavigationWindow *window) gtk_object_sink (GTK_OBJECT (window->details->tooltips)); window->details->content_paned = nautilus_horizontal_splitter_new (); + gtk_table_attach (GTK_TABLE (NAUTILUS_WINDOW (window)->details->table), + window->details->content_paned, + /* X direction */ /* Y direction */ + 0, 1, 3, 4, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, + 0, 0); gtk_widget_show (window->details->content_paned); - bonobo_window_set_contents (BONOBO_WINDOW (window), window->details->content_paned); -} -static void -file_menu_new_window_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - NautilusWindow *window = NAUTILUS_WINDOW (user_data); + nautilus_navigation_window_initialize_actions (window); + nautilus_navigation_window_initialize_menus (window); + + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + toolbar = gtk_ui_manager_get_widget (ui_manager, "/Toolbar"); + window->details->toolbar = toolbar; + gtk_table_attach (GTK_TABLE (NAUTILUS_WINDOW (window)->details->table), + toolbar, + /* X direction */ /* Y direction */ + 0, 1, 1, 2, + GTK_EXPAND | GTK_FILL, 0, + 0, 0); + gtk_widget_show (toolbar); + + nautilus_navigation_window_initialize_toolbars (window); + + /* Set initial sensitivity of some buttons & menu items + * now that they're all created. + */ + nautilus_navigation_window_allow_back (window, FALSE); + nautilus_navigation_window_allow_forward (window, FALSE); + + /* set up location bar */ + location_bar_box = gtk_hbox_new (FALSE, GNOME_PAD); + window->details->location_bar_box = location_bar_box; + gtk_container_set_border_width (GTK_CONTAINER (location_bar_box), GNOME_PAD_SMALL); + + window->navigation_bar = nautilus_location_bar_new (window); + gtk_widget_show (GTK_WIDGET (window->navigation_bar)); + + g_signal_connect_object (window->navigation_bar, "location_changed", + G_CALLBACK (navigation_bar_location_changed_callback), window, 0); - const gchar *uri = nautilus_window_get_location (window); + gtk_box_pack_start (GTK_BOX (location_bar_box), window->navigation_bar, + TRUE, TRUE, GNOME_PAD_SMALL); - window = nautilus_application_create_navigation_window (window->application, - gtk_window_get_screen (GTK_WINDOW (window))); + /* Option menu for content view types; it's empty here, filled in when a uri is set. + * Pack it into vbox so it doesn't grow vertically when location bar does. + */ + view_as_menu_vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); + gtk_widget_show (view_as_menu_vbox); + gtk_box_pack_end (GTK_BOX (location_bar_box), view_as_menu_vbox, FALSE, FALSE, 0); + + window->view_as_option_menu = gtk_option_menu_new (); + gtk_box_pack_end (GTK_BOX (view_as_menu_vbox), window->view_as_option_menu, TRUE, FALSE, 0); + gtk_widget_show (window->view_as_option_menu); - nautilus_window_open_location (window, uri, FALSE); + /* Allocate the zoom control and place on the right next to the menu. + * It gets shown later, if the view-frame contains something zoomable. + */ + window->zoom_control = nautilus_zoom_control_new (); + g_signal_connect_object (window->zoom_control, "zoom_in", + G_CALLBACK (nautilus_window_zoom_in), + window, G_CONNECT_SWAPPED); + g_signal_connect_object (window->zoom_control, "zoom_out", + G_CALLBACK (nautilus_window_zoom_out), + window, G_CONNECT_SWAPPED); + g_signal_connect_object (window->zoom_control, "zoom_to_level", + G_CALLBACK (nautilus_window_zoom_to_level), + window, G_CONNECT_SWAPPED); + g_signal_connect_object (window->zoom_control, "zoom_to_default", + G_CALLBACK (nautilus_window_zoom_to_default), + window, G_CONNECT_SWAPPED); + gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); + + gtk_widget_show (location_bar_box); + + gtk_table_attach (GTK_TABLE (NAUTILUS_WINDOW (window)->details->table), + location_bar_box, + /* X direction */ /* Y direction */ + 0, 1, 2, 3, + GTK_EXPAND | GTK_FILL, 0, + 0, 0); + + } static void @@ -315,11 +386,12 @@ nautilus_navigation_window_unrealize (GtkWidget *widget) NautilusNavigationWindow *window; window = NAUTILUS_NAVIGATION_WINDOW (widget); - +#ifdef BONOBO_DONE if (window->details->throbber_property_bag != CORBA_OBJECT_NIL) { bonobo_object_release_unref (window->details->throbber_property_bag, NULL); window->details->throbber_property_bag = CORBA_OBJECT_NIL; } +#endif GTK_WIDGET_CLASS (parent_class)->unrealize (widget); } @@ -357,6 +429,7 @@ nautilus_navigation_window_finalize (GObject *object) window = NAUTILUS_NAVIGATION_WINDOW (object); nautilus_navigation_window_remove_bookmarks_menu_callback (window); + nautilus_navigation_window_remove_go_menu_callback (window); nautilus_navigation_window_clear_back_list (window); nautilus_navigation_window_clear_forward_list (window); @@ -461,34 +534,23 @@ nautilus_navigation_window_go_home (NautilusNavigationWindow *window) void nautilus_navigation_window_allow_back (NautilusNavigationWindow *window, gboolean allow) { - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - - nautilus_bonobo_set_sensitive (NAUTILUS_WINDOW (window)->details->shell_ui, - NAUTILUS_COMMAND_BACK, allow); - /* Have to handle non-standard Back button explicitly (it's - * non-standard to support right-click menu). - */ - gtk_widget_set_sensitive - (GTK_WIDGET (window->details->back_button_item), allow); + GtkAction *action; - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); + action = gtk_action_group_get_action (window->details->navigation_action_group, + NAUTILUS_ACTION_BACK); + + gtk_action_set_sensitive (action, allow); } void nautilus_navigation_window_allow_forward (NautilusNavigationWindow *window, gboolean allow) { - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - - nautilus_bonobo_set_sensitive (NAUTILUS_WINDOW (window)->details->shell_ui, - NAUTILUS_COMMAND_FORWARD, allow); - - /* Have to handle non-standard Forward button explicitly (it's - * non-standard to support right-click menu). - */ - gtk_widget_set_sensitive - (GTK_WIDGET (window->details->forward_button_item), allow); + GtkAction *action; - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); + action = gtk_action_group_get_action (window->details->navigation_action_group, + NAUTILUS_ACTION_FORWARD); + + gtk_action_set_sensitive (action, allow); } static void @@ -629,113 +691,6 @@ real_set_title (NautilusWindow *window, const char *title) } static void -real_merge_menus (NautilusWindow *nautilus_window) -{ - NautilusNavigationWindow *window; - GtkWidget *location_bar_box; - GtkWidget *view_as_menu_vbox; - BonoboControl *location_bar_wrapper; - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("New Window", file_menu_new_window_callback), - BONOBO_UI_VERB_END - }; - - EEL_CALL_PARENT (NAUTILUS_WINDOW_CLASS, - merge_menus, (nautilus_window)); - - window = NAUTILUS_NAVIGATION_WINDOW (nautilus_window); - - bonobo_ui_util_set_ui (NAUTILUS_WINDOW (window)->details->shell_ui, - DATADIR, - "nautilus-navigation-window-ui.xml", - "nautilus", NULL); - - bonobo_ui_component_freeze - (NAUTILUS_WINDOW (window)->details->shell_ui, NULL); - - bonobo_ui_component_add_verb_list_with_data (nautilus_window->details->shell_ui, - verbs, window); - - nautilus_navigation_window_initialize_menus_part_1 (window); - nautilus_navigation_window_initialize_toolbars (window); - - /* Set initial sensitivity of some buttons & menu items - * now that they're all created. - */ - nautilus_navigation_window_allow_back (window, FALSE); - nautilus_navigation_window_allow_forward (window, FALSE); - - /* set up location bar */ - location_bar_box = gtk_hbox_new (FALSE, GNOME_PAD); - gtk_container_set_border_width (GTK_CONTAINER (location_bar_box), GNOME_PAD_SMALL); - - window->navigation_bar = nautilus_location_bar_new (window); - gtk_widget_show (GTK_WIDGET (window->navigation_bar)); - - g_signal_connect_object (window->navigation_bar, "location_changed", - G_CALLBACK (navigation_bar_location_changed_callback), window, 0); - - gtk_box_pack_start (GTK_BOX (location_bar_box), window->navigation_bar, - TRUE, TRUE, GNOME_PAD_SMALL); - - /* Option menu for content view types; it's empty here, filled in when a uri is set. - * Pack it into vbox so it doesn't grow vertically when location bar does. - */ - view_as_menu_vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); - gtk_widget_show (view_as_menu_vbox); - gtk_box_pack_end (GTK_BOX (location_bar_box), view_as_menu_vbox, FALSE, FALSE, 0); - - window->view_as_option_menu = gtk_option_menu_new (); - gtk_box_pack_end (GTK_BOX (view_as_menu_vbox), window->view_as_option_menu, TRUE, FALSE, 0); - gtk_widget_show (window->view_as_option_menu); - - /* Allocate the zoom control and place on the right next to the menu. - * It gets shown later, if the view-frame contains something zoomable. - */ - window->zoom_control = nautilus_zoom_control_new (); - g_signal_connect_object (window->zoom_control, "zoom_in", - G_CALLBACK (nautilus_window_zoom_in), - window, G_CONNECT_SWAPPED); - g_signal_connect_object (window->zoom_control, "zoom_out", - G_CALLBACK (nautilus_window_zoom_out), - window, G_CONNECT_SWAPPED); - g_signal_connect_object (window->zoom_control, "zoom_to_level", - G_CALLBACK (nautilus_window_zoom_to_level), - window, G_CONNECT_SWAPPED); - g_signal_connect_object (window->zoom_control, "zoom_to_default", - G_CALLBACK (nautilus_window_zoom_to_default), - window, G_CONNECT_SWAPPED); - gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); - - gtk_widget_show (location_bar_box); - - /* Wrap the location bar in a control and set it up. */ - location_bar_wrapper = bonobo_control_new (location_bar_box); - bonobo_ui_component_object_set (NAUTILUS_WINDOW (window)->details->shell_ui, - "/Location Bar/Wrapper", - BONOBO_OBJREF (location_bar_wrapper), - NULL); - - bonobo_object_unref (location_bar_wrapper); - - bonobo_ui_component_thaw (NAUTILUS_WINDOW (window)->details->shell_ui, - NULL); -} - -static void -real_merge_menus_2 (NautilusWindow *nautilus_window) -{ - NautilusNavigationWindow *window; - - EEL_CALL_PARENT (NAUTILUS_WINDOW_CLASS, - merge_menus_2, (nautilus_window)); - - window = NAUTILUS_NAVIGATION_WINDOW (nautilus_window); - - nautilus_navigation_window_initialize_menus_part_2 (window); -} - -static void zoom_level_changed_callback (NautilusView *view, NautilusNavigationWindow *window) { @@ -832,9 +787,7 @@ nautilus_navigation_window_show_location_bar_temporarily (NautilusNavigationWind static void real_prompt_for_location (NautilusWindow *window) { - if (!window->details->updating_bonobo_state) { - nautilus_navigation_window_show_location_bar_temporarily (NAUTILUS_NAVIGATION_WINDOW (window), FALSE); - } + nautilus_navigation_window_show_location_bar_temporarily (NAUTILUS_NAVIGATION_WINDOW (window), FALSE); } void @@ -910,44 +863,12 @@ add_sidebar_panels (NautilusNavigationWindow *window) NAUTILUS_SIDEBAR (current)); } -static void -show_dock_item (NautilusNavigationWindow *window, const char *dock_item_path) -{ - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - - nautilus_bonobo_set_hidden (NAUTILUS_WINDOW (window)->details->shell_ui, - dock_item_path, - FALSE); - nautilus_navigation_window_update_show_hide_menu_items (window); - - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); -} - -static void -hide_dock_item (NautilusNavigationWindow *window, const char *dock_item_path) -{ - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - - nautilus_bonobo_set_hidden (NAUTILUS_WINDOW (window)->details->shell_ui, - dock_item_path, - TRUE); - nautilus_navigation_window_update_show_hide_menu_items (window); - - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); -} - -static gboolean -dock_item_showing (NautilusNavigationWindow *window, const char *dock_item_path) -{ - return !nautilus_bonobo_get_hidden (NAUTILUS_WINDOW (window)->details->shell_ui, - dock_item_path); -} - void nautilus_navigation_window_hide_location_bar (NautilusNavigationWindow *window, gboolean save_preference) { window->details->temporary_navigation_bar = FALSE; - hide_dock_item (window, LOCATION_BAR_PATH); + gtk_widget_hide (window->details->location_bar_box); + nautilus_navigation_window_update_show_hide_menu_items (window); if (save_preference && eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_START_WITH_LOCATION_BAR)) { eel_preferences_set_boolean (NAUTILUS_PREFERENCES_START_WITH_LOCATION_BAR, FALSE); @@ -957,7 +878,8 @@ nautilus_navigation_window_hide_location_bar (NautilusNavigationWindow *window, void nautilus_navigation_window_show_location_bar (NautilusNavigationWindow *window, gboolean save_preference) { - show_dock_item (window, LOCATION_BAR_PATH); + gtk_widget_show (window->details->location_bar_box); + nautilus_navigation_window_update_show_hide_menu_items (window); if (save_preference && eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_START_WITH_LOCATION_BAR)) { eel_preferences_set_boolean (NAUTILUS_PREFERENCES_START_WITH_LOCATION_BAR, TRUE); @@ -967,19 +889,61 @@ nautilus_navigation_window_show_location_bar (NautilusNavigationWindow *window, gboolean nautilus_navigation_window_location_bar_showing (NautilusNavigationWindow *window) { - return dock_item_showing (window, LOCATION_BAR_PATH); + if (window->details->location_bar_box != NULL) { + return GTK_WIDGET_VISIBLE (window->details->location_bar_box); + } + /* If we're not visible yet we haven't changed visibility, so its TRUE */ + return TRUE; } gboolean nautilus_navigation_window_toolbar_showing (NautilusNavigationWindow *window) { - return dock_item_showing (window, TOOLBAR_PATH); + if (window->details->toolbar != NULL) { + return GTK_WIDGET_VISIBLE (window->details->toolbar); + } + /* If we're not visible yet we haven't changed visibility, so its TRUE */ + return TRUE; +} + +void +nautilus_navigation_window_hide_status_bar (NautilusNavigationWindow *window) +{ + gtk_widget_hide (NAUTILUS_WINDOW (window)->details->statusbar); + + nautilus_navigation_window_update_show_hide_menu_items (window); + if (eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR) && + eel_preferences_get_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR)) { + eel_preferences_set_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR, FALSE); + } +} + +void +nautilus_navigation_window_show_status_bar (NautilusNavigationWindow *window) +{ + gtk_widget_show (NAUTILUS_WINDOW (window)->details->statusbar); + + nautilus_navigation_window_update_show_hide_menu_items (window); + if (eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR) && + !eel_preferences_get_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR)) { + eel_preferences_set_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR, TRUE); + } +} + +gboolean +nautilus_navigation_window_status_bar_showing (NautilusNavigationWindow *window) +{ + if (NAUTILUS_WINDOW (window)->details->statusbar != NULL) { + return GTK_WIDGET_VISIBLE (NAUTILUS_WINDOW (window)->details->statusbar); + } + /* If we're not visible yet we haven't changed visibility, so its TRUE */ + return TRUE; } void nautilus_navigation_window_hide_sidebar (NautilusNavigationWindow *window) { - if (NAUTILUS_IS_DESKTOP_WINDOW (window) || window->sidebar == NULL) { + if (window->sidebar == NULL) { return; } @@ -995,7 +959,7 @@ nautilus_navigation_window_hide_sidebar (NautilusNavigationWindow *window) void nautilus_navigation_window_show_sidebar (NautilusNavigationWindow *window) { - if (NAUTILUS_IS_DESKTOP_WINDOW (window) || window->sidebar != NULL) { + if (window->sidebar != NULL) { return; } @@ -1073,9 +1037,9 @@ nautilus_navigation_window_show (GtkWidget *widget) } if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR)) { - nautilus_window_show_status_bar (NAUTILUS_WINDOW (window)); + nautilus_navigation_window_show_status_bar (window); } else { - nautilus_window_hide_status_bar (NAUTILUS_WINDOW (window)); + nautilus_navigation_window_hide_status_bar (window); } GTK_WIDGET_CLASS (parent_class)->show (widget); @@ -1132,8 +1096,6 @@ nautilus_navigation_window_class_init (NautilusNavigationWindowClass *class) GTK_OBJECT_CLASS (class)->destroy = nautilus_navigation_window_destroy; GTK_WIDGET_CLASS (class)->show = nautilus_navigation_window_show; GTK_WIDGET_CLASS (class)->unrealize = nautilus_navigation_window_unrealize; - NAUTILUS_WINDOW_CLASS (class)->merge_menus = real_merge_menus; - NAUTILUS_WINDOW_CLASS (class)->merge_menus_2 = real_merge_menus_2; NAUTILUS_WINDOW_CLASS (class)->load_view_as_menu = real_load_view_as_menu; NAUTILUS_WINDOW_CLASS (class)->set_content_view_widget = real_set_content_view_widget; NAUTILUS_WINDOW_CLASS (class)->set_throbber_active = real_set_throbber_active; diff --git a/src/nautilus-navigation-window.h b/src/nautilus-navigation-window.h index b795660c8..9a822dd2f 100644 --- a/src/nautilus-navigation-window.h +++ b/src/nautilus-navigation-window.h @@ -102,5 +102,11 @@ void nautilus_navigation_window_add_sidebar_panel (NautilusNavigationWind NautilusSidebar *sidebar_panel); void nautilus_navigation_window_remove_sidebar_panel (NautilusNavigationWindow *window, NautilusSidebar *sidebar_panel); +void nautilus_navigation_window_hide_status_bar (NautilusNavigationWindow *window); +void nautilus_navigation_window_show_status_bar (NautilusNavigationWindow *window); +gboolean nautilus_navigation_window_status_bar_showing (NautilusNavigationWindow *window); +void nautilus_navigation_window_back_or_forward (NautilusNavigationWindow *window, + gboolean back, + guint distance); #endif diff --git a/src/nautilus-notes-viewer.c b/src/nautilus-notes-viewer.c index 2e08d5b40..191c58add 100644 --- a/src/nautilus-notes-viewer.c +++ b/src/nautilus-notes-viewer.c @@ -38,13 +38,12 @@ #include <gtk/gtktextview.h> #include <gtk/gtkvbox.h> #include <gtk/gtkscrolledwindow.h> -#include <bonobo/bonobo-property-bag.h> +#include <libgnome/gnome-i18n.h> #include <libnautilus-private/nautilus-file-attributes.h> #include <libnautilus-private/nautilus-file.h> #include <libnautilus-private/nautilus-global-preferences.h> #include <libnautilus-private/nautilus-metadata.h> #include <libnautilus-private/nautilus-clipboard.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-theme.h> #include <libnautilus-private/nautilus-module.h> #include <libnautilus-private/nautilus-sidebar-provider.h> diff --git a/src/nautilus-profiler.c b/src/nautilus-profiler.c deleted file mode 100644 index 852667437..000000000 --- a/src/nautilus-profiler.c +++ /dev/null @@ -1,317 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* - * Nautilus - * - * Copyright (C) 2000 Eazel, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ramiro Estrugo <ramiro@eazel.com> - */ - -/* nautilus-profiler.c: Nautilus profiler hooks and reporting. - */ - -#include <config.h> -#include "nautilus-profiler.h" - -#ifdef ENABLE_PROFILER - -#include <eel/eel-gtk-extensions.h> -#include <eel/eel-vfs-extensions.h> -#include <glib.h> -#include <gtk/gtkbutton.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkscrolledwindow.h> -#include <gtk/gtksignal.h> -#include <gtk/gtktextbuffer.h> -#include <gtk/gtktextview.h> -#include <gtk/gtkvbox.h> -#include <gtk/gtkvscrollbar.h> -#include <gtk/gtkwindow.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomevfs/gnome-vfs-utils.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -/* These are defined in eazel-tools/profiler/profiler.C */ -extern void profile_on (void); -extern void profile_off (void); -extern void profile_reset (void); -extern void profile_dump (const char *file_name, gboolean); - -void -nautilus_profiler_bonobo_ui_reset_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - profile_reset (); -} - -void -nautilus_profiler_bonobo_ui_start_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - profile_on (); -} - -void -nautilus_profiler_bonobo_ui_stop_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - profile_off (); -} - -static void -widget_set_busy_cursor (GtkWidget *widget) -{ - GdkCursor *cursor; - - g_return_if_fail (GTK_IS_WIDGET (widget)); - g_return_if_fail (GTK_WIDGET_REALIZED (GTK_WIDGET (widget))); - - cursor = gdk_cursor_new (GDK_WATCH); - - gdk_window_set_cursor (GTK_WIDGET (widget)->window, cursor); - - gdk_flush (); - - gdk_cursor_unref (cursor); -} - -static void -widget_clear_busy_cursor (GtkWidget *widget) -{ - g_return_if_fail (GTK_IS_WIDGET (widget)); - g_return_if_fail (GTK_WIDGET_REALIZED (GTK_WIDGET (widget))); - - gdk_window_set_cursor (GTK_WIDGET (widget)->window, NULL); - - gdk_flush (); -} - -typedef struct -{ - GtkWidget *main_box; - GtkWidget *text; - GtkTextBuffer *text_buffer; -} ScrolledText; - -static ScrolledText * -scrolled_text_new (void) -{ - ScrolledText *scrolled_text; - GtkWidget *scrolled_window; - - scrolled_text = g_new (ScrolledText, 1); - - scrolled_text->main_box = gtk_hbox_new (FALSE, 0); - scrolled_text->text_buffer = gtk_text_buffer_new (NULL); - - gtk_text_buffer_create_tag (scrolled_text->text_buffer, "fixed_font", - "family", "monospace", - "wrap_mode", GTK_WRAP_NONE, - NULL); - - - scrolled_text->text = gtk_text_view_new_with_buffer (scrolled_text->text_buffer); - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (scrolled_window), - scrolled_text->text); - - gtk_box_pack_start (GTK_BOX (scrolled_text->main_box), scrolled_window, TRUE, TRUE, 0); - - gtk_widget_show_all (scrolled_window); - - return scrolled_text; -} - -typedef struct -{ - GtkWidget *window; - ScrolledText *scrolled_text; -} DumpDialog; - -static void -window_delete_event (GtkWidget *widget, GdkEvent *event, gpointer callback_data) -{ - g_return_if_fail (GTK_IS_WINDOW (widget)); - - gtk_widget_hide (widget); -} - -static void -window_print_button_callback (GtkWidget *widget, gpointer callback_data) -{ - DumpDialog *dump_dialog = (DumpDialog *) callback_data; - - g_return_if_fail (dump_dialog != NULL); - - /* Implement me */ - g_assert_not_reached (); -} - -static void -window_save_button_callback (GtkWidget *widget, gpointer callback_data) -{ - DumpDialog *dump_dialog = (DumpDialog *) callback_data; - - g_return_if_fail (dump_dialog != NULL); - - /* Implement me */ - g_assert_not_reached (); -} - -static DumpDialog * -dump_dialog_new (const char *title) -{ - DumpDialog *dump_dialog; - GtkWidget *print_button; - GtkWidget *save_button; - GtkWidget *main_box; - GtkWidget *button_box; - - dump_dialog = g_new (DumpDialog, 1); - - dump_dialog->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - eel_gtk_window_set_up_close_accelerator - (GTK_WINDOW (dump_dialog->window)); - g_signal_connect (dump_dialog->window, "delete_event", - G_CALLBACK (window_delete_event), dump_dialog->window); - - gtk_widget_set_size_request (dump_dialog->window, 700, 700); - - main_box = gtk_vbox_new (FALSE, 0); - dump_dialog->scrolled_text = scrolled_text_new (); - gtk_text_view_set_editable (GTK_TEXT_VIEW (dump_dialog->scrolled_text->text), FALSE); - - print_button = gtk_button_new_with_label (_("Print")); - save_button = gtk_button_new_with_label (_("Save")); - - gtk_widget_set_sensitive (print_button, FALSE); - gtk_widget_set_sensitive (save_button, FALSE); - - g_signal_connect_object (print_button, "clicked", - G_CALLBACK (window_print_button_callback), dump_dialog, 0); - g_signal_connect_object (save_button, "clicked", - G_CALLBACK (window_save_button_callback), dump_dialog, 0); - - gtk_container_add (GTK_CONTAINER (dump_dialog->window), main_box); - - button_box = gtk_hbox_new (FALSE, 4); - gtk_container_set_border_width (GTK_CONTAINER (button_box), 4); - - gtk_box_pack_start (GTK_BOX (main_box), dump_dialog->scrolled_text->main_box, TRUE, TRUE, 0); - gtk_box_pack_end (GTK_BOX (main_box), button_box, FALSE, FALSE, 0); - - gtk_box_pack_end (GTK_BOX (button_box), print_button, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (button_box), save_button, FALSE, FALSE, 0); - - gtk_widget_show_all (dump_dialog->window); - - return dump_dialog; -} - -static void -dump_dialog_show (const char *dump_data, const char *title) -{ - static DumpDialog *dump_dialog = NULL; - GtkTextBuffer *buffer; - GtkTextIter start_iter, end_iter; - - g_return_if_fail (dump_data != NULL); - - if (dump_dialog == NULL) { - dump_dialog = dump_dialog_new (_("Profile Dump")); - } - - buffer = dump_dialog->scrolled_text->text_buffer; - - /* delete existing text in buffer */ - gtk_text_buffer_get_bounds (buffer, &start_iter, &end_iter); - gtk_text_buffer_delete (buffer, &start_iter, &end_iter); - - gtk_text_buffer_get_start_iter (buffer, &start_iter); - - gtk_text_buffer_insert_with_tags_by_name (buffer, &start_iter, - dump_data, -1, - "fixed_font", - NULL); - - if (title != NULL) { - gtk_window_set_title (GTK_WINDOW (dump_dialog->window), title); - } - - gtk_widget_show (dump_dialog->window); -} - - -void -nautilus_profiler_bonobo_ui_report_callback (BonoboUIComponent *component, - gpointer user_data, - const char *path) -{ - char *dump_file_name; - char *uri; - int fd; - - int dump_size = 0; - char *dump_contents = NULL; - - GtkWidget *window = NULL; - - g_return_if_fail (component != NULL); - g_return_if_fail (GTK_IS_WINDOW (user_data)); - - dump_file_name = g_strdup ("/tmp/nautilus-profile-log-XXXXXX"); - - fd = mkstemp (dump_file_name); - - if (fd != -1) { - close (fd); - } else { - g_free (dump_file_name); - dump_file_name = g_strdup_printf ("/tmp/nautilus-profile-log.%d", getpid ()); - } - - window = GTK_WIDGET (user_data); - - widget_set_busy_cursor (window); - - profile_dump (dump_file_name, TRUE); - - uri = gnome_vfs_get_uri_from_local_path (dump_file_name); - - if (eel_read_entire_file (uri, &dump_size, &dump_contents) == GNOME_VFS_OK) { - dump_dialog_show (dump_contents, uri); - } - - widget_clear_busy_cursor (window); - - remove (dump_file_name); - - g_free (dump_file_name); -} - -#endif diff --git a/src/nautilus-profiler.h b/src/nautilus-profiler.h deleted file mode 100644 index fd5384433..000000000 --- a/src/nautilus-profiler.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* - * Nautilus - * - * Copyright (C) 2000 Eazel, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ramiro Estrugo <ramiro@eazel.com> - */ - -/* nautilus-profiler.h: Nautilus profiler hooks and reporting. */ - -#ifndef NAUTILUS_PROFILER_H -#define NAUTILUS_PROFILER_H - -#include <libnautilus-private/nautilus-bonobo-extensions.h> - -void nautilus_profiler_bonobo_ui_reset_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb); -void nautilus_profiler_bonobo_ui_start_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb); -void nautilus_profiler_bonobo_ui_stop_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb); -void nautilus_profiler_bonobo_ui_report_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb); - -#endif /* NAUTILUS_PROFILER_H */ diff --git a/src/nautilus-shell-ui.xml b/src/nautilus-shell-ui.xml index bb58aa87e..f51524d23 100644 --- a/src/nautilus-shell-ui.xml +++ b/src/nautilus-shell-ui.xml @@ -1,232 +1,112 @@ -<Root> - -<!-- A description of each placeholder's purpose is in libnautilus/nautilus-bonobo-ui.h --> - -<commands> - <!-- We define commands here for (at least) all the items - for which we share tip or sensitivity state between more - than one item (usually 1 menuitem and 1 toolitem. - --> - <cmd name="Up" - _tip="Go up one level"/> - <cmd name="Home" - _tip="Go to the home location"/> - <cmd name="Stop" - _tip="Stop loading this location"/> - <cmd name="Select All" accel="*Control*a" sensitive="0"/> - <cmd name="Cut" accel="*Control*x" sensitive="0"/> - <cmd name="Copy" accel="*Control*c" sensitive="0"/> - <cmd name="Paste" accel="*Control*v" sensitive="0"/> - <cmd name="Clear" sensitive="0"/> - <cmd name="Reload" - _tip="Display the latest contents of the current location"/> - <cmd name="Go to Burn CD" - _label="_CD/DVD Creator" - _tip="Go to Empty CD folder"/> - <cmd name="Zoom In" _label="Zoom _In" - _tip="Show the contents in more detail"/> - <cmd name="Zoom Out" _label="Zoom _Out" - _tip="Show the contents in less detail"/> - <cmd name="Zoom Normal" _label="Normal Si_ze" - _tip="Show the contents at the normal size"/> -</commands> - -<keybindings> - <accel name="*Control*equal" verb="Zoom In"/> - <accel name="*Control**Shift*plus" verb="Zoom In"/> - <accel name="BackSpace" verb="Up"/> - <accel name="*Control*r" verb="Reload"/> -</keybindings> +<ui> +<!-- +<accelerator action="Zoom In"/> +<accelerator action="Zoom In"/> +<accelerator action="Up"/> +<accelerator action="Reload"/> +--> -<menu> - <submenu name="File" _label="_File"> +<menubar name="MenuBar"> + <menu action="File"> - <placeholder name="New Items Placeholder" delimit="none"> + <placeholder name="New Items Placeholder"> </placeholder> - - <placeholder name="Open Placeholder" delimit="top"/> - <placeholder name="Location Placeholder" delimit="top"/> - - <placeholder name="General Status Placeholder" delimit="top"/> - <placeholder name="File Items Placeholder" delimit="top"/> - <placeholder name="Global File Items Placeholder" delimit="top"/> - <placeholder name="Extension Actions" delimit="top"/> + <placeholder name="Open Placeholder"/> + <placeholder name="Location Placeholder"/> + <menuitem name="Connect to Server" + action="Connect to Server"/> + <placeholder name="General Status Placeholder"/> + <placeholder name="File Items Placeholder"/> + <placeholder name="Global File Items Placeholder"/> + <placeholder name="Extension Actions"/> <separator/> <placeholder name="Close Items Placeholder"/> <menuitem name="Close" - _label="_Close" - _tip="Close this folder" - accel="*Control*w" - pixtype="stock" pixname="gtk-close" - verb="Close"/> - </submenu> - - <submenu name="Edit" _label="_Edit"> - -<!-- FIXME bugzilla.gnome.org 43515 - - Undo is disabled until we have a better implementation. - Both here and in nautilus-undo-signal-handlers.c. - - <menuitem name="Undo" - _label="_Undo" - _tip="Undo the last text change" - pixtype="stock" pixname="gtk-undo" - accel="*Control*z" - verb="Undo"/> - - <separator/> + action="Close"/> + </menu> + + <menu action="Edit"> +<!-- BONOBOTODO: These should be in the dir-view? + <menuitem name="Cut" action="Cut"/> + <menuitem name="Copy" action ="Copy"/> + <menuitem name="Paste" action="Paste"/> + <menuitem name="Clear" action="Clear"/> --> - <menuitem name="Cut" - _label="Cut _Text" - pixtype="stock" pixname="gtk-cut" - verb="Cut"/> - <menuitem name="Copy" - _label="_Copy Text" - pixtype="stock" pixname="gtk-copy" - verb="Copy"/> - <menuitem name="Paste" - _label="_Paste Text" - pixtype="stock" pixname="gtk-paste" - verb="Paste"/> - <menuitem name="Clear" - _label="C_lear Text" - pixtype="stock" pixname="gtk-clear" - verb="Clear"/> - <separator/> <placeholder name="Select Items"> +<!-- BONOBOTODO: This should go in fm-directory-view? <menuitem name="Select All" - _label="Select _All" - verb="Select All"/> + action="Select All"/> +--> </placeholder> - - <placeholder name="File Items Placeholder" delimit="top"/> - <placeholder name="Dangerous File Items Placeholder" delimit="top"/> - <placeholder name="Edit Items Placeholder" delimit="top"/> - <placeholder name="Global Edit Items Placeholder" delimit="none"/> + <placeholder name="File Items Placeholder"/> + <placeholder name="Dangerous File Items Placeholder"/> + <placeholder name="Edit Items Placeholder"/> + <placeholder name="Global Edit Items Placeholder"/> - <placeholder name="Extension Actions" delimit="top"/> + <placeholder name="Extension Actions"/> <separator/> + <menuitem name="Backgrounds and Emblems" action="Backgrounds and Emblems"/> + <menuitem name="Preferences" action="Preferences"/> + </menu> - <menuitem name="Backgrounds and Emblems" - _label="_Backgrounds and Emblems..." - _tip="Display patterns, colors, and emblems that can be used to customize appearance" - verb="Backgrounds and Emblems"/> - - <menuitem name="Preferences" - _label="Prefere_nces" - _tip="Edit Nautilus preferences" - pixtype="stock" pixname="gtk-preferences" - verb="Preferences"/> - </submenu> - - <submenu name="View" _label="_View"> - <menuitem name="Stop" - _label="_Stop" - pixtype="stock" pixname="gtk-stop" - verb="Stop"/> - <menuitem name="Reload" - _label="_Reload" - accel="*Control*r" - pixtype="stock" pixname="refresh" - verb="Reload"/> + <menu action="View"> + <menuitem name="Stop" action="Stop"/> + <menuitem name="Reload" action="Reload"/> - <placeholder name="Show Hide Placeholder" delimit="top"> + <placeholder name="Show Hide Placeholder"> </placeholder> - <placeholder name="View Preferences Placeholder" delimit = "top"/> - <placeholder name="View Items Placeholder" delimit="top"/> + <placeholder name="View Preferences Placeholder"/> + <placeholder name="View Items Placeholder"/> - <placeholder name="Zoom Items Placeholder" delimit="top"> + <placeholder name="Zoom Items Placeholder"> <menuitem name="Zoom In" - accel="*Control*plus" - pixtype="stock" pixname="zoom-in" - verb="Zoom In"/> + action="Zoom In"/> <menuitem name="Zoom Out" - accel="*Control*minus" - pixtype="stock" pixname="zoom-out" - verb="Zoom Out"/> + action="Zoom Out"/> <menuitem name="Zoom Normal" - pixtype="stock" pixname="zoom-100" - verb="Zoom Normal"/> + action="Zoom Normal"/> </placeholder> <placeholder name="View Choices"> - <placeholder name="Extra Viewer" delimit="top"/> + <placeholder name="Extra Viewer"/> <separator name="Before Short List"/> <placeholder name="Short List"/> </placeholder> - </submenu> + </menu> - <placeholder/> - - <submenu name="Profiler" _label="_Profiler"> - <menuitem name="Start Profiling" - _label="_Start Profiling" - _tip="Start Profiling" - verb="Start Profiling"/> - <menuitem name="Stop Profiling" - _label="_Stop Profiling" - _tip="Stop Profiling" - verb="Stop Profiling"/> - <menuitem name="Reset Profiling" - _label="_Reset Profiling" - _tip="Reset Profiling" - verb="Reset Profiling"/> - <menuitem name="Report Profiling" - _label="_Report Profiling" - _tip="Report Profiling" - verb="Report Profiling"/> - </submenu> + <placeholder name="Other Menus"/> - <submenu name="Help" _label="_Help"> + <menu action="Help"> <menuitem name="Nautilus Manual" - _label="_Contents" - _tip="Display Nautilus help" - accel="F1" - pixtype="stock" pixname="gtk-help" - verb="Nautilus Manual"/> + action="Nautilus Manual"/> <menuitem name="About Nautilus" - _label="_About" - _tip="Display credits for the creators of Nautilus" - pixtype="stock" pixname="about" - verb="About Nautilus"/> - </submenu> -</menu> + action="About Nautilus"/> + </menu> +</menubar> -<status> - <control name="StatusButton" behavior="pack-start"/> - <!-- the name "main" is required by Bonobo --> - <item name="main"/> -</status> - -<popups> - <popup name="background" tearoff="0"> - <placeholder name="Before Zoom Items" delimit="none"> - <placeholder name="New Window Items" delimit="none"> - </placeholder> - <placeholder name="New Object Items" delimit="none"> - </placeholder> - <placeholder name="Extension Actions" delimit="top"/> +<popup name="background"> + <placeholder name="Before Zoom Items"> + <placeholder name="New Window Items"> </placeholder> - <placeholder name="Zoom Items" delimit="top"> - <menuitem name="Zoom In" - pixtype="stock" pixname="zoom-in" - verb="Zoom In"/> - <menuitem name="Zoom Out" - pixtype="stock" pixname="zoom-out" - verb="Zoom Out"/> - <menuitem name="Zoom Normal" - pixtype="stock" pixname="zoom-100" - verb="Zoom Normal"/> + <placeholder name="New Object Items"> </placeholder> - <placeholder name="After Zoom Items" delimit="top"/> - </popup> -</popups> - -</Root> + <placeholder name="Extension Actions"/> + </placeholder> + <placeholder name="Zoom Items"> + <menuitem name="Zoom In" + action="Zoom In"/> + <menuitem name="Zoom Out" + action="Zoom Out"/> + <menuitem name="Zoom Normal" + action="Zoom Normal"/> + </placeholder> + <placeholder name="After Zoom Items"/> +</popup> + +</ui> diff --git a/src/nautilus-sidebar-title.c b/src/nautilus-sidebar-title.c index 1244f4e17..9d13134e3 100644 --- a/src/nautilus-sidebar-title.c +++ b/src/nautilus-sidebar-title.c @@ -30,8 +30,6 @@ #include "nautilus-window.h" -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-property-bag-client.h> #include <eel/eel-background.h> #include <eel/eel-gdk-extensions.h> #include <eel/eel-gdk-pixbuf-extensions.h> diff --git a/src/nautilus-spatial-window-ui.xml b/src/nautilus-spatial-window-ui.xml index 06d94de48..4b003990d 100644 --- a/src/nautilus-spatial-window-ui.xml +++ b/src/nautilus-spatial-window-ui.xml @@ -1,69 +1,40 @@ -<Root> +<ui> -<!-- A description of each placeholder's purpose is in libnautilus/nautilus-bonobo-ui.h --> +<accelerator action="Go Up Close"/> +<!-- +<accelerator action="Home"/> +--> -<commands> -</commands> - -<keybindings> - <accel name="*Alt**Shift*Up" verb="UpCloseCurrent"/> - <accel name="*Shift*BackSpace" verb="UpCloseCurrent"/> - <accel name="*Alt*Home" verb="Home"/> -</keybindings> -<menu> - <submenu name="File"> +<menubar name="MenuBar"> + <menu action="File"> <placeholder name="Location Placeholder"> <menuitem name="Up" - _label="Open _Parent" - _tip="Open the parent folder" - accel="*Alt*Up" - verb="Up"/> + action="Up"/> <menuitem name="Go to Location" - _label="Open _Location..." - accel="*Control*l" - verb="Go to Location"/> - <menuitem name="Connect to Server" - _label="Connect to _Server..." - verb="Connect to Server"/> + action="Go to Location"/> </placeholder> <placeholder name="Close Items Placeholder"> - <menuitem name="Close With Parents" - _label="Close P_arent Folders" - _tip="Close this folder's parents" - accel="*Control**Shift*w" - verb="Close Parent Folders"/> + <menuitem name="Close Parent Folders" + action="Close Parent Folders"/> <menuitem name="Close All Folders" - _label="Clos_e All Folders" - _tip="Close all folder windows" - accel="*Control*q" - verb="Close All Folders"/> + action="Close All Folders"/> </placeholder> - </submenu> + </menu> - <submenu name="Places" _label="_Places"> - <menuitem name="Home" - _label="_Home" - accel="*Alt*Home" - pixtype="stock" pixname="gtk-home" - verb="Home"/> - <menuitem name="Go to Computer" - _label="_Computer" - _tip="Go to Computer" - pixtype="stock" pixname="gnome-fs-client" - verb="Go to Computer"/> - <menuitem name="Go to Templates" - _label="_Templates" - _tip="Go to templates folder" - verb="Go to Templates"/> - <menuitem name="Go to Trash" - _label="_Trash" - _tip="Go to the trash folder" - verb="Go to Trash"/> - <menuitem name="Go to Burn CD" - _label="CD _Creator" - _tip="Go to the CD/DVD Creator" - verb="Go to Burn CD"/> - </submenu> -</menu> + <placeholder name="Other Menus"> + <menu action="Places"> + <menuitem name="Home" + action="Home"/> + <menuitem name="Go to Computer" + action="Go to Computer"/> + <menuitem name="Go to Templates" + action="Go to Templates"/> + <menuitem name="Go to Trash" + action="Go to Trash"/> + <menuitem name="Go to Burn CD" + action="Go to Burn CD"/> + </menu> + </placeholder> +</menubar> -</Root> +</ui> diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c index a5f94c07c..35b024b27 100644 --- a/src/nautilus-spatial-window.c +++ b/src/nautilus-spatial-window.c @@ -39,9 +39,6 @@ #include "nautilus-signaller.h" #include "nautilus-window-manage-views.h" #include "nautilus-zoom-control.h" -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-property-bag-client.h> -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-debug.h> #include <eel/eel-gdk-extensions.h> #include <eel/eel-gdk-pixbuf-extensions.h> @@ -56,6 +53,7 @@ #include <gtk/gtkoptionmenu.h> #include <gtk/gtktogglebutton.h> #include <gtk/gtkvbox.h> +#include <gtk/gtkuimanager.h> #include <libgnome/gnome-i18n.h> #include <libgnome/gnome-macros.h> #include <libgnome/gnome-util.h> @@ -64,7 +62,6 @@ #include <libgnomeui/gnome-window-icon.h> #include <libgnomevfs/gnome-vfs-uri.h> #include <libgnomevfs/gnome-vfs-utils.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-file-attributes.h> #include <libnautilus-private/nautilus-global-preferences.h> @@ -73,7 +70,6 @@ #include <libnautilus-private/nautilus-metadata.h> #include <libnautilus-private/nautilus-mime-actions.h> #include <libnautilus-private/nautilus-program-choosing.h> -#include <libnautilus-private/nautilus-bonobo-ui.h> #include <libnautilus-private/nautilus-clipboard.h> #include <libnautilus-private/nautilus-undo.h> #include <math.h> @@ -81,14 +77,14 @@ #define MAX_TITLE_LENGTH 180 -struct _NautilusSpatialWindowDetails { +struct _NautilusSpatialWindowDetails { + GtkActionGroup *spatial_action_group; /* owned by ui_manager */ char *last_geometry; guint save_geometry_timeout_id; GtkWidget *content_box; GtkWidget *location_button; GtkWidget *location_label; - GtkWidget *location_statusbar; GnomeVFSURI *location; }; @@ -299,25 +295,22 @@ nautilus_spatial_window_show (GtkWidget *widget) } static void -file_menu_close_parent_windows_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_close_parent_folders_callback (GtkAction *action, + gpointer user_data) { nautilus_application_close_parent_windows (NAUTILUS_SPATIAL_WINDOW (user_data)); } static void -file_menu_close_all_windows_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_close_all_folders_callback (GtkAction *action, + gpointer user_data) { nautilus_application_close_all_spatial_windows (); } static void -go_up_close_current_window_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_go_up_close_callback (GtkAction *action, + gpointer user_data) { nautilus_window_go_up (NAUTILUS_WINDOW (user_data), TRUE); } @@ -351,38 +344,6 @@ real_set_title (NautilusWindow *window, const char *title) } static void -real_merge_menus (NautilusWindow *nautilus_window) -{ - NautilusSpatialWindow *window; - BonoboControl *control; - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("Close Parent Folders", file_menu_close_parent_windows_callback), - BONOBO_UI_VERB ("Close All Folders", file_menu_close_all_windows_callback), - BONOBO_UI_VERB ("UpCloseCurrent", go_up_close_current_window_callback), - BONOBO_UI_VERB_END - }; - - EEL_CALL_PARENT (NAUTILUS_WINDOW_CLASS, - merge_menus, (nautilus_window)); - - window = NAUTILUS_SPATIAL_WINDOW (nautilus_window); - - bonobo_ui_util_set_ui (NAUTILUS_WINDOW (window)->details->shell_ui, - DATADIR, - "nautilus-spatial-window-ui.xml", - "nautilus", NULL); - - bonobo_ui_component_add_verb_list_with_data (nautilus_window->details->shell_ui, - verbs, window); - - control = bonobo_control_new (window->details->location_statusbar); - bonobo_ui_component_object_set (nautilus_window->details->shell_ui, - "/status/StatusButton", - BONOBO_OBJREF (control), - NULL); -} - -static void real_set_content_view_widget (NautilusWindow *window, NautilusView *new_view) { @@ -515,7 +476,9 @@ menu_popup_pos (GtkMenu *menu, gtk_widget_size_request (widget, &button_requisition); gdk_window_get_origin (widget->window, x, y); - + *x += widget->allocation.x; + *y += widget->allocation.y; + *y -= menu_requisition.height - button_requisition.height; *push_in = TRUE; @@ -604,28 +567,55 @@ nautilus_spatial_window_set_location_button (NautilusSpatialWindow *window, } static void +action_go_to_location_callback (GtkAction *action, + gpointer user_data) +{ + NautilusWindow *window; + + window = NAUTILUS_WINDOW (user_data); + + nautilus_window_prompt_for_location (window); +} + +static GtkActionEntry spatial_entries[] = { + { "Places", NULL, N_("_Places") }, /* name, stock id, label */ + { "Go to Location", NULL, N_("Open _Location..."), /* name, stock id, label */ + "<control>L", N_("Specify a location to open"), + G_CALLBACK (action_go_to_location_callback) }, + { "Close Parent Folders", NULL, N_("Close P_arent Folders"), /* name, stock id, label */ + "<control><shift>W", N_("Close this folder's parents"), + G_CALLBACK (action_close_parent_folders_callback) }, + { "Close All Folders", NULL, N_("Clos_e All Folders"), /* name, stock id, label */ + "<control>Q", N_("Close all folder windows"), + G_CALLBACK (action_close_all_folders_callback) }, + { "Go Up Close", NULL, N_("Go up and close the current window"), /* name, stock id, label */ + "<alt><shift>Up", NULL, + G_CALLBACK (action_go_up_close_callback) }, +}; + +static void nautilus_spatial_window_instance_init (NautilusSpatialWindow *window) { - GtkShadowType shadow_type; - GtkWidget *frame; GtkRcStyle *rc_style; GtkWidget *arrow; GtkWidget *hbox; + GtkActionGroup *action_group; + GtkUIManager *ui_manager; + GError *error; + char *file; window->details = g_new0 (NautilusSpatialWindowDetails, 1); window->affect_spatial_window_on_next_location_change = TRUE; window->details->content_box = gtk_hbox_new (FALSE, 0); + gtk_table_attach (GTK_TABLE (NAUTILUS_WINDOW (window)->details->table), + window->details->content_box, + /* X direction */ /* Y direction */ + 0, 1, 1, 4, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, + 0, 0); gtk_widget_show (window->details->content_box); - bonobo_window_set_contents (BONOBO_WINDOW (window), - window->details->content_box); - - window->details->location_statusbar = gtk_statusbar_new (); - gtk_widget_show (window->details->location_statusbar); - gtk_widget_hide (GTK_STATUSBAR (window->details->location_statusbar)->frame); - gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (window->details->location_statusbar), - FALSE); window->details->location_button = gtk_button_new (); gtk_button_set_relief (GTK_BUTTON (window->details->location_button), @@ -652,22 +642,37 @@ nautilus_spatial_window_instance_init (NautilusSpatialWindow *window) gtk_box_pack_start (GTK_BOX (hbox), arrow, FALSE, FALSE, 0); gtk_widget_show (arrow); - frame = gtk_frame_new (NULL); - gtk_widget_style_get (GTK_WIDGET (window->details->location_statusbar), - "shadow_type", &shadow_type, NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), shadow_type); - gtk_box_pack_start (GTK_BOX (window->details->location_statusbar), - frame, TRUE, TRUE, 0); - gtk_widget_show (frame); - - gtk_container_add (GTK_CONTAINER (frame), - window->details->location_button); gtk_widget_set_sensitive (window->details->location_button, FALSE); g_signal_connect (window->details->location_button, "clicked", G_CALLBACK (location_button_clicked_callback), window); - gtk_widget_show (window->details->location_statusbar); + gtk_box_pack_start (GTK_BOX (NAUTILUS_WINDOW (window)->details->statusbar), + window->details->location_button, + FALSE, TRUE, 0); + + gtk_box_reorder_child (GTK_BOX (NAUTILUS_WINDOW (window)->details->statusbar), + window->details->location_button, 0); + + action_group = gtk_action_group_new ("SpatialActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + window->details->spatial_action_group = action_group; + gtk_action_group_add_actions (action_group, + spatial_entries, G_N_ELEMENTS (spatial_entries), + window); + + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ + + error = NULL; + file = nautilus_ui_file ("nautilus-spatial-window-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (ui_manager, file, &error)) { + g_error ("building menus failed: %s", error->message); + g_error_free (error); + } + g_free (file); + return; } static void @@ -686,8 +691,6 @@ nautilus_spatial_window_class_init (NautilusSpatialWindowClass *class) real_prompt_for_location; NAUTILUS_WINDOW_CLASS (class)->set_title = real_set_title; - NAUTILUS_WINDOW_CLASS (class)->merge_menus = - real_merge_menus; NAUTILUS_WINDOW_CLASS (class)->set_content_view_widget = real_set_content_view_widget; NAUTILUS_WINDOW_CLASS (class)->close = diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c index 272ec62b7..a8419e34b 100644 --- a/src/nautilus-window-manage-views.c +++ b/src/nautilus-window-manage-views.c @@ -28,14 +28,12 @@ #include <config.h> #include "nautilus-window-manage-views.h" +#include "nautilus-actions.h" #include "nautilus-application.h" #include "nautilus-location-bar.h" #include "nautilus-main.h" #include "nautilus-window-private.h" #include "nautilus-zoom-control.h" -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-property-bag-client.h> #include <eel/eel-accessibility.h> #include <eel/eel-debug.h> #include <eel/eel-gdk-extensions.h> @@ -53,7 +51,6 @@ #include <libgnomevfs/gnome-vfs-async-ops.h> #include <libgnomevfs/gnome-vfs-uri.h> #include <libgnomevfs/gnome-vfs-utils.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-file-attributes.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-file.h> @@ -105,6 +102,8 @@ static void load_new_location (NautilusWindow gboolean tell_new_content_view); static void location_has_really_changed (NautilusWindow *window); static void update_for_new_location (NautilusWindow *window); +static void zoom_parameters_changed_callback (NautilusView *view, + NautilusWindow *window); void nautilus_window_report_selection_changed (NautilusWindowInfo *window) @@ -947,6 +946,7 @@ create_content_view (NautilusWindow *window, { NautilusView *view; GList *selection; + GtkAction *action; /* FIXME bugzilla.gnome.org 41243: * We should use inheritance instead of these special cases @@ -959,21 +959,16 @@ create_content_view (NautilusWindow *window, */ view_id = NAUTILUS_DESKTOP_ICON_VIEW_IID; } - - nautilus_window_ui_freeze (window); - - bonobo_ui_component_freeze (window->details->shell_ui, NULL); - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_IN, - FALSE); - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_OUT, - FALSE); - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_NORMAL, - FALSE); - - bonobo_ui_component_thaw (window->details->shell_ui, NULL); + + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_IN); + gtk_action_set_sensitive (action, FALSE); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_OUT); + gtk_action_set_sensitive (action, FALSE); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_NORMAL); + gtk_action_set_sensitive (action, FALSE); if (window->content_view != NULL && eel_strcmp (nautilus_view_get_view_id (window->content_view), @@ -1020,7 +1015,6 @@ create_content_view (NautilusWindow *window, nautilus_window_go_home (NAUTILUS_WINDOW (window)); } - nautilus_window_ui_thaw (window); } static void @@ -1104,8 +1098,6 @@ location_has_really_changed (NautilusWindow *window) if (window->details->pending_location != NULL) { /* Tell the window we are finished. */ update_for_new_location (window); - - } free_location_change (window); @@ -1152,13 +1144,17 @@ update_for_new_location (NautilusWindow *window) /* Check if we can go up. */ update_up_button (window); + + /* Set up the initial zoom levels */ + zoom_parameters_changed_callback (window->content_view, + window); /* Set up the content view menu for this new location. */ nautilus_window_load_view_as_menus (window); /* Load menus from nautilus extensions for this location */ nautilus_window_load_extension_menus (window); - + #if !NEW_UI_COMPLETE if (NAUTILUS_IS_NAVIGATION_WINDOW (window)) { /* Check if the back and forward buttons need enabling or disabling. */ @@ -1496,27 +1492,36 @@ static void zoom_level_changed_callback (NautilusView *view, NautilusWindow *window) { + GtkAction *action; + gboolean supports_zooming; + g_assert (NAUTILUS_IS_WINDOW (window)); /* This is called each time the component successfully completed * a zooming operation. */ - nautilus_window_ui_freeze (window); - - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_IN, - nautilus_view_can_zoom_in (view)); - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_OUT, - nautilus_view_can_zoom_out (view)); - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_NORMAL, - TRUE); - - /* FIXME bugzilla.gnome.org 43442: Desensitize "Zoom Normal"? */ + supports_zooming = nautilus_view_supports_zooming (view); - nautilus_window_ui_thaw (window); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_IN); + gtk_action_set_visible (action, supports_zooming); + gtk_action_set_sensitive (action, + nautilus_view_can_zoom_in (view)); + + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_OUT); + gtk_action_set_visible (action, supports_zooming); + gtk_action_set_sensitive (action, + nautilus_view_can_zoom_out (view)); + + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_NORMAL); + gtk_action_set_visible (action, supports_zooming); + gtk_action_set_sensitive (action, + TRUE); + + /* FIXME bugzilla.gnome.org 43442: Desensitize "Zoom Normal"? */ } static void @@ -1524,6 +1529,7 @@ zoom_parameters_changed_callback (NautilusView *view, NautilusWindow *window) { float zoom_level; + GtkAction *action; g_assert (NAUTILUS_IS_WINDOW (window)); @@ -1535,19 +1541,15 @@ zoom_parameters_changed_callback (NautilusView *view, */ zoom_level = nautilus_view_get_zoom_level (view); if (zoom_level == 0.0) { - nautilus_window_ui_freeze (window); - - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_IN, - FALSE); - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_OUT, - FALSE); - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_ZOOM_NORMAL, - FALSE); - - nautilus_window_ui_thaw (window); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_IN); + gtk_action_set_sensitive (action, FALSE); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_OUT); + gtk_action_set_sensitive (action, FALSE); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_ZOOM_NORMAL); + gtk_action_set_sensitive (action, FALSE); /* Don't attempt to set 0.0 as zoom level. */ return; diff --git a/src/nautilus-window-manage-views.h b/src/nautilus-window-manage-views.h index 0c436b8b1..22d3f0188 100644 --- a/src/nautilus-window-manage-views.h +++ b/src/nautilus-window-manage-views.h @@ -53,9 +53,6 @@ const char *nautilus_window_get_content_view_id (NautilusW char *nautilus_window_get_view_label (NautilusWindow *window); void nautilus_navigation_window_set_sidebar_panels (NautilusNavigationWindow *window, GList *view_identifier_list); -void nautilus_navigation_window_back_or_forward (NautilusNavigationWindow *window, - gboolean back, - guint distance); /* NautilusWindowInfo implementation: */ diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c index a34bec831..7b526de1d 100644 --- a/src/nautilus-window-menus.c +++ b/src/nautilus-window-menus.c @@ -29,6 +29,7 @@ #include <locale.h> +#include "nautilus-actions.h" #include "nautilus-application.h" #include "nautilus-connect-server-dialog.h" #include "nautilus-file-management-properties.h" @@ -37,7 +38,6 @@ #include "nautilus-window-manage-views.h" #include "nautilus-window-private.h" #include "nautilus-desktop-window.h" -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-debug.h> #include <eel/eel-glib-extensions.h> #include <eel/eel-gnome-extensions.h> @@ -58,42 +58,13 @@ #include <libgnomevfs/gnome-vfs-utils.h> #include <libgnomevfs/gnome-vfs-ops.h> #include <libnautilus-extension/nautilus-menu-provider.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-icon-factory.h> #include <libnautilus-private/nautilus-module.h> #include <libnautilus-private/nautilus-undo-manager.h> -#include <libnautilus-private/nautilus-bonobo-ui.h> -#ifdef ENABLE_PROFILER -#include "nautilus-profiler.h" -#endif - -/* Private menu definitions; others are in <libnautilus-private/nautilus-bonobo-ui.h>. - * These are not part of the published set, either because they are - * development-only or because we expect to change them and - * don't want other code relying on their existence. - */ - -#define MENU_PATH_SHOW_HIDE_SIDEBAR "/menu/View/Show Hide Placeholder/Show Hide Sidebar" -#define MENU_PATH_SHOW_HIDE_TOOLBAR "/menu/View/Show Hide Placeholder/Show Hide Toolbar" -#define MENU_PATH_SHOW_HIDE_LOCATION_BAR "/menu/View/Show Hide Placeholder/Show Hide Location Bar" -#define MENU_PATH_SHOW_HIDE_STATUS_BAR "/menu/View/Show Hide Placeholder/Show Hide Statusbar" - -#define MENU_PATH_EXTENSION_ACTIONS "/menu/File/Extension Actions" -#define POPUP_PATH_EXTENSION_ACTIONS "/popups/background/Before Zoom Items/Extension Actions" - -#define COMMAND_PATH_CLOSE_WINDOW "/commands/Close" -#define COMMAND_SHOW_HIDE_SIDEBAR "/commands/Show Hide Sidebar" -#define COMMAND_SHOW_HIDE_TOOLBAR "/commands/Show Hide Toolbar" -#define COMMAND_SHOW_HIDE_LOCATION_BAR "/commands/Show Hide Location Bar" -#define COMMAND_SHOW_HIDE_STATUS_BAR "/commands/Show Hide Statusbar" -#define COMMAND_GO_BURN_CD "/commands/Go to Burn CD" - -#define ID_SHOW_HIDE_SIDEBAR "Show Hide Sidebar" -#define ID_SHOW_HIDE_TOOLBAR "Show Hide Toolbar" -#define ID_SHOW_HIDE_LOCATION_BAR "Show Hide Location Bar" -#define ID_SHOW_HIDE_STATUS_BAR "Show Hide Statusbar" +#define MENU_PATH_EXTENSION_ACTIONS "/MenuBar/File/Extension Actions" +#define POPUP_PATH_EXTENSION_ACTIONS "/background/Before Zoom Items/Extension Actions" #define COMPUTER_URI "computer:" #define BURN_CD_URI "burn:" @@ -139,13 +110,6 @@ bookmark_holder_free (BookmarkHolder *bookmark_holder) g_free (bookmark_holder); } -/* Private menu definitions; others are in <libnautilus-private/nautilus-bonobo-ui.h>. - * These are not part of the published set, either because they are - * development-only or because we expect to change them and - * don't want other code relying on their existence. - */ - - static void bookmark_holder_free_cover (gpointer callback_data, GClosure *closure) { @@ -153,7 +117,7 @@ bookmark_holder_free_cover (gpointer callback_data, GClosure *closure) } static void -activate_bookmark_in_menu_item (BonoboUIComponent *component, gpointer user_data, const char *path) +activate_bookmark_in_menu_item (GtkAction *action, gpointer user_data) { BookmarkHolder *holder; char *uri; @@ -171,23 +135,22 @@ activate_bookmark_in_menu_item (BonoboUIComponent *component, gpointer user_data void nautilus_menus_append_bookmark_to_menu (NautilusWindow *window, - BonoboUIComponent *uic, NautilusBookmark *bookmark, const char *parent_path, guint index_in_parent, + GtkActionGroup *action_group, + guint merge_id, GCallback refresh_callback, NautilusBookmarkFailedCallback failed_callback) { BookmarkHolder *bookmark_holder; - char *raw_name, *display_name, *truncated_name, *verb_name; - char *ui_path; + char *raw_name, *display_name, *truncated_name, *action_name; GdkPixbuf *pixbuf; + GtkAction *action; g_assert (NAUTILUS_IS_WINDOW (window)); g_assert (NAUTILUS_IS_BOOKMARK (bookmark)); - nautilus_window_ui_freeze (window); - bookmark_holder = bookmark_holder_new (bookmark, window, refresh_callback, failed_callback); /* We double the underscores here to escape them so Bonobo will know they are @@ -203,60 +166,53 @@ nautilus_menus_append_bookmark_to_menu (NautilusWindow *window, /* Create menu item with pixbuf */ pixbuf = nautilus_bookmark_get_pixbuf (bookmark, NAUTILUS_ICON_SIZE_FOR_MENUS, FALSE); - nautilus_bonobo_add_numbered_menu_item - (uic, - parent_path, - index_in_parent, - display_name, - pixbuf); - g_object_unref (pixbuf); - g_free (display_name); + + action_name = g_strdup_printf ("bookmark_%d", index_in_parent); + + action = gtk_action_new (action_name, + display_name, + _("Go to the location specified by this bookmark"), + NULL); - /* Add the status tip */ - ui_path = nautilus_bonobo_get_numbered_menu_item_path - (uic, parent_path, index_in_parent); - nautilus_bonobo_set_tip (uic, ui_path, _("Go to the location specified by this bookmark")); - g_free (ui_path); - - /* Add verb to new bookmark menu item */ - verb_name = nautilus_bonobo_get_numbered_menu_item_command - (uic, parent_path, index_in_parent); - bonobo_ui_component_add_verb_full (uic, verb_name, - g_cclosure_new (G_CALLBACK (activate_bookmark_in_menu_item), - bookmark_holder, - bookmark_holder_free_cover)); - g_free (verb_name); - - nautilus_window_ui_thaw (window); -} + /* TODO: This should really use themed icons and + nautilus_bookmark_get_icon (bookmark), but that doesn't work yet*/ + g_object_set_data_full (G_OBJECT (action), "menu-icon", + g_object_ref (pixbuf), + g_object_unref); + + g_signal_connect_data (action, "activate", + G_CALLBACK (activate_bookmark_in_menu_item), + bookmark_holder, + bookmark_holder_free_cover, 0); -static void -file_menu_new_window_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - NautilusWindow *current_window; - NautilusWindow *new_window; + gtk_action_group_add_action (action_group, + GTK_ACTION (action)); + + g_object_unref (action); - current_window = NAUTILUS_WINDOW (user_data); - new_window = nautilus_application_create_navigation_window ( - current_window->application, - gtk_window_get_screen (GTK_WINDOW (current_window))); - nautilus_window_go_home (new_window); + gtk_ui_manager_add_ui (window->details->ui_manager, + merge_id, + parent_path, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + g_object_unref (pixbuf); + g_free (action_name); + g_free (display_name); } static void -file_menu_close_window_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_close_window_callback (GtkAction *action, + gpointer user_data) { nautilus_window_close (NAUTILUS_WINDOW (user_data)); } static void -connect_to_server_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_connect_to_server_callback (GtkAction *action, + gpointer user_data) { GtkWidget *dialog; @@ -283,63 +239,38 @@ have_burn_uri (void) } static void -go_menu_location_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - NautilusWindow *window; - - window = NAUTILUS_WINDOW (user_data); - - nautilus_window_prompt_for_location (window); -} - -static void -stop_button_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_stop_callback (GtkAction *action, + gpointer user_data) { nautilus_window_stop_loading (NAUTILUS_WINDOW (user_data)); } static void -edit_menu_undo_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_undo_callback (GtkAction *action, + gpointer user_data) { nautilus_undo_manager_undo (NAUTILUS_WINDOW (user_data)->application->undo_manager); } static void -go_menu_up_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) -{ - nautilus_window_go_up (NAUTILUS_WINDOW (user_data), FALSE); -} - -static void -go_menu_home_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_home_callback (GtkAction *action, + gpointer user_data) { nautilus_window_go_home (NAUTILUS_WINDOW (user_data)); } static void -go_menu_go_to_computer_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_go_to_computer_callback (GtkAction *action, + gpointer user_data) { nautilus_window_go_to (NAUTILUS_WINDOW (user_data), COMPUTER_URI); } static void -go_menu_go_to_templates_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_go_to_templates_callback (GtkAction *action, + gpointer user_data) { char *uri; @@ -351,92 +282,45 @@ go_menu_go_to_templates_callback (BonoboUIComponent *component, } static void -go_menu_go_to_trash_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_go_to_trash_callback (GtkAction *action, + gpointer user_data) { nautilus_window_go_to (NAUTILUS_WINDOW (user_data), EEL_TRASH_URI); } static void -go_menu_go_to_burn_cd_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_go_to_burn_cd_callback (GtkAction *action, + gpointer user_data) { nautilus_window_go_to (NAUTILUS_WINDOW (user_data), BURN_CD_URI); } static void -view_menu_reload_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_reload_callback (GtkAction *action, + gpointer user_data) { nautilus_window_reload (NAUTILUS_WINDOW (user_data)); } static void -view_menu_show_hide_statusbar_state_changed_callback (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) -{ - NautilusWindow *window; - - window = NAUTILUS_WINDOW (user_data); - - if (strcmp (state, "") == 0) { - /* State goes blank when component is removed; ignore this. */ - return; - } - - if (!strcmp (state, "1")) { - nautilus_window_show_status_bar (window); - } else { - nautilus_window_hide_status_bar (window); - } -} - -void -nautilus_window_update_show_hide_menu_items (NautilusWindow *window) -{ - g_assert (NAUTILUS_IS_WINDOW (window)); - - nautilus_window_ui_freeze (window); - - bonobo_ui_component_freeze (window->details->shell_ui, NULL); - - nautilus_bonobo_set_toggle_state (window->details->shell_ui, - COMMAND_SHOW_HIDE_STATUS_BAR, - nautilus_window_status_bar_showing (window)); - - bonobo_ui_component_thaw (window->details->shell_ui, NULL); - - nautilus_window_ui_thaw (window); -} - -static void -view_menu_zoom_in_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_zoom_in_callback (GtkAction *action, + gpointer user_data) { nautilus_window_zoom_in (NAUTILUS_WINDOW (user_data)); } static void -view_menu_zoom_out_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_zoom_out_callback (GtkAction *action, + gpointer user_data) { nautilus_window_zoom_out (NAUTILUS_WINDOW (user_data)); } static void -view_menu_zoom_normal_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_zoom_normal_callback (GtkAction *action, + gpointer user_data) { nautilus_window_zoom_to_default (NAUTILUS_WINDOW (user_data)); } @@ -451,9 +335,8 @@ preferences_respond_callback (GtkDialog *dialog, } static void -preferences_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_preferences_callback (GtkAction *action, + gpointer user_data) { GtkWindow *window; @@ -463,9 +346,8 @@ preferences_callback (BonoboUIComponent *component, } static void -backgrounds_and_emblems_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_backgrounds_and_emblems_callback (GtkAction *action, + gpointer user_data) { GtkWindow *window; @@ -475,9 +357,8 @@ backgrounds_and_emblems_callback (BonoboUIComponent *component, } static void -help_menu_about_nautilus_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_about_nautilus_callback (GtkAction *action, + gpointer user_data) { static GtkWidget *about = NULL; const char *authors[] = { @@ -567,9 +448,15 @@ help_menu_about_nautilus_callback (BonoboUIComponent *component, } static void -help_menu_nautilus_manual_callback (BonoboUIComponent *component, - gpointer user_data, - const char *verb) +action_up_callback (GtkAction *action, + gpointer user_data) +{ + nautilus_window_go_up (NAUTILUS_WINDOW (user_data), FALSE); +} + +static void +action_nautilus_manual_callback (GtkAction *action, + gpointer user_data) { NautilusWindow *window; GError *error; @@ -605,6 +492,159 @@ help_menu_nautilus_manual_callback (BonoboUIComponent *component, } } +static void +menu_item_select_cb (GtkMenuItem *proxy, + NautilusWindow *window) +{ + GtkAction *action; + char *message; + + action = g_object_get_data (G_OBJECT (proxy), "gtk-action"); + g_return_if_fail (action != NULL); + + g_object_get (G_OBJECT (action), "tooltip", &message, NULL); + if (message) { + gtk_statusbar_push (GTK_STATUSBAR (window->details->statusbar), + window->details->help_message_cid, message); + g_free (message); + } +} + +static void +menu_item_deselect_cb (GtkMenuItem *proxy, + NautilusWindow *window) +{ + gtk_statusbar_pop (GTK_STATUSBAR (window->details->statusbar), + window->details->help_message_cid); +} + +static void +disconnect_proxy_cb (GtkUIManager *manager, + GtkAction *action, + GtkWidget *proxy, + NautilusWindow *window) +{ + if (GTK_IS_MENU_ITEM (proxy)) { + g_signal_handlers_disconnect_by_func + (proxy, G_CALLBACK (menu_item_select_cb), window); + g_signal_handlers_disconnect_by_func + (proxy, G_CALLBACK (menu_item_deselect_cb), window); + } +} + +static void +connect_proxy_cb (GtkUIManager *manager, + GtkAction *action, + GtkWidget *proxy, + NautilusWindow *window) +{ + GdkPixbuf *icon; + + if (GTK_IS_MENU_ITEM (proxy)) { + g_signal_connect (proxy, "select", + G_CALLBACK (menu_item_select_cb), window); + g_signal_connect (proxy, "deselect", + G_CALLBACK (menu_item_deselect_cb), window); + + + /* This is a way to easily get pixbufs into the menu items */ + icon = g_object_get_data (G_OBJECT (action), "menu-icon"); + if (icon != NULL) { + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy), + gtk_image_new_from_pixbuf (icon)); + } + } + if (GTK_IS_TOOL_BUTTON (proxy)) { + icon = g_object_get_data (G_OBJECT (action), "toolbar-icon"); + if (icon != NULL) { + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), + gtk_image_new_from_pixbuf (icon)); + } + } + +} + +static GtkActionEntry main_entries[] = { + { "File", NULL, N_("_File") }, /* name, stock id, label */ + { "Edit", NULL, N_("_Edit") }, /* name, stock id, label */ + { "View", NULL, N_("_View") }, /* name, stock id, label */ + { "Help", NULL, N_("_Help") }, /* name, stock id, label */ + { "Close", GTK_STOCK_CLOSE, /* name, stock id */ + N_("_Close"), "<control>W", /* label, accelerator */ + N_("Close this folder"), /* tooltip */ + G_CALLBACK (action_close_window_callback) }, + { "Backgrounds and Emblems", NULL, + N_("_Backgrounds and Emblems..."), + NULL, N_("Display patterns, colors, and emblems that can be used to customize appearance"), + G_CALLBACK (action_backgrounds_and_emblems_callback) }, + { "Preferences", GTK_STOCK_PREFERENCES, + N_("Prefere_nces"), + NULL, N_("Edit Nautilus preferences"), + G_CALLBACK (action_preferences_callback) }, + { "Undo", NULL, N_("_Undo"), /* name, stock id, label */ + "<control>Z", N_("Undo the last text change"), + G_CALLBACK (action_undo_callback) }, + { "Up", GTK_STOCK_GO_UP, N_("Open _Parent"), /* name, stock id, label */ + "<alt>Up", N_("Open the parent folder"), + G_CALLBACK (action_up_callback) }, + { "Stop", GTK_STOCK_STOP, /* name, stock id */ + N_("_Stop"), NULL, /* label, accelerator */ + NULL, /* tooltip */ + G_CALLBACK (action_stop_callback) }, + { "Reload", GTK_STOCK_REFRESH, /* name, stock id */ + N_("_Reload"), "<control>R", /* label, accelerator */ + NULL, /* tooltip */ + G_CALLBACK (action_reload_callback) }, + { "Reload", GTK_STOCK_REFRESH, /* name, stock id */ + N_("_Reload"), "<control>R", /* label, accelerator */ + NULL, /* tooltip */ + G_CALLBACK (action_reload_callback) }, + { "Nautilus Manual", GTK_STOCK_HELP, /* name, stock id */ + N_("_Contents"), "F1", /* label, accelerator */ + N_("Display Nautilus help"), /* tooltip */ + G_CALLBACK (action_nautilus_manual_callback) }, + { "About Nautilus", GTK_STOCK_ABOUT, /* name, stock id */ + N_("_About"), NULL, /* label, accelerator */ + N_("Display credits for the creators of Nautilus"), /* tooltip */ + G_CALLBACK (action_about_nautilus_callback) }, + { "Zoom In", GTK_STOCK_ZOOM_IN, /* name, stock id */ + N_("Zoom _In"), "<control>plus", /* label, accelerator */ + N_("Show the contents in more detail"), /* tooltip */ + G_CALLBACK (action_zoom_in_callback) }, + { "Zoom Out", GTK_STOCK_ZOOM_OUT, /* name, stock id */ + N_("Zoom _Out"), "<control>minus", /* label, accelerator */ + N_("Show the contents in less detail"), /* tooltip */ + G_CALLBACK (action_zoom_out_callback) }, + { "Zoom Normal", GTK_STOCK_ZOOM_100, /* name, stock id */ + N_("Normal Si_ze"), NULL, /* label, accelerator */ + N_("Show the contents at the normal size"), /* tooltip */ + G_CALLBACK (action_zoom_normal_callback) }, + { "Connect to Server", NULL, /* name, stock id */ + N_("Connect to _Server..."), NULL, /* label, accelerator */ + N_("Set up a connection to a network server"), /* tooltip */ + G_CALLBACK (action_connect_to_server_callback) }, + { "Home", GTK_STOCK_HOME, /* name, stock id */ + N_("_Home"), "<alt>Home", /* label, accelerator */ + N_("Go to the home folder"), /* tooltip */ + G_CALLBACK (action_home_callback) }, + { "Go to Computer", "gnome-fs-client", /* name, stock id */ + N_("_Computer"), NULL, /* label, accelerator */ + N_("Go to the computer location"), /* tooltip */ + G_CALLBACK (action_go_to_computer_callback) }, + { "Go to Templates", NULL, /* name, stock id */ + N_("T_emplates"), NULL, /* label, accelerator */ + N_("Go to the templates folder"), /* tooltip */ + G_CALLBACK (action_go_to_templates_callback) }, + { "Go to Trash", NULL, /* name, stock id */ + N_("_Trash"), NULL, /* label, accelerator */ + N_("Go to the trash folder"), /* tooltip */ + G_CALLBACK (action_go_to_trash_callback) }, + { "Go to Burn CD", NULL, /* name, stock id */ + N_("CD _Creator"), NULL, /* label, accelerator */ + N_("Go to the CD/DVD Creator"), /* tooltip */ + G_CALLBACK (action_go_to_burn_cd_callback) }, +}; + /** * nautilus_window_initialize_menus * @@ -612,72 +652,49 @@ help_menu_nautilus_manual_callback (BonoboUIComponent *component, * @window: A recently-created NautilusWindow. */ void -nautilus_window_initialize_menus_part_1 (NautilusWindow *window) -{ - BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("New Window", file_menu_new_window_callback), - BONOBO_UI_VERB ("Close", file_menu_close_window_callback), - BONOBO_UI_VERB ("Connect to Server", connect_to_server_callback), - BONOBO_UI_VERB ("Undo", edit_menu_undo_callback), - BONOBO_UI_VERB ("Backgrounds and Emblems", backgrounds_and_emblems_callback), - BONOBO_UI_VERB ("Up", go_menu_up_callback), - BONOBO_UI_VERB ("Home", go_menu_home_callback), - BONOBO_UI_VERB ("Go to Computer", go_menu_go_to_computer_callback), - BONOBO_UI_VERB ("Go to Templates", go_menu_go_to_templates_callback), - BONOBO_UI_VERB ("Go to Trash", go_menu_go_to_trash_callback), - BONOBO_UI_VERB ("Go to Burn CD", go_menu_go_to_burn_cd_callback), - BONOBO_UI_VERB ("Go to Location", go_menu_location_callback), - BONOBO_UI_VERB ("Reload", view_menu_reload_callback), - BONOBO_UI_VERB ("Zoom In", view_menu_zoom_in_callback), - BONOBO_UI_VERB ("Zoom Out", view_menu_zoom_out_callback), - BONOBO_UI_VERB ("Zoom Normal", view_menu_zoom_normal_callback), - -#ifdef ENABLE_PROFILER - BONOBO_UI_VERB ("Start Profiling", nautilus_profiler_bonobo_ui_start_callback), - BONOBO_UI_VERB ("Stop Profiling", nautilus_profiler_bonobo_ui_stop_callback), - BONOBO_UI_VERB ("Reset Profiling", nautilus_profiler_bonobo_ui_reset_callback), - BONOBO_UI_VERB ("Report Profiling", nautilus_profiler_bonobo_ui_report_callback), -#endif - - BONOBO_UI_VERB ("About Nautilus", help_menu_about_nautilus_callback), - BONOBO_UI_VERB ("Nautilus Manual", help_menu_nautilus_manual_callback), - BONOBO_UI_VERB ("Preferences", preferences_callback), - BONOBO_UI_VERB ("Stop", stop_button_callback), - - BONOBO_UI_VERB_END - }; - - nautilus_window_ui_freeze (window); - - bonobo_ui_component_freeze (window->details->shell_ui, NULL); - - nautilus_window_update_show_hide_menu_items (window); - - bonobo_ui_component_add_verb_list_with_data (window->details->shell_ui, verbs, window); - - bonobo_ui_component_add_listener - (window->details->shell_ui, - ID_SHOW_HIDE_STATUS_BAR, - view_menu_show_hide_statusbar_state_changed_callback, - window); +nautilus_window_initialize_menus (NautilusWindow *window) +{ + GtkActionGroup *action_group; + GtkUIManager *ui_manager; + GtkAction *action; + char *file; + GError *error; + + action_group = gtk_action_group_new ("ShellActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + window->details->main_action_group = action_group; + gtk_action_group_add_actions (action_group, + main_entries, G_N_ELEMENTS (main_entries), + window); + + action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_UP); + g_object_set (action, "short_label", _("_Up"), NULL); + + window->details->ui_manager = gtk_ui_manager_new (); + ui_manager = window->details->ui_manager; + gtk_window_add_accel_group (GTK_WINDOW (window), + gtk_ui_manager_get_accel_group (ui_manager)); + + g_signal_connect (ui_manager, "connect_proxy", + G_CALLBACK (connect_proxy_cb), window); + g_signal_connect (ui_manager, "disconnect_proxy", + G_CALLBACK (disconnect_proxy_cb), window); + + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ - /* Register to catch Bonobo UI events so we can notice View As changes */ - g_signal_connect_object (window->details->shell_ui, "ui_event", - G_CALLBACK (nautilus_window_handle_ui_event_callback), window, 0); + error = NULL; + file = nautilus_ui_file ("nautilus-shell-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (ui_manager, file, &error)) { + g_error ("building menus failed: %s", error->message); + g_error_free (error); + } + g_free (file); - bonobo_ui_component_thaw (window->details->shell_ui, NULL); - if (!have_burn_uri ()) { - nautilus_bonobo_set_hidden (window->details->shell_ui, - COMMAND_GO_BURN_CD, - TRUE); + action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_GO_TO_BURN_CD); + gtk_action_set_visible (action, FALSE); } - -#ifndef ENABLE_PROFILER - nautilus_bonobo_set_hidden (window->details->shell_ui, NAUTILUS_MENU_PATH_PROFILER, TRUE); -#endif - - nautilus_window_ui_thaw (window); } static GList * @@ -706,37 +723,113 @@ get_extension_menus (NautilusWindow *window) return items; } +static void +extension_action_callback (GtkAction *action, + gpointer callback_data) +{ + nautilus_menu_item_activate (NAUTILUS_MENU_ITEM (callback_data)); +} + void nautilus_window_load_extension_menus (NautilusWindow *window) { + char *name, *label, *tip, *icon; + gboolean sensitive, priority; + GtkActionGroup *action_group; + GtkAction *action; + GdkPixbuf *pixbuf; GList *items; GList *l; + int i; + guint merge_id; + + if (window->details->extensions_menu_merge_id != 0) { + gtk_ui_manager_remove_ui (window->details->ui_manager, + window->details->extensions_menu_merge_id); + window->details->extensions_menu_merge_id = 0; + } + + if (window->details->extensions_menu_action_group != NULL) { + gtk_ui_manager_remove_action_group (window->details->ui_manager, + window->details->extensions_menu_action_group); + window->details->extensions_menu_action_group = NULL; + } - nautilus_bonobo_remove_menu_items_and_commands - (window->details->shell_ui, POPUP_PATH_EXTENSION_ACTIONS); - nautilus_bonobo_remove_menu_items_and_commands - (window->details->shell_ui, MENU_PATH_EXTENSION_ACTIONS); + merge_id = gtk_ui_manager_new_merge_id (window->details->ui_manager); + window->details->extensions_menu_merge_id = merge_id; + action_group = gtk_action_group_new ("ExtensionsMenuGroup"); + window->details->extensions_menu_action_group = action_group; + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + gtk_ui_manager_insert_action_group (window->details->ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ items = get_extension_menus (window); - for (l = items; l != NULL; l = l->next) { + for (l = items, i = 0; l != NULL; l = l->next, i++) { NautilusMenuItem *item; item = NAUTILUS_MENU_ITEM (l->data); - nautilus_bonobo_add_extension_item_command - (window->details->shell_ui, item); + g_object_get (G_OBJECT (item), + "name", &name, "label", &label, + "tip", &tip, "icon", &icon, + "sensitive", &sensitive, + "priority", &priority, + NULL); + + action = gtk_action_new (name, + label, + tip, + icon); + + /* TODO: This should really use themed icons, but that + doesn't work here yet */ + if (icon != NULL) { + pixbuf = nautilus_icon_factory_get_pixbuf_from_name + (icon, + NULL, + NAUTILUS_ICON_SIZE_FOR_MENUS, + NULL); + if (pixbuf != NULL) { + g_object_set_data_full (G_OBJECT (action), "menu-icon", + pixbuf, + g_object_unref); + } + } - nautilus_bonobo_add_extension_item - (window->details->shell_ui, - MENU_PATH_EXTENSION_ACTIONS, - item); - - nautilus_bonobo_add_extension_item - (window->details->shell_ui, - POPUP_PATH_EXTENSION_ACTIONS, - item); + gtk_action_set_sensitive (action, sensitive); + g_object_set (action, "is-important", priority, NULL); + g_signal_connect_data (action, "activate", + G_CALLBACK (extension_action_callback), + g_object_ref (item), + (GClosureNotify)g_object_unref, 0); + + gtk_action_group_add_action (action_group, + GTK_ACTION (action)); + g_object_unref (action); + + gtk_ui_manager_add_ui (window->details->ui_manager, + merge_id, + MENU_PATH_EXTENSION_ACTIONS, + name, + name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + gtk_ui_manager_add_ui (window->details->ui_manager, + merge_id, + POPUP_PATH_EXTENSION_ACTIONS, + name, + name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + + g_free (name); + g_free (label); + g_free (tip); + g_free (icon); + g_object_unref (item); } diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h index d8ea0f54a..cf2fafbe2 100644 --- a/src/nautilus-window-private.h +++ b/src/nautilus-window-private.h @@ -49,19 +49,17 @@ typedef enum { /* FIXME bugzilla.gnome.org 42575: Migrate more fields into here. */ struct NautilusWindowDetails { - /* Bonobo. */ - BonoboUIContainer *ui_container; - BonoboUIComponent *shell_ui; - BonoboUIComponent *status_ui; - gboolean updating_bonobo_state; - - int ui_change_depth; - guint ui_idle_id; - gboolean ui_is_frozen; - gboolean ui_pending_initialize_menus_part_2; - + GtkWidget *table; + GtkWidget *statusbar; + GtkWidget *menubar; + + GtkUIManager *ui_manager; + GtkActionGroup *main_action_group; /* owned by ui_manager */ + guint help_message_cid; + /* Menus. */ - guint refresh_go_menu_idle_id; + guint extensions_menu_merge_id; + GtkActionGroup *extensions_menu_action_group; /* Current location. */ char *location; @@ -78,6 +76,11 @@ struct NautilusWindowDetails NautilusFile *determine_view_file; /* View As choices */ + GtkActionGroup *view_as_action_group; /* owned by ui_manager */ + GtkRadioAction *view_as_radio_action; + GtkRadioAction *extra_viewer_radio_action; + guint short_list_merge_id; + guint extra_viewer_merge_id; GList *short_list_viewers; char *extra_viewer; @@ -90,7 +93,8 @@ struct NautilusWindowDetails struct _NautilusNavigationWindowDetails { GtkWidget *content_paned; - + GtkActionGroup *navigation_action_group; /* owned by ui_manager */ + /* Location bar */ gboolean temporary_navigation_bar; @@ -99,18 +103,28 @@ struct _NautilusNavigationWindowDetails { NautilusSidebar *current_side_panel; /* Menus */ + GtkActionGroup *bookmarks_action_group; guint refresh_bookmarks_menu_idle_id; - + guint bookmarks_merge_id; + + GtkActionGroup *go_menu_action_group; + guint refresh_go_menu_idle_id; + guint go_menu_merge_id; + /* Toolbar */ + GtkWidget *toolbar; GtkTooltips *tooltips; + GtkWidget *location_bar_box; - GtkWidget *back_button_item; - GtkWidget *forward_button_item; - + guint extensions_toolbar_merge_id; + GtkActionGroup *extensions_toolbar_action_group; + +#ifdef BONOBO_DONE /* Throbber */ gboolean throbber_active; gboolean throbber_activating; Bonobo_PropertyBag throbber_property_bag; +#endif }; #define NAUTILUS_MENU_PATH_BACK_ITEM "/menu/Go/Back" @@ -156,28 +170,19 @@ void nautilus_window_set_status (Nautil const char *status); void nautilus_window_load_view_as_menus (NautilusWindow *window); void nautilus_window_load_extension_menus (NautilusWindow *window); -void nautilus_window_initialize_menus_part_1 (NautilusWindow *window); -void nautilus_window_initialize_menus_part_2 (NautilusWindow *window); +void nautilus_window_initialize_menus (NautilusWindow *window); void nautilus_menus_append_bookmark_to_menu (NautilusWindow *window, - BonoboUIComponent *uic, NautilusBookmark *bookmark, const char *parent_path, guint index_in_parent, + GtkActionGroup *action_group, + guint merge_id, GCallback refresh_callback, NautilusBookmarkFailedCallback failed_callback); - -void nautilus_window_handle_ui_event_callback (BonoboUIComponent *ui, - const char *id, - Bonobo_UIComponent_EventType type, - const char *state, - NautilusWindow *window); #if NEW_UI_COMPLETE void nautilus_window_go_up (NautilusWindow *window); #endif void nautilus_window_update_find_menu_item (NautilusWindow *window); -void nautilus_window_remove_go_menu_callback (NautilusWindow *window); -void nautilus_window_remove_go_menu_items (NautilusWindow *window); -void nautilus_window_update_show_hide_menu_items (NautilusWindow *window); void nautilus_window_zoom_in (NautilusWindow *window); void nautilus_window_zoom_out (NautilusWindow *window); void nautilus_window_zoom_to_level (NautilusWindow *window, @@ -186,7 +191,6 @@ void nautilus_window_zoom_to_default (Nautil void nautilus_window_show_view_as_dialog (NautilusWindow *window); void nautilus_window_set_content_view_widget (NautilusWindow *window, NautilusView *content_view); -Bonobo_UIContainer nautilus_window_get_ui_container (NautilusWindow *window); void nautilus_window_set_viewed_file (NautilusWindow *window, NautilusFile *file); void nautilus_send_history_list_changed (void); @@ -198,12 +202,14 @@ void nautilus_window_update_icon (NautilusWindow *window); /* Navigation window menus */ -void nautilus_navigation_window_initialize_menus_part_1 (NautilusNavigationWindow *window); -void nautilus_navigation_window_initialize_menus_part_2 (NautilusNavigationWindow *window); +void nautilus_navigation_window_initialize_actions (NautilusNavigationWindow *window); +void nautilus_navigation_window_initialize_menus (NautilusNavigationWindow *window); void nautilus_navigation_window_remove_bookmarks_menu_callback (NautilusNavigationWindow *window); void nautilus_navigation_window_remove_bookmarks_menu_items (NautilusNavigationWindow *window); void nautilus_navigation_window_update_show_hide_menu_items (NautilusNavigationWindow *window); +void nautilus_navigation_window_remove_go_menu_callback (NautilusNavigationWindow *window); +void nautilus_navigation_window_remove_go_menu_items (NautilusNavigationWindow *window); /* Navigation window toolbar */ void nautilus_navigation_window_activate_throbber (NautilusNavigationWindow *window); diff --git a/src/nautilus-window-toolbars.c b/src/nautilus-window-toolbars.c index a86142b81..9f65e0095 100644 --- a/src/nautilus-window-toolbars.c +++ b/src/nautilus-window-toolbars.c @@ -33,12 +33,6 @@ #include "nautilus-window-manage-views.h" #include "nautilus-window-private.h" #include "nautilus-window.h" -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-property-bag.h> -#include <bonobo/bonobo-property-bag-client.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-moniker-util.h> -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-gnome-extensions.h> #include <eel/eel-gtk-extensions.h> #include <eel/eel-string.h> @@ -48,7 +42,6 @@ #include <libgnome/gnome-i18n.h> #include <libgnomeui/gnome-popup-menu.h> #include <libnautilus-extension/nautilus-menu-provider.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-bookmark.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-global-preferences.h> @@ -68,177 +61,7 @@ enum { TOOLBAR_ITEM_ORIENTATION_PROP }; -static void -activate_back_or_forward_menu_item (GtkMenuItem *menu_item, - NautilusNavigationWindow *window, - gboolean back) -{ - int index; - - g_assert (GTK_IS_MENU_ITEM (menu_item)); - g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); - - index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item), "user_data")); - - nautilus_navigation_window_back_or_forward (window, back, index); -} - -static void -activate_back_menu_item_callback (GtkMenuItem *menu_item, NautilusNavigationWindow *window) -{ - activate_back_or_forward_menu_item (menu_item, window, TRUE); -} - -static void -activate_forward_menu_item_callback (GtkMenuItem *menu_item, NautilusNavigationWindow *window) -{ - activate_back_or_forward_menu_item (menu_item, window, FALSE); -} - -static GtkMenu * -create_back_or_forward_menu (NautilusNavigationWindow *window, gboolean back) -{ - GtkMenu *menu; - GtkWidget *menu_item; - GList *list_link; - int index; - - g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window)); - - menu = GTK_MENU (gtk_menu_new ()); - - list_link = back ? window->back_list : window->forward_list; - index = 0; - while (list_link != NULL) - { - menu_item = nautilus_bookmark_menu_item_new (NAUTILUS_BOOKMARK (list_link->data)); - g_object_set_data (G_OBJECT (menu_item), "user_data", GINT_TO_POINTER (index)); - gtk_widget_show (GTK_WIDGET (menu_item)); - g_signal_connect_object (menu_item, "activate", - back - ? G_CALLBACK (activate_back_menu_item_callback) - : G_CALLBACK (activate_forward_menu_item_callback), - window, 0); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - list_link = g_list_next (list_link); - ++index; - } - - return menu; -} - -static GtkWidget * -get_back_button (NautilusNavigationWindow *window) -{ - return window->details->back_button_item; -} - -static GtkWidget * -get_forward_button (NautilusNavigationWindow *window) -{ - return window->details->forward_button_item; -} - -static void -menu_position_under_widget (GtkMenu *menu, int *x, int *y, - gboolean *push_in, gpointer user_data) -{ - GtkWidget *w; - int screen_width, screen_height; - GtkRequisition requisition; - - w = GTK_WIDGET (user_data); - - gdk_window_get_origin (w->window, x, y); - *x += w->allocation.x; - *y += w->allocation.y + w->allocation.height; - - gtk_widget_size_request (GTK_WIDGET (menu), &requisition); - - screen_width = gdk_screen_width (); - screen_height = gdk_screen_height (); - - *x = CLAMP (*x, 0, MAX (0, screen_width - requisition.width)); - *y = CLAMP (*y, 0, MAX (0, screen_height - requisition.height)); -} - -static gboolean -back_or_forward_button_pressed_callback (GtkWidget *widget, - GdkEventButton *event, - gpointer *user_data) -{ - NautilusNavigationWindow *window; - gboolean back; - - g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); - g_return_val_if_fail (NAUTILUS_IS_NAVIGATION_WINDOW (user_data), FALSE); - - window = NAUTILUS_NAVIGATION_WINDOW (user_data); - - back = widget == get_back_button (window); - g_assert (back || widget == get_forward_button (window)); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); - - gnome_popup_menu_do_popup_modal (GTK_WIDGET (create_back_or_forward_menu (NAUTILUS_NAVIGATION_WINDOW (user_data), back)), - menu_position_under_widget, widget, event, widget, widget); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE); - - return TRUE; -} - -static gboolean -back_or_forward_key_pressed_callback (GtkWidget *widget, - GdkEventKey *event, - gpointer *user_data) -{ - if (event->keyval == GDK_space || - event->keyval == GDK_KP_Space || - event->keyval == GDK_Return || - event->keyval == GDK_KP_Enter) { - back_or_forward_button_pressed_callback (widget, NULL, user_data); - } - - return FALSE; -} - -static GtkWidget * -create_back_or_forward_toolbar_item (NautilusNavigationWindow *window, - const char *tooltip, - const char *control_path) -{ - GtkWidget *button; - - button = gtk_toggle_button_new (); - - gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); - - gtk_container_add (GTK_CONTAINER (button), - gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT)); - - gtk_widget_show_all (GTK_WIDGET (button)); - - gtk_tooltips_set_tip (window->details->tooltips, - GTK_WIDGET (button), - tooltip, NULL); - - g_signal_connect_object (button, "key_press_event", - G_CALLBACK (back_or_forward_key_pressed_callback), - window, 0); - g_signal_connect_object (button, "button_press_event", - G_CALLBACK (back_or_forward_button_pressed_callback), - window, 0); - - bonobo_ui_component_widget_set (NAUTILUS_WINDOW (window)->details->shell_ui, - control_path, - button, - NULL); - - return button; -} - +#ifdef BONOBO_DONE static void throbber_set_throbbing (NautilusNavigationWindow *window, gboolean throbbing) @@ -296,10 +119,13 @@ throbber_created_callback (Bonobo_Unknown throbber, g_object_unref (window); } +#endif + void nautilus_navigation_window_set_throbber_active (NautilusNavigationWindow *window, gboolean allow) { +#ifdef BONOBO_DONE if (( window->details->throbber_active && allow) || (!window->details->throbber_active && !allow)) { return; @@ -317,11 +143,13 @@ nautilus_navigation_window_set_throbber_active (NautilusNavigationWindow *window if (window->details->throbber_property_bag != CORBA_OBJECT_NIL) { throbber_set_throbbing (window, allow); } +#endif } void nautilus_navigation_window_activate_throbber (NautilusNavigationWindow *window) { +#ifdef BONOBO_DONE CORBA_Environment ev; char *exception_as_text; @@ -352,34 +180,16 @@ nautilus_navigation_window_activate_throbber (NautilusNavigationWindow *window) CORBA_exception_free (&ev); window->details->throbber_activating = TRUE; } +#endif } void nautilus_navigation_window_initialize_toolbars (NautilusNavigationWindow *window) { - GtkWidget *space; - - nautilus_window_ui_freeze (NAUTILUS_WINDOW (window)); - nautilus_navigation_window_activate_throbber (window); - - window->details->back_button_item = create_back_or_forward_toolbar_item - (window, _("Go back a few pages"), - "/Toolbar/BackMenu"); - window->details->forward_button_item = create_back_or_forward_toolbar_item - (window, _("Go forward a number of pages"), - "/Toolbar/ForwardMenu"); - - space = gtk_event_box_new (); - gtk_event_box_set_visible_window (GTK_EVENT_BOX (space), FALSE); - bonobo_ui_component_widget_set (NAUTILUS_WINDOW (window)->details->shell_ui, - "/Toolbar/SpaceWrapper", - space, - NULL); - - nautilus_window_ui_thaw (NAUTILUS_WINDOW (window)); } + static GList * get_extension_toolbar_items (NautilusNavigationWindow *window) { @@ -407,15 +217,47 @@ get_extension_toolbar_items (NautilusNavigationWindow *window) return items; } +static void +extension_action_callback (GtkAction *action, + gpointer callback_data) +{ + nautilus_menu_item_activate (NAUTILUS_MENU_ITEM (callback_data)); +} + void nautilus_navigation_window_load_extension_toolbar_items (NautilusNavigationWindow *window) { + char *name, *label, *tip, *icon; + gboolean sensitive, priority; + GtkActionGroup *action_group; + GtkAction *action; + GdkPixbuf *pixbuf; + GtkUIManager *ui_manager; GList *items; GList *l; - nautilus_bonobo_remove_menu_items_and_commands - (NAUTILUS_WINDOW (window)->details->shell_ui, - TOOLBAR_PATH_EXTENSION_ACTIONS); + guint merge_id; + + ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)); + if (window->details->extensions_toolbar_merge_id != 0) { + gtk_ui_manager_remove_ui (ui_manager, + window->details->extensions_toolbar_merge_id); + window->details->extensions_toolbar_merge_id = 0; + } + + if (window->details->extensions_toolbar_action_group != NULL) { + gtk_ui_manager_remove_action_group (ui_manager, + window->details->extensions_toolbar_action_group); + window->details->extensions_toolbar_action_group = NULL; + } + + merge_id = gtk_ui_manager_new_merge_id (ui_manager); + window->details->extensions_toolbar_merge_id = merge_id; + action_group = gtk_action_group_new ("ExtensionsMenuGroup"); + window->details->extensions_toolbar_action_group = action_group; + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); /* owned by ui manager */ items = get_extension_toolbar_items (window); @@ -424,14 +266,58 @@ nautilus_navigation_window_load_extension_toolbar_items (NautilusNavigationWindo item = NAUTILUS_MENU_ITEM (l->data); - nautilus_bonobo_add_extension_item_command - (NAUTILUS_WINDOW (window)->details->shell_ui, item); + g_object_get (G_OBJECT (item), + "name", &name, "label", &label, + "tip", &tip, "icon", &icon, + "sensitive", &sensitive, + "priority", &priority, + NULL); + + action = gtk_action_new (name, + label, + tip, + icon); + + /* TODO: This should really use themed icons, but that + doesn't work here yet */ + if (icon != NULL) { + pixbuf = nautilus_icon_factory_get_pixbuf_from_name + (icon, + NULL, + /*BONOBOTODO: size */48, + NULL); + if (pixbuf != NULL) { + g_object_set_data_full (G_OBJECT (action), "toolbar-icon", + pixbuf, + g_object_unref); + } + } - nautilus_bonobo_add_extension_toolbar_item - (NAUTILUS_WINDOW (window)->details->shell_ui, - TOOLBAR_PATH_EXTENSION_ACTIONS, - item); + gtk_action_set_sensitive (action, sensitive); + g_object_set (action, "is-important", priority, NULL); + g_signal_connect_data (action, "activate", + G_CALLBACK (extension_action_callback), + g_object_ref (item), + (GClosureNotify)g_object_unref, 0); + + gtk_action_group_add_action (action_group, + GTK_ACTION (action)); + g_object_unref (action); + + gtk_ui_manager_add_ui (ui_manager, + merge_id, + TOOLBAR_PATH_EXTENSION_ACTIONS, + name, + name, + GTK_UI_MANAGER_TOOLITEM, + FALSE); + + g_free (name); + g_free (label); + g_free (tip); + g_free (icon); + g_object_unref (item); } diff --git a/src/nautilus-window.c b/src/nautilus-window.c index 3480c0518..ddeb03c86 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -3,7 +3,7 @@ /* * Nautilus * - * Copyright (C) 1999, 2000 Red Hat, Inc. + * Copyright (C) 1999, 2000, 2004 Red Hat, Inc. * Copyright (C) 1999, 2000, 2001 Eazel, Inc. * * Nautilus is free software; you can redistribute it and/or @@ -22,7 +22,7 @@ * * Authors: Elliot Lee <sopwith@redhat.com> * John Sullivan <sullivan@eazel.com> - * + * Alexander Larsson <alexl@redhat.com> */ /* nautilus-window.c: Implementation of the main window object */ @@ -30,6 +30,7 @@ #include <config.h> #include "nautilus-window-private.h" +#include "nautilus-actions.h" #include "nautilus-application.h" #include "nautilus-bookmarks-window.h" #include "nautilus-information-panel.h" @@ -37,9 +38,6 @@ #include "nautilus-signaller.h" #include "nautilus-window-manage-views.h" #include "nautilus-zoom-control.h" -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-property-bag-client.h> -#include <bonobo/bonobo-ui-util.h> #include <eel/eel-debug.h> #include <eel/eel-gdk-extensions.h> #include <eel/eel-gdk-pixbuf-extensions.h> @@ -64,7 +62,6 @@ #include <libgnomeui/gnome-window-icon.h> #include <libgnomevfs/gnome-vfs-uri.h> #include <libgnomevfs/gnome-vfs-utils.h> -#include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-file-attributes.h> #include <libnautilus-private/nautilus-global-preferences.h> @@ -74,7 +71,6 @@ #include <libnautilus-private/nautilus-mime-actions.h> #include <libnautilus-private/nautilus-program-choosing.h> #include <libnautilus-private/nautilus-view-factory.h> -#include <libnautilus-private/nautilus-bonobo-ui.h> #include <libnautilus-private/nautilus-clipboard.h> #include <libnautilus-private/nautilus-undo.h> #include <math.h> @@ -93,19 +89,10 @@ #define SIDE_PANE_MINIMUM_HEIGHT 400 /* dock items */ -#define LOCATION_BAR_PATH "/Location Bar" -#define TOOLBAR_PATH "/Toolbar" -#define STATUS_BAR_PATH "/status" -#define MENU_BAR_PATH "/menu" - -#define COMMAND_PREFIX "/commands/" -#define NAUTILUS_COMMAND_TOGGLE_FIND_MODE "/commands/Toggle Find Mode" -#define NAUTILUS_COMMAND_VIEW_AS "/commands/View as" -#define NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER "/menu/View/View Choices/Extra Viewer" -#define NAUTILUS_MENU_PATH_BEFORE_SHORT_LIST_SEPARATOR "/menu/View/View Choices/Before Short List" -#define NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER "/menu/View/View Choices/Short List" -#define NAUTILUS_MENU_PATH_AFTER_SHORT_LIST_SEPARATOR "/menu/View/View Choices/After Short List" +#define NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER "/MenuBar/View/View Choices/Extra Viewer" +#define NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER "/MenuBar/View/View Choices/Short List" +#define NAUTILUS_MENU_PATH_AFTER_SHORT_LIST_SEPARATOR "/MenuBar/View/View Choices/After Short List" enum { ARG_0, @@ -115,13 +102,15 @@ enum { static void cancel_view_as_callback (NautilusWindow *window); static void nautilus_window_info_iface_init (NautilusWindowInfoIface *iface); +static void set_initial_window_geometry (NautilusWindow *window); static GList *history_list; -G_DEFINE_TYPE_WITH_CODE (NautilusWindow, nautilus_window, BONOBO_TYPE_WINDOW, +G_DEFINE_TYPE_WITH_CODE (NautilusWindow, nautilus_window, GTK_TYPE_WINDOW, G_IMPLEMENT_INTERFACE (NAUTILUS_TYPE_WINDOW_INFO, nautilus_window_info_iface_init)); + static void set_up_default_icon_list (void) { @@ -163,23 +152,48 @@ icons_changed_callback (GObject *factory, NautilusWindow *window) static void nautilus_window_init (NautilusWindow *window) { + GtkWidget *table; + GtkWidget *menu; + GtkWidget *statusbar; + window->details = g_new0 (NautilusWindowDetails, 1); window->details->show_hidden_files_mode = NAUTILUS_WINDOW_SHOW_HIDDEN_FILES_DEFAULT; - /* CORBA and Bonobo setup, which must be done before the location bar setup */ - window->details->ui_container = bonobo_window_get_ui_container (BONOBO_WINDOW (window)); - bonobo_object_ref (window->details->ui_container); - /* Set initial window title */ gtk_window_set_title (GTK_WINDOW (window), _("Nautilus")); - window->details->shell_ui = bonobo_ui_component_new ("Nautilus Shell"); - bonobo_ui_component_set_container - (window->details->shell_ui, - nautilus_window_get_ui_container (window), - NULL); + table = gtk_table_new (1, 5, FALSE); + window->details->table = table; + gtk_widget_show (table); + gtk_container_add (GTK_CONTAINER (window), table); + + + statusbar = gtk_statusbar_new (); + window->details->statusbar = statusbar; + gtk_table_attach (GTK_TABLE (table), + statusbar, + /* X direction */ /* Y direction */ + 0, 1, 4, 5, + GTK_EXPAND | GTK_FILL, 0, + 0, 0); + window->details->help_message_cid = gtk_statusbar_get_context_id + (GTK_STATUSBAR (statusbar), "help_message"); + gtk_widget_show (statusbar); + + nautilus_window_initialize_menus (window); + + menu = gtk_ui_manager_get_widget (window->details->ui_manager, "/MenuBar"); + window->details->menubar = menu; + gtk_widget_show (menu); + gtk_table_attach (GTK_TABLE (table), + menu, + /* X direction */ /* Y direction */ + 0, 1, 0, 1, + GTK_EXPAND | GTK_FILL, 0, + 0, 0); + /* Register IconFactory callback to update the window border icon * when the icon-theme is changed. */ @@ -187,144 +201,27 @@ nautilus_window_init (NautilusWindow *window) G_CALLBACK (icons_changed_callback), window, 0); - /* Create a separate component so when we remove the status - * we don't loose the status bar - */ - window->details->status_ui = bonobo_ui_component_new ("Status Component"); - bonobo_ui_component_set_container - (window->details->status_ui, - nautilus_window_get_ui_container (window), - NULL); - gtk_quit_add_destroy (1, GTK_OBJECT (window)); /* Keep the main event loop alive as long as the window exists */ nautilus_main_event_loop_register (GTK_OBJECT (window)); -} - -static gint -ui_idle_handler (gpointer data) -{ - NautilusWindow *window; - gboolean old_updating_bonobo_state; - - window = data; - - g_assert (NAUTILUS_IS_WINDOW (window)); - g_object_ref (data); - - g_assert (window->details->ui_change_depth == 0); - - /* Simulate an extra freeze/thaw so that calling window_ui_freeze - * and thaw from within the idle handler doesn't try to remove it - * (the already running idle handler) - */ - window->details->ui_change_depth++; - old_updating_bonobo_state = window->details->updating_bonobo_state; - - if (window->details->ui_pending_initialize_menus_part_2) { - EEL_CALL_METHOD (NAUTILUS_WINDOW_CLASS, window, - merge_menus_2, (window)); - } - - if (window->details->ui_is_frozen) { - window->details->updating_bonobo_state = TRUE; - bonobo_ui_engine_thaw (bonobo_ui_container_get_engine (window->details->ui_container)); - window->details->ui_is_frozen = FALSE; - window->details->updating_bonobo_state = old_updating_bonobo_state; - } - - window->details->ui_change_depth--; - - window->details->ui_idle_id = 0; - g_object_unref (data); - - return FALSE; -} - -static inline void -ui_install_idle_handler (NautilusWindow *window) -{ - if (window->details->ui_idle_id == 0) { - window->details->ui_idle_id = g_idle_add_full (G_PRIORITY_LOW, ui_idle_handler, window, NULL); - } -} - -static inline void -ui_remove_idle_handler (NautilusWindow *window) -{ - if (window->details->ui_idle_id != 0) { - g_source_remove (window->details->ui_idle_id); - window->details->ui_idle_id = 0; - } -} - -/* Register that BonoboUI changes are going to be made to WINDOW. The UI - * won't actually be synchronised until some arbitrary date in the future. - */ -void -nautilus_window_ui_freeze (NautilusWindow *window) -{ - g_object_ref (window); - - if (window->details->ui_change_depth == 0) { - ui_remove_idle_handler (window); - } - - if (!window->details->ui_is_frozen) { - bonobo_ui_engine_freeze (bonobo_ui_container_get_engine (window->details->ui_container)); - window->details->ui_is_frozen = TRUE; - } - - window->details->ui_change_depth++; -} - -/* Register that the BonoboUI changes for WINDOW have finished. There _must_ - * be one and only one call to this function for every call to - * starting_ui_change () - */ -void -nautilus_window_ui_thaw (NautilusWindow *window) -{ - window->details->ui_change_depth--; - - g_assert (window->details->ui_change_depth >= 0); - - if (window->details->ui_change_depth == 0 - && (window->details->ui_is_frozen - || window->details->ui_pending_initialize_menus_part_2)) { - ui_install_idle_handler (window); - } + set_initial_window_geometry (window); + + nautilus_window_allow_stop (window, FALSE); - g_object_unref (window); +#ifdef BONOBO_DONE + /* BONOBOTODO: this crashes, because ->application is not set in initializer */ + /* Set up undo manager */ + nautilus_undo_manager_attach (window->application->undo_manager, G_OBJECT (window)); +#endif } -/* Unconditionally synchronize the BonoboUI of WINDOW. */ +/* Unconditionally synchronize the GtkUIManager of WINDOW. */ static void nautilus_window_ui_update (NautilusWindow *window) { - BonoboUIEngine *engine; - gboolean old_updating_bonobo_state; - - engine = bonobo_ui_container_get_engine (window->details->ui_container); - old_updating_bonobo_state = window->details->updating_bonobo_state; - - window->details->updating_bonobo_state = TRUE; - if (window->details->ui_is_frozen) { - bonobo_ui_engine_thaw (engine); - if (window->details->ui_change_depth == 0) { - window->details->ui_is_frozen = FALSE; - if (!window->details->ui_pending_initialize_menus_part_2) { - ui_remove_idle_handler (window); - } - } else { - bonobo_ui_engine_freeze (engine); - } - } else { - bonobo_ui_engine_update (engine); - } - window->details->updating_bonobo_state = old_updating_bonobo_state; + gtk_ui_manager_ensure_update (window->details->ui_manager); } static gboolean @@ -334,7 +231,7 @@ nautilus_window_clear_status (gpointer callback_data) window = NAUTILUS_WINDOW (callback_data); - bonobo_ui_component_set_status (window->details->status_ui, NULL, NULL); + gtk_statusbar_pop (GTK_STATUSBAR (window->details->statusbar), 0); /* clear any previous message, underflow is allowed */ return FALSE; } @@ -343,7 +240,7 @@ void nautilus_window_set_status (NautilusWindow *window, const char *text) { if (text != NULL && text[0] != '\0') { - bonobo_ui_component_set_status (window->details->status_ui, text, NULL); + gtk_statusbar_push (GTK_STATUSBAR (window->details->statusbar), 0, text); } else { nautilus_window_clear_status (window); } @@ -396,43 +293,42 @@ nautilus_window_go_up (NautilusWindow *window, gboolean close_behind) void nautilus_window_allow_up (NautilusWindow *window, gboolean allow) { + GtkAction *action; + g_return_if_fail (NAUTILUS_IS_WINDOW (window)); - nautilus_window_ui_freeze (window); - - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_UP, allow); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_UP); + gtk_action_set_sensitive (action, allow); - nautilus_window_ui_thaw (window); } void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow) { + GtkAction *action; + g_return_if_fail (NAUTILUS_IS_WINDOW (window)); - nautilus_window_ui_freeze (window); - - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_STOP, allow); - + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_STOP); + gtk_action_set_sensitive (action, allow); + EEL_CALL_METHOD (NAUTILUS_WINDOW_CLASS, window, set_throbber_active, (window, allow)); - - nautilus_window_ui_thaw (window); } void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow) { + GtkAction *action; + g_return_if_fail (NAUTILUS_IS_WINDOW (window)); - nautilus_window_ui_freeze (window); - - nautilus_bonobo_set_sensitive (window->details->shell_ui, - NAUTILUS_COMMAND_RELOAD, allow); + action = gtk_action_group_get_action (window->details->main_action_group, + NAUTILUS_ACTION_RELOAD); + gtk_action_set_sensitive (action, allow); - nautilus_window_ui_thaw (window); } void @@ -568,57 +464,11 @@ set_initial_window_geometry (NautilusWindow *window) } static void -real_merge_menus (NautilusWindow *window) -{ - /* Load the user interface from the XML file. */ - bonobo_ui_util_set_ui (window->details->shell_ui, - DATADIR, - "nautilus-shell-ui.xml", - "nautilus", NULL); - - - bonobo_ui_component_freeze (window->details->shell_ui, NULL); - - bonobo_ui_component_thaw (window->details->shell_ui, NULL); - - /* initalize the menus and toolbars */ - nautilus_window_initialize_menus_part_1 (window); - - /* We'll do the second part later (bookmarks and go menus) */ - window->details->ui_pending_initialize_menus_part_2 = TRUE; -} - -static void -real_merge_menus_2 (NautilusWindow *window) -{ - window->details->ui_pending_initialize_menus_part_2 = FALSE; -} - -static void -nautilus_window_constructed (NautilusWindow *window) -{ - nautilus_window_ui_freeze (window); - - set_initial_window_geometry (window); - - EEL_CALL_METHOD (NAUTILUS_WINDOW_CLASS, window, - merge_menus, (window)); - - nautilus_window_allow_stop (window, FALSE); - - /* Set up undo manager */ - nautilus_undo_manager_attach (window->application->undo_manager, G_OBJECT (window)); - - nautilus_window_ui_thaw (window); -} - -static void nautilus_window_set_property (GObject *object, guint arg_id, - const GValue *value, + const GValue *value, GParamSpec *pspec) { - char *old_name; NautilusWindow *window; window = NAUTILUS_WINDOW (object); @@ -628,17 +478,7 @@ nautilus_window_set_property (GObject *object, if (g_value_get_string (value) == NULL) { return; } - old_name = bonobo_window_get_name (BONOBO_WINDOW (window)); - bonobo_window_set_name (BONOBO_WINDOW (window), g_value_get_string (value)); - /* This hack of using the time when the name first - * goes non-NULL to be window-constructed time is - * completely lame. But it works, so for now we leave - * it alone. - */ - if (old_name == NULL) { - nautilus_window_constructed (window); - } - g_free (old_name); + /* BONOBOTODO: WTF? */ break; case ARG_APP: window->application = NAUTILUS_APPLICATION (g_value_get_object (value)); @@ -654,9 +494,9 @@ nautilus_window_get_property (GObject *object, { switch (arg_id) { case ARG_APP_ID: - g_value_set_string_take_ownership ( - value, - bonobo_window_get_name (BONOBO_WINDOW (object))); + /* BONOBOTODO: WTF? */ + g_value_set_static_string (value, + "none"); break; case ARG_APP: g_value_set_object (value, NAUTILUS_WINDOW (object)->application); @@ -702,23 +542,6 @@ nautilus_window_finalize (GObject *object) nautilus_window_manage_views_finalize (window); nautilus_window_set_viewed_file (window, NULL); - nautilus_window_remove_go_menu_callback (window); - - if (window->details->ui_idle_id != 0) { - g_source_remove (window->details->ui_idle_id); - } - - if (window->details->shell_ui != NULL) { - bonobo_ui_component_unset_container (window->details->shell_ui, NULL); - bonobo_object_unref (window->details->shell_ui); - window->details->shell_ui = NULL; - } - - if (window->details->status_ui != NULL) { - bonobo_ui_component_unset_container (window->details->status_ui, NULL); - bonobo_object_unref (window->details->status_ui); - window->details->status_ui = NULL; - } nautilus_file_unref (window->details->viewed_file); @@ -734,7 +557,7 @@ nautilus_window_finalize (GObject *object) g_object_unref (window->last_location_bookmark); } - bonobo_object_unref (window->details->ui_container); + g_object_unref (window->details->ui_manager); if (window->details->location_change_at_idle_id != 0) { g_source_remove (window->details->location_change_at_idle_id); @@ -803,93 +626,92 @@ nautilus_window_size_request (GtkWidget *widget, * Main API */ +typedef struct { + NautilusWindow *window; + char *id; +} ActivateViewData; + static void -activate_nth_short_list_item (NautilusWindow *window, guint index) +free_activate_view_data (gpointer data) { - g_assert (NAUTILUS_IS_WINDOW (window)); - g_assert (index < g_list_length (window->details->short_list_viewers)); + ActivateViewData *activate_data; - nautilus_window_set_content_view (window, - g_list_nth_data (window->details->short_list_viewers, index)); -} + activate_data = data; -static void -activate_extra_viewer (NautilusWindow *window) -{ - g_assert (NAUTILUS_IS_WINDOW (window)); - g_assert (window->details->extra_viewer != NULL); - - nautilus_window_set_content_view (window, window->details->extra_viewer); + g_free (activate_data->id); + g_free (activate_data); } static void -handle_view_as_item_from_bonobo_menu (NautilusWindow *window, const char *id) +action_view_as_callback (GtkAction *action, + ActivateViewData *data) { - char *container_path; - - container_path = nautilus_bonobo_get_numbered_menu_item_container_path_from_command (id); - - if (eel_strcmp (container_path, NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER) == 0) { - activate_nth_short_list_item - (window, - nautilus_bonobo_get_numbered_menu_item_index_from_command (id)); - } else if (eel_strcmp (container_path, NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER) == 0) { - g_return_if_fail - (nautilus_bonobo_get_numbered_menu_item_index_from_command (id) == 0); - activate_extra_viewer (window); - } - - g_free (container_path); + nautilus_window_set_content_view (data->window, + data->id); } -void -nautilus_window_handle_ui_event_callback (BonoboUIComponent *ui, - const char *id, - Bonobo_UIComponent_EventType type, - const char *state, - NautilusWindow *window) -{ - if (!window->details->updating_bonobo_state - && type == Bonobo_UIComponent_STATE_CHANGED - && strcmp (state, "1") == 0) { - handle_view_as_item_from_bonobo_menu (window, id); - } -} - -static void -add_view_as_bonobo_menu_item (NautilusWindow *window, - const char *placeholder_path, - const char *identifier, - int index) +static GtkRadioAction * +add_view_as_menu_item (NautilusWindow *window, + const char *placeholder_path, + const char *identifier, + int index, /* extra_viewer is always index 0 */ + guint merge_id) { char *tip; - char *item_path; const NautilusViewInfo *info; char *label; + GtkRadioAction *action; + char *action_name; + ActivateViewData *data; info = nautilus_view_factory_lookup (identifier); /* BONOBOTODO: nicer way for labels */ label = g_strdup_printf (_("View as %s"), _(info->label_with_mnemonic)); - - nautilus_bonobo_add_numbered_radio_menu_item - (window->details->shell_ui, - placeholder_path, - index, - label, - "viewers group"); - g_free (label); - /* BONOBOTODO: nicer way for labels */ tip = g_strdup_printf (_("Display this location with \"%s\""), _(info->label)); - item_path = nautilus_bonobo_get_numbered_menu_item_path - (window->details->shell_ui, - placeholder_path, - index); - nautilus_bonobo_set_tip (window->details->shell_ui, item_path, tip); - g_free (item_path); + + action_name = g_strdup_printf ("view_as_%d", index); + action = gtk_radio_action_new (action_name, + label, + tip, + NULL, + 0); + + if (window->details->view_as_radio_action != NULL) { + gtk_radio_action_set_group (action, + gtk_radio_action_get_group (window->details->view_as_radio_action)); + } else if (index != 0) { + /* Index 0 is the extra view, and we don't want to use that here, + as it can get deleted/changed later */ + window->details->view_as_radio_action = action; + } + + g_free (label); g_free (tip); + + data = g_new (ActivateViewData, 1); + data->window = window; + data->id = g_strdup (identifier); + g_signal_connect_data (action, "activate", + G_CALLBACK (action_view_as_callback), + data, (GClosureNotify) free_activate_view_data, 0); + + gtk_action_group_add_action (window->details->view_as_action_group, + GTK_ACTION (action)); + g_object_unref (action); + + gtk_ui_manager_add_ui (window->details->ui_manager, + merge_id, + placeholder_path, + action_name, + action_name, + GTK_UI_MANAGER_MENUITEM, + FALSE); + g_free (action_name); + + return action; /* return value owned by group */ } /* Make a special first item in the "View as" option menu that represents @@ -917,15 +739,26 @@ update_extra_viewer_in_view_as_menus (NautilusWindow *window, g_free (window->details->extra_viewer); window->details->extra_viewer = g_strdup (id); - /* Also update the Bonobo View menu item */ - if (id == NULL) { - nautilus_bonobo_remove_menu_items_and_commands - (window->details->shell_ui, NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER); - } else { - add_view_as_bonobo_menu_item (window, - NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER, - window->details->extra_viewer, - 0); + if (window->details->extra_viewer_merge_id != 0) { + gtk_ui_manager_remove_ui (window->details->ui_manager, + window->details->extra_viewer_merge_id); + window->details->extra_viewer_merge_id = 0; + } + + if (window->details->extra_viewer_radio_action != NULL) { + gtk_action_group_remove_action (window->details->view_as_action_group, + GTK_ACTION (window->details->extra_viewer_radio_action)); + window->details->extra_viewer_radio_action = NULL; + } + + if (id != NULL) { + window->details->extra_viewer_merge_id = gtk_ui_manager_new_merge_id (window->details->ui_manager); + window->details->extra_viewer_radio_action = + add_view_as_menu_item (window, + NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER, + window->details->extra_viewer, + 0, + window->details->extra_viewer_merge_id); } } @@ -957,17 +790,16 @@ static void nautilus_window_synch_view_as_menus (NautilusWindow *window) { int index; - char *verb_name, *command_path; + char *action_name; GList *node; - const char *numbered_menu_item_container_path; + GtkAction *action; g_return_if_fail (NAUTILUS_IS_WINDOW (window)); if (window->content_view == NULL) { return; } - - for (node = window->details->short_list_viewers, index = 0; + for (node = window->details->short_list_viewers, index = 1; node != NULL; node = node->next, ++index) { if (nautilus_window_content_view_matches_iid (window, (char *)node->data)) { @@ -977,22 +809,16 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window) if (node == NULL) { replace_extra_viewer_in_view_as_menus (window); index = 0; - numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER; } else { remove_extra_viewer_in_view_as_menus (window); - numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER; } - g_assert (numbered_menu_item_container_path != NULL); + action_name = g_strdup_printf ("view_as_%d", index); + action = gtk_action_group_get_action (window->details->view_as_action_group, + action_name); + g_free (action_name); - /* Make View menu in menu bar mark the right item */ - verb_name = nautilus_bonobo_get_numbered_menu_item_command - (window->details->shell_ui, - numbered_menu_item_container_path, index); - command_path = g_strconcat (COMMAND_PREFIX, verb_name, NULL); - nautilus_bonobo_set_toggle_state (window->details->shell_ui, command_path, TRUE); - g_free (command_path); - g_free (verb_name); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); } static void @@ -1018,33 +844,56 @@ real_load_view_as_menu (NautilusWindow *window) { GList *node; int index; + guint merge_id; + + if (window->details->short_list_merge_id != 0) { + gtk_ui_manager_remove_ui (window->details->ui_manager, + window->details->short_list_merge_id); + window->details->short_list_merge_id = 0; + } + if (window->details->view_as_action_group != NULL) { + gtk_ui_manager_remove_action_group (window->details->ui_manager, + window->details->view_as_action_group); + window->details->view_as_action_group = NULL; + } - /* Clear out the menu items created last time. For the option menu, we need do - * nothing since we replace the entire menu. For the View menu, we have - * to do this explicitly. - */ - nautilus_bonobo_remove_menu_items_and_commands - (window->details->shell_ui, NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER); - nautilus_bonobo_remove_menu_items_and_commands - (window->details->shell_ui, NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER); - + if (window->details->extra_viewer_merge_id != 0) { + gtk_ui_manager_remove_ui (window->details->ui_manager, + window->details->extra_viewer_merge_id); + window->details->extra_viewer_merge_id = 0; + } + if (window->details->extra_viewer_radio_action != NULL) { + gtk_action_group_remove_action (window->details->view_as_action_group, + GTK_ACTION (window->details->extra_viewer_radio_action)); + window->details->extra_viewer_radio_action = NULL; + } + g_free (window->details->extra_viewer); + window->details->extra_viewer = NULL; + refresh_stored_viewers (window); - + merge_id = gtk_ui_manager_new_merge_id (window->details->ui_manager); + window->details->short_list_merge_id = merge_id; + window->details->view_as_action_group = gtk_action_group_new ("ViewAsGroup"); + gtk_action_group_set_translation_domain (window->details->view_as_action_group, GETTEXT_PACKAGE); + window->details->view_as_radio_action = NULL; + /* Add a menu item for each view in the preferred list for this location. */ - for (node = window->details->short_list_viewers, index = 0; + /* Start on 1, because extra_viewer gets index 0 */ + for (node = window->details->short_list_viewers, index = 1; node != NULL; node = node->next, ++index) { /* Menu item in View menu. */ - add_view_as_bonobo_menu_item (window, - NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER, - node->data, - index); + add_view_as_menu_item (window, + NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER, + node->data, + index, + merge_id); } - - nautilus_bonobo_set_hidden (window->details->shell_ui, - NAUTILUS_MENU_PATH_AFTER_SHORT_LIST_SEPARATOR, - window->details->short_list_viewers == NULL); + gtk_ui_manager_insert_action_group (window->details->ui_manager, + window->details->view_as_action_group, + -1); + g_object_unref (window->details->view_as_action_group); /* owned by ui_manager */ nautilus_window_synch_view_as_menus (window); } @@ -1308,73 +1157,6 @@ nautilus_window_set_content_view_widget (NautilusWindow *window, set_content_view_widget, (window, frame)); } -static void -show_dock_item (NautilusWindow *window, const char *dock_item_path) -{ - if (NAUTILUS_IS_DESKTOP_WINDOW (window)) { - return; - } - - nautilus_window_ui_freeze (window); - - nautilus_bonobo_set_hidden (window->details->shell_ui, - dock_item_path, - FALSE); - nautilus_window_update_show_hide_menu_items (window); - - nautilus_window_ui_thaw (window); -} - -static void -hide_dock_item (NautilusWindow *window, const char *dock_item_path) -{ - nautilus_window_ui_freeze (window); - - nautilus_bonobo_set_hidden (window->details->shell_ui, - dock_item_path, - TRUE); - nautilus_window_update_show_hide_menu_items (window); - - nautilus_window_ui_thaw (window); -} - -static gboolean -dock_item_showing (NautilusWindow *window, const char *dock_item_path) -{ - return !nautilus_bonobo_get_hidden (window->details->shell_ui, - dock_item_path); -} - -void -nautilus_window_hide_status_bar (NautilusWindow *window) -{ - hide_dock_item (window, STATUS_BAR_PATH); - - nautilus_window_update_show_hide_menu_items (window); - if (eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR) && - eel_preferences_get_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR)) { - eel_preferences_set_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR, FALSE); - } -} - -void -nautilus_window_show_status_bar (NautilusWindow *window) -{ - show_dock_item (window, STATUS_BAR_PATH); - - nautilus_window_update_show_hide_menu_items (window); - if (eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR) && - !eel_preferences_get_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR)) { - eel_preferences_set_boolean (NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR, TRUE); - } -} - -gboolean -nautilus_window_status_bar_showing (NautilusWindow *window) -{ - return dock_item_showing (window, STATUS_BAR_PATH); -} - /** * nautilus_window_show: * @widget: GtkWidget @@ -1395,12 +1177,10 @@ nautilus_window_show (GtkWidget *widget) nautilus_window_ui_update (window); } -Bonobo_UIContainer -nautilus_window_get_ui_container (NautilusWindow *window) +GtkUIManager * +nautilus_window_get_ui_manager (NautilusWindow *window) { - g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), CORBA_OBJECT_NIL); - - return BONOBO_OBJREF (window->details->ui_container); + return window->details->ui_manager; } void @@ -1654,7 +1434,7 @@ nautilus_window_info_iface_init (NautilusWindowInfoIface *iface) iface->get_title = nautilus_window_get_cached_title; iface->get_history = nautilus_window_get_history; iface->get_current_location = nautilus_window_get_location; - iface->get_ui_container = nautilus_window_get_ui_container; + iface->get_ui_manager = nautilus_window_get_ui_manager; iface->get_selection_count = nautilus_window_get_selection_count; iface->get_selection = nautilus_window_get_selection; iface->get_hidden_files_mode = nautilus_window_get_hidden_files_mode; @@ -1673,11 +1453,9 @@ nautilus_window_class_init (NautilusWindowClass *class) class->add_current_location_to_history_list = real_add_current_location_to_history_list; class->get_title = real_get_title; class->set_title = real_set_title; - class->merge_menus = real_merge_menus; - class->merge_menus_2 = real_merge_menus_2; class->set_content_view_widget = real_set_content_view_widget; class->load_view_as_menu = real_load_view_as_menu; - + g_object_class_install_property (G_OBJECT_CLASS (class), ARG_APP_ID, g_param_spec_string ("app_id", diff --git a/src/nautilus-window.h b/src/nautilus-window.h index af6c5b19d..761fbe503 100644 --- a/src/nautilus-window.h +++ b/src/nautilus-window.h @@ -30,6 +30,7 @@ #define NAUTILUS_WINDOW_H #include <bonobo/bonobo-window.h> +#include <gtk/gtkuimanager.h> #include <eel/eel-glib-extensions.h> #include <libnautilus-private/nautilus-bookmark.h> #include <libnautilus-private/nautilus-window-info.h> @@ -50,7 +51,7 @@ typedef struct NautilusWindow NautilusWindow; #endif typedef struct { - BonoboWindowClass parent_spot; + GtkWindowClass parent_spot; NautilusWindowType window_type; @@ -66,8 +67,6 @@ typedef struct { char * (* get_title) (NautilusWindow *window); void (* set_title) (NautilusWindow *window, const char *title); - void (* merge_menus) (NautilusWindow *window); - void (* merge_menus_2) (NautilusWindow *window); void (* load_view_as_menu) (NautilusWindow *window); void (* set_content_view_widget) (NautilusWindow *window, NautilusView *new_view); @@ -87,7 +86,7 @@ typedef enum { typedef struct NautilusWindowDetails NautilusWindowDetails; struct NautilusWindow { - BonoboWindow parent_object; + GtkWindow parent_object; NautilusWindowDetails *details; @@ -108,8 +107,6 @@ struct NautilusWindow { }; GType nautilus_window_get_type (void); -void nautilus_window_ui_freeze (NautilusWindow *window); -void nautilus_window_ui_thaw (NautilusWindow *window); void nautilus_window_close (NautilusWindow *window); char * nautilus_window_get_location (NautilusWindow *window); void nautilus_window_go_to (NautilusWindow *window, @@ -127,9 +124,6 @@ void nautilus_window_display_error (NautilusWindow *window const char *error_msg); void nautilus_window_reload (NautilusWindow *window); -void nautilus_window_hide_status_bar (NautilusWindow *window); -void nautilus_window_show_status_bar (NautilusWindow *window); -gboolean nautilus_window_status_bar_showing (NautilusWindow *window); void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_up (NautilusWindow *window, @@ -138,5 +132,6 @@ void nautilus_window_allow_stop (NautilusWindow *window gboolean allow); void nautilus_window_allow_burn_cd (NautilusWindow *window, gboolean allow); +GtkUIManager * nautilus_window_get_ui_manager (NautilusWindow *window); #endif |