diff options
-rw-r--r-- | src/ephy-session.c | 172 | ||||
-rw-r--r-- | src/ephy-session.h | 8 | ||||
-rw-r--r-- | src/ephy-shell.c | 26 | ||||
-rw-r--r-- | tests/ephy-session-test.c | 7 |
4 files changed, 124 insertions, 89 deletions
diff --git a/src/ephy-session.c b/src/ephy-session.c index bfe09c5b1..1d13ac168 100644 --- a/src/ephy-session.c +++ b/src/ephy-session.c @@ -32,7 +32,6 @@ #include "ephy-gui.h" #include "ephy-prefs.h" #include "ephy-settings.h" -#include "ephy-shell.h" #include "ephy-string.h" #include "ephy-window.h" @@ -56,6 +55,7 @@ struct _EphySessionPrivate GQueue *queue; guint queue_idle_id; + guint open_uris_idle_id; guint dont_save : 1; }; @@ -192,92 +192,142 @@ session_command_free (SessionCommand *cmd) g_object_unref (ephy_shell_get_default ()); } -static void -session_command_open_uris (EphySession *session, - char **uris, - const char *options, - guint32 user_time) +typedef struct { + EphySession *session; + EphyWindow *window; + char **uris; + EphyNewTabFlags flags; + guint32 user_time; + guint current_uri; +} OpenURIsData; + +static OpenURIsData * +open_uris_data_new (EphySession *session, + const char **uris, + EphyStartupFlags startup_flags, + guint32 user_time) { + OpenURIsData *data; EphyShell *shell; - EphyWindow *window; - EphyEmbed *embed; - EphyNewTabFlags flags = 0; - guint i; gboolean new_windows_in_tabs; gboolean have_uris; shell = ephy_shell_get_default (); - g_object_ref (shell); + data = g_slice_new0 (OpenURIsData); + data->session = g_object_ref (session); + data->uris = g_strdupv ((char **)uris); + data->user_time = user_time; - window = ephy_shell_get_main_window (shell); + data->window = ephy_shell_get_main_window (shell); new_windows_in_tabs = g_settings_get_boolean (EPHY_SETTINGS_MAIN, EPHY_PREFS_NEW_WINDOWS_IN_TABS); - have_uris = ! (g_strv_length (uris) == 1 && g_str_equal (uris[0], "")); + have_uris = ! (g_strv_length ((char **)uris) == 1 && g_str_equal (uris[0], "")); - if (options != NULL && strstr (options, "external") != NULL) + if (startup_flags & EPHY_STARTUP_NEW_TAB) { - flags |= EPHY_NEW_TAB_FROM_EXTERNAL; + data->flags |= EPHY_NEW_TAB_FROM_EXTERNAL; } - if (options != NULL && strstr (options, "new-window") != NULL) + if (startup_flags & EPHY_STARTUP_NEW_WINDOW) { - window = NULL; - flags |= EPHY_NEW_TAB_IN_NEW_WINDOW; + data->window = NULL; + data->flags |= EPHY_NEW_TAB_IN_NEW_WINDOW; } - else if ((options != NULL && strstr (options, "new-tab") != NULL) || - (new_windows_in_tabs && have_uris)) + else if (startup_flags & EPHY_STARTUP_NEW_TAB || (new_windows_in_tabs && have_uris)) { - flags |= EPHY_NEW_TAB_IN_EXISTING_WINDOW | - EPHY_NEW_TAB_JUMP | - EPHY_NEW_TAB_PRESENT_WINDOW; + data->flags |= EPHY_NEW_TAB_IN_EXISTING_WINDOW | EPHY_NEW_TAB_JUMP | EPHY_NEW_TAB_PRESENT_WINDOW; } else if (!have_uris) { - window = NULL; - flags |= EPHY_NEW_TAB_IN_NEW_WINDOW; + data->window = NULL; + data->flags |= EPHY_NEW_TAB_IN_NEW_WINDOW; } - for (i = 0; uris[i] != NULL; ++i) - { - const char *url = uris[i]; - EphyNewTabFlags page_flags; + g_application_hold (G_APPLICATION (shell)); + + return data; +} + +static void +open_uris_data_free (OpenURIsData *data) +{ + g_application_release (G_APPLICATION (ephy_shell_get_default ())); + g_object_unref (data->session); + g_strfreev (data->uris); + + g_slice_free (OpenURIsData, data); +} + +static gboolean +ephy_session_open_uris_idle (OpenURIsData *data) +{ + EphyEmbed *embed; + EphyNewTabFlags page_flags; + const char *url; #ifdef HAVE_WEBKIT2 - WebKitURIRequest *request = NULL; + WebKitURIRequest *request = NULL; #else - WebKitNetworkRequest *request = NULL; + WebKitNetworkRequest *request = NULL; #endif - if (url[0] == '\0') - { - page_flags = EPHY_NEW_TAB_HOME_PAGE; - } - else - { - page_flags = EPHY_NEW_TAB_OPEN_PAGE; + url = data->uris[data->current_uri]; + if (url[0] == '\0') + { + page_flags = EPHY_NEW_TAB_HOME_PAGE; + } + else + { + page_flags = EPHY_NEW_TAB_OPEN_PAGE; #ifdef HAVE_WEBKIT2 - request = webkit_uri_request_new (url); + request = webkit_uri_request_new (url); #else - request = webkit_network_request_new (url); + request = webkit_network_request_new (url); #endif - } - - embed = ephy_shell_new_tab_full (shell, window, - NULL /* parent tab */, - request, - flags | page_flags, - EPHY_WEB_VIEW_CHROME_ALL, - FALSE /* is popup? */, - user_time); + } - if (request) - g_object_unref (request); + embed = ephy_shell_new_tab_full (ephy_shell_get_default (), + data->window, + NULL /* parent tab */, + request, + data->flags | page_flags, + EPHY_WEB_VIEW_CHROME_ALL, + FALSE /* is popup? */, + data->user_time); - window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))); + if (request) + { + g_object_unref (request); } - g_object_unref (shell); + data->window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))); + data->current_uri++; + + return data->uris[data->current_uri] != NULL; +} + +static void +ephy_session_open_uris_idle_done (OpenURIsData *data) +{ + data->session->priv->open_uris_idle_id = 0; + open_uris_data_free (data); +} + +void +ephy_session_open_uris (EphySession *session, + const char **uris, + EphyStartupFlags startup_flags, + guint32 user_time) +{ + if (session->priv->open_uris_idle_id == 0) + { + session->priv->open_uris_idle_id = + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + (GSourceFunc)ephy_session_open_uris_idle, + open_uris_data_new (session, uris, startup_flags, user_time), + (GDestroyNotify)ephy_session_open_uris_idle_done); + } } static void @@ -314,9 +364,6 @@ session_command_dispatch (EphySession *session) switch (cmd->command) { - case EPHY_SESSION_CMD_OPEN_URIS: - session_command_open_uris (session, cmd->args, cmd->arg, cmd->user_time); - break; default: g_assert_not_reached (); break; @@ -429,14 +476,12 @@ window_removed_cb (GtkApplication *application, static void ephy_session_init (EphySession *session) { - EphySessionPrivate *priv; EphyShell *shell; LOG ("EphySession initialising"); - priv = session->priv = EPHY_SESSION_GET_PRIVATE (session); - - priv->queue = g_queue_new (); + session->priv = EPHY_SESSION_GET_PRIVATE (session); + session->priv->queue = g_queue_new (); shell = ephy_shell_get_default (); g_signal_connect (shell, "window-added", @@ -452,6 +497,12 @@ ephy_session_dispose (GObject *object) LOG ("EphySession disposing"); + if (session->priv->open_uris_idle_id > 0) + { + g_source_remove (session->priv->open_uris_idle_id); + session->priv->open_uris_idle_id = 0; + } + session_command_queue_clear (session); G_OBJECT_CLASS (ephy_session_parent_class)->dispose (object); @@ -1396,7 +1447,6 @@ ephy_session_queue_command (EphySession *session, LOG ("queue_command command:%d", command); g_return_if_fail (EPHY_IS_SESSION (session)); - g_return_if_fail (command != EPHY_SESSION_CMD_OPEN_URIS || args != NULL); priv = session->priv; diff --git a/src/ephy-session.h b/src/ephy-session.h index 62f07690e..afdf398e9 100644 --- a/src/ephy-session.h +++ b/src/ephy-session.h @@ -26,6 +26,7 @@ #ifndef EPHY_SESSION_H #define EPHY_SESSION_H +#include "ephy-shell.h" #include "ephy-window.h" #include <gtk/gtk.h> @@ -45,8 +46,7 @@ typedef struct _EphySessionClass EphySessionClass; typedef enum { - EPHY_SESSION_CMD_OPEN_URIS, - EPHY_SESSION_CMD_LAST + EPHY_SESSION_CMD_LAST } EphySessionCommand; struct _EphySession @@ -64,6 +64,10 @@ struct _EphySessionClass GType ephy_session_get_type (void); +void ephy_session_open_uris (EphySession *session, + const char **uris, + EphyStartupFlags startup_flags, + guint32 user_time); gboolean ephy_session_save (EphySession *session, const char *filename); diff --git a/src/ephy-shell.c b/src/ephy-shell.c index ee947ff97..42209bd5c 100644 --- a/src/ephy-shell.c +++ b/src/ephy-shell.c @@ -113,7 +113,7 @@ ephy_shell_startup_context_new (EphyStartupFlags startup_flags, } static void -queue_commands (EphyShell *shell) +ephy_shell_startup_continue (EphyShell *shell) { EphyShellStartupContext *ctx; EphySession *session; @@ -129,21 +129,8 @@ queue_commands (EphyShell *shell) else if (ctx->arguments != NULL) { /* Don't queue any window openings if no extra arguments given, */ /* since session autoresume will open one for us. */ - GString *options; - - options = g_string_sized_new (64); - - if (ctx->startup_flags & EPHY_STARTUP_NEW_WINDOW) - g_string_append (options, "new-window,"); - - if (ctx->startup_flags & EPHY_STARTUP_NEW_TAB) - g_string_append (options, "new-tab,external,"); - - ephy_session_queue_command (session, - EPHY_SESSION_CMD_OPEN_URIS, - (const char*)options->str, - (const char **)ctx->arguments, - ctx->user_time, FALSE); + ephy_session_open_uris (session, (const char **)ctx->arguments, + ctx->startup_flags, ctx->user_time); } } @@ -262,7 +249,7 @@ session_load_cb (GObject *object, EphyShell *shell = EPHY_SHELL (user_data); ephy_session_resume_finish (session, result, NULL); - queue_commands (shell); + ephy_shell_startup_continue (shell); } static void @@ -281,9 +268,8 @@ ephy_shell_activate (GApplication *application) ctx = shell->priv->startup_context; ephy_session_resume (EPHY_SESSION (ephy_shell_get_session (shell)), ctx->user_time, NULL, session_load_cb, shell); - } - else - queue_commands (shell); + } else + ephy_shell_startup_continue (shell); } /* diff --git a/tests/ephy-session-test.c b/tests/ephy-session-test.c index 554544d25..5c9863245 100644 --- a/tests/ephy-session-test.c +++ b/tests/ephy-session-test.c @@ -237,12 +237,7 @@ open_uris_after_loading_session (const char** uris, int final_num_windows) * command - it should bail after noticing there are windows * already. */ - ephy_session_queue_command (session, - EPHY_SESSION_CMD_OPEN_URIS, - NULL, - uris, - user_time, - FALSE); + ephy_session_open_uris (session, uris, 0, user_time); while (gtk_events_pending ()) gtk_main_iteration_do (FALSE); |