summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarin Adler <darin@src.gnome.org>2000-10-18 21:43:35 +0000
committerDarin Adler <darin@src.gnome.org>2000-10-18 21:43:35 +0000
commite5483a3a3c4bff78a57b7621f1b3832949426948 (patch)
tree73f023c34c5f81416ee8d48f1e6dbad2db6f6070
parent14dbbeaddfad425cca25f49648754957ad4e973d (diff)
downloadnautilus-e5483a3a3c4bff78a57b7621f1b3832949426948.tar.gz
Use calls by new names.
* components/notes/nautilus-notes.c: (make_notes_view): * src/nautilus-location-bar.c: (nautilus_location_bar_new): * src/nautilus-simple-search-bar.c: (nautilus_simple_search_bar_new): Use calls by new names. * libnautilus-extensions/nautilus-undo-signal-handlers.c: (editable_key_press_event), (nautilus_undo_editable_set_undo_key): Disabled the undo-key part of undo also. The old code was actually harmless because it got the name of the signal wrong, but it's better to have it disabled. * src/nautilus-shell-ui.xml: Added a comment that points out the 2nd place where undo has been disabled. * libnautilus/nautilus-clipboard.h: * libnautilus/nautilus-clipboard.c: (cut_callback), (copy_callback), (paste_callback), (clear_callback), (set_paste_sensitive_if_clipboard_contains_data), (focus_changed_callback), (target_destroy_callback), (nautilus_clipboard_set_up_editable), (first_focus_callback), (control_destroyed_callback), (nautilus_clipboard_set_up_editable_in_control), (disconnect_set_up_in_control_handlers): Some minor cleanup of the clipboard code. Includes bug fixes for items that are already in focus when the clipboard is hooked up (should never happen), and a fix for code that was using gtk_signal_disconnect on something that was connected with gtk_signal_connect_while_alive (doesn't work). Also got rid of misguided code that was copying a Bonobo_UIContainer with memcpy (since Bonobo_UIContainer is just a pointer). * src/Makefile.am: * src/nautilus-window-private.h: Changed source file name from nautilus-service-menu to nautilus-service-ui, since it does a toolbar item, not just a menu. * src/nautilus-window-service-ui.c: * src/nautilus-window-service-ui.h: A second cut at the service UI code. It no longer leaks a UI component. * src/nautilus-window.c: (nautilus_window_constructed), (nautilus_window_get_ui_container): Use our own pointer to the UI container instead of asking the shell UI for its container.
-rw-r--r--ChangeLog48
-rw-r--r--components/notes/nautilus-notes.c2
-rw-r--r--libnautilus-extensions/nautilus-undo-signal-handlers.c52
-rw-r--r--libnautilus-private/nautilus-undo-signal-handlers.c52
-rw-r--r--libnautilus/nautilus-clipboard.c326
-rw-r--r--libnautilus/nautilus-clipboard.h21
-rw-r--r--src/Makefile.am3
-rw-r--r--src/nautilus-location-bar.c5
-rw-r--r--src/nautilus-navigation-window.c17
-rw-r--r--src/nautilus-object-window.c17
-rw-r--r--src/nautilus-shell-ui.xml3
-rw-r--r--src/nautilus-simple-search-bar.c5
-rw-r--r--src/nautilus-spatial-window.c17
-rw-r--r--src/nautilus-window-private.h15
-rw-r--r--src/nautilus-window-service-ui.c (renamed from src/nautilus-window-service-menu.c)68
-rw-r--r--src/nautilus-window-service-ui.h32
-rw-r--r--src/nautilus-window.c17
17 files changed, 400 insertions, 300 deletions
diff --git a/ChangeLog b/ChangeLog
index ba149cd40..13bc956a0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+2000-10-18 Darin Adler <darin@eazel.com>
+
+ * components/notes/nautilus-notes.c: (make_notes_view):
+ * src/nautilus-location-bar.c: (nautilus_location_bar_new):
+ * src/nautilus-simple-search-bar.c:
+ (nautilus_simple_search_bar_new):
+ Use calls by new names.
+
+ * libnautilus-extensions/nautilus-undo-signal-handlers.c:
+ (editable_key_press_event), (nautilus_undo_editable_set_undo_key):
+ Disabled the undo-key part of undo also. The old code was actually
+ harmless because it got the name of the signal wrong, but it's
+ better to have it disabled.
+ * src/nautilus-shell-ui.xml: Added a comment that points out the
+ 2nd place where undo has been disabled.
+
+ * libnautilus/nautilus-clipboard.h:
+ * libnautilus/nautilus-clipboard.c: (cut_callback),
+ (copy_callback), (paste_callback), (clear_callback),
+ (set_paste_sensitive_if_clipboard_contains_data),
+ (focus_changed_callback), (target_destroy_callback),
+ (nautilus_clipboard_set_up_editable), (first_focus_callback),
+ (control_destroyed_callback),
+ (nautilus_clipboard_set_up_editable_in_control),
+ (disconnect_set_up_in_control_handlers):
+ Some minor cleanup of the clipboard code. Includes bug fixes for
+ items that are already in focus when the clipboard is hooked up
+ (should never happen), and a fix for code that was using
+ gtk_signal_disconnect on something that was connected with
+ gtk_signal_connect_while_alive (doesn't work). Also got rid of
+ misguided code that was copying a Bonobo_UIContainer with memcpy
+ (since Bonobo_UIContainer is just a pointer).
+
+ * src/Makefile.am:
+ * src/nautilus-window-private.h:
+ Changed source file name from nautilus-service-menu to
+ nautilus-service-ui, since it does a toolbar item, not just a
+ menu.
+
+ * src/nautilus-window-service-ui.c:
+ * src/nautilus-window-service-ui.h:
+ A second cut at the service UI code. It no longer leaks a UI
+ component.
+
+ * src/nautilus-window.c: (nautilus_window_constructed),
+ (nautilus_window_get_ui_container): Use our own pointer to the UI
+ container instead of asking the shell UI for its container.
+
2000-10-18 John Sullivan <sullivan@eazel.com>
Fixed bug 3862 (Icon view reversed after looking at list view)
diff --git a/components/notes/nautilus-notes.c b/components/notes/nautilus-notes.c
index 9288c91ba..a3476fd06 100644
--- a/components/notes/nautilus-notes.c
+++ b/components/notes/nautilus-notes.c
@@ -185,7 +185,7 @@ make_notes_view (BonoboGenericFactory *Factory, const char *goad_id, gpointer cl
notes_load_location, notes);
/* handle selections */
- nautilus_clipboard_set_up_editable_from_bonobo_control
+ nautilus_clipboard_set_up_editable_in_control
(GTK_EDITABLE (notes->note_text_field),
nautilus_view_get_bonobo_control (notes->view));
diff --git a/libnautilus-extensions/nautilus-undo-signal-handlers.c b/libnautilus-extensions/nautilus-undo-signal-handlers.c
index 1af3b1c82..f7c9f3e6b 100644
--- a/libnautilus-extensions/nautilus-undo-signal-handlers.c
+++ b/libnautilus-extensions/nautilus-undo-signal-handlers.c
@@ -284,23 +284,35 @@ restore_editable_from_undo_snapshot_callback (GtkObject *target, gpointer callba
* Allow the use of ctrl-z from within widget.
*/
-static void
+/* Undo is disabled until we have a better implementation.
+ * Both here and in nautilus-shell-ui.xml.
+ */
+
+#ifdef UNDO_ENABLED
+
+/* FIXME: This needs a return value of gboolean. */
+static void
editable_key_press_event (GtkEditable *editable, GdkEventKey *event, gpointer user_data)
{
switch (event->keyval) {
- /* Undo */
- case 'z':
- if ((event->state & GDK_CONTROL_MASK) != 0) {
- nautilus_undo (GTK_OBJECT (editable));
- return;
- }
- break;
-
- default:
- break;
+ /* Undo */
+ case 'z':
+ if ((event->state & GDK_CONTROL_MASK) != 0) {
+ nautilus_undo (GTK_OBJECT (editable));
+ /* FIXME: Need to stop the signal to prevent
+ * re-handling the same event.
+ */
+ return;
+ }
+ break;
+
+ default:
+ break;
}
}
+#endif
+
/* editable_set_undo_key
*
* Allow the use of ctrl-z from within widget. This should only be
@@ -310,16 +322,18 @@ editable_key_press_event (GtkEditable *editable, GdkEventKey *event, gpointer us
void
nautilus_undo_editable_set_undo_key (GtkEditable *editable, gboolean value)
{
+#ifdef UNDO_ENABLED
if (value) {
/* Connect to entry signals */
gtk_signal_connect (GTK_OBJECT (editable),
- "key-press-event",
- GTK_SIGNAL_FUNC (editable_key_press_event),
- NULL);
- }
- else {
+ "key_press_event",
+ GTK_SIGNAL_FUNC (editable_key_press_event),
+ NULL);
+ } else {
+ /* FIXME: This warns if the handler is already connected. */
gtk_signal_disconnect_by_func (GTK_OBJECT (editable),
- GTK_SIGNAL_FUNC (editable_key_press_event),
- NULL);
- }
+ GTK_SIGNAL_FUNC (editable_key_press_event),
+ NULL);
+ }
+#endif
}
diff --git a/libnautilus-private/nautilus-undo-signal-handlers.c b/libnautilus-private/nautilus-undo-signal-handlers.c
index 1af3b1c82..f7c9f3e6b 100644
--- a/libnautilus-private/nautilus-undo-signal-handlers.c
+++ b/libnautilus-private/nautilus-undo-signal-handlers.c
@@ -284,23 +284,35 @@ restore_editable_from_undo_snapshot_callback (GtkObject *target, gpointer callba
* Allow the use of ctrl-z from within widget.
*/
-static void
+/* Undo is disabled until we have a better implementation.
+ * Both here and in nautilus-shell-ui.xml.
+ */
+
+#ifdef UNDO_ENABLED
+
+/* FIXME: This needs a return value of gboolean. */
+static void
editable_key_press_event (GtkEditable *editable, GdkEventKey *event, gpointer user_data)
{
switch (event->keyval) {
- /* Undo */
- case 'z':
- if ((event->state & GDK_CONTROL_MASK) != 0) {
- nautilus_undo (GTK_OBJECT (editable));
- return;
- }
- break;
-
- default:
- break;
+ /* Undo */
+ case 'z':
+ if ((event->state & GDK_CONTROL_MASK) != 0) {
+ nautilus_undo (GTK_OBJECT (editable));
+ /* FIXME: Need to stop the signal to prevent
+ * re-handling the same event.
+ */
+ return;
+ }
+ break;
+
+ default:
+ break;
}
}
+#endif
+
/* editable_set_undo_key
*
* Allow the use of ctrl-z from within widget. This should only be
@@ -310,16 +322,18 @@ editable_key_press_event (GtkEditable *editable, GdkEventKey *event, gpointer us
void
nautilus_undo_editable_set_undo_key (GtkEditable *editable, gboolean value)
{
+#ifdef UNDO_ENABLED
if (value) {
/* Connect to entry signals */
gtk_signal_connect (GTK_OBJECT (editable),
- "key-press-event",
- GTK_SIGNAL_FUNC (editable_key_press_event),
- NULL);
- }
- else {
+ "key_press_event",
+ GTK_SIGNAL_FUNC (editable_key_press_event),
+ NULL);
+ } else {
+ /* FIXME: This warns if the handler is already connected. */
gtk_signal_disconnect_by_func (GTK_OBJECT (editable),
- GTK_SIGNAL_FUNC (editable_key_press_event),
- NULL);
- }
+ GTK_SIGNAL_FUNC (editable_key_press_event),
+ NULL);
+ }
+#endif
}
diff --git a/libnautilus/nautilus-clipboard.c b/libnautilus/nautilus-clipboard.c
index 1b27828d7..1242e4ebc 100644
--- a/libnautilus/nautilus-clipboard.c
+++ b/libnautilus/nautilus-clipboard.c
@@ -30,72 +30,58 @@
#include <config.h>
#include "nautilus-clipboard.h"
-#include "nautilus-bonobo-ui.h"
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
-#include <libgnome/gnome-defs.h>
-#include <libgnome/gnome-i18n.h>
#include <bonobo/bonobo-ui-util.h>
+#include <gtk/gtksignal.h>
+static void disconnect_set_up_in_control_handlers (GtkObject *object,
+ gpointer callback_data);
static void
-cut_callback (BonoboUIComponent *ui_component,
+cut_callback (BonoboUIComponent *ui,
gpointer callback_data,
- const char *cname)
+ const char *command_name)
{
- GtkEditable *editable_widget;
-
- g_assert (BONOBO_IS_UI_COMPONENT (ui_component));
- g_assert (strcmp (cname, "Cut") == 0);
+ g_assert (BONOBO_IS_UI_COMPONENT (ui));
+ g_assert (strcmp (command_name, "Cut") == 0);
- editable_widget = GTK_EDITABLE (callback_data);
- gtk_editable_cut_clipboard (editable_widget);
+ gtk_editable_cut_clipboard (GTK_EDITABLE (callback_data));
}
static void
-copy_callback (BonoboUIComponent *ui_component,
+copy_callback (BonoboUIComponent *ui,
gpointer callback_data,
- const char *cname)
+ const char *command_name)
{
- GtkEditable *editable_widget;
-
- g_assert (BONOBO_IS_UI_COMPONENT (ui_component));
- g_assert (strcmp (cname, "Copy") == 0);
+ g_assert (BONOBO_IS_UI_COMPONENT (ui));
+ g_assert (strcmp (command_name, "Copy") == 0);
- editable_widget = GTK_EDITABLE (callback_data);
- gtk_editable_copy_clipboard (editable_widget);
+ gtk_editable_copy_clipboard (GTK_EDITABLE (callback_data));
}
static void
-paste_callback (BonoboUIComponent *ui_component,
+paste_callback (BonoboUIComponent *ui,
gpointer callback_data,
- const char *cname)
+ const char *command_name)
{
- GtkEditable *editable_widget;
-
- g_assert (BONOBO_IS_UI_COMPONENT (ui_component));
- g_assert (strcmp (cname, "Paste") == 0);
+ g_assert (BONOBO_IS_UI_COMPONENT (ui));
+ g_assert (strcmp (command_name, "Paste") == 0);
- editable_widget = GTK_EDITABLE (callback_data);
- gtk_editable_paste_clipboard (editable_widget);
+ gtk_editable_paste_clipboard (GTK_EDITABLE (callback_data));
}
static void
-clear_callback (BonoboUIComponent *ui_component,
+clear_callback (BonoboUIComponent *ui,
gpointer callback_data,
- const char *cname)
+ const char *command_name)
{
- GtkEditable *editable_widget;
-
- g_assert (BONOBO_IS_UI_COMPONENT (ui_component));
- g_assert (strcmp (cname, "Clear") == 0);
+ g_assert (BONOBO_IS_UI_COMPONENT (ui));
+ g_assert (strcmp (command_name, "Clear") == 0);
-
- editable_widget = GTK_EDITABLE (callback_data);
- gtk_editable_delete_selection (editable_widget);
+ gtk_editable_delete_selection (GTK_EDITABLE (callback_data));
}
-#ifdef N0
+#ifdef SENSITIVITY_ADJUSTMENT_WORKS
+
static void
set_paste_sensitive_if_clipboard_contains_data (BonoboUIHandler *ui_handler)
{
@@ -108,56 +94,8 @@ set_paste_sensitive_if_clipboard_contains_data (BonoboUIHandler *ui_handler)
NAUTILUS_MENU_PATH_PASTE_ITEM,
clipboard_contains_data);
}
-#endif
static void
-add_menu_items_callback (GtkWidget *widget,
- GdkEventAny *event,
- gpointer callback_data)
-{
- BonoboUIComponent *ui_component;
- gpointer container_data;
- Bonobo_UIContainer container;
- BonoboUIVerb verbs [] = {
- BONOBO_UI_VERB ("Cut", (BonoboUIVerbFn) cut_callback),
- BONOBO_UI_VERB ("Copy", (BonoboUIVerbFn) copy_callback),
- BONOBO_UI_VERB ("Paste", (BonoboUIVerbFn) paste_callback),
- BONOBO_UI_VERB ("Clear", (BonoboUIVerbFn) clear_callback),
- BONOBO_UI_VERB_END
- };
-
- ui_component = gtk_object_get_data (GTK_OBJECT (widget), "clipboard_ui_component");
- container_data = gtk_object_get_data (GTK_OBJECT (widget), "associated_ui_container");
- container = * (Bonobo_UIContainer *) container_data;
-
- bonobo_ui_component_set_container (ui_component,
- container);
- bonobo_ui_util_set_ui (ui_component,
- DATADIR,
- "nautilus-clipboard-ui.xml",
- "nautilus");
- g_assert (BONOBO_IS_UI_COMPONENT (ui_component));
-
- /* Add the verbs */
- bonobo_ui_component_add_verb_list_with_data (ui_component, verbs, widget);
- /* FIXME bugzilla.eazel.com 733: Update the sensitivities */
-
-}
-
-static void
-remove_menu_items_callback (GtkWidget *widget,
- GdkEventAny *event,
- gpointer callback_data)
-{
- BonoboUIComponent *ui_component;
-
- ui_component = gtk_object_get_data (GTK_OBJECT (widget), "clipboard_ui_component");
- bonobo_ui_component_unset_container (ui_component);
-
-}
-
-#ifdef N0
-static void
set_clipboard_menu_items_sensitive (BonoboUIHandler *ui_handler)
{
@@ -197,113 +135,167 @@ set_clipboard_menu_items_insensitive (BonoboUIHandler *ui_handler,
FALSE);
}
}
+
#endif
+typedef struct {
+ BonoboUIComponent *component;
+ Bonobo_UIContainer container;
+} TargetCallbackData;
+
static void
-container_copy_free (gpointer data)
+focus_changed_callback (GtkWidget *widget,
+ GdkEventAny *event,
+ gpointer callback_data)
{
- g_free (data);
+ TargetCallbackData *target_data;
+ BonoboUIComponent *ui;
+
+ g_assert (GTK_IS_EDITABLE (widget));
+ g_assert (callback_data != NULL);
+ target_data = callback_data;
+ g_assert (BONOBO_IS_UI_COMPONENT (target_data->component));
+
+ /* Connect the component to the container if the widget has focus. */
+ ui = target_data->component;
+ if (GTK_WIDGET_HAS_FOCUS (widget)) {
+ bonobo_ui_component_set_container (ui,
+ target_data->container);
+ bonobo_ui_component_freeze (ui, NULL);
+ bonobo_ui_util_set_ui (ui,
+ DATADIR,
+ "nautilus-clipboard-ui.xml",
+ "nautilus");
+ bonobo_ui_component_thaw (ui, NULL);
+
+ /* FIXME bugzilla.eazel.com 733: Update sensitivities of the
+ * commands now, also arrange for them to stay updated as the
+ * state of the editable changes.
+ */
+ } else {
+ bonobo_ui_component_unset_container (ui);
+ }
}
static void
-ui_component_remove_container_and_unref (gpointer data)
+target_destroy_callback (GtkObject *object,
+ gpointer callback_data)
{
- BonoboUIComponent *ui;
-
- ui = BONOBO_UI_COMPONENT (data);
-
- bonobo_ui_component_unset_container (ui);
- bonobo_object_unref (BONOBO_OBJECT (ui));
+ TargetCallbackData *target_data;
+
+ g_assert (callback_data != NULL);
+ target_data = callback_data;
+ g_assert (BONOBO_IS_UI_COMPONENT (target_data->component));
+
+ /* Disconnect the component from the container, and then free
+ * everything.
+ */
+ bonobo_ui_component_unset_container (target_data->component);
+ bonobo_object_unref (BONOBO_OBJECT (target_data->component));
+ bonobo_object_release_unref (target_data->container, NULL);
+ g_free (target_data);
}
-static void
-finish_setting_up_editable (GtkEditable *target,
- Bonobo_UIContainer container)
+void
+nautilus_clipboard_set_up_editable (GtkEditable *target,
+ Bonobo_UIContainer ui_container)
{
+ BonoboUIVerb verbs [] = {
+ BONOBO_UI_VERB ("Cut", cut_callback),
+ BONOBO_UI_VERB ("Copy", copy_callback),
+ BONOBO_UI_VERB ("Paste", paste_callback),
+ BONOBO_UI_VERB ("Clear", clear_callback),
+ BONOBO_UI_VERB_END
+ };
BonoboUIComponent *ui;
- Bonobo_UIContainer *ui_container;
- char *component_name;
-
- /* Create a unique component name for each clipboard item,
- since they are registered and deregistered by name */
- component_name = g_strdup_printf ("Clipboard %p", target);
- ui = bonobo_ui_component_new (component_name);
- g_free (component_name);
+ TargetCallbackData *target_data;
- ui_container = g_new0 (Bonobo_UIContainer, 1);
- memcpy (ui_container, &container, sizeof (Bonobo_UIContainer));
-
- /* Free the ui component when we get rid of the widget */
- gtk_object_set_data_full (GTK_OBJECT (target), "clipboard_ui_component",
- ui, ui_component_remove_container_and_unref);
- gtk_object_set_data_full (GTK_OBJECT (target), "associated_ui_container",
- ui_container, container_copy_free);
-
- gtk_signal_connect (GTK_OBJECT (target), "focus_in_event",
- GTK_SIGNAL_FUNC (add_menu_items_callback),
- NULL);
- gtk_signal_connect (GTK_OBJECT (target), "focus_out_event",
- GTK_SIGNAL_FUNC (remove_menu_items_callback),
- NULL);
-
-
+ g_return_if_fail (GTK_IS_EDITABLE (target));
+ g_return_if_fail (ui_container != CORBA_OBJECT_NIL);
+
+ /* Create the UI component and set up the verbs. */
+ ui = bonobo_ui_component_new_default ();
+ bonobo_ui_component_add_verb_list_with_data (ui, verbs, target);
+
+ /* Do the actual connection of the UI to the container at
+ * focus time, and disconnect at both focus and destroy
+ * time.
+ */
+ target_data = g_new (TargetCallbackData, 1);
+ bonobo_object_ref (BONOBO_OBJECT (ui));
+ target_data->component = ui;
+ target_data->container = bonobo_object_dup_ref (ui_container, NULL);
+ gtk_signal_connect_after (GTK_OBJECT (target), "focus_in_event",
+ focus_changed_callback, target_data);
+ gtk_signal_connect_after (GTK_OBJECT (target), "focus_out_event",
+ focus_changed_callback, target_data);
+ gtk_signal_connect (GTK_OBJECT (target), "destroy",
+ target_destroy_callback, target_data);
+
+ /* Call the focus changed callback once to merge if the window is
+ * already in focus.
+ */
+ focus_changed_callback (GTK_WIDGET (target), NULL, target_data);
}
static void
-finish_setting_up_editable_from_bonobo_control_callback (gpointer data,
- GdkEventAny *event,
- gpointer user_data)
+first_focus_callback (GtkWidget *widget,
+ GdkEventAny *event,
+ gpointer callback_data)
{
- GtkEditable *target;
- BonoboControl *control;
-
- target = GTK_EDITABLE (data);
- control = BONOBO_CONTROL (user_data);
-
- /* Don't set up the clipboard again on future focus_in's */
- gtk_signal_disconnect_by_func (GTK_OBJECT (data),
- GTK_SIGNAL_FUNC (finish_setting_up_editable_from_bonobo_control_callback),
- user_data);
-
- finish_setting_up_editable (target,
- bonobo_control_get_remote_ui_container (control));
-
- /* Do the initial merging */
- add_menu_items_callback (GTK_WIDGET (target),
- NULL,
- NULL);
-
+ /* Don't set up the clipboard again on future focus_in's. This
+ * is one-time work.
+ */
+ disconnect_set_up_in_control_handlers
+ (GTK_OBJECT (widget),
+ callback_data);
+
+ /* Do the rest of the setup. */
+ nautilus_clipboard_set_up_editable
+ (GTK_EDITABLE (widget),
+ bonobo_control_get_remote_ui_container (BONOBO_CONTROL (callback_data)));
+}
+static void
+control_destroyed_callback (GtkObject *object,
+ gpointer callback_data)
+{
+ disconnect_set_up_in_control_handlers
+ (object, callback_data);
}
void
-nautilus_clipboard_set_up_editable_from_bonobo_control (GtkEditable *target,
- BonoboControl *control)
+nautilus_clipboard_set_up_editable_in_control (GtkEditable *target,
+ BonoboControl *control)
{
-
-
g_return_if_fail (GTK_IS_EDITABLE (target));
g_return_if_fail (BONOBO_IS_CONTROL (control));
/* Use lazy initialization, so that we wait until after
- embedding, and thus for the ability to get the remote
- ui container */
- gtk_signal_connect_while_alive (GTK_OBJECT (target),
- "focus_in_event",
- finish_setting_up_editable_from_bonobo_control_callback,
- control, GTK_OBJECT (control));
-
+ * embedding. At that point, the UI container will be set up,
+ * but it's not necessarily set up now.
+ */
+ /* We'd like to use gtk_signal_connect_while_alive, but it's
+ * not compatible with gtk_signal_disconnect calls.
+ */
+ gtk_signal_connect (GTK_OBJECT (target),
+ "focus_in_event",
+ first_focus_callback,
+ control);
+ gtk_signal_connect (GTK_OBJECT (target),
+ "destroy",
+ control_destroyed_callback,
+ control);
}
-
-void
-nautilus_clipboard_set_up_editable_from_bonobo_ui_container (GtkEditable *target,
- Bonobo_UIContainer ui_container)
+static void
+disconnect_set_up_in_control_handlers (GtkObject *object,
+ gpointer callback_data)
{
-
-
- g_return_if_fail (GTK_IS_EDITABLE (target));
- finish_setting_up_editable (target,
- ui_container);
+ gtk_signal_disconnect_by_func (object,
+ first_focus_callback,
+ callback_data);
+ gtk_signal_disconnect_by_func (object,
+ control_destroyed_callback,
+ callback_data);
}
-
diff --git a/libnautilus/nautilus-clipboard.h b/libnautilus/nautilus-clipboard.h
index 8bef6fbc7..16c01d73b 100644
--- a/libnautilus/nautilus-clipboard.h
+++ b/libnautilus/nautilus-clipboard.h
@@ -29,14 +29,19 @@
#include <gtk/gtkeditable.h>
#include <bonobo/bonobo-control.h>
-/* Components should use this, which includes menu merging. */
-void nautilus_clipboard_set_up_editable_from_bonobo_control (GtkEditable *target,
- BonoboControl *control);
+/* This makes this editable put clipboard commands into the passed UI
+ * container when the editable is in focus. Callers in Nautilus
+ * normally get the UI container from
+ * nautilus_window_get_bonobo_ui_container.
+ */
+void nautilus_clipboard_set_up_editable (GtkEditable *target,
+ Bonobo_UIContainer container);
-/* Local editable widgets should set up clipboard capabilities using this function.
- They can obtain their local ui container using the function
- nautilus_window_get_bonobo_ui_container */
-void nautilus_clipboard_set_up_editable_from_bonobo_ui_container (GtkEditable *target,
- Bonobo_UIContainer container);
+/* Components should use this convenient cover instead of the call
+ * above. This cover waits until the UI container shows up, so it can be
+ * called even before the control has a UI container.
+ */
+void nautilus_clipboard_set_up_editable_in_control (GtkEditable *target,
+ BonoboControl *control);
#endif /* NAUTILUS_CLIPBOARD_H */
diff --git a/src/Makefile.am b/src/Makefile.am
index be0bb7b6e..aafc5934c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -86,6 +86,7 @@ noinst_HEADERS = \
nautilus-view-frame.h \
nautilus-window-manage-views.h \
nautilus-window-private.h \
+ nautilus-window-service-ui.h \
nautilus-window.h \
nautilus-zoom-control.h \
$(profiler_headers) \
@@ -126,7 +127,7 @@ nautilus_SOURCES = \
nautilus-view-frame.c \
nautilus-window-manage-views.c \
nautilus-window-menus.c \
- nautilus-window-service-menu.c \
+ nautilus-window-service-ui.c \
nautilus-window-toolbars.c \
nautilus-window.c \
nautilus-zoom-control.c \
diff --git a/src/nautilus-location-bar.c b/src/nautilus-location-bar.c
index ff1f1ce84..132866e64 100644
--- a/src/nautilus-location-bar.c
+++ b/src/nautilus-location-bar.c
@@ -510,8 +510,9 @@ nautilus_location_bar_new (NautilusWindow *window)
location_bar = NAUTILUS_LOCATION_BAR (bar);
/* Clipboard */
- nautilus_clipboard_set_up_editable_from_bonobo_ui_container (GTK_EDITABLE (location_bar->entry),
- nautilus_window_get_bonobo_ui_container (window));
+ nautilus_clipboard_set_up_editable
+ (GTK_EDITABLE (location_bar->entry),
+ nautilus_window_get_ui_container (window));
return bar;
}
diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c
index 360a188d5..b081b88ef 100644
--- a/src/nautilus-navigation-window.c
+++ b/src/nautilus-navigation-window.c
@@ -38,6 +38,7 @@
#include "nautilus-switchable-navigation-bar.h"
#include "nautilus-throbber.h"
#include "nautilus-window-manage-views.h"
+#include "nautilus-window-service-ui.h"
#include "nautilus-zoom-control.h"
#include <bonobo/bonobo-ui-util.h>
#include <ctype.h>
@@ -344,19 +345,17 @@ nautilus_window_constructed (NautilusWindow *window)
window->details->shell_ui = bonobo_ui_component_new ("Nautilus Shell");
bonobo_ui_component_set_container
(window->details->shell_ui,
- bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container)));
+ nautilus_window_get_ui_container (window));
bonobo_ui_component_freeze (window->details->shell_ui, NULL);
-
bonobo_ui_util_set_ui (window->details->shell_ui,
DATADIR,
"nautilus-shell-ui.xml",
"nautilus");
bonobo_ui_component_thaw (window->details->shell_ui, NULL);
- /* merge in the services menu if necessary */
-
+ /* Load the services part of the user interface too if desired. */
#ifdef EAZEL_SERVICES
- nautilus_window_install_service_menu (window);
+ nautilus_window_install_service_ui (window);
#endif
/* set up location bar */
@@ -1797,11 +1796,9 @@ nautilus_window_show (GtkWidget *widget)
}
Bonobo_UIContainer
-nautilus_window_get_bonobo_ui_container (NautilusWindow *window)
+nautilus_window_get_ui_container (NautilusWindow *window)
{
- g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), NULL);
+ g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), CORBA_OBJECT_NIL);
- /* FIXME: Do we have to ref the container here? */
- return bonobo_ui_component_get_container (window->details->shell_ui);
+ return bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container));
}
-
diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c
index 360a188d5..b081b88ef 100644
--- a/src/nautilus-object-window.c
+++ b/src/nautilus-object-window.c
@@ -38,6 +38,7 @@
#include "nautilus-switchable-navigation-bar.h"
#include "nautilus-throbber.h"
#include "nautilus-window-manage-views.h"
+#include "nautilus-window-service-ui.h"
#include "nautilus-zoom-control.h"
#include <bonobo/bonobo-ui-util.h>
#include <ctype.h>
@@ -344,19 +345,17 @@ nautilus_window_constructed (NautilusWindow *window)
window->details->shell_ui = bonobo_ui_component_new ("Nautilus Shell");
bonobo_ui_component_set_container
(window->details->shell_ui,
- bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container)));
+ nautilus_window_get_ui_container (window));
bonobo_ui_component_freeze (window->details->shell_ui, NULL);
-
bonobo_ui_util_set_ui (window->details->shell_ui,
DATADIR,
"nautilus-shell-ui.xml",
"nautilus");
bonobo_ui_component_thaw (window->details->shell_ui, NULL);
- /* merge in the services menu if necessary */
-
+ /* Load the services part of the user interface too if desired. */
#ifdef EAZEL_SERVICES
- nautilus_window_install_service_menu (window);
+ nautilus_window_install_service_ui (window);
#endif
/* set up location bar */
@@ -1797,11 +1796,9 @@ nautilus_window_show (GtkWidget *widget)
}
Bonobo_UIContainer
-nautilus_window_get_bonobo_ui_container (NautilusWindow *window)
+nautilus_window_get_ui_container (NautilusWindow *window)
{
- g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), NULL);
+ g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), CORBA_OBJECT_NIL);
- /* FIXME: Do we have to ref the container here? */
- return bonobo_ui_component_get_container (window->details->shell_ui);
+ return bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container));
}
-
diff --git a/src/nautilus-shell-ui.xml b/src/nautilus-shell-ui.xml
index 2442bc515..87dbd47d8 100644
--- a/src/nautilus-shell-ui.xml
+++ b/src/nautilus-shell-ui.xml
@@ -76,7 +76,8 @@
<submenu name="Edit" _label="_Edit">
-<!-- Undo is disabled until we have a better implementation
+<!-- Undo is disabled until we have a better implementation.
+ Both here and in nautilus-undo-signal-handlers.c.
<menuitem name="Undo"
_label="_Undo"
diff --git a/src/nautilus-simple-search-bar.c b/src/nautilus-simple-search-bar.c
index 7e14a7f70..4d0ed7b1e 100644
--- a/src/nautilus-simple-search-bar.c
+++ b/src/nautilus-simple-search-bar.c
@@ -131,8 +131,9 @@ nautilus_simple_search_bar_new (NautilusWindow *window)
bar->details->entry = NAUTILUS_ENTRY (nautilus_entry_new ());
nautilus_undo_set_up_nautilus_entry_for_undo (bar->details->entry);
nautilus_undo_editable_set_undo_key (GTK_EDITABLE (bar->details->entry), TRUE);
- nautilus_clipboard_set_up_editable_from_bonobo_ui_container (GTK_EDITABLE (bar->details->entry),
- nautilus_window_get_bonobo_ui_container (window));
+ nautilus_clipboard_set_up_editable
+ (GTK_EDITABLE (bar->details->entry),
+ nautilus_window_get_ui_container (window));
gtk_signal_connect_object (GTK_OBJECT (bar->details->entry), "activate",
nautilus_gtk_button_auto_click,
diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c
index 360a188d5..b081b88ef 100644
--- a/src/nautilus-spatial-window.c
+++ b/src/nautilus-spatial-window.c
@@ -38,6 +38,7 @@
#include "nautilus-switchable-navigation-bar.h"
#include "nautilus-throbber.h"
#include "nautilus-window-manage-views.h"
+#include "nautilus-window-service-ui.h"
#include "nautilus-zoom-control.h"
#include <bonobo/bonobo-ui-util.h>
#include <ctype.h>
@@ -344,19 +345,17 @@ nautilus_window_constructed (NautilusWindow *window)
window->details->shell_ui = bonobo_ui_component_new ("Nautilus Shell");
bonobo_ui_component_set_container
(window->details->shell_ui,
- bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container)));
+ nautilus_window_get_ui_container (window));
bonobo_ui_component_freeze (window->details->shell_ui, NULL);
-
bonobo_ui_util_set_ui (window->details->shell_ui,
DATADIR,
"nautilus-shell-ui.xml",
"nautilus");
bonobo_ui_component_thaw (window->details->shell_ui, NULL);
- /* merge in the services menu if necessary */
-
+ /* Load the services part of the user interface too if desired. */
#ifdef EAZEL_SERVICES
- nautilus_window_install_service_menu (window);
+ nautilus_window_install_service_ui (window);
#endif
/* set up location bar */
@@ -1797,11 +1796,9 @@ nautilus_window_show (GtkWidget *widget)
}
Bonobo_UIContainer
-nautilus_window_get_bonobo_ui_container (NautilusWindow *window)
+nautilus_window_get_ui_container (NautilusWindow *window)
{
- g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), NULL);
+ g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), CORBA_OBJECT_NIL);
- /* FIXME: Do we have to ref the container here? */
- return bonobo_ui_component_get_container (window->details->shell_ui);
+ return bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container));
}
-
diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h
index 785d9d802..a92151a8b 100644
--- a/src/nautilus-window-private.h
+++ b/src/nautilus-window-private.h
@@ -107,8 +107,6 @@ GList * nautilus_get_history_list (void);
void nautilus_window_add_bookmark_for_current_location (NautilusWindow *window);
void nautilus_window_initialize_menus (NautilusWindow *window);
void nautilus_window_initialize_toolbars (NautilusWindow *window);
-void nautilus_window_install_service_menu (NautilusWindow *window);
-
void nautilus_window_go_back (NautilusWindow *window);
void nautilus_window_go_forward (NautilusWindow *window);
void nautilus_window_go_up (NautilusWindow *window);
@@ -135,15 +133,6 @@ void nautilus_window_add_sidebar_panel (Nautilus
NautilusViewFrame *sidebar_panel);
void nautilus_window_remove_sidebar_panel (NautilusWindow *window,
NautilusViewFrame *sidebar_panel);
-Bonobo_UIContainer nautilus_window_get_bonobo_ui_container (NautilusWindow *window);
-#endif /* NAUTILUS_WINDOW_PRIVATE_H */
-
-
-
-
-
-
-
-
-
+Bonobo_UIContainer nautilus_window_get_ui_container (NautilusWindow *window);
+#endif /* NAUTILUS_WINDOW_PRIVATE_H */
diff --git a/src/nautilus-window-service-menu.c b/src/nautilus-window-service-ui.c
index 500ee17a0..7a93e724e 100644
--- a/src/nautilus-window-service-menu.c
+++ b/src/nautilus-window-service-ui.c
@@ -1,6 +1,6 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
- nautilus-service-menu.c: integrate the built-in service menu
+ nautilus-service-ui.c: integrate the built-in service ui
Copyright (C) 2000 Eazel, Inc.
@@ -21,42 +21,54 @@
Author: Andy Hertzfeld <andy@eazel.com>
*/
+
#include <config.h>
+#include "nautilus-window-service-ui.h"
-#include <bonobo/bonobo-control.h>
#include <bonobo/bonobo-ui-util.h>
-
-#include "nautilus-window.h"
#include "nautilus-window-private.h"
-
static void
goto_services_summary (BonoboUIComponent *component,
- gpointer user_data,
- const char *verb)
+ gpointer callback_data,
+ const char *verb)
{
- nautilus_window_goto_uri (NAUTILUS_WINDOW (user_data), "eazel:");
+ nautilus_window_goto_uri (NAUTILUS_WINDOW (callback_data),
+ "eazel:");
}
static void
goto_online_storage (BonoboUIComponent *component,
- gpointer user_data,
- const char *verb)
+ gpointer callback_data,
+ const char *verb)
{
- nautilus_window_goto_uri (NAUTILUS_WINDOW (user_data), "eazel:vault");
+ nautilus_window_goto_uri (NAUTILUS_WINDOW (callback_data),
+ "eazel:vault");
}
static void
goto_software_catalog (BonoboUIComponent *component,
- gpointer user_data,
- const char *verb)
+ gpointer callback_data,
+ const char *verb)
+{
+ nautilus_window_goto_uri (NAUTILUS_WINDOW (callback_data),
+ "eazel:catalog");
+}
+
+static void
+detach_service_ui (gpointer data)
{
- nautilus_window_goto_uri (NAUTILUS_WINDOW (user_data), "eazel:catalog");
+ BonoboUIComponent *service_ui;
+
+ service_ui = BONOBO_UI_COMPONENT (data);
+ bonobo_ui_component_unset_container (service_ui);
+ bonobo_object_unref (BONOBO_OBJECT (service_ui));
}
-void nautilus_window_install_service_menu (NautilusWindow *window)
+void
+nautilus_window_install_service_ui (NautilusWindow *window)
{
- BonoboUIComponent *ui_component;
+ BonoboUIComponent *service_ui;
BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("Eazel Services", goto_services_summary),
@@ -65,20 +77,22 @@ void nautilus_window_install_service_menu (NautilusWindow *window)
BONOBO_UI_VERB_END
};
- ui_component = bonobo_ui_component_new ("Eazel Services");
-
+ /* Load UI from the XML file. */
+ service_ui = bonobo_ui_component_new ("Eazel Services");
+ bonobo_ui_component_add_verb_list_with_data (service_ui, verbs, window);
bonobo_ui_component_set_container
- (ui_component,
- bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container)));
- bonobo_ui_component_freeze (ui_component, NULL);
-
- bonobo_ui_util_set_ui (ui_component,
+ (service_ui,
+ nautilus_window_get_ui_container (window));
+ bonobo_ui_component_freeze (service_ui, NULL);
+ bonobo_ui_util_set_ui (service_ui,
DATADIR,
"nautilus-service-ui.xml",
"nautilus");
- bonobo_ui_component_thaw (ui_component, NULL);
+ bonobo_ui_component_thaw (service_ui, NULL);
- bonobo_ui_component_add_verb_list_with_data (ui_component, verbs, window);
+ /* Attach the UI to the window. */
+ gtk_object_set_data_full (GTK_OBJECT (window),
+ "service UI",
+ service_ui,
+ detach_service_ui);
}
-
-
diff --git a/src/nautilus-window-service-ui.h b/src/nautilus-window-service-ui.h
new file mode 100644
index 000000000..750cc09d0
--- /dev/null
+++ b/src/nautilus-window-service-ui.h
@@ -0,0 +1,32 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
+
+ nautilus-service-ui.h: integrate the built-in service UI additions
+
+ 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: Darin Adler <darin@eazel.com>
+*/
+
+#ifndef NAUTILUS_WINDOW_SERVICE_UI_H
+#define NAUTILUS_WINDOW_SERVICE_UI_H
+
+#include "nautilus-window.h"
+
+void nautilus_window_install_service_ui (NautilusWindow *window);
+
+#endif /* NAUTILUS_WINDOW_SERVICE_UI_H */
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 360a188d5..b081b88ef 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -38,6 +38,7 @@
#include "nautilus-switchable-navigation-bar.h"
#include "nautilus-throbber.h"
#include "nautilus-window-manage-views.h"
+#include "nautilus-window-service-ui.h"
#include "nautilus-zoom-control.h"
#include <bonobo/bonobo-ui-util.h>
#include <ctype.h>
@@ -344,19 +345,17 @@ nautilus_window_constructed (NautilusWindow *window)
window->details->shell_ui = bonobo_ui_component_new ("Nautilus Shell");
bonobo_ui_component_set_container
(window->details->shell_ui,
- bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container)));
+ nautilus_window_get_ui_container (window));
bonobo_ui_component_freeze (window->details->shell_ui, NULL);
-
bonobo_ui_util_set_ui (window->details->shell_ui,
DATADIR,
"nautilus-shell-ui.xml",
"nautilus");
bonobo_ui_component_thaw (window->details->shell_ui, NULL);
- /* merge in the services menu if necessary */
-
+ /* Load the services part of the user interface too if desired. */
#ifdef EAZEL_SERVICES
- nautilus_window_install_service_menu (window);
+ nautilus_window_install_service_ui (window);
#endif
/* set up location bar */
@@ -1797,11 +1796,9 @@ nautilus_window_show (GtkWidget *widget)
}
Bonobo_UIContainer
-nautilus_window_get_bonobo_ui_container (NautilusWindow *window)
+nautilus_window_get_ui_container (NautilusWindow *window)
{
- g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), NULL);
+ g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), CORBA_OBJECT_NIL);
- /* FIXME: Do we have to ref the container here? */
- return bonobo_ui_component_get_container (window->details->shell_ui);
+ return bonobo_object_corba_objref (BONOBO_OBJECT (window->details->ui_container));
}
-