summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliot Lee <sopwith@src.gnome.org>1999-12-07 17:46:29 +0000
committerElliot Lee <sopwith@src.gnome.org>1999-12-07 17:46:29 +0000
commit685753b110ed487f68cee6b0d9029f8b2a4b231b (patch)
tree4baab6d446622afab46630cbf5315047f71769d5
parent1d23907d45a168e45dc65b89b36f30bb094c37ff (diff)
downloadnautilus-685753b110ed487f68cee6b0d9029f8b2a4b231b.tar.gz
Add notes.
Add notes. Pass the content view along with a location-changed message.
-rw-r--r--docs/gnomad-notes.txt103
-rw-r--r--idl/nautilus.idl4
-rw-r--r--src/nautilus-navigation-window.c56
-rw-r--r--src/nautilus-object-window.c56
-rw-r--r--src/nautilus-spatial-window.c56
-rw-r--r--src/nautilus-window.c56
-rw-r--r--src/ntl-window.c56
7 files changed, 362 insertions, 25 deletions
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;
+
+ 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;
- gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view);
+ 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;
+
+ 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;
- gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view);
+ 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;
+
+ 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;
- gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view);
+ 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;
+
+ 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;
- gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view);
+ 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;
+
+ 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;
- gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view);
+ 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,