diff options
author | Elliot Lee <sopwith@src.gnome.org> | 1999-12-06 00:49:57 +0000 |
---|---|---|
committer | Elliot Lee <sopwith@src.gnome.org> | 1999-12-06 00:49:57 +0000 |
commit | 24997abbdd38ffec958fa88a8f8b24e798a03991 (patch) | |
tree | 76f2b8712eec05c7b6287da045bfd1b22ac070fc | |
parent | 498d1f0a7d71c8bdf776a3e76db53e74e185e1c7 (diff) | |
download | nautilus-24997abbdd38ffec958fa88a8f8b24e798a03991.tar.gz |
Basic framework is there. Now for URL resolution and loading.
Basic framework is there. Now for URL resolution and loading.
-rw-r--r-- | .cvsignore | 13 | ||||
-rw-r--r-- | AUTHORS | 0 | ||||
-rw-r--r-- | ChangeLog-20000414 | 0 | ||||
-rw-r--r-- | NEWS | 0 | ||||
-rw-r--r-- | README | 0 | ||||
-rwxr-xr-x | autogen.sh | 4 | ||||
-rw-r--r-- | configure.in | 6 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/nautilus-main.c | 6 | ||||
-rw-r--r-- | src/nautilus-navigation-window.c | 212 | ||||
-rw-r--r-- | src/nautilus-navigation-window.h | 10 | ||||
-rw-r--r-- | src/nautilus-object-window.c | 212 | ||||
-rw-r--r-- | src/nautilus-object-window.h | 10 | ||||
-rw-r--r-- | src/nautilus-spatial-window.c | 212 | ||||
-rw-r--r-- | src/nautilus-spatial-window.h | 10 | ||||
-rw-r--r-- | src/nautilus-view-frame.c | 52 | ||||
-rw-r--r-- | src/nautilus-view-frame.h | 32 | ||||
-rw-r--r-- | src/nautilus-window.c | 212 | ||||
-rw-r--r-- | src/nautilus-window.h | 10 | ||||
-rw-r--r-- | src/ntl-main.c | 6 | ||||
-rw-r--r-- | src/ntl-view.c | 52 | ||||
-rw-r--r-- | src/ntl-view.h | 32 | ||||
-rw-r--r-- | src/ntl-window.c | 212 | ||||
-rw-r--r-- | src/ntl-window.h | 10 |
24 files changed, 913 insertions, 402 deletions
diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 000000000..cf389c655 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,13 @@ +intl +po +ABOUT-NLS +config.guess +config.sub +ltconfig +ltmain.sh +aclocal.m4 +config.h.in +Makefile.in +configure +stamp-h.in +obj diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/AUTHORS diff --git a/ChangeLog-20000414 b/ChangeLog-20000414 new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/ChangeLog-20000414 diff --git a/autogen.sh b/autogen.sh index a64fe9558..b93c73877 100755 --- a/autogen.sh +++ b/autogen.sh @@ -7,9 +7,9 @@ test -z "$srcdir" && srcdir=. ORIGDIR=`pwd` cd $srcdir -PROJECT=hyperbola +PROJECT=nautilus TEST_TYPE=-f -FILE=src/gui/hyperbola-main.c +FILE=src/Makefile.am DIE=0 diff --git a/configure.in b/configure.in index a3e29614d..e87209e27 100644 --- a/configure.in +++ b/configure.in @@ -26,9 +26,13 @@ AC_MSG_ERROR([ *** GLIB 1.2.0 or better is required. The latest version of GLIB *** is always available from ftp://ftp.gtk.org/.])) AM_PATH_GNOME(1.0.0,,AC_MSG_ERROR([*** GNOME 1.0.0 or better is -required.]), gdk_pixbuf) +required.]), gdk_pixbuf gnorba bonobo) AC_SUBST(GDK_PIXBUF_CFLAGS) AC_SUBST(GDK_PIXBUF_LIBS) +AC_SUBST(GNORBA_CFLAGS) +AC_SUBST(GNORBA_LIBS) +AC_SUBST(BONOBO_CFLAGS) +AC_SUBST(BONOBO_LIBS) AM_PATH_LIBGLADE(,AC_MSG_ERROR([*** Libglade 0.7 or better is needed.]), gnome) dnl Checks for typedefs, structures, and compiler characteristics. diff --git a/src/Makefile.am b/src/Makefile.am index 9a960c589..a68e8f9bf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS=nautilus INCLUDES=$(GNORBA_CFLAGS) $(GNOMEUI_CFLAGS) -DVERSION="\"$(VERSION)\"" -LDADD=$(GNORBA_LIBS) $(GNOMEUI_LIBS) +LDADD=$(GNORBA_LIBS) $(GNOMEUI_LIBS) $(BONOBO_LIBS) nautilus_SOURCES= \ ntl-content-view.h \ diff --git a/src/nautilus-main.c b/src/nautilus-main.c index e089cbce7..f4e0c220f 100644 --- a/src/nautilus-main.c +++ b/src/nautilus-main.c @@ -2,6 +2,7 @@ #include "nautilus.h" #include <gnome.h> #include <libgnorba/gnorba.h> +#include <bonobo/gnome-bonobo.h> static int window_count = 0; static void @@ -22,13 +23,16 @@ int main(int argc, char *argv[]) GtkWidget *mainwin; orb = gnome_CORBA_init_with_popt_table("nautilus", VERSION, &argc, argv, options, 0, &ctx, GNORBA_INIT_SERVER_FUNC, &ev); + bonobo_init(orb, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL); mainwin = gtk_widget_new(nautilus_window_get_type(), "app_id", "nautilus", NULL); + bonobo_activate(); + nautilus_window_set_initial_state(NAUTILUS_WINDOW(mainwin)); gtk_widget_show(mainwin); window_count++; gtk_signal_connect(GTK_OBJECT(mainwin), "destroy", check_for_quit, NULL); - gtk_main(); + bonobo_main(); return 0; } diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index 6b2dcc650..e2398492c 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -4,6 +4,8 @@ static void nautilus_window_class_init (NautilusWindowClass *klass); static void nautilus_window_init (NautilusWindow *window); +static void nautilus_window_back (NautilusWindow *window); +static void nautilus_window_fwd (NautilusWindow *window); static void nautilus_window_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); @@ -16,6 +18,8 @@ static void nautilus_window_real_request_location_change (NautilusWindow *window NautilusLocationReference loc, GtkWidget *requesting_view); +#define CONTENTS_AS_HBOX + GtkType nautilus_window_get_type(void) { @@ -183,12 +187,16 @@ nautilus_window_constructed(NautilusWindow *window) wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_BACK); window->btn_back = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_back), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_back, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_back), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_back), "clicked", nautilus_window_back, NULL); wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_FORWARD); window->btn_fwd = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_fwd), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_fwd, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_fwd), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_fwd), "clicked", nautilus_window_fwd, NULL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_back, FALSE, FALSE, GNOME_PAD_SMALL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_fwd, FALSE, FALSE, GNOME_PAD_SMALL); @@ -197,17 +205,21 @@ nautilus_window_constructed(NautilusWindow *window) gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); +#ifdef CONTENTS_AS_HBOX + window->content_hbox = gtk_hbox_new(FALSE, GNOME_PAD_SMALL); +#else window->content_hbox = gtk_hpaned_new(); - gtk_widget_show(window->content_hbox); +#endif gnome_app_set_contents(app, window->content_hbox); - window->nav_notebook = gtk_notebook_new(); - gtk_widget_show(window->nav_notebook); -#if 0 - gtk_box_pack_end(GTK_BOX(window->content_hbox), window->nav_notebook, FALSE, FALSE, GNOME_PAD); + window->meta_notebook = gtk_notebook_new(); + gtk_widget_show(window->meta_notebook); +#ifdef CONTENTS_AS_HBOX + gtk_box_pack_end(GTK_BOX(window->content_hbox), window->meta_notebook, FALSE, FALSE, GNOME_PAD); #else - gtk_paned_pack2(GTK_PANED(window->content_hbox), window->nav_notebook, TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(window->content_hbox), window->meta_notebook, TRUE, TRUE); #endif + gtk_widget_show_all(window->content_hbox); } static void @@ -240,7 +252,7 @@ nautilus_window_set_arg (GtkObject *object, { gtk_widget_ref(GTK_WIDGET(window->content_view)); gtk_container_remove(GTK_CONTAINER(window->content_hbox), GTK_WIDGET(window->content_view)); -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -248,7 +260,7 @@ nautilus_window_set_arg (GtkObject *object, gtk_widget_unref(GTK_WIDGET(window->content_view)); } else -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -295,55 +307,65 @@ nautilus_window_close (GtkWidget *widget, } void -nautilus_window_set_content_view(NautilusWindow *window, GtkWidget *content_view) +nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view) { gtk_object_set(GTK_OBJECT(window), "content_view", content_view, NULL); gtk_widget_show(GTK_WIDGET(content_view)); } static gboolean -nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *nav_view) +nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *meta_view) { if(event->button != 3) return FALSE; gtk_signal_emit_stop_by_name(GTK_OBJECT(dockitem), "button_press_event"); - gtk_signal_emit_by_name(GTK_OBJECT(nav_view), "show_properties"); + gtk_signal_emit_by_name(GTK_OBJECT(meta_view), "show_properties"); return TRUE; } void -nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view) { GtkWidget *label; + const char *desc; + char cbuf[32]; - g_return_if_fail(!g_slist_find(window->nav_views, nav_view)); - g_return_if_fail(NAUTILUS_IS_META_VIEW(nav_view)); + g_return_if_fail(!g_slist_find(window->meta_views, meta_view)); + g_return_if_fail(NAUTILUS_IS_META_VIEW(meta_view)); - label = gtk_label_new(nautilus_meta_view_get_description(NAUTILUS_META_VIEW(nav_view))); + desc = nautilus_meta_view_get_description(NAUTILUS_META_VIEW(meta_view)); + if(!desc) + { + desc = cbuf; + g_snprintf(cbuf, sizeof(cbuf), "%p", meta_view); + } + label = gtk_label_new(desc); gtk_widget_show(label); - gtk_notebook_prepend_page(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view), label); - gtk_widget_show(GTK_WIDGET(nav_view)); + gtk_signal_connect(GTK_OBJECT(label), "button_press_event", + GTK_SIGNAL_FUNC(nautilus_window_send_show_properties), meta_view); + gtk_notebook_prepend_page(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view), label); + gtk_widget_show(GTK_WIDGET(meta_view)); - window->nav_views = g_slist_prepend(window->nav_views, nav_view); + window->meta_views = g_slist_prepend(window->meta_views, meta_view); } void -nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view) { gint pagenum; - g_return_if_fail(g_slist_find(window->nav_views, nav_view)); + g_return_if_fail(g_slist_find(window->meta_views, meta_view)); - window->nav_views = g_slist_remove(window->nav_views, nav_view); + window->meta_views = g_slist_remove(window->meta_views, meta_view); - pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view)); + pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view)); g_return_if_fail(pagenum >= 0); - gtk_notebook_remove_page(GTK_NOTEBOOK(window->nav_notebook), pagenum); + gtk_notebook_remove_page(GTK_NOTEBOOK(window->meta_notebook), pagenum); } void @@ -361,14 +383,40 @@ nautilus_window_request_location_change(NautilusWindow *window, } static void -nautilus_window_real_request_location_change (NautilusWindow *window, - NautilusLocationReference loc, - GtkWidget *requesting_view) +nautilus_window_change_location(NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view, + gboolean is_back) { guint signum; GSList *cur; NautilusNavigationInfo loci_spot, *loci; + /* Update history */ + if(is_back) + { + window->uris_next = g_slist_prepend(window->uris_next, window->uris_prev->data); + window->uris_prev = g_slist_remove(window->uris_prev, window->uris_prev->data); + } + else + { + char *append_val; + if(window->uris_next && !strcmp(loc, window->uris_next->data)) + { + append_val = window->uris_next->data; + window->uris_next = g_slist_remove(window->uris_next, window->uris_next->data); + } + else + { + append_val = g_strdup(loc); + g_slist_foreach(window->uris_next, (GFunc)g_free, NULL); + g_slist_free(window->uris_next); + } + window->uris_prev = g_slist_prepend(window->uris_prev, append_val); + } + gtk_widget_set_sensitive(window->btn_back, window->uris_prev?TRUE:FALSE); + gtk_widget_set_sensitive(window->btn_fwd, window->uris_next?TRUE:FALSE); + memset(&loci_spot, 0, sizeof(loci_spot)); loci = &loci_spot; loci->requested_uri = loci->actual_uri = loc; @@ -377,7 +425,7 @@ nautilus_window_real_request_location_change (NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) gtk_signal_emit(GTK_OBJECT(cur->data), signum, loci, window->content_view, requesting_view); gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); @@ -388,10 +436,17 @@ nautilus_window_real_request_location_change (NautilusWindow *window, window->actual_current_uri = loci->actual_uri; } +static void +nautilus_window_real_request_location_change (NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view) +{ + nautilus_window_change_location(window, loc, requesting_view, FALSE); +} + void nautilus_window_save_state(NautilusWindow *window, const char *config_path) { -#if 0 GSList *cur; int n; guint signum; @@ -400,7 +455,7 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_push_prefix(config_path); if(window->content_view) { - gnome_config_set_string("content_view_type", gtk_type_name(GTK_OBJECT_TYPE(window->content_view))); + gnome_config_set_string("content_view_type", NAUTILUS_VIEW(window->content_view)->iid); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); gnome_config_push_prefix(cbuf); @@ -413,16 +468,21 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_set_string("content_view_type", "NONE"); - n = g_slist_length(window->nav_views); - gnome_config_set_int("num_nav_views", n); + n = g_slist_length(window->meta_views); signum = gtk_signal_lookup("save_state", nautilus_view_get_type()); - for(n = 0, cur = window->nav_views; cur; cur = cur->next, n++) + for(n = 0, cur = window->meta_views; cur; cur = cur->next, n++) { - g_snprintf(cbuf, sizeof(cbuf), "nav_view_%d_type=0", n); + if(!NAUTILUS_VIEW(cur->data)->iid) + { + continue; + n--; + } - gnome_config_set_string(cbuf, gtk_type_name(GTK_OBJECT_TYPE(cur->data))); + g_snprintf(cbuf, sizeof(cbuf), "meta_view_%d_type=0", n); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, n); + gnome_config_set_string(cbuf, NAUTILUS_VIEW(cur->data)->iid); + + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, n); gnome_config_push_prefix(cbuf); @@ -430,50 +490,45 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_pop_prefix(); } + gnome_config_set_int("num_meta_views", n); gnome_config_pop_prefix(); -#endif } void nautilus_window_set_initial_state(NautilusWindow *window) { -#if 0 GSList *cur; GtkRequisition sreq; GdkGeometry geo; + NautilusView *view; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, - NAUTILUS_VIEW(gtk_widget_new(nautilus_content_gtkhtml_get_type(), - "main_window", window, NULL)) + view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), + "main_window", window, NULL)) ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_location_get_type(), - "main_window", window, NULL)) - ); - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_history_get_type(), - "main_window", window, NULL)) - ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_tree_get_type(), - "main_window", window, NULL)) + nautilus_view_load_client(view, "control:clock"); + nautilus_window_add_meta_view(window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), + "main_window", window, NULL)) ); + nautilus_view_load_client(view, "control:clock"); gtk_widget_size_request(GTK_WIDGET(window), &sreq); gtk_widget_size_request(GTK_WIDGET(window->content_hbox), &sreq); - gtk_widget_size_request(GTK_WIDGET(window->nav_notebook), &sreq); - geo.min_width = window->nav_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); - geo.min_height = window->nav_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); + gtk_widget_size_request(GTK_WIDGET(window->meta_notebook), &sreq); + geo.min_width = window->meta_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); + geo.min_height = window->meta_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); geo.base_width = geo.min_width; geo.base_height = geo.min_height; gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geo, GDK_HINT_BASE_SIZE|GDK_HINT_MIN_SIZE); gtk_window_set_default_size(GTK_WINDOW(window), geo.min_width, geo.min_height); +#ifndef CONTENTS_AS_HBOX gtk_paned_set_position(GTK_PANED(window->content_hbox), MAX(400, GTK_WIDGET(window->content_view)->requisition.width)); #endif } @@ -481,7 +536,6 @@ nautilus_window_set_initial_state(NautilusWindow *window) void nautilus_window_load_state(NautilusWindow *window, const char *config_path) { -#if 0 char *vtype; GSList *cur; int i, n; @@ -489,7 +543,7 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) char cbuf[1024]; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, NULL); @@ -502,13 +556,9 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) if(vtype && strcmp(vtype, "NONE")) /* Create new content view */ { GtkWidget *w; - GtkType wt; - - wt = gtk_type_from_name(vtype); - g_assert(wt); - g_assert(gtk_type_is_a(wt, NAUTILUS_TYPE_VIEW)); - w = gtk_widget_new(wt, "main_window", window, NULL); + w = gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(w), vtype); nautilus_window_set_content_view(window, NAUTILUS_VIEW(w)); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); @@ -520,23 +570,18 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } g_free(vtype); - n = gnome_config_get_int("num_nav_views=0"); + n = gnome_config_get_int("num_meta_views=0"); for(i = 0; i < n; n++) { - GtkType nvt; GtkWidget *nvw; - g_snprintf(cbuf, sizeof(cbuf), "%s/nav_view_%d_type=0", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/meta_view_%d_type=0", config_path, i); vtype = gnome_config_get_string(cbuf); - nvt = gtk_type_from_name(vtype); - g_free(vtype); - g_assert(nvt); - - g_assert(gtk_type_is_a(nvt, NAUTILUS_TYPE_VIEW)); - nvw = gtk_widget_new(nvt, "main_window", window, NULL); + nvw = gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(nvw), vtype); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, i); gnome_config_push_prefix(cbuf); gtk_signal_emit(GTK_OBJECT(cur->data), signum, cbuf); @@ -546,5 +591,28 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } gnome_config_pop_prefix(); -#endif +} + +static void +nautilus_window_back (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_prev); + + uri = window->uris_prev->data; + + nautilus_window_change_location(window, uri, NULL, TRUE); +} + +static void +nautilus_window_fwd (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_next); + + uri = window->uris_next->data; + + nautilus_window_change_location(window, uri, NULL, FALSE); } diff --git a/src/nautilus-navigation-window.h b/src/nautilus-navigation-window.h index 3fcfc42a9..5f0c291b7 100644 --- a/src/nautilus-navigation-window.h +++ b/src/nautilus-navigation-window.h @@ -3,6 +3,7 @@ #include <libgnomeui/gnome-app.h> #include "ntl-types.h" +#include "ntl-view.h" #define NAUTILUS_TYPE_WINDOW (nautilus_window_get_type()) #define NAUTILUS_WINDOW(obj) (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_WINDOW, NautilusWindow)) @@ -28,9 +29,11 @@ struct _NautilusWindow { GtkWidget *content_view; - GSList *nav_views; - GtkWidget *nav_notebook, *content_hbox, *btn_back, *btn_fwd; + GSList *meta_views; + GtkWidget *meta_notebook, *content_hbox, *btn_back, *btn_fwd; NautilusLocationReference current_uri, actual_current_uri; + + GSList *uris_prev, *uris_next; }; GtkType nautilus_window_get_type(void); @@ -41,5 +44,8 @@ void nautilus_window_request_location_change(NautilusWindow *window, void nautilus_window_save_state(NautilusWindow *window, const char *config_path); void nautilus_window_load_state(NautilusWindow *window, const char *config_path); void nautilus_window_set_initial_state(NautilusWindow *window); +void nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view); +void nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view); +void nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view); #endif diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c index 6b2dcc650..e2398492c 100644 --- a/src/nautilus-object-window.c +++ b/src/nautilus-object-window.c @@ -4,6 +4,8 @@ static void nautilus_window_class_init (NautilusWindowClass *klass); static void nautilus_window_init (NautilusWindow *window); +static void nautilus_window_back (NautilusWindow *window); +static void nautilus_window_fwd (NautilusWindow *window); static void nautilus_window_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); @@ -16,6 +18,8 @@ static void nautilus_window_real_request_location_change (NautilusWindow *window NautilusLocationReference loc, GtkWidget *requesting_view); +#define CONTENTS_AS_HBOX + GtkType nautilus_window_get_type(void) { @@ -183,12 +187,16 @@ nautilus_window_constructed(NautilusWindow *window) wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_BACK); window->btn_back = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_back), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_back, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_back), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_back), "clicked", nautilus_window_back, NULL); wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_FORWARD); window->btn_fwd = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_fwd), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_fwd, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_fwd), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_fwd), "clicked", nautilus_window_fwd, NULL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_back, FALSE, FALSE, GNOME_PAD_SMALL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_fwd, FALSE, FALSE, GNOME_PAD_SMALL); @@ -197,17 +205,21 @@ nautilus_window_constructed(NautilusWindow *window) gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); +#ifdef CONTENTS_AS_HBOX + window->content_hbox = gtk_hbox_new(FALSE, GNOME_PAD_SMALL); +#else window->content_hbox = gtk_hpaned_new(); - gtk_widget_show(window->content_hbox); +#endif gnome_app_set_contents(app, window->content_hbox); - window->nav_notebook = gtk_notebook_new(); - gtk_widget_show(window->nav_notebook); -#if 0 - gtk_box_pack_end(GTK_BOX(window->content_hbox), window->nav_notebook, FALSE, FALSE, GNOME_PAD); + window->meta_notebook = gtk_notebook_new(); + gtk_widget_show(window->meta_notebook); +#ifdef CONTENTS_AS_HBOX + gtk_box_pack_end(GTK_BOX(window->content_hbox), window->meta_notebook, FALSE, FALSE, GNOME_PAD); #else - gtk_paned_pack2(GTK_PANED(window->content_hbox), window->nav_notebook, TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(window->content_hbox), window->meta_notebook, TRUE, TRUE); #endif + gtk_widget_show_all(window->content_hbox); } static void @@ -240,7 +252,7 @@ nautilus_window_set_arg (GtkObject *object, { gtk_widget_ref(GTK_WIDGET(window->content_view)); gtk_container_remove(GTK_CONTAINER(window->content_hbox), GTK_WIDGET(window->content_view)); -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -248,7 +260,7 @@ nautilus_window_set_arg (GtkObject *object, gtk_widget_unref(GTK_WIDGET(window->content_view)); } else -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -295,55 +307,65 @@ nautilus_window_close (GtkWidget *widget, } void -nautilus_window_set_content_view(NautilusWindow *window, GtkWidget *content_view) +nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view) { gtk_object_set(GTK_OBJECT(window), "content_view", content_view, NULL); gtk_widget_show(GTK_WIDGET(content_view)); } static gboolean -nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *nav_view) +nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *meta_view) { if(event->button != 3) return FALSE; gtk_signal_emit_stop_by_name(GTK_OBJECT(dockitem), "button_press_event"); - gtk_signal_emit_by_name(GTK_OBJECT(nav_view), "show_properties"); + gtk_signal_emit_by_name(GTK_OBJECT(meta_view), "show_properties"); return TRUE; } void -nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view) { GtkWidget *label; + const char *desc; + char cbuf[32]; - g_return_if_fail(!g_slist_find(window->nav_views, nav_view)); - g_return_if_fail(NAUTILUS_IS_META_VIEW(nav_view)); + g_return_if_fail(!g_slist_find(window->meta_views, meta_view)); + g_return_if_fail(NAUTILUS_IS_META_VIEW(meta_view)); - label = gtk_label_new(nautilus_meta_view_get_description(NAUTILUS_META_VIEW(nav_view))); + desc = nautilus_meta_view_get_description(NAUTILUS_META_VIEW(meta_view)); + if(!desc) + { + desc = cbuf; + g_snprintf(cbuf, sizeof(cbuf), "%p", meta_view); + } + label = gtk_label_new(desc); gtk_widget_show(label); - gtk_notebook_prepend_page(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view), label); - gtk_widget_show(GTK_WIDGET(nav_view)); + gtk_signal_connect(GTK_OBJECT(label), "button_press_event", + GTK_SIGNAL_FUNC(nautilus_window_send_show_properties), meta_view); + gtk_notebook_prepend_page(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view), label); + gtk_widget_show(GTK_WIDGET(meta_view)); - window->nav_views = g_slist_prepend(window->nav_views, nav_view); + window->meta_views = g_slist_prepend(window->meta_views, meta_view); } void -nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view) { gint pagenum; - g_return_if_fail(g_slist_find(window->nav_views, nav_view)); + g_return_if_fail(g_slist_find(window->meta_views, meta_view)); - window->nav_views = g_slist_remove(window->nav_views, nav_view); + window->meta_views = g_slist_remove(window->meta_views, meta_view); - pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view)); + pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view)); g_return_if_fail(pagenum >= 0); - gtk_notebook_remove_page(GTK_NOTEBOOK(window->nav_notebook), pagenum); + gtk_notebook_remove_page(GTK_NOTEBOOK(window->meta_notebook), pagenum); } void @@ -361,14 +383,40 @@ nautilus_window_request_location_change(NautilusWindow *window, } static void -nautilus_window_real_request_location_change (NautilusWindow *window, - NautilusLocationReference loc, - GtkWidget *requesting_view) +nautilus_window_change_location(NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view, + gboolean is_back) { guint signum; GSList *cur; NautilusNavigationInfo loci_spot, *loci; + /* Update history */ + if(is_back) + { + window->uris_next = g_slist_prepend(window->uris_next, window->uris_prev->data); + window->uris_prev = g_slist_remove(window->uris_prev, window->uris_prev->data); + } + else + { + char *append_val; + if(window->uris_next && !strcmp(loc, window->uris_next->data)) + { + append_val = window->uris_next->data; + window->uris_next = g_slist_remove(window->uris_next, window->uris_next->data); + } + else + { + append_val = g_strdup(loc); + g_slist_foreach(window->uris_next, (GFunc)g_free, NULL); + g_slist_free(window->uris_next); + } + window->uris_prev = g_slist_prepend(window->uris_prev, append_val); + } + gtk_widget_set_sensitive(window->btn_back, window->uris_prev?TRUE:FALSE); + gtk_widget_set_sensitive(window->btn_fwd, window->uris_next?TRUE:FALSE); + memset(&loci_spot, 0, sizeof(loci_spot)); loci = &loci_spot; loci->requested_uri = loci->actual_uri = loc; @@ -377,7 +425,7 @@ nautilus_window_real_request_location_change (NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) gtk_signal_emit(GTK_OBJECT(cur->data), signum, loci, window->content_view, requesting_view); gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); @@ -388,10 +436,17 @@ nautilus_window_real_request_location_change (NautilusWindow *window, window->actual_current_uri = loci->actual_uri; } +static void +nautilus_window_real_request_location_change (NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view) +{ + nautilus_window_change_location(window, loc, requesting_view, FALSE); +} + void nautilus_window_save_state(NautilusWindow *window, const char *config_path) { -#if 0 GSList *cur; int n; guint signum; @@ -400,7 +455,7 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_push_prefix(config_path); if(window->content_view) { - gnome_config_set_string("content_view_type", gtk_type_name(GTK_OBJECT_TYPE(window->content_view))); + gnome_config_set_string("content_view_type", NAUTILUS_VIEW(window->content_view)->iid); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); gnome_config_push_prefix(cbuf); @@ -413,16 +468,21 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_set_string("content_view_type", "NONE"); - n = g_slist_length(window->nav_views); - gnome_config_set_int("num_nav_views", n); + n = g_slist_length(window->meta_views); signum = gtk_signal_lookup("save_state", nautilus_view_get_type()); - for(n = 0, cur = window->nav_views; cur; cur = cur->next, n++) + for(n = 0, cur = window->meta_views; cur; cur = cur->next, n++) { - g_snprintf(cbuf, sizeof(cbuf), "nav_view_%d_type=0", n); + if(!NAUTILUS_VIEW(cur->data)->iid) + { + continue; + n--; + } - gnome_config_set_string(cbuf, gtk_type_name(GTK_OBJECT_TYPE(cur->data))); + g_snprintf(cbuf, sizeof(cbuf), "meta_view_%d_type=0", n); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, n); + gnome_config_set_string(cbuf, NAUTILUS_VIEW(cur->data)->iid); + + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, n); gnome_config_push_prefix(cbuf); @@ -430,50 +490,45 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_pop_prefix(); } + gnome_config_set_int("num_meta_views", n); gnome_config_pop_prefix(); -#endif } void nautilus_window_set_initial_state(NautilusWindow *window) { -#if 0 GSList *cur; GtkRequisition sreq; GdkGeometry geo; + NautilusView *view; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, - NAUTILUS_VIEW(gtk_widget_new(nautilus_content_gtkhtml_get_type(), - "main_window", window, NULL)) + view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), + "main_window", window, NULL)) ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_location_get_type(), - "main_window", window, NULL)) - ); - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_history_get_type(), - "main_window", window, NULL)) - ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_tree_get_type(), - "main_window", window, NULL)) + nautilus_view_load_client(view, "control:clock"); + nautilus_window_add_meta_view(window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), + "main_window", window, NULL)) ); + nautilus_view_load_client(view, "control:clock"); gtk_widget_size_request(GTK_WIDGET(window), &sreq); gtk_widget_size_request(GTK_WIDGET(window->content_hbox), &sreq); - gtk_widget_size_request(GTK_WIDGET(window->nav_notebook), &sreq); - geo.min_width = window->nav_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); - geo.min_height = window->nav_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); + gtk_widget_size_request(GTK_WIDGET(window->meta_notebook), &sreq); + geo.min_width = window->meta_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); + geo.min_height = window->meta_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); geo.base_width = geo.min_width; geo.base_height = geo.min_height; gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geo, GDK_HINT_BASE_SIZE|GDK_HINT_MIN_SIZE); gtk_window_set_default_size(GTK_WINDOW(window), geo.min_width, geo.min_height); +#ifndef CONTENTS_AS_HBOX gtk_paned_set_position(GTK_PANED(window->content_hbox), MAX(400, GTK_WIDGET(window->content_view)->requisition.width)); #endif } @@ -481,7 +536,6 @@ nautilus_window_set_initial_state(NautilusWindow *window) void nautilus_window_load_state(NautilusWindow *window, const char *config_path) { -#if 0 char *vtype; GSList *cur; int i, n; @@ -489,7 +543,7 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) char cbuf[1024]; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, NULL); @@ -502,13 +556,9 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) if(vtype && strcmp(vtype, "NONE")) /* Create new content view */ { GtkWidget *w; - GtkType wt; - - wt = gtk_type_from_name(vtype); - g_assert(wt); - g_assert(gtk_type_is_a(wt, NAUTILUS_TYPE_VIEW)); - w = gtk_widget_new(wt, "main_window", window, NULL); + w = gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(w), vtype); nautilus_window_set_content_view(window, NAUTILUS_VIEW(w)); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); @@ -520,23 +570,18 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } g_free(vtype); - n = gnome_config_get_int("num_nav_views=0"); + n = gnome_config_get_int("num_meta_views=0"); for(i = 0; i < n; n++) { - GtkType nvt; GtkWidget *nvw; - g_snprintf(cbuf, sizeof(cbuf), "%s/nav_view_%d_type=0", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/meta_view_%d_type=0", config_path, i); vtype = gnome_config_get_string(cbuf); - nvt = gtk_type_from_name(vtype); - g_free(vtype); - g_assert(nvt); - - g_assert(gtk_type_is_a(nvt, NAUTILUS_TYPE_VIEW)); - nvw = gtk_widget_new(nvt, "main_window", window, NULL); + nvw = gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(nvw), vtype); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, i); gnome_config_push_prefix(cbuf); gtk_signal_emit(GTK_OBJECT(cur->data), signum, cbuf); @@ -546,5 +591,28 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } gnome_config_pop_prefix(); -#endif +} + +static void +nautilus_window_back (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_prev); + + uri = window->uris_prev->data; + + nautilus_window_change_location(window, uri, NULL, TRUE); +} + +static void +nautilus_window_fwd (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_next); + + uri = window->uris_next->data; + + nautilus_window_change_location(window, uri, NULL, FALSE); } diff --git a/src/nautilus-object-window.h b/src/nautilus-object-window.h index 3fcfc42a9..5f0c291b7 100644 --- a/src/nautilus-object-window.h +++ b/src/nautilus-object-window.h @@ -3,6 +3,7 @@ #include <libgnomeui/gnome-app.h> #include "ntl-types.h" +#include "ntl-view.h" #define NAUTILUS_TYPE_WINDOW (nautilus_window_get_type()) #define NAUTILUS_WINDOW(obj) (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_WINDOW, NautilusWindow)) @@ -28,9 +29,11 @@ struct _NautilusWindow { GtkWidget *content_view; - GSList *nav_views; - GtkWidget *nav_notebook, *content_hbox, *btn_back, *btn_fwd; + GSList *meta_views; + GtkWidget *meta_notebook, *content_hbox, *btn_back, *btn_fwd; NautilusLocationReference current_uri, actual_current_uri; + + GSList *uris_prev, *uris_next; }; GtkType nautilus_window_get_type(void); @@ -41,5 +44,8 @@ void nautilus_window_request_location_change(NautilusWindow *window, void nautilus_window_save_state(NautilusWindow *window, const char *config_path); void nautilus_window_load_state(NautilusWindow *window, const char *config_path); void nautilus_window_set_initial_state(NautilusWindow *window); +void nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view); +void nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view); +void nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view); #endif diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c index 6b2dcc650..e2398492c 100644 --- a/src/nautilus-spatial-window.c +++ b/src/nautilus-spatial-window.c @@ -4,6 +4,8 @@ static void nautilus_window_class_init (NautilusWindowClass *klass); static void nautilus_window_init (NautilusWindow *window); +static void nautilus_window_back (NautilusWindow *window); +static void nautilus_window_fwd (NautilusWindow *window); static void nautilus_window_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); @@ -16,6 +18,8 @@ static void nautilus_window_real_request_location_change (NautilusWindow *window NautilusLocationReference loc, GtkWidget *requesting_view); +#define CONTENTS_AS_HBOX + GtkType nautilus_window_get_type(void) { @@ -183,12 +187,16 @@ nautilus_window_constructed(NautilusWindow *window) wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_BACK); window->btn_back = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_back), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_back, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_back), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_back), "clicked", nautilus_window_back, NULL); wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_FORWARD); window->btn_fwd = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_fwd), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_fwd, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_fwd), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_fwd), "clicked", nautilus_window_fwd, NULL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_back, FALSE, FALSE, GNOME_PAD_SMALL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_fwd, FALSE, FALSE, GNOME_PAD_SMALL); @@ -197,17 +205,21 @@ nautilus_window_constructed(NautilusWindow *window) gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); +#ifdef CONTENTS_AS_HBOX + window->content_hbox = gtk_hbox_new(FALSE, GNOME_PAD_SMALL); +#else window->content_hbox = gtk_hpaned_new(); - gtk_widget_show(window->content_hbox); +#endif gnome_app_set_contents(app, window->content_hbox); - window->nav_notebook = gtk_notebook_new(); - gtk_widget_show(window->nav_notebook); -#if 0 - gtk_box_pack_end(GTK_BOX(window->content_hbox), window->nav_notebook, FALSE, FALSE, GNOME_PAD); + window->meta_notebook = gtk_notebook_new(); + gtk_widget_show(window->meta_notebook); +#ifdef CONTENTS_AS_HBOX + gtk_box_pack_end(GTK_BOX(window->content_hbox), window->meta_notebook, FALSE, FALSE, GNOME_PAD); #else - gtk_paned_pack2(GTK_PANED(window->content_hbox), window->nav_notebook, TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(window->content_hbox), window->meta_notebook, TRUE, TRUE); #endif + gtk_widget_show_all(window->content_hbox); } static void @@ -240,7 +252,7 @@ nautilus_window_set_arg (GtkObject *object, { gtk_widget_ref(GTK_WIDGET(window->content_view)); gtk_container_remove(GTK_CONTAINER(window->content_hbox), GTK_WIDGET(window->content_view)); -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -248,7 +260,7 @@ nautilus_window_set_arg (GtkObject *object, gtk_widget_unref(GTK_WIDGET(window->content_view)); } else -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -295,55 +307,65 @@ nautilus_window_close (GtkWidget *widget, } void -nautilus_window_set_content_view(NautilusWindow *window, GtkWidget *content_view) +nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view) { gtk_object_set(GTK_OBJECT(window), "content_view", content_view, NULL); gtk_widget_show(GTK_WIDGET(content_view)); } static gboolean -nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *nav_view) +nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *meta_view) { if(event->button != 3) return FALSE; gtk_signal_emit_stop_by_name(GTK_OBJECT(dockitem), "button_press_event"); - gtk_signal_emit_by_name(GTK_OBJECT(nav_view), "show_properties"); + gtk_signal_emit_by_name(GTK_OBJECT(meta_view), "show_properties"); return TRUE; } void -nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view) { GtkWidget *label; + const char *desc; + char cbuf[32]; - g_return_if_fail(!g_slist_find(window->nav_views, nav_view)); - g_return_if_fail(NAUTILUS_IS_META_VIEW(nav_view)); + g_return_if_fail(!g_slist_find(window->meta_views, meta_view)); + g_return_if_fail(NAUTILUS_IS_META_VIEW(meta_view)); - label = gtk_label_new(nautilus_meta_view_get_description(NAUTILUS_META_VIEW(nav_view))); + desc = nautilus_meta_view_get_description(NAUTILUS_META_VIEW(meta_view)); + if(!desc) + { + desc = cbuf; + g_snprintf(cbuf, sizeof(cbuf), "%p", meta_view); + } + label = gtk_label_new(desc); gtk_widget_show(label); - gtk_notebook_prepend_page(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view), label); - gtk_widget_show(GTK_WIDGET(nav_view)); + gtk_signal_connect(GTK_OBJECT(label), "button_press_event", + GTK_SIGNAL_FUNC(nautilus_window_send_show_properties), meta_view); + gtk_notebook_prepend_page(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view), label); + gtk_widget_show(GTK_WIDGET(meta_view)); - window->nav_views = g_slist_prepend(window->nav_views, nav_view); + window->meta_views = g_slist_prepend(window->meta_views, meta_view); } void -nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view) { gint pagenum; - g_return_if_fail(g_slist_find(window->nav_views, nav_view)); + g_return_if_fail(g_slist_find(window->meta_views, meta_view)); - window->nav_views = g_slist_remove(window->nav_views, nav_view); + window->meta_views = g_slist_remove(window->meta_views, meta_view); - pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view)); + pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view)); g_return_if_fail(pagenum >= 0); - gtk_notebook_remove_page(GTK_NOTEBOOK(window->nav_notebook), pagenum); + gtk_notebook_remove_page(GTK_NOTEBOOK(window->meta_notebook), pagenum); } void @@ -361,14 +383,40 @@ nautilus_window_request_location_change(NautilusWindow *window, } static void -nautilus_window_real_request_location_change (NautilusWindow *window, - NautilusLocationReference loc, - GtkWidget *requesting_view) +nautilus_window_change_location(NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view, + gboolean is_back) { guint signum; GSList *cur; NautilusNavigationInfo loci_spot, *loci; + /* Update history */ + if(is_back) + { + window->uris_next = g_slist_prepend(window->uris_next, window->uris_prev->data); + window->uris_prev = g_slist_remove(window->uris_prev, window->uris_prev->data); + } + else + { + char *append_val; + if(window->uris_next && !strcmp(loc, window->uris_next->data)) + { + append_val = window->uris_next->data; + window->uris_next = g_slist_remove(window->uris_next, window->uris_next->data); + } + else + { + append_val = g_strdup(loc); + g_slist_foreach(window->uris_next, (GFunc)g_free, NULL); + g_slist_free(window->uris_next); + } + window->uris_prev = g_slist_prepend(window->uris_prev, append_val); + } + gtk_widget_set_sensitive(window->btn_back, window->uris_prev?TRUE:FALSE); + gtk_widget_set_sensitive(window->btn_fwd, window->uris_next?TRUE:FALSE); + memset(&loci_spot, 0, sizeof(loci_spot)); loci = &loci_spot; loci->requested_uri = loci->actual_uri = loc; @@ -377,7 +425,7 @@ nautilus_window_real_request_location_change (NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) gtk_signal_emit(GTK_OBJECT(cur->data), signum, loci, window->content_view, requesting_view); gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); @@ -388,10 +436,17 @@ nautilus_window_real_request_location_change (NautilusWindow *window, window->actual_current_uri = loci->actual_uri; } +static void +nautilus_window_real_request_location_change (NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view) +{ + nautilus_window_change_location(window, loc, requesting_view, FALSE); +} + void nautilus_window_save_state(NautilusWindow *window, const char *config_path) { -#if 0 GSList *cur; int n; guint signum; @@ -400,7 +455,7 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_push_prefix(config_path); if(window->content_view) { - gnome_config_set_string("content_view_type", gtk_type_name(GTK_OBJECT_TYPE(window->content_view))); + gnome_config_set_string("content_view_type", NAUTILUS_VIEW(window->content_view)->iid); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); gnome_config_push_prefix(cbuf); @@ -413,16 +468,21 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_set_string("content_view_type", "NONE"); - n = g_slist_length(window->nav_views); - gnome_config_set_int("num_nav_views", n); + n = g_slist_length(window->meta_views); signum = gtk_signal_lookup("save_state", nautilus_view_get_type()); - for(n = 0, cur = window->nav_views; cur; cur = cur->next, n++) + for(n = 0, cur = window->meta_views; cur; cur = cur->next, n++) { - g_snprintf(cbuf, sizeof(cbuf), "nav_view_%d_type=0", n); + if(!NAUTILUS_VIEW(cur->data)->iid) + { + continue; + n--; + } - gnome_config_set_string(cbuf, gtk_type_name(GTK_OBJECT_TYPE(cur->data))); + g_snprintf(cbuf, sizeof(cbuf), "meta_view_%d_type=0", n); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, n); + gnome_config_set_string(cbuf, NAUTILUS_VIEW(cur->data)->iid); + + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, n); gnome_config_push_prefix(cbuf); @@ -430,50 +490,45 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_pop_prefix(); } + gnome_config_set_int("num_meta_views", n); gnome_config_pop_prefix(); -#endif } void nautilus_window_set_initial_state(NautilusWindow *window) { -#if 0 GSList *cur; GtkRequisition sreq; GdkGeometry geo; + NautilusView *view; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, - NAUTILUS_VIEW(gtk_widget_new(nautilus_content_gtkhtml_get_type(), - "main_window", window, NULL)) + view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), + "main_window", window, NULL)) ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_location_get_type(), - "main_window", window, NULL)) - ); - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_history_get_type(), - "main_window", window, NULL)) - ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_tree_get_type(), - "main_window", window, NULL)) + nautilus_view_load_client(view, "control:clock"); + nautilus_window_add_meta_view(window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), + "main_window", window, NULL)) ); + nautilus_view_load_client(view, "control:clock"); gtk_widget_size_request(GTK_WIDGET(window), &sreq); gtk_widget_size_request(GTK_WIDGET(window->content_hbox), &sreq); - gtk_widget_size_request(GTK_WIDGET(window->nav_notebook), &sreq); - geo.min_width = window->nav_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); - geo.min_height = window->nav_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); + gtk_widget_size_request(GTK_WIDGET(window->meta_notebook), &sreq); + geo.min_width = window->meta_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); + geo.min_height = window->meta_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); geo.base_width = geo.min_width; geo.base_height = geo.min_height; gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geo, GDK_HINT_BASE_SIZE|GDK_HINT_MIN_SIZE); gtk_window_set_default_size(GTK_WINDOW(window), geo.min_width, geo.min_height); +#ifndef CONTENTS_AS_HBOX gtk_paned_set_position(GTK_PANED(window->content_hbox), MAX(400, GTK_WIDGET(window->content_view)->requisition.width)); #endif } @@ -481,7 +536,6 @@ nautilus_window_set_initial_state(NautilusWindow *window) void nautilus_window_load_state(NautilusWindow *window, const char *config_path) { -#if 0 char *vtype; GSList *cur; int i, n; @@ -489,7 +543,7 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) char cbuf[1024]; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, NULL); @@ -502,13 +556,9 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) if(vtype && strcmp(vtype, "NONE")) /* Create new content view */ { GtkWidget *w; - GtkType wt; - - wt = gtk_type_from_name(vtype); - g_assert(wt); - g_assert(gtk_type_is_a(wt, NAUTILUS_TYPE_VIEW)); - w = gtk_widget_new(wt, "main_window", window, NULL); + w = gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(w), vtype); nautilus_window_set_content_view(window, NAUTILUS_VIEW(w)); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); @@ -520,23 +570,18 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } g_free(vtype); - n = gnome_config_get_int("num_nav_views=0"); + n = gnome_config_get_int("num_meta_views=0"); for(i = 0; i < n; n++) { - GtkType nvt; GtkWidget *nvw; - g_snprintf(cbuf, sizeof(cbuf), "%s/nav_view_%d_type=0", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/meta_view_%d_type=0", config_path, i); vtype = gnome_config_get_string(cbuf); - nvt = gtk_type_from_name(vtype); - g_free(vtype); - g_assert(nvt); - - g_assert(gtk_type_is_a(nvt, NAUTILUS_TYPE_VIEW)); - nvw = gtk_widget_new(nvt, "main_window", window, NULL); + nvw = gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(nvw), vtype); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, i); gnome_config_push_prefix(cbuf); gtk_signal_emit(GTK_OBJECT(cur->data), signum, cbuf); @@ -546,5 +591,28 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } gnome_config_pop_prefix(); -#endif +} + +static void +nautilus_window_back (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_prev); + + uri = window->uris_prev->data; + + nautilus_window_change_location(window, uri, NULL, TRUE); +} + +static void +nautilus_window_fwd (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_next); + + uri = window->uris_next->data; + + nautilus_window_change_location(window, uri, NULL, FALSE); } diff --git a/src/nautilus-spatial-window.h b/src/nautilus-spatial-window.h index 3fcfc42a9..5f0c291b7 100644 --- a/src/nautilus-spatial-window.h +++ b/src/nautilus-spatial-window.h @@ -3,6 +3,7 @@ #include <libgnomeui/gnome-app.h> #include "ntl-types.h" +#include "ntl-view.h" #define NAUTILUS_TYPE_WINDOW (nautilus_window_get_type()) #define NAUTILUS_WINDOW(obj) (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_WINDOW, NautilusWindow)) @@ -28,9 +29,11 @@ struct _NautilusWindow { GtkWidget *content_view; - GSList *nav_views; - GtkWidget *nav_notebook, *content_hbox, *btn_back, *btn_fwd; + GSList *meta_views; + GtkWidget *meta_notebook, *content_hbox, *btn_back, *btn_fwd; NautilusLocationReference current_uri, actual_current_uri; + + GSList *uris_prev, *uris_next; }; GtkType nautilus_window_get_type(void); @@ -41,5 +44,8 @@ void nautilus_window_request_location_change(NautilusWindow *window, void nautilus_window_save_state(NautilusWindow *window, const char *config_path); void nautilus_window_load_state(NautilusWindow *window, const char *config_path); void nautilus_window_set_initial_state(NautilusWindow *window); +void nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view); +void nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view); +void nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view); #endif diff --git a/src/nautilus-view-frame.c b/src/nautilus-view-frame.c index b960ccbd7..aa180e5a4 100644 --- a/src/nautilus-view-frame.c +++ b/src/nautilus-view-frame.c @@ -33,6 +33,7 @@ enum { }; static void nautilus_view_init (NautilusView *view); +static void nautilus_view_constructed(NautilusView *view); static void nautilus_view_class_init (NautilusViewClass *klass); static void nautilus_view_set_arg (GtkObject *object, GtkArg *arg, @@ -89,7 +90,6 @@ gtk_marshal_NONE__BOXED_OBJECT_BOXED (GtkObject * object, func_data); } - static void nautilus_view_class_init (NautilusViewClass *klass) { @@ -108,6 +108,7 @@ nautilus_view_class_init (NautilusViewClass *klass) klass->notify_location_change = NULL; klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); + klass->view_constructed = nautilus_view_constructed; i = 0; klass->view_signals[i++] = gtk_signal_new("notify_location_change", @@ -140,16 +141,21 @@ nautilus_view_class_init (NautilusViewClass *klass) GTK_TYPE_OBJECT, GTK_ARG_READWRITE|GTK_ARG_CONSTRUCT, ARG_MAIN_WINDOW); + klass->num_construct_args++; } static void nautilus_view_set_arg (GtkObject *object, GtkArg *arg, - guint arg_id) + guint arg_id) { + NautilusView *view; + + view = NAUTILUS_VIEW(object); switch(arg_id) { case ARG_MAIN_WINDOW: - NAUTILUS_VIEW(object)->main_window = GTK_WIDGET(GTK_VALUE_OBJECT(*arg)); + view->main_window = GTK_WIDGET(GTK_VALUE_OBJECT(*arg)); + nautilus_view_construct_arg_set(view); break; } } @@ -170,7 +176,28 @@ static void nautilus_view_init (NautilusView *view) { GTK_WIDGET_SET_FLAGS (view, GTK_NO_WINDOW); - +} + +static void +nautilus_view_constructed(NautilusView *view) +{ +} + +void +nautilus_view_construct_arg_set(NautilusView *view) +{ + guint nca; + NautilusViewClass *klass; + + klass = NAUTILUS_VIEW_CLASS(((GtkObject *)view)->klass); + nca = klass->num_construct_args; + if(view->construct_arg_count >= nca) + return; + + view->construct_arg_count++; + if((view->construct_arg_count >= nca) + && klass->view_constructed) + klass->view_constructed(view); } void @@ -219,3 +246,20 @@ nautilus_view_size_allocate (GtkWidget *widget, if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) gtk_widget_size_allocate (bin->child, &child_allocation); } + +void +nautilus_view_load_client(NautilusView *view, + const char * iid) +{ + if(view->client) + { + g_free(view->iid); view->iid = NULL; + gtk_container_remove(GTK_CONTAINER(view), view->client); view->client = NULL; + } + + view->client = gnome_bonobo_widget_new_control((char *)iid); + g_return_if_fail(view->client); + view->iid = g_strdup(iid); + gtk_widget_show(view->client); + gtk_container_add(GTK_CONTAINER(view), view->client); +} diff --git a/src/nautilus-view-frame.h b/src/nautilus-view-frame.h index 69e6b7df2..53e60e4ee 100644 --- a/src/nautilus-view-frame.h +++ b/src/nautilus-view-frame.h @@ -22,6 +22,7 @@ #include <gtk/gtkwidget.h> #include <gtk/gtkbin.h> #include "ntl-types.h" +#include <bonobo/gnome-bonobo.h> #ifdef __cplusplus extern "C" { @@ -38,28 +39,41 @@ typedef struct _NautilusViewClass NautilusViewClass; struct _NautilusView { - GtkBin parent; + GtkBin parent; - GtkWidget *main_window; + GtkWidget *main_window; + + char *iid; + GtkWidget *client; + + guint construct_arg_count; }; struct _NautilusViewClass { - GtkBinClass parent_spot; + GtkBinClass parent_spot; - void (*notify_location_change) (NautilusView *view, + void (*notify_location_change) (NautilusView *view, NautilusNavigationInfo *nav_context); - void (*load_state) (NautilusView *view, const char *config_path); - void (*save_state) (NautilusView *view, const char *config_path); - void (*show_properties) (NautilusView *view); + void (*load_state) (NautilusView *view, const char *config_path); + void (*save_state) (NautilusView *view, const char *config_path); + void (*show_properties) (NautilusView *view); - GtkBinClass *parent_class; - guint view_signals[3]; + void (*view_constructed) (NautilusView *view); /* Not a signal. Work-around for Gtk+'s lack of a 'constructed' operation */ + + GtkBinClass *parent_class; + guint view_signals[3]; + guint num_construct_args; }; GtkType nautilus_view_get_type (void); void nautilus_view_request_location_change (NautilusView *view, NautilusLocationReference loc); +void nautilus_view_load_client (NautilusView *view, + const char * iid); + +/* This is a "protected" operation */ +void nautilus_view_construct_arg_set(NautilusView *view); #ifdef __cplusplus } diff --git a/src/nautilus-window.c b/src/nautilus-window.c index 6b2dcc650..e2398492c 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -4,6 +4,8 @@ static void nautilus_window_class_init (NautilusWindowClass *klass); static void nautilus_window_init (NautilusWindow *window); +static void nautilus_window_back (NautilusWindow *window); +static void nautilus_window_fwd (NautilusWindow *window); static void nautilus_window_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); @@ -16,6 +18,8 @@ static void nautilus_window_real_request_location_change (NautilusWindow *window NautilusLocationReference loc, GtkWidget *requesting_view); +#define CONTENTS_AS_HBOX + GtkType nautilus_window_get_type(void) { @@ -183,12 +187,16 @@ nautilus_window_constructed(NautilusWindow *window) wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_BACK); window->btn_back = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_back), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_back, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_back), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_back), "clicked", nautilus_window_back, NULL); wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_FORWARD); window->btn_fwd = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_fwd), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_fwd, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_fwd), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_fwd), "clicked", nautilus_window_fwd, NULL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_back, FALSE, FALSE, GNOME_PAD_SMALL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_fwd, FALSE, FALSE, GNOME_PAD_SMALL); @@ -197,17 +205,21 @@ nautilus_window_constructed(NautilusWindow *window) gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); +#ifdef CONTENTS_AS_HBOX + window->content_hbox = gtk_hbox_new(FALSE, GNOME_PAD_SMALL); +#else window->content_hbox = gtk_hpaned_new(); - gtk_widget_show(window->content_hbox); +#endif gnome_app_set_contents(app, window->content_hbox); - window->nav_notebook = gtk_notebook_new(); - gtk_widget_show(window->nav_notebook); -#if 0 - gtk_box_pack_end(GTK_BOX(window->content_hbox), window->nav_notebook, FALSE, FALSE, GNOME_PAD); + window->meta_notebook = gtk_notebook_new(); + gtk_widget_show(window->meta_notebook); +#ifdef CONTENTS_AS_HBOX + gtk_box_pack_end(GTK_BOX(window->content_hbox), window->meta_notebook, FALSE, FALSE, GNOME_PAD); #else - gtk_paned_pack2(GTK_PANED(window->content_hbox), window->nav_notebook, TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(window->content_hbox), window->meta_notebook, TRUE, TRUE); #endif + gtk_widget_show_all(window->content_hbox); } static void @@ -240,7 +252,7 @@ nautilus_window_set_arg (GtkObject *object, { gtk_widget_ref(GTK_WIDGET(window->content_view)); gtk_container_remove(GTK_CONTAINER(window->content_hbox), GTK_WIDGET(window->content_view)); -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -248,7 +260,7 @@ nautilus_window_set_arg (GtkObject *object, gtk_widget_unref(GTK_WIDGET(window->content_view)); } else -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -295,55 +307,65 @@ nautilus_window_close (GtkWidget *widget, } void -nautilus_window_set_content_view(NautilusWindow *window, GtkWidget *content_view) +nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view) { gtk_object_set(GTK_OBJECT(window), "content_view", content_view, NULL); gtk_widget_show(GTK_WIDGET(content_view)); } static gboolean -nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *nav_view) +nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *meta_view) { if(event->button != 3) return FALSE; gtk_signal_emit_stop_by_name(GTK_OBJECT(dockitem), "button_press_event"); - gtk_signal_emit_by_name(GTK_OBJECT(nav_view), "show_properties"); + gtk_signal_emit_by_name(GTK_OBJECT(meta_view), "show_properties"); return TRUE; } void -nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view) { GtkWidget *label; + const char *desc; + char cbuf[32]; - g_return_if_fail(!g_slist_find(window->nav_views, nav_view)); - g_return_if_fail(NAUTILUS_IS_META_VIEW(nav_view)); + g_return_if_fail(!g_slist_find(window->meta_views, meta_view)); + g_return_if_fail(NAUTILUS_IS_META_VIEW(meta_view)); - label = gtk_label_new(nautilus_meta_view_get_description(NAUTILUS_META_VIEW(nav_view))); + desc = nautilus_meta_view_get_description(NAUTILUS_META_VIEW(meta_view)); + if(!desc) + { + desc = cbuf; + g_snprintf(cbuf, sizeof(cbuf), "%p", meta_view); + } + label = gtk_label_new(desc); gtk_widget_show(label); - gtk_notebook_prepend_page(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view), label); - gtk_widget_show(GTK_WIDGET(nav_view)); + gtk_signal_connect(GTK_OBJECT(label), "button_press_event", + GTK_SIGNAL_FUNC(nautilus_window_send_show_properties), meta_view); + gtk_notebook_prepend_page(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view), label); + gtk_widget_show(GTK_WIDGET(meta_view)); - window->nav_views = g_slist_prepend(window->nav_views, nav_view); + window->meta_views = g_slist_prepend(window->meta_views, meta_view); } void -nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view) { gint pagenum; - g_return_if_fail(g_slist_find(window->nav_views, nav_view)); + g_return_if_fail(g_slist_find(window->meta_views, meta_view)); - window->nav_views = g_slist_remove(window->nav_views, nav_view); + window->meta_views = g_slist_remove(window->meta_views, meta_view); - pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view)); + pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view)); g_return_if_fail(pagenum >= 0); - gtk_notebook_remove_page(GTK_NOTEBOOK(window->nav_notebook), pagenum); + gtk_notebook_remove_page(GTK_NOTEBOOK(window->meta_notebook), pagenum); } void @@ -361,14 +383,40 @@ nautilus_window_request_location_change(NautilusWindow *window, } static void -nautilus_window_real_request_location_change (NautilusWindow *window, - NautilusLocationReference loc, - GtkWidget *requesting_view) +nautilus_window_change_location(NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view, + gboolean is_back) { guint signum; GSList *cur; NautilusNavigationInfo loci_spot, *loci; + /* Update history */ + if(is_back) + { + window->uris_next = g_slist_prepend(window->uris_next, window->uris_prev->data); + window->uris_prev = g_slist_remove(window->uris_prev, window->uris_prev->data); + } + else + { + char *append_val; + if(window->uris_next && !strcmp(loc, window->uris_next->data)) + { + append_val = window->uris_next->data; + window->uris_next = g_slist_remove(window->uris_next, window->uris_next->data); + } + else + { + append_val = g_strdup(loc); + g_slist_foreach(window->uris_next, (GFunc)g_free, NULL); + g_slist_free(window->uris_next); + } + window->uris_prev = g_slist_prepend(window->uris_prev, append_val); + } + gtk_widget_set_sensitive(window->btn_back, window->uris_prev?TRUE:FALSE); + gtk_widget_set_sensitive(window->btn_fwd, window->uris_next?TRUE:FALSE); + memset(&loci_spot, 0, sizeof(loci_spot)); loci = &loci_spot; loci->requested_uri = loci->actual_uri = loc; @@ -377,7 +425,7 @@ nautilus_window_real_request_location_change (NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) gtk_signal_emit(GTK_OBJECT(cur->data), signum, loci, window->content_view, requesting_view); gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); @@ -388,10 +436,17 @@ nautilus_window_real_request_location_change (NautilusWindow *window, window->actual_current_uri = loci->actual_uri; } +static void +nautilus_window_real_request_location_change (NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view) +{ + nautilus_window_change_location(window, loc, requesting_view, FALSE); +} + void nautilus_window_save_state(NautilusWindow *window, const char *config_path) { -#if 0 GSList *cur; int n; guint signum; @@ -400,7 +455,7 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_push_prefix(config_path); if(window->content_view) { - gnome_config_set_string("content_view_type", gtk_type_name(GTK_OBJECT_TYPE(window->content_view))); + gnome_config_set_string("content_view_type", NAUTILUS_VIEW(window->content_view)->iid); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); gnome_config_push_prefix(cbuf); @@ -413,16 +468,21 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_set_string("content_view_type", "NONE"); - n = g_slist_length(window->nav_views); - gnome_config_set_int("num_nav_views", n); + n = g_slist_length(window->meta_views); signum = gtk_signal_lookup("save_state", nautilus_view_get_type()); - for(n = 0, cur = window->nav_views; cur; cur = cur->next, n++) + for(n = 0, cur = window->meta_views; cur; cur = cur->next, n++) { - g_snprintf(cbuf, sizeof(cbuf), "nav_view_%d_type=0", n); + if(!NAUTILUS_VIEW(cur->data)->iid) + { + continue; + n--; + } - gnome_config_set_string(cbuf, gtk_type_name(GTK_OBJECT_TYPE(cur->data))); + g_snprintf(cbuf, sizeof(cbuf), "meta_view_%d_type=0", n); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, n); + gnome_config_set_string(cbuf, NAUTILUS_VIEW(cur->data)->iid); + + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, n); gnome_config_push_prefix(cbuf); @@ -430,50 +490,45 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_pop_prefix(); } + gnome_config_set_int("num_meta_views", n); gnome_config_pop_prefix(); -#endif } void nautilus_window_set_initial_state(NautilusWindow *window) { -#if 0 GSList *cur; GtkRequisition sreq; GdkGeometry geo; + NautilusView *view; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, - NAUTILUS_VIEW(gtk_widget_new(nautilus_content_gtkhtml_get_type(), - "main_window", window, NULL)) + view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), + "main_window", window, NULL)) ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_location_get_type(), - "main_window", window, NULL)) - ); - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_history_get_type(), - "main_window", window, NULL)) - ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_tree_get_type(), - "main_window", window, NULL)) + nautilus_view_load_client(view, "control:clock"); + nautilus_window_add_meta_view(window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), + "main_window", window, NULL)) ); + nautilus_view_load_client(view, "control:clock"); gtk_widget_size_request(GTK_WIDGET(window), &sreq); gtk_widget_size_request(GTK_WIDGET(window->content_hbox), &sreq); - gtk_widget_size_request(GTK_WIDGET(window->nav_notebook), &sreq); - geo.min_width = window->nav_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); - geo.min_height = window->nav_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); + gtk_widget_size_request(GTK_WIDGET(window->meta_notebook), &sreq); + geo.min_width = window->meta_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); + geo.min_height = window->meta_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); geo.base_width = geo.min_width; geo.base_height = geo.min_height; gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geo, GDK_HINT_BASE_SIZE|GDK_HINT_MIN_SIZE); gtk_window_set_default_size(GTK_WINDOW(window), geo.min_width, geo.min_height); +#ifndef CONTENTS_AS_HBOX gtk_paned_set_position(GTK_PANED(window->content_hbox), MAX(400, GTK_WIDGET(window->content_view)->requisition.width)); #endif } @@ -481,7 +536,6 @@ nautilus_window_set_initial_state(NautilusWindow *window) void nautilus_window_load_state(NautilusWindow *window, const char *config_path) { -#if 0 char *vtype; GSList *cur; int i, n; @@ -489,7 +543,7 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) char cbuf[1024]; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, NULL); @@ -502,13 +556,9 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) if(vtype && strcmp(vtype, "NONE")) /* Create new content view */ { GtkWidget *w; - GtkType wt; - - wt = gtk_type_from_name(vtype); - g_assert(wt); - g_assert(gtk_type_is_a(wt, NAUTILUS_TYPE_VIEW)); - w = gtk_widget_new(wt, "main_window", window, NULL); + w = gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(w), vtype); nautilus_window_set_content_view(window, NAUTILUS_VIEW(w)); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); @@ -520,23 +570,18 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } g_free(vtype); - n = gnome_config_get_int("num_nav_views=0"); + n = gnome_config_get_int("num_meta_views=0"); for(i = 0; i < n; n++) { - GtkType nvt; GtkWidget *nvw; - g_snprintf(cbuf, sizeof(cbuf), "%s/nav_view_%d_type=0", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/meta_view_%d_type=0", config_path, i); vtype = gnome_config_get_string(cbuf); - nvt = gtk_type_from_name(vtype); - g_free(vtype); - g_assert(nvt); - - g_assert(gtk_type_is_a(nvt, NAUTILUS_TYPE_VIEW)); - nvw = gtk_widget_new(nvt, "main_window", window, NULL); + nvw = gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(nvw), vtype); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, i); gnome_config_push_prefix(cbuf); gtk_signal_emit(GTK_OBJECT(cur->data), signum, cbuf); @@ -546,5 +591,28 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } gnome_config_pop_prefix(); -#endif +} + +static void +nautilus_window_back (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_prev); + + uri = window->uris_prev->data; + + nautilus_window_change_location(window, uri, NULL, TRUE); +} + +static void +nautilus_window_fwd (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_next); + + uri = window->uris_next->data; + + nautilus_window_change_location(window, uri, NULL, FALSE); } diff --git a/src/nautilus-window.h b/src/nautilus-window.h index 3fcfc42a9..5f0c291b7 100644 --- a/src/nautilus-window.h +++ b/src/nautilus-window.h @@ -3,6 +3,7 @@ #include <libgnomeui/gnome-app.h> #include "ntl-types.h" +#include "ntl-view.h" #define NAUTILUS_TYPE_WINDOW (nautilus_window_get_type()) #define NAUTILUS_WINDOW(obj) (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_WINDOW, NautilusWindow)) @@ -28,9 +29,11 @@ struct _NautilusWindow { GtkWidget *content_view; - GSList *nav_views; - GtkWidget *nav_notebook, *content_hbox, *btn_back, *btn_fwd; + GSList *meta_views; + GtkWidget *meta_notebook, *content_hbox, *btn_back, *btn_fwd; NautilusLocationReference current_uri, actual_current_uri; + + GSList *uris_prev, *uris_next; }; GtkType nautilus_window_get_type(void); @@ -41,5 +44,8 @@ void nautilus_window_request_location_change(NautilusWindow *window, void nautilus_window_save_state(NautilusWindow *window, const char *config_path); void nautilus_window_load_state(NautilusWindow *window, const char *config_path); void nautilus_window_set_initial_state(NautilusWindow *window); +void nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view); +void nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view); +void nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view); #endif diff --git a/src/ntl-main.c b/src/ntl-main.c index e089cbce7..f4e0c220f 100644 --- a/src/ntl-main.c +++ b/src/ntl-main.c @@ -2,6 +2,7 @@ #include "nautilus.h" #include <gnome.h> #include <libgnorba/gnorba.h> +#include <bonobo/gnome-bonobo.h> static int window_count = 0; static void @@ -22,13 +23,16 @@ int main(int argc, char *argv[]) GtkWidget *mainwin; orb = gnome_CORBA_init_with_popt_table("nautilus", VERSION, &argc, argv, options, 0, &ctx, GNORBA_INIT_SERVER_FUNC, &ev); + bonobo_init(orb, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL); mainwin = gtk_widget_new(nautilus_window_get_type(), "app_id", "nautilus", NULL); + bonobo_activate(); + nautilus_window_set_initial_state(NAUTILUS_WINDOW(mainwin)); gtk_widget_show(mainwin); window_count++; gtk_signal_connect(GTK_OBJECT(mainwin), "destroy", check_for_quit, NULL); - gtk_main(); + bonobo_main(); return 0; } diff --git a/src/ntl-view.c b/src/ntl-view.c index b960ccbd7..aa180e5a4 100644 --- a/src/ntl-view.c +++ b/src/ntl-view.c @@ -33,6 +33,7 @@ enum { }; static void nautilus_view_init (NautilusView *view); +static void nautilus_view_constructed(NautilusView *view); static void nautilus_view_class_init (NautilusViewClass *klass); static void nautilus_view_set_arg (GtkObject *object, GtkArg *arg, @@ -89,7 +90,6 @@ gtk_marshal_NONE__BOXED_OBJECT_BOXED (GtkObject * object, func_data); } - static void nautilus_view_class_init (NautilusViewClass *klass) { @@ -108,6 +108,7 @@ nautilus_view_class_init (NautilusViewClass *klass) klass->notify_location_change = NULL; klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); + klass->view_constructed = nautilus_view_constructed; i = 0; klass->view_signals[i++] = gtk_signal_new("notify_location_change", @@ -140,16 +141,21 @@ nautilus_view_class_init (NautilusViewClass *klass) GTK_TYPE_OBJECT, GTK_ARG_READWRITE|GTK_ARG_CONSTRUCT, ARG_MAIN_WINDOW); + klass->num_construct_args++; } static void nautilus_view_set_arg (GtkObject *object, GtkArg *arg, - guint arg_id) + guint arg_id) { + NautilusView *view; + + view = NAUTILUS_VIEW(object); switch(arg_id) { case ARG_MAIN_WINDOW: - NAUTILUS_VIEW(object)->main_window = GTK_WIDGET(GTK_VALUE_OBJECT(*arg)); + view->main_window = GTK_WIDGET(GTK_VALUE_OBJECT(*arg)); + nautilus_view_construct_arg_set(view); break; } } @@ -170,7 +176,28 @@ static void nautilus_view_init (NautilusView *view) { GTK_WIDGET_SET_FLAGS (view, GTK_NO_WINDOW); - +} + +static void +nautilus_view_constructed(NautilusView *view) +{ +} + +void +nautilus_view_construct_arg_set(NautilusView *view) +{ + guint nca; + NautilusViewClass *klass; + + klass = NAUTILUS_VIEW_CLASS(((GtkObject *)view)->klass); + nca = klass->num_construct_args; + if(view->construct_arg_count >= nca) + return; + + view->construct_arg_count++; + if((view->construct_arg_count >= nca) + && klass->view_constructed) + klass->view_constructed(view); } void @@ -219,3 +246,20 @@ nautilus_view_size_allocate (GtkWidget *widget, if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) gtk_widget_size_allocate (bin->child, &child_allocation); } + +void +nautilus_view_load_client(NautilusView *view, + const char * iid) +{ + if(view->client) + { + g_free(view->iid); view->iid = NULL; + gtk_container_remove(GTK_CONTAINER(view), view->client); view->client = NULL; + } + + view->client = gnome_bonobo_widget_new_control((char *)iid); + g_return_if_fail(view->client); + view->iid = g_strdup(iid); + gtk_widget_show(view->client); + gtk_container_add(GTK_CONTAINER(view), view->client); +} diff --git a/src/ntl-view.h b/src/ntl-view.h index 69e6b7df2..53e60e4ee 100644 --- a/src/ntl-view.h +++ b/src/ntl-view.h @@ -22,6 +22,7 @@ #include <gtk/gtkwidget.h> #include <gtk/gtkbin.h> #include "ntl-types.h" +#include <bonobo/gnome-bonobo.h> #ifdef __cplusplus extern "C" { @@ -38,28 +39,41 @@ typedef struct _NautilusViewClass NautilusViewClass; struct _NautilusView { - GtkBin parent; + GtkBin parent; - GtkWidget *main_window; + GtkWidget *main_window; + + char *iid; + GtkWidget *client; + + guint construct_arg_count; }; struct _NautilusViewClass { - GtkBinClass parent_spot; + GtkBinClass parent_spot; - void (*notify_location_change) (NautilusView *view, + void (*notify_location_change) (NautilusView *view, NautilusNavigationInfo *nav_context); - void (*load_state) (NautilusView *view, const char *config_path); - void (*save_state) (NautilusView *view, const char *config_path); - void (*show_properties) (NautilusView *view); + void (*load_state) (NautilusView *view, const char *config_path); + void (*save_state) (NautilusView *view, const char *config_path); + void (*show_properties) (NautilusView *view); - GtkBinClass *parent_class; - guint view_signals[3]; + void (*view_constructed) (NautilusView *view); /* Not a signal. Work-around for Gtk+'s lack of a 'constructed' operation */ + + GtkBinClass *parent_class; + guint view_signals[3]; + guint num_construct_args; }; GtkType nautilus_view_get_type (void); void nautilus_view_request_location_change (NautilusView *view, NautilusLocationReference loc); +void nautilus_view_load_client (NautilusView *view, + const char * iid); + +/* This is a "protected" operation */ +void nautilus_view_construct_arg_set(NautilusView *view); #ifdef __cplusplus } diff --git a/src/ntl-window.c b/src/ntl-window.c index 6b2dcc650..e2398492c 100644 --- a/src/ntl-window.c +++ b/src/ntl-window.c @@ -4,6 +4,8 @@ static void nautilus_window_class_init (NautilusWindowClass *klass); static void nautilus_window_init (NautilusWindow *window); +static void nautilus_window_back (NautilusWindow *window); +static void nautilus_window_fwd (NautilusWindow *window); static void nautilus_window_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); @@ -16,6 +18,8 @@ static void nautilus_window_real_request_location_change (NautilusWindow *window NautilusLocationReference loc, GtkWidget *requesting_view); +#define CONTENTS_AS_HBOX + GtkType nautilus_window_get_type(void) { @@ -183,12 +187,16 @@ nautilus_window_constructed(NautilusWindow *window) wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_BACK); window->btn_back = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_back), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_back, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_back), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_back), "clicked", nautilus_window_back, NULL); wtmp = gnome_stock_pixmap_widget(GTK_WIDGET(window), GNOME_STOCK_PIXMAP_FORWARD); window->btn_fwd = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(window->btn_fwd), GTK_RELIEF_NONE); + gtk_widget_set_sensitive(window->btn_fwd, FALSE); gtk_container_add(GTK_CONTAINER(window->btn_fwd), wtmp); + gtk_signal_connect(GTK_OBJECT(window->btn_fwd), "clicked", nautilus_window_fwd, NULL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_back, FALSE, FALSE, GNOME_PAD_SMALL); gtk_box_pack_start(GTK_BOX(menu_hbox), window->btn_fwd, FALSE, FALSE, GNOME_PAD_SMALL); @@ -197,17 +205,21 @@ nautilus_window_constructed(NautilusWindow *window) gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); +#ifdef CONTENTS_AS_HBOX + window->content_hbox = gtk_hbox_new(FALSE, GNOME_PAD_SMALL); +#else window->content_hbox = gtk_hpaned_new(); - gtk_widget_show(window->content_hbox); +#endif gnome_app_set_contents(app, window->content_hbox); - window->nav_notebook = gtk_notebook_new(); - gtk_widget_show(window->nav_notebook); -#if 0 - gtk_box_pack_end(GTK_BOX(window->content_hbox), window->nav_notebook, FALSE, FALSE, GNOME_PAD); + window->meta_notebook = gtk_notebook_new(); + gtk_widget_show(window->meta_notebook); +#ifdef CONTENTS_AS_HBOX + gtk_box_pack_end(GTK_BOX(window->content_hbox), window->meta_notebook, FALSE, FALSE, GNOME_PAD); #else - gtk_paned_pack2(GTK_PANED(window->content_hbox), window->nav_notebook, TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(window->content_hbox), window->meta_notebook, TRUE, TRUE); #endif + gtk_widget_show_all(window->content_hbox); } static void @@ -240,7 +252,7 @@ nautilus_window_set_arg (GtkObject *object, { gtk_widget_ref(GTK_WIDGET(window->content_view)); gtk_container_remove(GTK_CONTAINER(window->content_hbox), GTK_WIDGET(window->content_view)); -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -248,7 +260,7 @@ nautilus_window_set_arg (GtkObject *object, gtk_widget_unref(GTK_WIDGET(window->content_view)); } else -#if 0 +#ifdef CONTENTS_AS_HBOX gtk_box_pack_start(GTK_BOX(window->content_hbox), new_cv, TRUE, TRUE, GNOME_PAD); #else gtk_paned_pack1(GTK_PANED(window->content_hbox), new_cv, TRUE, FALSE); @@ -295,55 +307,65 @@ nautilus_window_close (GtkWidget *widget, } void -nautilus_window_set_content_view(NautilusWindow *window, GtkWidget *content_view) +nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view) { gtk_object_set(GTK_OBJECT(window), "content_view", content_view, NULL); gtk_widget_show(GTK_WIDGET(content_view)); } static gboolean -nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *nav_view) +nautilus_window_send_show_properties(GtkWidget *dockitem, GdkEventButton *event, NautilusView *meta_view) { if(event->button != 3) return FALSE; gtk_signal_emit_stop_by_name(GTK_OBJECT(dockitem), "button_press_event"); - gtk_signal_emit_by_name(GTK_OBJECT(nav_view), "show_properties"); + gtk_signal_emit_by_name(GTK_OBJECT(meta_view), "show_properties"); return TRUE; } void -nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view) { GtkWidget *label; + const char *desc; + char cbuf[32]; - g_return_if_fail(!g_slist_find(window->nav_views, nav_view)); - g_return_if_fail(NAUTILUS_IS_META_VIEW(nav_view)); + g_return_if_fail(!g_slist_find(window->meta_views, meta_view)); + g_return_if_fail(NAUTILUS_IS_META_VIEW(meta_view)); - label = gtk_label_new(nautilus_meta_view_get_description(NAUTILUS_META_VIEW(nav_view))); + desc = nautilus_meta_view_get_description(NAUTILUS_META_VIEW(meta_view)); + if(!desc) + { + desc = cbuf; + g_snprintf(cbuf, sizeof(cbuf), "%p", meta_view); + } + label = gtk_label_new(desc); gtk_widget_show(label); - gtk_notebook_prepend_page(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view), label); - gtk_widget_show(GTK_WIDGET(nav_view)); + gtk_signal_connect(GTK_OBJECT(label), "button_press_event", + GTK_SIGNAL_FUNC(nautilus_window_send_show_properties), meta_view); + gtk_notebook_prepend_page(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view), label); + gtk_widget_show(GTK_WIDGET(meta_view)); - window->nav_views = g_slist_prepend(window->nav_views, nav_view); + window->meta_views = g_slist_prepend(window->meta_views, meta_view); } void -nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *nav_view) +nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view) { gint pagenum; - g_return_if_fail(g_slist_find(window->nav_views, nav_view)); + g_return_if_fail(g_slist_find(window->meta_views, meta_view)); - window->nav_views = g_slist_remove(window->nav_views, nav_view); + window->meta_views = g_slist_remove(window->meta_views, meta_view); - pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->nav_notebook), GTK_WIDGET(nav_view)); + pagenum = gtk_notebook_page_num(GTK_NOTEBOOK(window->meta_notebook), GTK_WIDGET(meta_view)); g_return_if_fail(pagenum >= 0); - gtk_notebook_remove_page(GTK_NOTEBOOK(window->nav_notebook), pagenum); + gtk_notebook_remove_page(GTK_NOTEBOOK(window->meta_notebook), pagenum); } void @@ -361,14 +383,40 @@ nautilus_window_request_location_change(NautilusWindow *window, } static void -nautilus_window_real_request_location_change (NautilusWindow *window, - NautilusLocationReference loc, - GtkWidget *requesting_view) +nautilus_window_change_location(NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view, + gboolean is_back) { guint signum; GSList *cur; NautilusNavigationInfo loci_spot, *loci; + /* Update history */ + if(is_back) + { + window->uris_next = g_slist_prepend(window->uris_next, window->uris_prev->data); + window->uris_prev = g_slist_remove(window->uris_prev, window->uris_prev->data); + } + else + { + char *append_val; + if(window->uris_next && !strcmp(loc, window->uris_next->data)) + { + append_val = window->uris_next->data; + window->uris_next = g_slist_remove(window->uris_next, window->uris_next->data); + } + else + { + append_val = g_strdup(loc); + g_slist_foreach(window->uris_next, (GFunc)g_free, NULL); + g_slist_free(window->uris_next); + } + window->uris_prev = g_slist_prepend(window->uris_prev, append_val); + } + gtk_widget_set_sensitive(window->btn_back, window->uris_prev?TRUE:FALSE); + gtk_widget_set_sensitive(window->btn_fwd, window->uris_next?TRUE:FALSE); + memset(&loci_spot, 0, sizeof(loci_spot)); loci = &loci_spot; loci->requested_uri = loci->actual_uri = loc; @@ -377,7 +425,7 @@ nautilus_window_real_request_location_change (NautilusWindow *window, signum = gtk_signal_lookup("notify_location_change", nautilus_view_get_type()); - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) gtk_signal_emit(GTK_OBJECT(cur->data), signum, loci, window->content_view, requesting_view); gtk_signal_emit(GTK_OBJECT(window->content_view), signum, loci, window->content_view, requesting_view); @@ -388,10 +436,17 @@ nautilus_window_real_request_location_change (NautilusWindow *window, window->actual_current_uri = loci->actual_uri; } +static void +nautilus_window_real_request_location_change (NautilusWindow *window, + NautilusLocationReference loc, + GtkWidget *requesting_view) +{ + nautilus_window_change_location(window, loc, requesting_view, FALSE); +} + void nautilus_window_save_state(NautilusWindow *window, const char *config_path) { -#if 0 GSList *cur; int n; guint signum; @@ -400,7 +455,7 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_push_prefix(config_path); if(window->content_view) { - gnome_config_set_string("content_view_type", gtk_type_name(GTK_OBJECT_TYPE(window->content_view))); + gnome_config_set_string("content_view_type", NAUTILUS_VIEW(window->content_view)->iid); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); gnome_config_push_prefix(cbuf); @@ -413,16 +468,21 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_set_string("content_view_type", "NONE"); - n = g_slist_length(window->nav_views); - gnome_config_set_int("num_nav_views", n); + n = g_slist_length(window->meta_views); signum = gtk_signal_lookup("save_state", nautilus_view_get_type()); - for(n = 0, cur = window->nav_views; cur; cur = cur->next, n++) + for(n = 0, cur = window->meta_views; cur; cur = cur->next, n++) { - g_snprintf(cbuf, sizeof(cbuf), "nav_view_%d_type=0", n); + if(!NAUTILUS_VIEW(cur->data)->iid) + { + continue; + n--; + } - gnome_config_set_string(cbuf, gtk_type_name(GTK_OBJECT_TYPE(cur->data))); + g_snprintf(cbuf, sizeof(cbuf), "meta_view_%d_type=0", n); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, n); + gnome_config_set_string(cbuf, NAUTILUS_VIEW(cur->data)->iid); + + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, n); gnome_config_push_prefix(cbuf); @@ -430,50 +490,45 @@ nautilus_window_save_state(NautilusWindow *window, const char *config_path) gnome_config_pop_prefix(); } + gnome_config_set_int("num_meta_views", n); gnome_config_pop_prefix(); -#endif } void nautilus_window_set_initial_state(NautilusWindow *window) { -#if 0 GSList *cur; GtkRequisition sreq; GdkGeometry geo; + NautilusView *view; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, - NAUTILUS_VIEW(gtk_widget_new(nautilus_content_gtkhtml_get_type(), - "main_window", window, NULL)) + view = NAUTILUS_VIEW(gtk_widget_new(nautilus_content_view_get_type(), + "main_window", window, NULL)) ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_location_get_type(), - "main_window", window, NULL)) - ); - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_history_get_type(), - "main_window", window, NULL)) - ); - - nautilus_window_add_meta_view(window, NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_tree_get_type(), - "main_window", window, NULL)) + nautilus_view_load_client(view, "control:clock"); + nautilus_window_add_meta_view(window, view = NAUTILUS_VIEW(gtk_widget_new(nautilus_meta_view_get_type(), + "main_window", window, NULL)) ); + nautilus_view_load_client(view, "control:clock"); gtk_widget_size_request(GTK_WIDGET(window), &sreq); gtk_widget_size_request(GTK_WIDGET(window->content_hbox), &sreq); - gtk_widget_size_request(GTK_WIDGET(window->nav_notebook), &sreq); - geo.min_width = window->nav_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); - geo.min_height = window->nav_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); + gtk_widget_size_request(GTK_WIDGET(window->meta_notebook), &sreq); + geo.min_width = window->meta_notebook->requisition.width + MAX(400, GTK_WIDGET(window->content_view)->requisition.width); + geo.min_height = window->meta_notebook->requisition.height + MAX(200, GTK_WIDGET(window->content_view)->requisition.height); geo.base_width = geo.min_width; geo.base_height = geo.min_height; gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geo, GDK_HINT_BASE_SIZE|GDK_HINT_MIN_SIZE); gtk_window_set_default_size(GTK_WINDOW(window), geo.min_width, geo.min_height); +#ifndef CONTENTS_AS_HBOX gtk_paned_set_position(GTK_PANED(window->content_hbox), MAX(400, GTK_WIDGET(window->content_view)->requisition.width)); #endif } @@ -481,7 +536,6 @@ nautilus_window_set_initial_state(NautilusWindow *window) void nautilus_window_load_state(NautilusWindow *window, const char *config_path) { -#if 0 char *vtype; GSList *cur; int i, n; @@ -489,7 +543,7 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) char cbuf[1024]; /* Remove old stuff */ - for(cur = window->nav_views; cur; cur = cur->next) + for(cur = window->meta_views; cur; cur = cur->next) nautilus_window_remove_meta_view(window, NAUTILUS_VIEW(cur->data)); nautilus_window_set_content_view(window, NULL); @@ -502,13 +556,9 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) if(vtype && strcmp(vtype, "NONE")) /* Create new content view */ { GtkWidget *w; - GtkType wt; - - wt = gtk_type_from_name(vtype); - g_assert(wt); - g_assert(gtk_type_is_a(wt, NAUTILUS_TYPE_VIEW)); - w = gtk_widget_new(wt, "main_window", window, NULL); + w = gtk_widget_new(nautilus_content_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(w), vtype); nautilus_window_set_content_view(window, NAUTILUS_VIEW(w)); g_snprintf(cbuf, sizeof(cbuf), "%s/Content_View/", config_path); @@ -520,23 +570,18 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } g_free(vtype); - n = gnome_config_get_int("num_nav_views=0"); + n = gnome_config_get_int("num_meta_views=0"); for(i = 0; i < n; n++) { - GtkType nvt; GtkWidget *nvw; - g_snprintf(cbuf, sizeof(cbuf), "%s/nav_view_%d_type=0", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/meta_view_%d_type=0", config_path, i); vtype = gnome_config_get_string(cbuf); - nvt = gtk_type_from_name(vtype); - g_free(vtype); - g_assert(nvt); - - g_assert(gtk_type_is_a(nvt, NAUTILUS_TYPE_VIEW)); - nvw = gtk_widget_new(nvt, "main_window", window, NULL); + nvw = gtk_widget_new(nautilus_meta_view_get_type(), "main_window", window, NULL); + nautilus_view_load_client(NAUTILUS_VIEW(nvw), vtype); - g_snprintf(cbuf, sizeof(cbuf), "%s/Nav_View_%d/", config_path, i); + g_snprintf(cbuf, sizeof(cbuf), "%s/Meta_View_%d/", config_path, i); gnome_config_push_prefix(cbuf); gtk_signal_emit(GTK_OBJECT(cur->data), signum, cbuf); @@ -546,5 +591,28 @@ nautilus_window_load_state(NautilusWindow *window, const char *config_path) } gnome_config_pop_prefix(); -#endif +} + +static void +nautilus_window_back (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_prev); + + uri = window->uris_prev->data; + + nautilus_window_change_location(window, uri, NULL, TRUE); +} + +static void +nautilus_window_fwd (NautilusWindow *window) +{ + char *uri; + + g_assert(window->uris_next); + + uri = window->uris_next->data; + + nautilus_window_change_location(window, uri, NULL, FALSE); } diff --git a/src/ntl-window.h b/src/ntl-window.h index 3fcfc42a9..5f0c291b7 100644 --- a/src/ntl-window.h +++ b/src/ntl-window.h @@ -3,6 +3,7 @@ #include <libgnomeui/gnome-app.h> #include "ntl-types.h" +#include "ntl-view.h" #define NAUTILUS_TYPE_WINDOW (nautilus_window_get_type()) #define NAUTILUS_WINDOW(obj) (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_WINDOW, NautilusWindow)) @@ -28,9 +29,11 @@ struct _NautilusWindow { GtkWidget *content_view; - GSList *nav_views; - GtkWidget *nav_notebook, *content_hbox, *btn_back, *btn_fwd; + GSList *meta_views; + GtkWidget *meta_notebook, *content_hbox, *btn_back, *btn_fwd; NautilusLocationReference current_uri, actual_current_uri; + + GSList *uris_prev, *uris_next; }; GtkType nautilus_window_get_type(void); @@ -41,5 +44,8 @@ void nautilus_window_request_location_change(NautilusWindow *window, void nautilus_window_save_state(NautilusWindow *window, const char *config_path); void nautilus_window_load_state(NautilusWindow *window, const char *config_path); void nautilus_window_set_initial_state(NautilusWindow *window); +void nautilus_window_set_content_view(NautilusWindow *window, NautilusView *content_view); +void nautilus_window_add_meta_view(NautilusWindow *window, NautilusView *meta_view); +void nautilus_window_remove_meta_view(NautilusWindow *window, NautilusView *meta_view); #endif |