diff options
author | Michael Meeks <michael@ximian.com> | 2001-12-21 11:32:29 +0000 |
---|---|---|
committer | Michael Meeks <michael@src.gnome.org> | 2001-12-21 11:32:29 +0000 |
commit | b14ecf326899f34d09ec81006de27eef2404173a (patch) | |
tree | b4e0d12583f46782101b93c065a3d3d746f52995 /libnautilus | |
parent | 057ab89f47516862840a742619c26811881ad0d0 (diff) | |
download | nautilus-b14ecf326899f34d09ec81006de27eef2404173a.tar.gz |
fix strcmp style for Darin.
2001-12-18 Michael Meeks <michael@ximian.com>
* components/hardware/nautilus-hardware-view.c
(setup_overview_form): fix strcmp style for Darin.
* components/music/fileinfo.c (find_genre_id),
(file_info_http): ditto.
* libnautilus-private/nautilus-customization-data.c
(nautilus_customization_data_get_next_element_for_display),
(nautilus_customization_data_new): ditto.
* src/nautilus-property-browser.c
(nautilus_property_browser_drag_data_get),
(make_category_link, make_drag_image): ditto.
* libnautilus-private/nautilus-volume-monitor.c
(option_list_has_option): ditto.
2001-12-17 Michael Meeks <michael@ximian.com>
* src/file-manager/fm-directory-view.c
(fm_directory_view_init): set mask.
* src/nautilus-view-frame.c
(create_corba_objects): set ambient property bag.
(create_ambient_properties),
(nautilus_view_frame_get_prop): impl.
(nautilus_view_frame_title_changed),
(nautilus_view_frame_selection_changed),
(send_history): re-implement to fire event instead.
* components/history/nautilus-history-view.c
(nautilus_history_view_instance_init): set mask.
(history_changed_callback, update_history): constify.
* libnautilus/nautilus-view.c
(impl_Nautilus_View_title_changed),
(impl_Nautilus_View_history_changed): kill.
(impl_Nautilus_View_selection_changed): kill.
(nautilus_view_construct_from_bonobo_control):
connect to set_frame.
(nautilus_view_set_frame_callback): impl.
(nautilus_view_dispose): impl. to unset the frame
(nautilus_view_class_init): upd signals, epv & hook
dispose.
(nautilus_view_frame_property_changed_callback): impl.
(nautilus_view_get_ambient_properties): impl.
(nautilus_view_set_listener_mask): impl.
* libnautilus/nautilus-view-component.idl: remove
title_changed and history_changed - use a propert
and the more flexible listener interface.
Diffstat (limited to 'libnautilus')
-rw-r--r-- | libnautilus/nautilus-view-component.idl | 14 | ||||
-rw-r--r-- | libnautilus/nautilus-view.c | 239 | ||||
-rw-r--r-- | libnautilus/nautilus-view.h | 24 |
3 files changed, 232 insertions, 45 deletions
diff --git a/libnautilus/nautilus-view-component.idl b/libnautilus/nautilus-view-component.idl index 9becf75a0..7a6b37f8c 100644 --- a/libnautilus/nautilus-view-component.idl +++ b/libnautilus/nautilus-view-component.idl @@ -66,20 +66,16 @@ module Nautilus { */ oneway void load_location (in URI location); oneway void stop_loading (); - - /* Called to tell the view about selection changes. */ - oneway void selection_changed (in URIList selection); - - /* Called to tell the view about title changes. */ - oneway void title_changed (in string title); - - /* Called to tell the view about history changes. */ - oneway void history_changed (in History history); }; /* The ViewFrame interface is used by the view to communicate * with the Nautilus shell. It's implemented as an interface * on the Bonobo::ControlFrame for the view. + * + * The Ambient properties on the ControlFrame are: + * 'title' - ro - string - the title + * 'history' - ro - Nautilus::History - the history list + * 'selection' - ro - URIList - the selection */ interface ViewFrame : ::Bonobo::Unknown { /* Called by the view component to change the location diff --git a/libnautilus/nautilus-view.c b/libnautilus/nautilus-view.c index fab4b93e7..478041663 100644 --- a/libnautilus/nautilus-view.c +++ b/libnautilus/nautilus-view.c @@ -30,11 +30,15 @@ nautilus view implementation. */ #include <config.h> +#include <string.h> #include "nautilus-view.h" #include "nautilus-idle-queue.h" #include "nautilus-undo.h" +#include <bonobo/bonobo-exception.h> #include <bonobo/bonobo-control.h> +#include <bonobo/bonobo-listener.h> +#include <bonobo/bonobo-event-source.h> #include <bonobo/bonobo-main.h> #include <bonobo/bonobo-ui-util.h> #include <gtk/gtkmain.h> @@ -54,9 +58,14 @@ enum { static guint signals[LAST_SIGNAL]; struct NautilusViewDetails { - BonoboControl *control; - NautilusIdleQueue *incoming_queue; - NautilusIdleQueue *outgoing_queue; + BonoboControl *control; + + NautilusViewListenerMask listen_mask; + BonoboListener *listener; + Bonobo_EventSource event_source; + + NautilusIdleQueue *incoming_queue; + NautilusIdleQueue *outgoing_queue; }; typedef void (* ViewFunction) (NautilusView *view, @@ -235,37 +244,163 @@ impl_Nautilus_View_stop_loading (PortableServer_Servant servant, NULL); } +static void +nautilus_view_frame_property_changed_callback (BonoboListener *listener, + const char *event_name, + const CORBA_any *any, + CORBA_Environment *ev, + gpointer user_data) +{ + NautilusView *view; + ViewFunction callback; + gpointer callback_data; + GDestroyNotify destroy_callback_data; + + view = user_data; + + g_return_if_fail (NAUTILUS_IS_VIEW (user_data)); + + if (strcmp (event_name, "Bonobo/Property:change:title") == 0) { + + callback = call_title_changed; + callback_data = g_strdup (BONOBO_ARG_GET_STRING (any)); + destroy_callback_data = g_free; + + } else if (strcmp (event_name, "Bonobo/Property:change:history") == 0) { + + + callback = call_history_changed; + callback_data = history_dup (any->_value); + destroy_callback_data = CORBA_free; + + } else if (strcmp (event_name, "Bonobo/Property:change:selection") == 0) { + + callback = call_selection_changed; + callback_data = nautilus_g_list_from_uri_list (any->_value); + destroy_callback_data = list_deep_free_cover; + + } else { + g_warning ("Unknown event '%s'", event_name); + return; + } + + nautilus_idle_queue_add (view->details->incoming_queue, + (GFunc) callback, + view, + callback_data, + destroy_callback_data); +} + static void -impl_Nautilus_View_selection_changed (PortableServer_Servant servant, - const Nautilus_URIList *selection, - CORBA_Environment *ev) +append_mask (GString *str, const char *mask_element) { - queue_incoming_call (servant, - call_selection_changed, - nautilus_g_list_from_uri_list (selection), - list_deep_free_cover); + if (str->len) { + g_string_append_c (str, ','); + } + g_string_append (str, mask_element); } -static void -impl_Nautilus_View_title_changed (PortableServer_Servant servant, - const CORBA_char *title, - CORBA_Environment *ev) +/* + * FIXME: we should use this 'set_frame' method to keep + * a cached CORBA_Object_duplicated reference to the + * remote NautilusViewFrame, since this would save lots + * of remote QI / unref traffic in all the methods that + * use view_frame_call_begin. + */ +static void +nautilus_view_set_frame (NautilusView *view, + Bonobo_ControlFrame frame) { - queue_incoming_call (servant, - call_title_changed, - g_strdup (title), - g_free); + BonoboListener *listener; + CORBA_Environment ev; + Bonobo_EventSource es; + Bonobo_PropertyBag pbag; + GString *mask; + + if (view->details->listen_mask == 0) { /* Defer until we need to */ + return; + } + + CORBA_exception_init (&ev); + + if ((listener = view->details->listener) != NULL) { + view->details->listener = NULL; + + bonobo_event_source_client_remove_listener ( + view->details->event_source, + BONOBO_OBJREF (listener), NULL); + + CORBA_Object_release (view->details->event_source, &ev); + bonobo_object_unref (BONOBO_OBJECT (listener)); + } + + if (frame != CORBA_OBJECT_NIL) { + + pbag = bonobo_control_get_ambient_properties ( + view->details->control, &ev); + + if (BONOBO_EX (&ev)) { + goto add_failed; + } + if (pbag == CORBA_OBJECT_NIL) { + g_warning ("NautilusView: contractural breakage - " + "NautilusViewFrame has no ambient property bag"); + goto add_failed; + } + + es = Bonobo_Unknown_queryInterface ( + pbag, "IDL:Bonobo/EventSource:1.0", &ev); + + if (BONOBO_EX (&ev)) { + goto add_failed; + } + + if (es == CORBA_OBJECT_NIL) { + g_warning ("Contractural breakage - NautilusViewFrame's " + "ambient property bag has no event source"); + goto add_failed; + } + + view->details->event_source = CORBA_Object_duplicate (es, &ev); + bonobo_object_release_unref (es, &ev); + + listener = bonobo_listener_new ( + nautilus_view_frame_property_changed_callback, view); + + view->details->listener = listener; + + mask = g_string_sized_new (128); + + if (view->details->listen_mask & NAUTILUS_VIEW_LISTEN_TITLE) + append_mask (mask, "Bonobo/Property:change:title"); + + if (view->details->listen_mask & NAUTILUS_VIEW_LISTEN_HISTORY) + append_mask (mask, "Bonobo/Property:change:history"); + + if (view->details->listen_mask & NAUTILUS_VIEW_LISTEN_SELECTION) + append_mask (mask, "Bonobo/Property:change:selection"); + + Bonobo_EventSource_addListenerWithMask ( + es, BONOBO_OBJREF (listener), mask->str, &ev); + + g_string_free (mask, TRUE); + } + + add_failed: + CORBA_exception_free (&ev); } -static void -impl_Nautilus_View_history_changed (PortableServer_Servant servant, - const Nautilus_History *history, - CORBA_Environment *ev) +static void +nautilus_view_set_frame_callback (BonoboControl *control, + NautilusView *view) { - queue_incoming_call (servant, - call_history_changed, - history_dup (history), - CORBA_free); + Bonobo_ControlFrame frame; + + g_return_if_fail (NAUTILUS_IS_VIEW (view)); + + frame = bonobo_control_get_control_frame (control, NULL); + + nautilus_view_set_frame (view, frame); } static void @@ -311,6 +446,10 @@ nautilus_view_construct_from_bonobo_control (NautilusView *view, bonobo_object_add_interface (BONOBO_OBJECT (view), BONOBO_OBJECT (control)); nautilus_undo_set_up_bonobo_control (control); + g_signal_connect (G_OBJECT (control), "set_frame", + G_CALLBACK (nautilus_view_set_frame_callback), + view); + return view; } @@ -329,6 +468,18 @@ nautilus_view_finalize (GObject *object) GNOME_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); } +static void +nautilus_view_dispose (GObject *object) +{ + NautilusView *view; + + view = NAUTILUS_VIEW (object); + + nautilus_view_set_frame (view, CORBA_OBJECT_NIL); + + GNOME_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + static Nautilus_ViewFrame view_frame_call_begin (NautilusView *view, CORBA_Environment *ev) { @@ -802,6 +953,7 @@ nautilus_view_class_init (NautilusViewClass *klass) POA_Nautilus_View__epv *epv = &klass->epv; G_OBJECT_CLASS (klass)->finalize = nautilus_view_finalize; + G_OBJECT_CLASS (klass)->dispose = nautilus_view_dispose; signals[LOAD_LOCATION] = g_signal_new ("load_location", @@ -844,9 +996,34 @@ nautilus_view_class_init (NautilusViewClass *klass) g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); - epv->load_location = impl_Nautilus_View_load_location; - epv->stop_loading = impl_Nautilus_View_stop_loading; - epv->selection_changed = impl_Nautilus_View_selection_changed; - epv->title_changed = impl_Nautilus_View_title_changed; - epv->history_changed = impl_Nautilus_View_history_changed; + epv->load_location = impl_Nautilus_View_load_location; + epv->stop_loading = impl_Nautilus_View_stop_loading; +} + +Bonobo_PropertyBag +nautilus_view_get_ambient_properties (NautilusView *view, + CORBA_Environment *opt_ev) +{ + g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL); + + return bonobo_control_get_ambient_properties ( + view->details->control, opt_ev); +} + +void +nautilus_view_set_listener_mask (NautilusView *view, + NautilusViewListenerMask mask) +{ + if (!view->details->listen_mask) { + Bonobo_ControlFrame frame; + + view->details->listen_mask = mask; + + frame = bonobo_control_get_control_frame ( + view->details->control, NULL); + + if (frame != CORBA_OBJECT_NIL) { + nautilus_view_set_frame (view, frame); + } + } } diff --git a/libnautilus/nautilus-view.h b/libnautilus/nautilus-view.h index 287e8a361..1b7468547 100644 --- a/libnautilus/nautilus-view.h +++ b/libnautilus/nautilus-view.h @@ -54,12 +54,14 @@ typedef struct { void (* load_location) (NautilusView *view, const char *location_uri); void (* stop_loading) (NautilusView *view); - void (* selection_changed) (NautilusView *view, - GList *selection); /* list of URI char *s */ - void (* title_changed) (NautilusView *view, - const char *title); - void (* history_changed) (NautilusView *view, + + /* These signals need to be enabled with nautilus_view_set_listener_mask */ + void (* title_changed) (NautilusView *view, + const char *title); + void (* history_changed) (NautilusView *view, const Nautilus_History *history); + void (* selection_changed) (NautilusView *view, + GList *selection); } NautilusViewClass; GtkType nautilus_view_get_type (void); @@ -110,6 +112,18 @@ BonoboUIComponent *nautilus_view_set_up_ui (NautilusV const char *ui_xml_file_name, const char *application_name); + +typedef enum { + NAUTILUS_VIEW_LISTEN_TITLE = 1<<0, + NAUTILUS_VIEW_LISTEN_HISTORY = 1<<1, + NAUTILUS_VIEW_LISTEN_SELECTION = 1<<2 +} NautilusViewListenerMask; + +Bonobo_PropertyBag nautilus_view_get_ambient_properties (NautilusView *view, + CORBA_Environment *opt_ev); +void nautilus_view_set_listener_mask (NautilusView *view, + NautilusViewListenerMask mask); + /* `protected' functions for use by subclasses only. */ NautilusView * nautilus_view_construct (NautilusView *view, GtkWidget *widget); |