From 77df45f51f70243aaad5ec88b816c881cfdb2dbe Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sun, 18 Aug 2013 15:17:23 +0200 Subject: EphyShell: add support for starting without windows To launch epiphany as a DBus service, we need to be able to launch without opening windows, and then use the GApplication inactivity timeout to manage our lifetime. https://bugzilla.gnome.org/show_bug.cgi?id=694943 --- data/org.gnome.Epiphany.service.in | 2 +- src/ephy-main.c | 6 ++++++ src/ephy-shell.c | 25 ++++++++++++++++++++++--- src/ephy-shell.h | 1 + 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/data/org.gnome.Epiphany.service.in b/data/org.gnome.Epiphany.service.in index 003ec0c66..5af8cf1d7 100644 --- a/data/org.gnome.Epiphany.service.in +++ b/data/org.gnome.Epiphany.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=org.gnome.Epiphany -Exec=@bindir@/epiphany +Exec=@bindir@/epiphany --headless-mode diff --git a/src/ephy-main.c b/src/ephy-main.c index 96ac40b31..0347a5770 100644 --- a/src/ephy-main.c +++ b/src/ephy-main.c @@ -56,6 +56,7 @@ static char *application_to_delete = NULL; static gboolean private_instance = FALSE; static gboolean incognito_mode = FALSE; static gboolean application_mode = FALSE; +static gboolean headless_mode = FALSE; static char *profile_directory = NULL; static gboolean @@ -90,6 +91,8 @@ static const GOptionEntry option_entries[] = N_("Start an instance in netbank mode"), NULL }, { "application-mode", 'a', 0, G_OPTION_ARG_NONE, &application_mode, N_("Start the browser in application mode"), NULL }, + { "headless-mode", 0, 0, G_OPTION_ARG_NONE, &headless_mode, + N_("Start the application without opening windows"), NULL }, { "profile", 0, 0, G_OPTION_ARG_STRING, &profile_directory, N_("Profile directory to use in the private instance"), N_("DIR") }, { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &arguments, @@ -214,6 +217,9 @@ get_startup_flags (void) { EphyStartupFlags flags = 0; + if (headless_mode) + return EPHY_STARTUP_OPEN_NOTHING; + if (open_in_new_tab) flags |= EPHY_STARTUP_NEW_TAB; if (open_in_new_window) diff --git a/src/ephy-shell.c b/src/ephy-shell.c index f514c6398..9e91bc7b0 100644 --- a/src/ephy-shell.c +++ b/src/ephy-shell.c @@ -295,6 +295,20 @@ session_load_cb (GObject *object, ephy_shell_startup_continue (shell); } +static void +ephy_shell_start_headless (EphyShell *shell) +{ + /* A bit of a hack: because we don't pass IS_SERVICE to GApplication + (because otherwise we would need a separate launcher binary), we + don't get the 10 seconds timeout for the first DBus call. + So just hold/release to get the inactivity timeout started instead. + */ + + g_application_hold (G_APPLICATION (shell)); + g_application_release (G_APPLICATION (shell)); + ephy_shell_startup_continue (shell); +} + static void ephy_shell_activate (GApplication *application) { @@ -302,15 +316,18 @@ ephy_shell_activate (GApplication *application) /* * We get here on each new instance (remote or not). Autoresume the - * session unless we are in application mode and queue the + * session unless we are in application or headless mode and queue the * commands. */ if (ephy_embed_shell_get_mode (EPHY_EMBED_SHELL (shell)) != EPHY_EMBED_SHELL_MODE_APPLICATION) { EphyShellStartupContext *ctx; ctx = shell->priv->startup_context; - ephy_session_resume (ephy_shell_get_session (shell), - ctx->user_time, NULL, session_load_cb, shell); + if (ctx->startup_flags != EPHY_STARTUP_OPEN_NOTHING) + ephy_session_resume (ephy_shell_get_session (shell), + ctx->user_time, NULL, session_load_cb, shell); + else + ephy_shell_start_headless (shell); } else ephy_shell_startup_continue (shell); } @@ -597,6 +614,8 @@ ephy_shell_init (EphyShell *shell) webkit_web_context_set_favicon_database_directory (web_context, favicon_db_path); g_free (favicon_db_path); #endif + + g_application_set_inactivity_timeout (G_APPLICATION (shell), 60 * 1000); } static void diff --git a/src/ephy-shell.h b/src/ephy-shell.h index 7b250fe26..2c817484a 100644 --- a/src/ephy-shell.h +++ b/src/ephy-shell.h @@ -113,6 +113,7 @@ typedef enum { typedef enum { EPHY_STARTUP_NEW_TAB = 1 << 0, EPHY_STARTUP_NEW_WINDOW = 1 << 1, + EPHY_STARTUP_OPEN_NOTHING = 1 << 2, } EphyStartupFlags; typedef struct { -- cgit v1.2.3