summaryrefslogtreecommitdiff
path: root/libnautilus
diff options
context:
space:
mode:
authorMichael Meeks <michael@ximian.com>2001-12-21 11:32:29 +0000
committerMichael Meeks <michael@src.gnome.org>2001-12-21 11:32:29 +0000
commitb14ecf326899f34d09ec81006de27eef2404173a (patch)
treeb4e0d12583f46782101b93c065a3d3d746f52995 /libnautilus
parent057ab89f47516862840a742619c26811881ad0d0 (diff)
downloadnautilus-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.idl14
-rw-r--r--libnautilus/nautilus-view.c239
-rw-r--r--libnautilus/nautilus-view.h24
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);