diff options
-rw-r--r-- | data/org.gnome.epiphany.gschema.xml | 5 | ||||
-rw-r--r-- | lib/ephy-prefs.h | 7 | ||||
-rw-r--r-- | src/ephy-session.c | 72 | ||||
-rw-r--r-- | src/ephy-window.c | 1 |
4 files changed, 33 insertions, 52 deletions
diff --git a/data/org.gnome.epiphany.gschema.xml b/data/org.gnome.epiphany.gschema.xml index f286277f6..d39fc3849 100644 --- a/data/org.gnome.epiphany.gschema.xml +++ b/data/org.gnome.epiphany.gschema.xml @@ -59,6 +59,11 @@ <default>true</default> <summary>Don't use an external application to view page source.</summary> </key> + <key name="restore-session-policy" enum="org.gnome.Epiphany.EphyPrefsRestoreSessionPolicy"> + <default>'always'</default> + <summary>Whether to automatically restore the last session</summary> + <description>Defines how the session will be restored during startup. Allowed values are 'always' (the previous state of the application is always restored) and 'never' (the homepage is always shown).</description> + </key> </schema> <schema path="/org/gnome/epiphany/ui/" id="org.gnome.Epiphany.ui"> <key type="b" name="show-toolbars"> diff --git a/lib/ephy-prefs.h b/lib/ephy-prefs.h index d5daaa034..e16f82c6a 100644 --- a/lib/ephy-prefs.h +++ b/lib/ephy-prefs.h @@ -37,6 +37,12 @@ typedef enum typedef enum { + EPHY_PREFS_RESTORE_SESSION_POLICY_ALWAYS, + EPHY_PREFS_RESTORE_SESSION_POLICY_NEVER +} EphyPrefsRestoreSessionPolicy; + +typedef enum +{ EPHY_PREFS_WEB_COOKIES_POLICY_ALWAYS, EPHY_PREFS_WEB_COOKIES_POLICY_NO_THIRD_PARTY, EPHY_PREFS_WEB_COOKIES_POLICY_NEVER @@ -105,6 +111,7 @@ typedef enum #define EPHY_PREFS_ENABLE_CARET_BROWSING "enable-caret-browsing" #define EPHY_PREFS_ENABLED_EXTENSIONS "enabled-extensions" #define EPHY_PREFS_INTERNAL_VIEW_SOURCE "internal-view-source" +#define EPHY_PREFS_RESTORE_SESSION_POLICY "restore-session-policy" #define EPHY_PREFS_LOCKDOWN_SCHEMA "org.gnome.Epiphany.lockdown" #define EPHY_PREFS_LOCKDOWN_FULLSCREEN "disable-fullscreen" diff --git a/src/ephy-session.c b/src/ephy-session.c index 6bdc993c2..f7579ef8d 100644 --- a/src/ephy-session.c +++ b/src/ephy-session.c @@ -231,6 +231,7 @@ session_command_autoresume (EphySession *session, GFile *saved_session_file; char *saved_session_file_path; gboolean crashed_session; + EphyPrefsRestoreSessionPolicy policy; LOG ("ephy_session_autoresume"); @@ -241,10 +242,20 @@ session_command_autoresume (EphySession *session, g_free (saved_session_file_path); + policy = g_settings_get_enum (EPHY_SETTINGS_MAIN, + EPHY_PREFS_RESTORE_SESSION_POLICY); + if (crashed_session == FALSE || + policy == EPHY_PREFS_RESTORE_SESSION_POLICY_NEVER || priv->windows != NULL || priv->tool_windows != NULL) { + /* If we are auto-resuming, and we never want to + * restore the session, clobber the session state + * file. */ + if (policy == EPHY_PREFS_RESTORE_SESSION_POLICY_NEVER) + session_delete (session, SESSION_STATE); + ephy_session_queue_command (session, EPHY_SESSION_CMD_MAYBE_OPEN_WINDOW, NULL, NULL, user_time, FALSE); @@ -614,67 +625,26 @@ ephy_session_class_init (EphySessionClass *class) /* Implementation */ -static void -close_dialog (GtkWidget *widget) -{ - if (GTK_IS_DIALOG (widget)) - { - /* don't destroy them, someone might have a ref on them */ - gtk_dialog_response (GTK_DIALOG (widget), - GTK_RESPONSE_DELETE_EVENT); - } -} - void ephy_session_close (EphySession *session) { - EphySessionPrivate *priv = session->priv; - GList *windows; + EphyPrefsRestoreSessionPolicy policy; LOG ("ephy_session_close"); - /* we have to ref the shell or else we may get finalised between - * destroying the windows and destroying the tool windows - */ - g_object_ref (ephy_shell_get_default ()); - - priv->dont_save = TRUE; - - /* Clear command queue */ - session_command_queue_clear (session); - - ephy_embed_shell_prepare_close (embed_shell); - - /* there may still be windows open, like dialogues posed from - * web pages, etc. Try to kill them, but be sure NOT to destroy - * the gtkmozembed offscreen window! - * Here, we just check if it's a dialogue and close it if it is one. - */ - windows = gtk_window_list_toplevels (); - g_list_foreach (windows, (GFunc) close_dialog, NULL); - g_list_free (windows); - - windows = ephy_session_get_windows (session); - g_list_foreach (windows, (GFunc) gtk_widget_destroy, NULL); - g_list_free (windows); - - windows = g_list_copy (session->priv->tool_windows); - g_list_foreach (windows, (GFunc) gtk_widget_destroy, NULL); - g_list_free (windows); - - ephy_embed_shell_prepare_close (embed_shell); + policy = g_settings_get_enum (EPHY_SETTINGS_MAIN, + EPHY_PREFS_RESTORE_SESSION_POLICY); + if (policy == EPHY_PREFS_RESTORE_SESSION_POLICY_ALWAYS) + { + EphySessionPrivate *priv = session->priv; - /* Just to be really sure, do it again: */ - windows = gtk_window_list_toplevels (); - g_list_foreach (windows, (GFunc) close_dialog, NULL); - g_list_free (windows); + priv->dont_save = TRUE; - session->priv->dont_save = FALSE; + session_command_queue_clear (session); - /* Clear command queue */ - session_command_queue_clear (session); + ephy_embed_shell_prepare_close (embed_shell); - g_object_unref (ephy_shell_get_default ()); + } } static int diff --git a/src/ephy-window.c b/src/ephy-window.c index 36243a3ad..16bda79eb 100644 --- a/src/ephy-window.c +++ b/src/ephy-window.c @@ -1064,7 +1064,6 @@ ephy_window_delete_event (GtkWidget *widget, if (number_windows == 1) { ephy_session_close (session); - return TRUE; } /* See bug #114689 */ |