aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorXan Lopez <xan@igalia.com>2012-04-12 19:31:09 +0800
committerXan Lopez <xan@igalia.com>2012-04-12 19:31:09 +0800
commitbb759160ad593489d9b51488916a0fd8734136ca (patch)
tree71f82a0838b61b2f2ac601fb33a07e5313926478 /src
parent94f2fb5c7a80dc2e904d8296bda14a0e0324ccc1 (diff)
downloadgsoc2013-epiphany-bb759160ad593489d9b51488916a0fd8734136ca.tar.gz
gsoc2013-epiphany-bb759160ad593489d9b51488916a0fd8734136ca.tar.zst
gsoc2013-epiphany-bb759160ad593489d9b51488916a0fd8734136ca.zip
Add a setting to control whether the session is automatically restored
We add a new gsettings key, 'restore-session-policy', with two valid values: 'always' and 'never'. A brief explanation of our session state mechanism follows. There are three ways to exit Epiphany: 1) Activate 'Quit' in the application menu 2) Close the last application window 3) Kill the process manually, SIGSEGV, or other similar unexpected event. For 1) and 2), we'll now do the same thing: a) Call ephy_session_close b) Exit the application manually ephy_session_close will check the new restore-session-policy setting, and only save the session state if it's set to 'always'. Before it used to manually destroy all present windows. We now let EphyShell or EphyWindow do this, EphySession only manages the session state saving. For 3), the process will die with the state saved up to that point, there's nothing we can do. For that reason, on startup also check the new setting; if it's set to 'never' ignore the session state, open a window in the homepage, and delete the old state file. https://bugzilla.gnome.org/show_bug.cgi?id=673453
Diffstat (limited to 'src')
-rw-r--r--src/ephy-session.c72
-rw-r--r--src/ephy-window.c1
2 files changed, 21 insertions, 52 deletions
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 */