[PATCH] Improve session management, attempt 2
- From: Christian Neumair <chris gnome-de org>
- To: nautilus-list <nautilus-list gnome org>
- Subject: [PATCH] Improve session management, attempt 2
- Date: Fri, 16 Jun 2006 16:01:00 +0200
The attached patch is a new attempt to implement session management,
this time the calls are proxied through NautilusShell (thus operating on
the server), session names are generated on the fly and a
"--load-session" parameter was added. Also, the session file is not
removed when it is not readable or no regular file, so that one can
manually load a particular session on startup.
--
Christian Neumair <chris gnome-de org>
? src/.nautilus-application.c.swp
Index: configure.in
===================================================================
RCS file: /cvs/gnome/nautilus/configure.in,v
retrieving revision 1.675
diff -u -p -r1.675 configure.in
--- configure.in 12 Jun 2006 12:35:55 -0000 1.675
+++ configure.in 16 Jun 2006 13:58:45 -0000
@@ -109,7 +109,7 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GET
AM_GLIB_GNU_GETTEXT
GLIB_DEFINE_LOCALEDIR(GNOMELOCALEDIR)
-IT_PROG_INTLTOOL([0.34.90])
+IT_PROG_INTLTOOL([0.34.2])
dnl ==========================================================================
Index: libnautilus-private/nautilus-global-preferences.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-global-preferences.c,v
retrieving revision 1.226
diff -u -p -r1.226 nautilus-global-preferences.c
--- libnautilus-private/nautilus-global-preferences.c 18 Mar 2006 07:13:49 -0000 1.226
+++ libnautilus-private/nautilus-global-preferences.c 16 Jun 2006 13:58:48 -0000
@@ -384,6 +384,10 @@ static const PreferenceDefault preferenc
PREFERENCE_STRING,
""
},
+ { NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_MAXIMIZED,
+ PREFERENCE_BOOLEAN,
+ GINT_TO_POINTER (FALSE)
+ },
{ NAUTILUS_PREFERENCES_TREE_SHOW_ONLY_DIRECTORIES,
PREFERENCE_BOOLEAN,
GINT_TO_POINTER (TRUE)
Index: libnautilus-private/nautilus-global-preferences.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-global-preferences.h,v
retrieving revision 1.132
diff -u -p -r1.132 nautilus-global-preferences.h
--- libnautilus-private/nautilus-global-preferences.h 15 Dec 2005 14:32:57 -0000 1.132
+++ libnautilus-private/nautilus-global-preferences.h 16 Jun 2006 13:58:49 -0000
@@ -88,6 +88,7 @@ typedef enum
#define NAUTILUS_PREFERENCES_START_WITH_TOOLBAR "preferences/start_with_toolbar"
#define NAUTILUS_PREFERENCES_SIDE_PANE_VIEW "preferences/side_pane_view"
#define NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_SAVED_GEOMETRY "preferences/navigation_window_saved_geometry"
+#define NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_MAXIMIZED "preferences/navigation_window_saved_maximized"
/* Sorting order */
#define NAUTILUS_PREFERENCES_SORT_DIRECTORIES_FIRST "preferences/sort_directories_first"
Index: libnautilus-private/nautilus-metadata.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-metadata.h,v
retrieving revision 1.30
diff -u -p -r1.30 nautilus-metadata.h
--- libnautilus-private/nautilus-metadata.h 11 Oct 2004 08:10:42 -0000 1.30
+++ libnautilus-private/nautilus-metadata.h 16 Jun 2006 13:58:49 -0000
@@ -55,6 +55,7 @@
#define NAUTILUS_METADATA_KEY_WINDOW_GEOMETRY "window_geometry"
#define NAUTILUS_METADATA_KEY_WINDOW_SCROLL_POSITION "window_scroll_position"
#define NAUTILUS_METADATA_KEY_WINDOW_SHOW_HIDDEN_FILES "window_show_hidden_files"
+#define NAUTILUS_METADATA_KEY_WINDOW_MAXIMIZED "window_maximized"
#define NAUTILUS_METADATA_KEY_SIDEBAR_BACKGROUND_COLOR "sidebar_background_color"
#define NAUTILUS_METADATA_KEY_SIDEBAR_BACKGROUND_IMAGE "sidebar_background_tile_image"
Index: src/nautilus-application.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-application.c,v
retrieving revision 1.241
diff -u -p -r1.241 nautilus-application.c
--- src/nautilus-application.c 22 Mar 2006 09:04:21 -0000 1.241
+++ src/nautilus-application.c 16 Jun 2006 13:59:00 -0000
@@ -52,8 +52,11 @@
#include "nautilus-shell.h"
#include "nautilus-window-bookmarks.h"
#include "nautilus-window-private.h"
+#include "nautilus-window-manage-views.h"
+#include <glib/gstdio.h>
#include <bonobo/bonobo-main.h>
#include <bonobo/bonobo-object.h>
+#include <eel/eel-gtk-extensions.h>
#include <eel/eel-gtk-macros.h>
#include <eel/eel-stock-dialogs.h>
#include <eel/eel-string-list.h>
@@ -117,6 +120,8 @@ static void update_session
static void init_session (void);
static gboolean is_kdesktop_present (void);
+static char *save_session_to_file (void);
+
BONOBO_CLASS_BOILERPLATE (NautilusApplication, nautilus_application,
BonoboGenericFactory, BONOBO_TYPE_GENERIC_FACTORY)
@@ -448,6 +453,7 @@ nautilus_application_startup (NautilusAp
gboolean browser_window,
const char *startup_id,
const char *geometry,
+ const char *session_to_load,
const char *urls[])
{
CORBA_Environment ev;
@@ -617,6 +623,10 @@ nautilus_application_startup (NautilusAp
} else if (!no_default_window) {
Nautilus_Shell_open_default_window (shell, corba_startup_id, corba_geometry, browser_window, &ev);
}
+
+ if (session_to_load != NULL) {
+ Nautilus_Shell_load_session (shell, session_to_load, &ev);
+ }
/* Add ourselves to the session */
init_session ();
@@ -1129,12 +1139,30 @@ nautilus_application_present_spatial_win
return window;
}
+static gboolean
+another_navigation_window_already_showing (NautilusWindow *the_window)
+{
+ GList *list, *item;
+
+ list = nautilus_application_get_window_list ();
+ for (item = list; item != NULL; item = item->next) {
+ if (item->data != the_window &&
+ NAUTILUS_IS_NAVIGATION_WINDOW (item->data)) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
NautilusWindow *
nautilus_application_create_navigation_window (NautilusApplication *application,
const char *startup_id,
GdkScreen *screen)
{
NautilusWindow *window;
+ char *geometry_string;
+ gboolean maximized;
g_return_val_if_fail (NAUTILUS_IS_APPLICATION (application), NULL);
@@ -1144,6 +1172,31 @@ nautilus_application_create_navigation_w
startup_id);
#endif
+ maximized = eel_preferences_get_boolean
+ (NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_MAXIMIZED);
+ if (maximized) {
+ gtk_window_maximize (GTK_WINDOW (window));
+ } else {
+ gtk_window_unmaximize (GTK_WINDOW (window));
+ }
+
+ geometry_string = eel_preferences_get
+ (NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_SAVED_GEOMETRY);
+ if (geometry_string != NULL &&
+ geometry_string[0] != 0) {
+ /* Ignore saved window position if a window with the same
+ * location is already showing. That way the two windows
+ * wont appear at the exact same location on the screen.
+ */
+ eel_gtk_window_set_initial_geometry_from_string
+ (GTK_WINDOW (window),
+ geometry_string,
+ NAUTILUS_WINDOW_MIN_WIDTH,
+ NAUTILUS_WINDOW_MIN_HEIGHT,
+ another_navigation_window_already_showing (window));
+ }
+ g_free (geometry_string);
+
return window;
}
@@ -1273,41 +1326,265 @@ removed_from_session (GnomeClient *clien
nautilus_main_event_loop_quit ();
}
-static gint
-save_session (GnomeClient *client, gint phase, GnomeSaveStyle save_style, gint shutdown,
- GnomeInteractStyle interact_style, gint fast, gpointer data)
+static char *
+save_session_to_file (void)
{
- NautilusWindow *window;
+ xmlDocPtr doc;
+ xmlNodePtr root_node, history_node;
GList *l;
- static char *clone_argv[] = { "nautilus", "--no-default-window" };
- char **restart_argv;
- int argc;
- int i;
- int num_windows;
-
- num_windows = g_list_length (nautilus_application_window_list);
- if (num_windows > 0) {
- argc = 1 + num_windows;
- i = 0;
- restart_argv = g_new (char *, argc);
- restart_argv[i++] = g_strdup ("nautilus");
- for (l = nautilus_application_window_list; l != NULL; l = l->next) {
- window = NAUTILUS_WINDOW (l->data);
- restart_argv[i++] = nautilus_window_get_location (window);
+ char *dir, *filename;
+ unsigned n_processed;
+
+ doc = xmlNewDoc ("1.0");
+
+ root_node = xmlNewNode (NULL, "session");
+ xmlDocSetRootElement (doc, root_node);
+
+ history_node = xmlNewChild (root_node, NULL, "history", NULL);
+
+ n_processed = 0;
+ for (l = nautilus_get_history_list (); l != NULL; l = l->next) {
+ NautilusBookmark *bookmark;
+ xmlNodePtr bookmark_node;
+ char *tmp;
+
+ bookmark = l->data;
+
+ bookmark_node = xmlNewChild (history_node, NULL, "bookmark", NULL);
+
+ tmp = nautilus_bookmark_get_name (bookmark);
+ xmlNewProp (bookmark_node, "name", tmp);
+ g_free (tmp);
+
+ tmp = nautilus_bookmark_get_icon (bookmark);
+ xmlNewProp (bookmark_node, "icon", tmp);
+ g_free (tmp);
+
+ tmp = nautilus_bookmark_get_uri (bookmark);
+ xmlNewProp (bookmark_node, "uri", tmp);
+ g_free (tmp);
+
+ if (nautilus_bookmark_get_has_custom_name (bookmark)) {
+ xmlNewProp (bookmark_node, "has_custom_name", "TRUE");
}
-
- gnome_client_set_restart_command (client, argc, restart_argv);
- for (i = 0; i < argc; i++) {
- g_free (restart_argv[i]);
+ if (++n_processed > 50) { /* prevent history list from growing arbitrarily large. */
+ break;
}
- g_free (restart_argv);
+ }
+
+ for (l = nautilus_application_window_list; l != NULL; l = l->next) {
+ xmlNodePtr win_node;
+ NautilusWindow *window;
+ char *tmp;
+
+ window = l->data;
+
+ win_node = xmlNewChild (root_node, NULL, "window", NULL);
+
+ xmlNewProp (win_node, "type", NAUTILUS_IS_NAVIGATION_WINDOW (window) ? "navigation" : "spatial");
+
+ if (NAUTILUS_IS_NAVIGATION_WINDOW (window)) { /* spatial windows store their state as file metadata */
+ tmp = eel_gtk_window_get_geometry_string (GTK_WINDOW (window));
+ xmlNewProp (win_node, "geometry", tmp);
+ g_free (tmp);
+
+ if (GTK_WIDGET (window)->window &&
+ gdk_window_get_state (GTK_WIDGET (window)->window) & GDK_WINDOW_STATE_MAXIMIZED) {
+ xmlNewProp (win_node, "maximized", "TRUE");
+ }
+ }
+
+ tmp = nautilus_window_get_location (window);
+ xmlNewProp (win_node, "location", tmp);
+ g_free (tmp);
+ }
+
+ dir = nautilus_get_user_directory ();
+ filename = tempnam (dir, "saved-session-");
+ g_free (dir);
+ g_message ("is %s\n", filename);
+
+ xmlIndentTreeOutput = 1;
+ if (filename == NULL || xmlSaveFormatFile (filename, doc, 1) < 0) {
+ g_message ("failed to save session to %s", filename);
+ g_free (filename);
+ filename = NULL;
+ }
+
+ xmlFreeDoc (doc);
+
+ return filename;
+}
+
+void
+nautilus_application_load_session (NautilusApplication *application,
+ const char *filename)
+{
+ xmlDocPtr doc;
+ gboolean bail;
+
+ g_assert (filename != NULL);
+
+ bail = TRUE;
+
+ if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+ xmlNodePtr root_node;
+
+ doc = xmlReadFile (filename, NULL, 0);
+ if (doc != NULL && (root_node = xmlDocGetRootElement (doc)) != NULL) {
+ xmlNodePtr node;
+
+ bail = FALSE;
+
+ for (node = root_node->children; node != NULL; node = node->next) {
+
+ if (!strcmp (node->name, "text")) {
+ continue;
+ } else if (!strcmp (node->name, "history")) {
+ xmlNodePtr bookmark_node;
+ gboolean emit_change;
+
+ emit_change = FALSE;
+
+ for (bookmark_node = node->children; bookmark_node != NULL; bookmark_node = bookmark_node->next) {
+ if (!strcmp (bookmark_node->name, "text")) {
+ continue;
+ } else if (!strcmp (bookmark_node->name, "bookmark")) {
+ xmlChar *name, *icon, *uri;
+ gboolean has_custom_name;
+
+ uri = xmlGetProp (bookmark_node, "uri");
+ name = xmlGetProp (bookmark_node, "name");
+ has_custom_name = xmlHasProp (bookmark_node, "has_custom_name") ? TRUE : FALSE;
+ icon = xmlGetProp (bookmark_node, "icon");
+
+ emit_change |= nautilus_add_to_history_list_no_notify (uri, name, has_custom_name, icon);
+
+ xmlFree (name);
+ xmlFree (uri);
+ xmlFree (icon);
+ } else {
+ g_message ("unexpected bookmark node %s while parsing %s", bookmark_node->name, filename);
+ bail = TRUE;
+ continue;
+ }
+ }
+
+ if (emit_change) {
+ nautilus_send_history_list_changed ();
+ }
+ } else if (!strcmp (node->name, "window")) {
+ NautilusWindow *window;
+ xmlChar *type, *location;
+
+ type = xmlGetProp (node, "type");
+ if (type == NULL) {
+ g_message ("empty type node while parsing %s", filename);
+ bail = TRUE;
+ continue;
+ }
+
+ location = xmlGetProp (node, "location");
+ if (location == NULL) {
+ g_message ("empty location node while parsing %s", filename);
+ bail = TRUE;
+ xmlFree (type);
+ continue;
+ }
+
+ if (!strcmp (type, "navigation")) {
+ xmlChar *geometry;
+
+ window = nautilus_application_create_navigation_window (application, NULL, gdk_screen_get_default ());
+
+ geometry = xmlGetProp (node, "geometry");
+ if (geometry != NULL) {
+ eel_gtk_window_set_initial_geometry_from_string
+ (GTK_WINDOW (window),
+ geometry,
+ NAUTILUS_WINDOW_MIN_WIDTH,
+ NAUTILUS_WINDOW_MIN_HEIGHT,
+ FALSE);
+ }
+ xmlFree (geometry);
+
+ if (xmlHasProp (node, "maximized")) {
+ gtk_window_maximize (GTK_WINDOW (window));
+ } else {
+ gtk_window_unmaximize (GTK_WINDOW (window));
+ }
+
+ nautilus_window_open_location (window, location, FALSE);
+ } else if (!strcmp (type, "spatial")) {
+ window = nautilus_application_present_spatial_window (application, NULL, NULL, location, gdk_screen_get_default ());
+ } else {
+ g_message ("unknown window type \"%s\" while parsing %s", type, filename);
+ bail = TRUE;
+ }
+
+ xmlFree (type);
+ xmlFree (location);
+ } else {
+ g_message ("unexpected node %s while parsing %s", node->name, filename);
+ bail = TRUE;
+ continue;
+ }
+ }
+ }
+
+ if (doc != NULL) {
+ xmlFreeDoc (doc);
+ }
+ }
+
+ if (bail) {
+ g_message ("failed to load session from %s", filename);
} else {
- gnome_client_set_restart_command (client,
- G_N_ELEMENTS (clone_argv),
- clone_argv);
+ char *uri;
+ GnomeVFSFileInfo *info;
+ /* only remove file if it is regular, user-owned and the user has write access. */
+
+ uri = gnome_vfs_get_uri_from_local_path (filename);
+ info = gnome_vfs_file_info_new ();
+ if (uri != NULL &&
+ gnome_vfs_get_file_info (uri, info, GNOME_VFS_FILE_INFO_DEFAULT) == GNOME_VFS_OK &&
+ (info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) &&
+ (info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS) &&
+ (info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_IDS) &&
+ info->type == GNOME_VFS_FILE_TYPE_REGULAR &&
+ (info->permissions & (GNOME_VFS_PERM_USER_WRITE |
+ GNOME_VFS_PERM_USER_WRITE)) &&
+ info->uid == geteuid ()) {
+ g_remove (filename);
+ }
+ gnome_vfs_file_info_unref (info);
+ g_free (uri);
}
-
+}
+
+static gint
+save_session (GnomeClient *client, gint phase, GnomeSaveStyle save_style, gint shutdown,
+ GnomeInteractStyle interact_style, gint fast, gpointer data)
+{
+ char *argv[4] = { NULL };
+
+ argv[0] = "nautilus";
+ argv[1] = "--no-default-window";
+
+ argv[3] = save_session_to_file ();
+ if (argv[3] != NULL) {
+ argv[2] = "--load-session";
+ }
+
+ gnome_client_set_restart_command (client,
+ G_N_ELEMENTS (argv),
+ argv);
+
+ if (argv[3] != NULL) {
+ g_free (argv[3]);
+ }
+
return TRUE;
}
Index: src/nautilus-application.h
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-application.h,v
retrieving revision 1.40
diff -u -p -r1.40 nautilus-application.h
--- src/nautilus-application.h 26 Feb 2006 11:03:25 -0000 1.40
+++ src/nautilus-application.h 16 Jun 2006 13:59:00 -0000
@@ -69,6 +69,7 @@ void nautilus_applicatio
gboolean browser_window,
const char *startup_id,
const char *default_geometry,
+ const char *session_to_load,
const char *urls[]);
GList * nautilus_application_get_window_list (void);
GList * nautilus_application_get_spatial_window_list (void);
@@ -95,5 +96,6 @@ void nautilus_applicatio
void nautilus_application_close_all_spatial_windows (void);
void nautilus_application_open_desktop (NautilusApplication *application);
void nautilus_application_close_desktop (void);
-
+void nautilus_application_load_session (NautilusApplication *application,
+ const char *filename);
#endif /* NAUTILUS_APPLICATION_H */
Index: src/nautilus-main.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-main.c,v
retrieving revision 1.156
diff -u -p -r1.156 nautilus-main.c
--- src/nautilus-main.c 26 Apr 2006 12:24:43 -0000 1.156
+++ src/nautilus-main.c 16 Jun 2006 13:59:01 -0000
@@ -190,6 +190,7 @@ main (int argc, char *argv[])
gboolean no_desktop;
const char *startup_id;
char *startup_id_copy;
+ char *session_to_load;
gchar *geometry;
const gchar **remaining;
gboolean perform_self_check;
@@ -216,6 +217,8 @@ main (int argc, char *argv[])
{ "restart", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &restart_shell,
N_("Restart Nautilus."), NULL },
{ G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, N_("[URI...]") },
+ { "load-session", 'l', 0, G_OPTION_ARG_STRING, &session_to_load,
+ N_("Load a saved session from the specified file."), N_("FILENAME") },
{ NULL }
};
@@ -243,6 +246,7 @@ main (int argc, char *argv[])
/* Get parameters. */
remaining = NULL;
geometry = NULL;
+ session_to_load = NULL;
kill_shell = FALSE;
no_default_window = FALSE;
no_desktop = FALSE;
@@ -349,6 +353,7 @@ main (int argc, char *argv[])
browser_window,
startup_id_copy,
geometry,
+ session_to_load,
remaining);
g_free (startup_id_copy);
Index: src/nautilus-navigation-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-navigation-window.c,v
retrieving revision 1.445
diff -u -p -r1.445 nautilus-navigation-window.c
--- src/nautilus-navigation-window.c 18 Mar 2006 07:13:50 -0000 1.445
+++ src/nautilus-navigation-window.c 16 Jun 2006 13:59:05 -0000
@@ -560,6 +560,22 @@ nautilus_navigation_window_unrealize (Gt
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
}
+static gboolean
+nautilus_navigation_window_state_event (GtkWidget *widget,
+ GdkEventWindowState *event)
+{
+ if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) {
+ eel_preferences_set_boolean (NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_MAXIMIZED,
+ event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED);
+ }
+
+ if (GTK_WIDGET_CLASS (parent_class)->window_state_event != NULL) {
+ return GTK_WIDGET_CLASS (parent_class)->window_state_event (widget, event);
+ }
+
+ return FALSE;
+}
+
static void
nautilus_navigation_window_destroy (GtkObject *object)
{
@@ -1418,8 +1434,7 @@ nautilus_navigation_window_save_geometry
g_assert (NAUTILUS_IS_WINDOW (window));
- if (GTK_WIDGET(window)->window &&
- !(gdk_window_get_state (GTK_WIDGET(window)->window) & GDK_WINDOW_STATE_MAXIMIZED)) {
+ if (GTK_WIDGET(window)->window) {
geometry_string = eel_gtk_window_get_geometry_string (GTK_WINDOW (window));
if (eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_SAVED_GEOMETRY)) {
@@ -1428,6 +1443,12 @@ nautilus_navigation_window_save_geometry
geometry_string);
}
g_free (geometry_string);
+
+ if (eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_MAXIMIZED)) {
+ eel_preferences_set_boolean
+ (NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_MAXIMIZED,
+ gdk_window_get_state (GTK_WIDGET (window)->window) & GDK_WINDOW_STATE_MAXIMIZED);
+ }
}
}
@@ -1462,6 +1483,7 @@ nautilus_navigation_window_class_init (N
GTK_OBJECT_CLASS (class)->destroy = nautilus_navigation_window_destroy;
GTK_WIDGET_CLASS (class)->show = nautilus_navigation_window_show;
GTK_WIDGET_CLASS (class)->unrealize = nautilus_navigation_window_unrealize;
+ GTK_WIDGET_CLASS (class)->window_state_event = nautilus_navigation_window_state_event;
NAUTILUS_WINDOW_CLASS (class)->load_view_as_menu = real_load_view_as_menu;
NAUTILUS_WINDOW_CLASS (class)->set_content_view_widget = real_set_content_view_widget;
NAUTILUS_WINDOW_CLASS (class)->set_throbber_active = real_set_throbber_active;
Index: src/nautilus-shell-interface.idl
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-shell-interface.idl,v
retrieving revision 1.9
diff -u -p -r1.9 nautilus-shell-interface.idl
--- src/nautilus-shell-interface.idl 19 Oct 2005 07:53:43 -0000 1.9
+++ src/nautilus-shell-interface.idl 16 Jun 2006 13:59:05 -0000
@@ -13,6 +13,7 @@ module Nautilus {
interface Shell : ::Bonobo::Unknown {
void open_windows (in URIList uris, in string startup_id, in string geometry, in boolean browser_window);
void open_default_window (in string startup_id, in string geometry, in boolean browser_window);
+ void load_session (in string filename);
void start_desktop ();
void stop_desktop ();
void quit ();
Index: src/nautilus-shell.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-shell.c,v
retrieving revision 1.62
diff -u -p -r1.62 nautilus-shell.c
--- src/nautilus-shell.c 7 Apr 2006 22:47:22 -0000 1.62
+++ src/nautilus-shell.c 16 Jun 2006 13:59:06 -0000
@@ -72,6 +72,9 @@ static void corba_open_default_windo
const CORBA_char *geometry,
CORBA_boolean browser_window,
CORBA_Environment *ev);
+static void corba_load_session (PortableServer_Servant servant,
+ const CORBA_char *filename,
+ CORBA_Environment *ev);
static void corba_start_desktop (PortableServer_Servant servant,
CORBA_Environment *ev);
static void corba_stop_desktop (PortableServer_Servant servant,
@@ -93,6 +96,7 @@ nautilus_shell_class_init (NautilusShell
klass->epv.open_windows = corba_open_windows;
klass->epv.open_default_window = corba_open_default_window;
+ klass->epv.load_session = corba_load_session;
klass->epv.start_desktop = corba_start_desktop;
klass->epv.stop_desktop = corba_stop_desktop;
klass->epv.quit = corba_quit;
@@ -202,6 +206,20 @@ corba_open_default_window (PortableServe
/* Open a window pointing at the default location. */
open_window (shell, NULL, startup_id, geometry, browser_window);
}
+}
+
+static void
+corba_load_session (PortableServer_Servant servant,
+ const CORBA_char *filename,
+ CORBA_Environment *ev)
+{
+ NautilusShell *shell;
+ NautilusApplication *application;
+
+ shell = NAUTILUS_SHELL (bonobo_object_from_servant (servant));
+ application = NAUTILUS_APPLICATION (shell->details->application);
+
+ nautilus_application_load_session (application, filename);
}
static void
Index: src/nautilus-spatial-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-spatial-window.c,v
retrieving revision 1.459
diff -u -p -r1.459 nautilus-spatial-window.c
--- src/nautilus-spatial-window.c 14 Apr 2006 11:57:23 -0000 1.459
+++ src/nautilus-spatial-window.c 16 Jun 2006 13:59:08 -0000
@@ -192,6 +192,25 @@ nautilus_spatial_window_unrealize (GtkWi
}
}
+static gboolean
+nautilus_spatial_window_state_event (GtkWidget *widget,
+ GdkEventWindowState *event)
+{
+ if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED &&
+ NAUTILUS_WINDOW (widget)->details->viewed_file != NULL) {
+ nautilus_file_set_boolean_metadata (NAUTILUS_WINDOW (widget)->details->viewed_file,
+ NAUTILUS_METADATA_KEY_WINDOW_MAXIMIZED,
+ FALSE,
+ event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED);
+ }
+
+ if (GTK_WIDGET_CLASS (parent_class)->window_state_event != NULL) {
+ return GTK_WIDGET_CLASS (parent_class)->window_state_event (widget, event);
+ }
+
+ return FALSE;
+}
+
static void
nautilus_spatial_window_destroy (GtkObject *object)
{
@@ -984,6 +1003,7 @@ nautilus_spatial_window_class_init (Naut
GTK_WIDGET_CLASS (class)->show = nautilus_spatial_window_show;
GTK_WIDGET_CLASS (class)->configure_event = nautilus_spatial_window_configure_event;
GTK_WIDGET_CLASS (class)->unrealize = nautilus_spatial_window_unrealize;
+ GTK_WIDGET_CLASS (class)->window_state_event = nautilus_spatial_window_state_event;
NAUTILUS_WINDOW_CLASS (class)->prompt_for_location =
real_prompt_for_location;
Index: src/nautilus-window-manage-views.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-window-manage-views.c,v
retrieving revision 1.366
diff -u -p -r1.366 nautilus-window-manage-views.c
--- src/nautilus-window-manage-views.c 8 May 2006 23:12:50 -0000 1.366
+++ src/nautilus-window-manage-views.c 16 Jun 2006 13:59:14 -0000
@@ -657,23 +657,6 @@ nautilus_window_content_view_matches_iid
}
-static gboolean
-another_navigation_window_already_showing (NautilusWindow *the_window)
-{
- GList *list, *item;
-
- list = nautilus_application_get_window_list ();
- for (item = list; item != NULL; item = item->next) {
- if (item->data != the_window &&
- NAUTILUS_IS_NAVIGATION_WINDOW (item->data)) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
/*
* begin_location_change
*
@@ -783,6 +766,7 @@ setup_new_window (NautilusWindow *window
char *show_hidden_file_setting;
char *geometry_string;
char *scroll_string;
+ gboolean maximized;
if (NAUTILUS_IS_SPATIAL_WINDOW (window) && !NAUTILUS_IS_DESKTOP_WINDOW (window)) {
/* load show hidden state */
@@ -801,6 +785,14 @@ setup_new_window (NautilusWindow *window
g_free (show_hidden_file_setting);
/* load the saved window geometry */
+ maximized = nautilus_file_get_boolean_metadata
+ (file, NAUTILUS_METADATA_KEY_WINDOW_MAXIMIZED, FALSE);
+ if (maximized) {
+ gtk_window_maximize (GTK_WINDOW (window));
+ } else {
+ gtk_window_unmaximize (GTK_WINDOW (window));
+ }
+
geometry_string = nautilus_file_get_metadata
(file, NAUTILUS_METADATA_KEY_WINDOW_GEOMETRY, NULL);
if (geometry_string != NULL) {
@@ -829,25 +821,6 @@ setup_new_window (NautilusWindow *window
window->details->pending_scroll_to = scroll_string;
}
}
-
- if (NAUTILUS_IS_NAVIGATION_WINDOW (window)) {
- geometry_string = eel_preferences_get
- (NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_SAVED_GEOMETRY);
- if (geometry_string != NULL &&
- geometry_string[0] != 0) {
- /* Ignore saved window position if a window with the same
- * location is already showing. That way the two windows
- * wont appear at the exact same location on the screen.
- */
- eel_gtk_window_set_initial_geometry_from_string
- (GTK_WINDOW (window),
- geometry_string,
- NAUTILUS_WINDOW_MIN_WIDTH,
- NAUTILUS_WINDOW_MIN_HEIGHT,
- another_navigation_window_already_showing (window));
- }
- g_free (geometry_string);
- }
}
static void
Index: src/nautilus-window-private.h
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-window-private.h,v
retrieving revision 1.113
diff -u -p -r1.113 nautilus-window-private.h
--- src/nautilus-window-private.h 20 Mar 2006 18:40:38 -0000 1.113
+++ src/nautilus-window-private.h 16 Jun 2006 13:59:15 -0000
@@ -203,6 +203,10 @@ void nautilus_window_set_v
void nautilus_send_history_list_changed (void);
void nautilus_window_add_current_location_to_history_list (NautilusWindow *window);
void nautilus_remove_from_history_list_no_notify (const char *location);
+gboolean nautilus_add_to_history_list_no_notify (const char *location,
+ const char *name,
+ gboolean has_custom_name,
+ const char *icon);
GList * nautilus_get_history_list (void);
void nautilus_window_bookmarks_preference_changed_callback (gpointer user_data);
void nautilus_window_update_icon (NautilusWindow *window);
Index: src/nautilus-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-window.c,v
retrieving revision 1.463
diff -u -p -r1.463 nautilus-window.c
--- src/nautilus-window.c 20 Mar 2006 18:40:38 -0000 1.463
+++ src/nautilus-window.c 16 Jun 2006 13:59:19 -0000
@@ -1352,7 +1352,7 @@ remove_from_history_list (NautilusBookma
}
}
-static void
+static gboolean
add_to_history_list (NautilusBookmark *bookmark)
{
/* Note that the history is shared amongst all windows so
@@ -1389,8 +1389,10 @@ add_to_history_list (NautilusBookmark *b
}
}
- nautilus_send_history_list_changed ();
+ return TRUE;
}
+
+ return FALSE;
}
void
@@ -1403,12 +1405,30 @@ nautilus_remove_from_history_list_no_not
g_object_unref (bookmark);
}
+gboolean
+nautilus_add_to_history_list_no_notify (const char *uri,
+ const char *name,
+ gboolean has_custom_name,
+ const char *icon)
+{
+ NautilusBookmark *bookmark;
+ gboolean ret;
+
+ bookmark = nautilus_bookmark_new_with_icon (uri, name, has_custom_name, icon);
+ ret = add_to_history_list (bookmark);
+ g_object_unref (bookmark);
+
+ return ret;
+}
+
static void
real_add_current_location_to_history_list (NautilusWindow *window)
{
g_assert (NAUTILUS_IS_WINDOW (window));
- add_to_history_list (window->current_location_bookmark);
+ if (add_to_history_list (window->current_location_bookmark)) {
+ nautilus_send_history_list_changed ();
+ }
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]