From 685753b110ed487f68cee6b0d9029f8b2a4b231b Mon Sep 17 00:00:00 2001 From: Elliot Lee Date: Tue, 7 Dec 1999 17:46:29 +0000 Subject: [PATCH] Add notes. Add notes. Pass the content view along with a location-changed message. --- docs/gnomad-notes.txt | 103 +++++++++++++++++++++++++++++++ idl/nautilus.idl | 4 ++ src/nautilus-navigation-window.c | 56 +++++++++++++++-- src/nautilus-object-window.c | 56 +++++++++++++++-- src/nautilus-spatial-window.c | 56 +++++++++++++++-- src/nautilus-window.c | 56 +++++++++++++++-- src/ntl-window.c | 56 +++++++++++++++-- 7 files changed, 362 insertions(+), 25 deletions(-) create mode 100644 docs/gnomad-notes.txt diff --git a/docs/gnomad-notes.txt b/docs/gnomad-notes.txt new file mode 100644 index 000000000..114e8ab45 --- /dev/null +++ b/docs/gnomad-notes.txt @@ -0,0 +1,103 @@ +1. A definite improvement over the previous version I saw. +2. Contains some interesting ideas: + Features: + > Multiple content views + > Display of an XML file as a frame floating in the content view + > Customizability + I like the ability to drag colors from the color selector to a window. + > Interface + . Much attention paid to producing a user-friendly result here. + . "Everything Windows explorer is and more" + . Simplicity of available operations + . Providing as much useful information as possible from a given screen, without + overloading the user (e.g. thumbnails). + . I like the (debated) user levels, but wish their differences were known. + Design: + Implementation: + > Code is survivably good - not wonderful, but not procmail + > Using XML allows easy integration of web data sources, etc. + +3. Has some drawbacks: + Features: + > Interface + . Value of the panel is questionable + . Double-click vs. single click needs explanation/exploration + . More information on what the new user + . The "file operations" area of the interface is not explored very well and + is very vague. + Design: + > Is basically a collection of intertwined widgets, rather than + a data-oriented class hierarchy. + > No abstraction of common patterns + > Extensibility virtually non-existent + > Generally poor. + + Example - instead of instantiating the a certain class with a well-known + interface when a particular view is requested, MultiView is used + with a number of set_*_view() functions that are hardcoded to display + certain views. + Example - The iconview has special cases for the vault in its metadata-reading code. + Example - There is only one application-level class that is ever derived from (IconView), + out of the thirty or fourty such classes present. + Implementation: + > Performance is poor (possibly due to use of AA canvas) + "It has to be faster if you are going to get people to use this" + > Uses Gtk-- + . In constant flux + . Relatively high resource demands + > Somewhat buggy + > Using XML - may not always be appropriate, has performance implications in the + current usage situations, what about gnome_metadata. + > Doesn't use gnome-vfs + +4. My conclusions + +gnomad is very focused on the user interface, and looks promising for producing a good +user experience. + +The patterns that pieces of gnomad fit would allow for easy integration into Nautilus. + +I recommend that that an assessment be made of features still needed from Nautilus, and +that we turn the various views of Gnomad into Bonobo controls for use in Nautilus. + + +Appendix A: What Nautilus is + +The generic pattern of content view/meta views/available operations occurs in a wide +variety of situations. The Windows web-browser interface uses the basics of this, but +does not exploit it to its full potential. + +Nautilus is a data shell that uses Bonobo components to present the best possible user +interface for a given piece of data. When navigation to a particular URL is requested by +a view (either the main content view or one of the meta views), Nautilus determines what +content view and meta views should be displayed, based on the requested URL, the +referring URL, the content type of the requested URL, and application configuration. + +This allows a standard yet appropriate interface to be provided for an infinite variety +of data types. + +http://people.redhat.com/sopwith/h3.gif contains a screenshot of the help browser +prototype that produced the idea for Nautilus. This window follows the content +view+meta views pattern that Nautilus supports. + +Based on analysis of gnomad, features that Nautilus design still needs: + More thorough examination of what data-related elements the user interface + should incorporate (especially in the areas of toolbars/menus). + + Ways of displaying meta views besides as tabs in a notebook. + + Multiple content views. + + Passing RDF-like tree from content to meta views, instead of just the URL. + +Other features that I had been planning to add: + Ability for displayed views to modify menus/toolbars + (just need to make use of GnomeUIHandler, I think). + + Finish implementation of the whole URL -> set of views code. + + Finish implementation period. :) + +Appendix B: Bugs + +Remove semicolon from end of music_view.cpp:115 (still doesn't work, oh well). diff --git a/idl/nautilus.idl b/idl/nautilus.idl index 5e4093081..77edc96b2 100644 --- a/idl/nautilus.idl +++ b/idl/nautilus.idl @@ -10,10 +10,14 @@ module Nautilus { struct NavigationInfo { string requested_uri, actual_uri, content_type; string referring_uri, actual_referring_uri, referring_content_type; + + Object content_view; }; struct SelectionInfo { string selected_uri; + + Object content_view; }; struct SelectionRequestInfo { diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index ab0e4a1a8..6f12ec65e 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -18,6 +18,9 @@ static void nautilus_window_close (GtkWidget *widget, static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, GtkWidget *requesting_view); +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view); #define CONTENTS_AS_HBOX /* six seconds */ @@ -84,6 +87,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); klass->request_location_change = nautilus_window_real_request_location_change; + klass->request_selection_change = nautilus_window_real_request_selection_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -499,10 +503,21 @@ nautilus_window_change_location(NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); /* If we need to load a different IID, do that before sending the location change request */ - if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) - nautilus_view_load_client(NAUTILUS_VIEW(window->content_view), loci->content_iid); + if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) { + NautilusView *new_view; - gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); + if(requesting_view == window->content_view) + requesting_view = NULL; + + new_view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL)); + nautilus_view_load_client(new_view, loci->content_iid); + nautilus_window_set_content_view(window, new_view); + } + + loci->navinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(requesting_view != window->content_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci); notfound_views = keep_views = discard_views = NULL; for(cur = window->meta_views; cur; cur = cur->next) @@ -510,9 +525,16 @@ nautilus_window_change_location(NautilusWindow *window, NautilusView *view = cur->data; if(g_slist_find_custom(loci->meta_iids, view->iid, (GCompareFunc)strcmp)) - gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view, requesting_view); + { + if(requesting_view != ((GtkWidget *)view)) + gtk_signal_emit(GTK_OBJECT(view), signum, loci); + } else - discard_views = g_slist_prepend(discard_views, view); + { + if(((GtkWidget *)view) == requesting_view) + requesting_view = NULL; + discard_views = g_slist_prepend(discard_views, view); + } } for(cur = loci->meta_iids; cur; cur = cur->next) { @@ -528,6 +550,7 @@ nautilus_window_change_location(NautilusWindow *window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL)); nautilus_view_load_client(view, cur->data); nautilus_window_add_meta_view(window, view); + gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view); } } for(cur = discard_views; cur; cur = cur->next) @@ -544,6 +567,29 @@ nautilus_window_change_location(NautilusWindow *window, nautilus_navinfo_free(loci); } +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view) +{ + GSList *cur; + guint signum; + Nautilus_SelectionInfo selinfo; + + signum = gtk_signal_lookup("notify_selection_change", nautilus_view_get_type()); + + selinfo.selected_uri = loc->selected_uri; + selinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(((GtkWidget *)window->content_view) != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + + for(cur = window->meta_views; cur; cur = cur->next) + { + if(cur->data != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + } +} + static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c index ab0e4a1a8..6f12ec65e 100644 --- a/src/nautilus-object-window.c +++ b/src/nautilus-object-window.c @@ -18,6 +18,9 @@ static void nautilus_window_close (GtkWidget *widget, static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, GtkWidget *requesting_view); +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view); #define CONTENTS_AS_HBOX /* six seconds */ @@ -84,6 +87,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); klass->request_location_change = nautilus_window_real_request_location_change; + klass->request_selection_change = nautilus_window_real_request_selection_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -499,10 +503,21 @@ nautilus_window_change_location(NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); /* If we need to load a different IID, do that before sending the location change request */ - if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) - nautilus_view_load_client(NAUTILUS_VIEW(window->content_view), loci->content_iid); + if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) { + NautilusView *new_view; - gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); + if(requesting_view == window->content_view) + requesting_view = NULL; + + new_view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL)); + nautilus_view_load_client(new_view, loci->content_iid); + nautilus_window_set_content_view(window, new_view); + } + + loci->navinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(requesting_view != window->content_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci); notfound_views = keep_views = discard_views = NULL; for(cur = window->meta_views; cur; cur = cur->next) @@ -510,9 +525,16 @@ nautilus_window_change_location(NautilusWindow *window, NautilusView *view = cur->data; if(g_slist_find_custom(loci->meta_iids, view->iid, (GCompareFunc)strcmp)) - gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view, requesting_view); + { + if(requesting_view != ((GtkWidget *)view)) + gtk_signal_emit(GTK_OBJECT(view), signum, loci); + } else - discard_views = g_slist_prepend(discard_views, view); + { + if(((GtkWidget *)view) == requesting_view) + requesting_view = NULL; + discard_views = g_slist_prepend(discard_views, view); + } } for(cur = loci->meta_iids; cur; cur = cur->next) { @@ -528,6 +550,7 @@ nautilus_window_change_location(NautilusWindow *window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL)); nautilus_view_load_client(view, cur->data); nautilus_window_add_meta_view(window, view); + gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view); } } for(cur = discard_views; cur; cur = cur->next) @@ -544,6 +567,29 @@ nautilus_window_change_location(NautilusWindow *window, nautilus_navinfo_free(loci); } +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view) +{ + GSList *cur; + guint signum; + Nautilus_SelectionInfo selinfo; + + signum = gtk_signal_lookup("notify_selection_change", nautilus_view_get_type()); + + selinfo.selected_uri = loc->selected_uri; + selinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(((GtkWidget *)window->content_view) != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + + for(cur = window->meta_views; cur; cur = cur->next) + { + if(cur->data != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + } +} + static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c index ab0e4a1a8..6f12ec65e 100644 --- a/src/nautilus-spatial-window.c +++ b/src/nautilus-spatial-window.c @@ -18,6 +18,9 @@ static void nautilus_window_close (GtkWidget *widget, static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, GtkWidget *requesting_view); +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view); #define CONTENTS_AS_HBOX /* six seconds */ @@ -84,6 +87,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); klass->request_location_change = nautilus_window_real_request_location_change; + klass->request_selection_change = nautilus_window_real_request_selection_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -499,10 +503,21 @@ nautilus_window_change_location(NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); /* If we need to load a different IID, do that before sending the location change request */ - if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) - nautilus_view_load_client(NAUTILUS_VIEW(window->content_view), loci->content_iid); + if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) { + NautilusView *new_view; - gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); + if(requesting_view == window->content_view) + requesting_view = NULL; + + new_view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL)); + nautilus_view_load_client(new_view, loci->content_iid); + nautilus_window_set_content_view(window, new_view); + } + + loci->navinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(requesting_view != window->content_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci); notfound_views = keep_views = discard_views = NULL; for(cur = window->meta_views; cur; cur = cur->next) @@ -510,9 +525,16 @@ nautilus_window_change_location(NautilusWindow *window, NautilusView *view = cur->data; if(g_slist_find_custom(loci->meta_iids, view->iid, (GCompareFunc)strcmp)) - gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view, requesting_view); + { + if(requesting_view != ((GtkWidget *)view)) + gtk_signal_emit(GTK_OBJECT(view), signum, loci); + } else - discard_views = g_slist_prepend(discard_views, view); + { + if(((GtkWidget *)view) == requesting_view) + requesting_view = NULL; + discard_views = g_slist_prepend(discard_views, view); + } } for(cur = loci->meta_iids; cur; cur = cur->next) { @@ -528,6 +550,7 @@ nautilus_window_change_location(NautilusWindow *window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL)); nautilus_view_load_client(view, cur->data); nautilus_window_add_meta_view(window, view); + gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view); } } for(cur = discard_views; cur; cur = cur->next) @@ -544,6 +567,29 @@ nautilus_window_change_location(NautilusWindow *window, nautilus_navinfo_free(loci); } +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view) +{ + GSList *cur; + guint signum; + Nautilus_SelectionInfo selinfo; + + signum = gtk_signal_lookup("notify_selection_change", nautilus_view_get_type()); + + selinfo.selected_uri = loc->selected_uri; + selinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(((GtkWidget *)window->content_view) != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + + for(cur = window->meta_views; cur; cur = cur->next) + { + if(cur->data != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + } +} + static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, diff --git a/src/nautilus-window.c b/src/nautilus-window.c index ab0e4a1a8..6f12ec65e 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -18,6 +18,9 @@ static void nautilus_window_close (GtkWidget *widget, static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, GtkWidget *requesting_view); +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view); #define CONTENTS_AS_HBOX /* six seconds */ @@ -84,6 +87,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); klass->request_location_change = nautilus_window_real_request_location_change; + klass->request_selection_change = nautilus_window_real_request_selection_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -499,10 +503,21 @@ nautilus_window_change_location(NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); /* If we need to load a different IID, do that before sending the location change request */ - if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) - nautilus_view_load_client(NAUTILUS_VIEW(window->content_view), loci->content_iid); + if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) { + NautilusView *new_view; - gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); + if(requesting_view == window->content_view) + requesting_view = NULL; + + new_view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL)); + nautilus_view_load_client(new_view, loci->content_iid); + nautilus_window_set_content_view(window, new_view); + } + + loci->navinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(requesting_view != window->content_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci); notfound_views = keep_views = discard_views = NULL; for(cur = window->meta_views; cur; cur = cur->next) @@ -510,9 +525,16 @@ nautilus_window_change_location(NautilusWindow *window, NautilusView *view = cur->data; if(g_slist_find_custom(loci->meta_iids, view->iid, (GCompareFunc)strcmp)) - gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view, requesting_view); + { + if(requesting_view != ((GtkWidget *)view)) + gtk_signal_emit(GTK_OBJECT(view), signum, loci); + } else - discard_views = g_slist_prepend(discard_views, view); + { + if(((GtkWidget *)view) == requesting_view) + requesting_view = NULL; + discard_views = g_slist_prepend(discard_views, view); + } } for(cur = loci->meta_iids; cur; cur = cur->next) { @@ -528,6 +550,7 @@ nautilus_window_change_location(NautilusWindow *window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL)); nautilus_view_load_client(view, cur->data); nautilus_window_add_meta_view(window, view); + gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view); } } for(cur = discard_views; cur; cur = cur->next) @@ -544,6 +567,29 @@ nautilus_window_change_location(NautilusWindow *window, nautilus_navinfo_free(loci); } +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view) +{ + GSList *cur; + guint signum; + Nautilus_SelectionInfo selinfo; + + signum = gtk_signal_lookup("notify_selection_change", nautilus_view_get_type()); + + selinfo.selected_uri = loc->selected_uri; + selinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(((GtkWidget *)window->content_view) != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + + for(cur = window->meta_views; cur; cur = cur->next) + { + if(cur->data != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + } +} + static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, diff --git a/src/ntl-window.c b/src/ntl-window.c index ab0e4a1a8..6f12ec65e 100644 --- a/src/ntl-window.c +++ b/src/ntl-window.c @@ -18,6 +18,9 @@ static void nautilus_window_close (GtkWidget *widget, static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, GtkWidget *requesting_view); +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view); #define CONTENTS_AS_HBOX /* six seconds */ @@ -84,6 +87,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); klass->request_location_change = nautilus_window_real_request_location_change; + klass->request_selection_change = nautilus_window_real_request_selection_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -499,10 +503,21 @@ nautilus_window_change_location(NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); /* If we need to load a different IID, do that before sending the location change request */ - if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) - nautilus_view_load_client(NAUTILUS_VIEW(window->content_view), loci->content_iid); + if(strcmp(NAUTILUS_VIEW(window->content_view)->iid, loci->content_iid)) { + NautilusView *new_view; - gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); + if(requesting_view == window->content_view) + requesting_view = NULL; + + new_view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL)); + nautilus_view_load_client(new_view, loci->content_iid); + nautilus_window_set_content_view(window, new_view); + } + + loci->navinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(requesting_view != window->content_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci); notfound_views = keep_views = discard_views = NULL; for(cur = window->meta_views; cur; cur = cur->next) @@ -510,9 +525,16 @@ nautilus_window_change_location(NautilusWindow *window, NautilusView *view = cur->data; if(g_slist_find_custom(loci->meta_iids, view->iid, (GCompareFunc)strcmp)) - gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view, requesting_view); + { + if(requesting_view != ((GtkWidget *)view)) + gtk_signal_emit(GTK_OBJECT(view), signum, loci); + } else - discard_views = g_slist_prepend(discard_views, view); + { + if(((GtkWidget *)view) == requesting_view) + requesting_view = NULL; + discard_views = g_slist_prepend(discard_views, view); + } } for(cur = loci->meta_iids; cur; cur = cur->next) { @@ -528,6 +550,7 @@ nautilus_window_change_location(NautilusWindow *window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL)); nautilus_view_load_client(view, cur->data); nautilus_window_add_meta_view(window, view); + gtk_signal_emit(GTK_OBJECT(view), signum, loci, window->content_view); } } for(cur = discard_views; cur; cur = cur->next) @@ -544,6 +567,29 @@ nautilus_window_change_location(NautilusWindow *window, nautilus_navinfo_free(loci); } +static void nautilus_window_real_request_selection_change(NautilusWindow *window, + Nautilus_SelectionRequestInfo *loc, + GtkWidget *requesting_view) +{ + GSList *cur; + guint signum; + Nautilus_SelectionInfo selinfo; + + signum = gtk_signal_lookup("notify_selection_change", nautilus_view_get_type()); + + selinfo.selected_uri = loc->selected_uri; + selinfo.content_view = NAUTILUS_VIEW(window->content_view)->view_client; + + if(((GtkWidget *)window->content_view) != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + + for(cur = window->meta_views; cur; cur = cur->next) + { + if(cur->data != requesting_view) + gtk_signal_emit(GTK_OBJECT(window->content_view), signum, &selinfo); + } +} + static void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc,