aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2005-02-02 07:42:48 +0800
committerChristian Persch <chpe@src.gnome.org>2005-02-02 07:42:48 +0800
commit3cc751a30e83efeed8fc9707d2069c545aa005c6 (patch)
tree3d1e4cee4a69ace5bc6a1d0d9ae28dfbebc7f698 /src
parentab9e3429d7c547aad67106a04847e16cda1279b4 (diff)
downloadgsoc2013-epiphany-3cc751a30e83efeed8fc9707d2069c545aa005c6.tar
gsoc2013-epiphany-3cc751a30e83efeed8fc9707d2069c545aa005c6.tar.gz
gsoc2013-epiphany-3cc751a30e83efeed8fc9707d2069c545aa005c6.tar.bz2
gsoc2013-epiphany-3cc751a30e83efeed8fc9707d2069c545aa005c6.tar.lz
gsoc2013-epiphany-3cc751a30e83efeed8fc9707d2069c545aa005c6.tar.xz
gsoc2013-epiphany-3cc751a30e83efeed8fc9707d2069c545aa005c6.tar.zst
gsoc2013-epiphany-3cc751a30e83efeed8fc9707d2069c545aa005c6.zip
Define variants with startup ID.
2005-02-02 Christian Persch <chpe@cvs.gnome.org> * idl/EphyAutomation.idl: Define variants with startup ID. * lib/ephy-gui.c: (ephy_gui_window_update_user_time): * lib/ephy-gui.h: * src/bookmarks/ephy-bookmarks.c: (redirect_cb): * src/ephy-automation.c: (impl_ephy_automation_loadUrlWithStartupId), (impl_ephy_automation_loadurl), (impl_ephy_automation_addBookmark), (impl_ephy_automation_importBookmarks), (impl_ephy_automation_loadSessionWithStartupId), (impl_ephy_automation_loadSession), (impl_ephy_automation_openBookmarksEditorWithStartupId), (impl_ephy_automation_openBookmarksEditor), (ephy_automation_class_init): * src/ephy-main.c: (get_startup_id), (main): * src/ephy-session.c: (offer_to_resume), (ephy_session_autoresume), (ephy_session_load): * src/ephy-session.h: * src/ephy-shell.c: (open_urls), (ephy_shell_startup), (ephy_shell_new_tab_full), (ephy_shell_new_tab): * src/ephy-shell.h: Implement startup ID forwarding to the already-running ephy instance. Part of bug #150085.
Diffstat (limited to 'src')
-rw-r--r--src/bookmarks/ephy-bookmarks.c3
-rw-r--r--src/ephy-automation.c101
-rw-r--r--src/ephy-main.c39
-rw-r--r--src/ephy-session.c35
-rw-r--r--src/ephy-session.h6
-rw-r--r--src/ephy-shell.c67
-rw-r--r--src/ephy-shell.h8
7 files changed, 208 insertions, 51 deletions
diff --git a/src/bookmarks/ephy-bookmarks.c b/src/bookmarks/ephy-bookmarks.c
index b7c4e4993..0043d845a 100644
--- a/src/bookmarks/ephy-bookmarks.c
+++ b/src/bookmarks/ephy-bookmarks.c
@@ -564,6 +564,9 @@ redirect_cb (EphyHistory *history,
(EphyNodeCallback) update_bookmark_destroy_cb,
G_OBJECT (dialog));
+ /* this dialogue is unexpected */
+ gtk_window_set_focus_on_map (GTK_WINDOW (dialog), FALSE);
+
gtk_window_present (GTK_WINDOW (dialog));
}
diff --git a/src/ephy-automation.c b/src/ephy-automation.c
index d87ad1372..fac7600d1 100644
--- a/src/ephy-automation.c
+++ b/src/ephy-automation.c
@@ -32,6 +32,7 @@
#include "ephy-bookmarks-import.h"
#include "eel-gconf-extensions.h"
#include "ephy-prefs.h"
+#include "ephy-gui.h"
#include <string.h>
#include <bonobo/bonobo-main.h>
@@ -42,16 +43,18 @@ static void ephy_automation_class_init (EphyAutomationClass *klass);
static GObjectClass *parent_class = NULL;
static void
-impl_ephy_automation_loadurl (PortableServer_Servant _servant,
- const CORBA_char *url,
- const CORBA_boolean fullscreen,
- const CORBA_boolean open_in_existing_tab,
- const CORBA_boolean open_in_new_tab,
- CORBA_Environment *ev)
+impl_ephy_automation_loadUrlWithStartupId (PortableServer_Servant _servant,
+ const CORBA_char *url,
+ const CORBA_boolean fullscreen,
+ const CORBA_boolean open_in_existing_tab,
+ const CORBA_boolean open_in_new_tab,
+ const CORBA_unsigned_long startup_id,
+ CORBA_Environment *ev)
{
EphyNewTabFlags flags = 0;
EphyWindow *window;
EphySession *session;
+ guint32 user_time = (guint32) startup_id;
session = EPHY_SESSION (ephy_shell_get_session (ephy_shell));
g_return_if_fail (session != NULL);
@@ -61,7 +64,7 @@ impl_ephy_automation_loadurl (PortableServer_Servant _servant,
url = "";
}
- if (ephy_session_autoresume (session) && *url == '\0')
+ if (ephy_session_autoresume (session, user_time) && *url == '\0')
{
/* no need to open the homepage,
* we did already open session windows */
@@ -72,6 +75,8 @@ impl_ephy_automation_loadurl (PortableServer_Servant _servant,
if (open_in_existing_tab && window != NULL)
{
+ ephy_gui_window_update_user_time (GTK_WIDGET (window),
+ user_time);
ephy_window_load_url (window, url);
return;
}
@@ -100,51 +105,96 @@ impl_ephy_automation_loadurl (PortableServer_Servant _servant,
flags |= EPHY_NEW_TAB_FULLSCREEN_MODE;
}
- ephy_shell_new_tab (ephy_shell, window, NULL, url, flags);
+ ephy_shell_new_tab_full (ephy_shell, window, NULL, url, flags,
+ user_time);
+}
+
+static void
+impl_ephy_automation_loadurl (PortableServer_Servant _servant,
+ const CORBA_char *url,
+ const CORBA_boolean fullscreen,
+ const CORBA_boolean open_in_existing_tab,
+ const CORBA_boolean open_in_new_tab,
+ CORBA_Environment *ev)
+{
+ impl_ephy_automation_loadUrlWithStartupId (_servant,
+ url,
+ fullscreen,
+ open_in_existing_tab,
+ open_in_new_tab,
+ 0, /* no startup ID */
+ ev);
}
static void
-impl_ephy_automation_add_bookmark (PortableServer_Servant _servant,
- const CORBA_char * url,
- CORBA_Environment * ev)
+impl_ephy_automation_addBookmark (PortableServer_Servant _servant,
+ const CORBA_char * url,
+ CORBA_Environment * ev)
{
ephy_bookmarks_add (ephy_shell_get_bookmarks (ephy_shell),
url /* title */, url);
}
static void
-impl_ephy_automation_import_bookmarks (PortableServer_Servant _servant,
- const CORBA_char * filename,
- CORBA_Environment * ev)
+impl_ephy_automation_importBookmarks (PortableServer_Servant _servant,
+ const CORBA_char *filename,
+ CORBA_Environment *ev)
{
ephy_bookmarks_import (ephy_shell_get_bookmarks (ephy_shell),
filename);
}
static void
-impl_ephy_automation_load_session (PortableServer_Servant _servant,
- const CORBA_char * filename,
- CORBA_Environment * ev)
+impl_ephy_automation_loadSessionWithStartupId (PortableServer_Servant _servant,
+ const CORBA_char *filename,
+ const CORBA_unsigned_long startup_id,
+ CORBA_Environment *ev)
{
EphySession *session;
+ guint32 user_time = (guint32) startup_id;
session = EPHY_SESSION (ephy_shell_get_session (ephy_shell));
- ephy_session_load (session, filename);
+ ephy_session_load (session, filename, user_time);
+}
+
+static void
+impl_ephy_automation_loadSession (PortableServer_Servant _servant,
+ const CORBA_char *filename,
+ CORBA_Environment *ev)
+{
+ impl_ephy_automation_loadSessionWithStartupId (_servant,
+ filename,
+ 0, /* no startup ID */
+ ev);
}
static void
-impl_ephy_automation_open_bookmarks_editor (PortableServer_Servant _servant,
- CORBA_Environment * ev)
+impl_ephy_automation_openBookmarksEditorWithStartupId (PortableServer_Servant _servant,
+ const CORBA_unsigned_long startup_id,
+ CORBA_Environment *ev)
{
GtkWidget *editor;
+ guint32 user_time = (guint32) startup_id;
if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_BOOKMARK_EDITING)) return;
+
editor = ephy_shell_get_bookmarks_editor (ephy_shell);
+ ephy_gui_window_update_user_time (editor, user_time);
+
gtk_window_present (GTK_WINDOW (editor));
}
static void
+impl_ephy_automation_openBookmarksEditor (PortableServer_Servant _servant,
+ CORBA_Environment *ev)
+{
+ impl_ephy_automation_openBookmarksEditorWithStartupId (_servant,
+ 0, /* no startup ID */
+ ev);
+}
+
+static void
ephy_automation_init (EphyAutomation *c)
{
}
@@ -158,10 +208,13 @@ ephy_automation_class_init (EphyAutomationClass *klass)
/* connect implementation callbacks */
epv->loadurl = impl_ephy_automation_loadurl;
- epv->addBookmark = impl_ephy_automation_add_bookmark;
- epv->importBookmarks = impl_ephy_automation_import_bookmarks;
- epv->loadSession = impl_ephy_automation_load_session;
- epv->openBookmarksEditor = impl_ephy_automation_open_bookmarks_editor;
+ epv->addBookmark = impl_ephy_automation_addBookmark;
+ epv->importBookmarks = impl_ephy_automation_importBookmarks;
+ epv->loadSession = impl_ephy_automation_loadSession;
+ epv->openBookmarksEditor = impl_ephy_automation_openBookmarksEditor;
+ epv->loadUrlWithStartupId = impl_ephy_automation_loadUrlWithStartupId;
+ epv->loadSessionWithStartupId = impl_ephy_automation_loadSessionWithStartupId;
+ epv->openBookmarksEditorWithStartupId = impl_ephy_automation_openBookmarksEditorWithStartupId;
}
BONOBO_TYPE_FUNC_FULL (
diff --git a/src/ephy-main.c b/src/ephy-main.c
index 042fd1f27..5a62232ca 100644
--- a/src/ephy-main.c
+++ b/src/ephy-main.c
@@ -38,6 +38,7 @@
#include <libgnomevfs/gnome-vfs-init.h>
#include <libgnomevfs/gnome-vfs-utils.h>
#include <libxml/xmlversion.h>
+#include <errno.h>
static gboolean open_in_existing = FALSE;
static gboolean open_in_new_tab = FALSE;
@@ -71,6 +72,39 @@ static struct poptOption popt_options[] =
{ NULL, 0, 0, NULL, 0, NULL, NULL }
};
+/* adapted from gtk+/gdk/x11/gdkdisplay-x11.c */
+static guint32
+get_startup_id (void)
+{
+ const char *startup_id, *time_str;
+ guint32 retval = 0;
+
+ startup_id = g_getenv ("DESKTOP_STARTUP_ID");
+ if (startup_id == NULL) return 0;
+
+ /* Find the launch time from the startup_id, if it's there. Newer spec
+ * states that the startup_id is of the form <unique>_TIME<timestamp>
+ */
+ time_str = g_strrstr (startup_id, "_TIME");
+ if (time_str != NULL)
+ {
+ gulong value;
+ gchar *end;
+ errno = 0;
+
+ /* Skip past the "_TIME" part */
+ time_str += 5;
+
+ value = strtoul (time_str, &end, 0);
+ if (end != time_str && errno == 0)
+ {
+ retval = (guint32) value;
+ }
+ }
+
+ return retval;
+}
+
static void
handle_url (GtkAboutDialog *about,
const char *link,
@@ -114,6 +148,7 @@ main (int argc, char *argv[])
GnomeProgram *program;
EphyShellStartupFlags startup_flags;
const char **args, *string_arg;
+ guint32 user_time;
gboolean new_instance;
GError *err = NULL;
@@ -129,6 +164,9 @@ main (int argc, char *argv[])
*/
LIBXML_TEST_VERSION
+ /* get this early, since gdk will unset the env var */
+ user_time = get_startup_id ();
+
program = gnome_program_init (PACKAGE, VERSION,
LIBGNOMEUI_MODULE, argc, argv,
GNOME_PARAM_POPT_TABLE, popt_options,
@@ -198,6 +236,7 @@ main (int argc, char *argv[])
ephy_shell_new ();
g_assert (ephy_shell != NULL);
new_instance = ephy_shell_startup (ephy_shell, startup_flags,
+ user_time,
args, string_arg, &err);
if (err != NULL)
diff --git a/src/ephy-session.c b/src/ephy-session.c
index 117081c83..49ca547d9 100644
--- a/src/ephy-session.c
+++ b/src/ephy-session.c
@@ -32,6 +32,7 @@
#include "ephy-file-helpers.h"
#include "eel-gconf-extensions.h"
#include "ephy-prefs.h"
+#include "ephy-gui.h"
#include "ephy-debug.h"
#include <glib/gi18n.h>
@@ -357,7 +358,8 @@ ephy_session_class_init (EphySessionClass *class)
}
static gboolean
-offer_to_resume (EphySession *session)
+offer_to_resume (EphySession *session,
+ guint32 user_time)
{
GtkWidget *dialog;
int response;
@@ -385,6 +387,9 @@ offer_to_resume (EphySession *session)
session->priv->resume_dialog = dialog;
+ ephy_gui_window_update_user_time (session->priv->resume_dialog,
+ user_time);
+
response = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
@@ -397,6 +402,7 @@ offer_to_resume (EphySession *session)
/**
* ephy_session_autoresume:
* @session: a #EphySession
+ * @user_time: a timestamp, or 0
*
* Resume a crashed session when necessary (interactive)
*
@@ -405,28 +411,33 @@ offer_to_resume (EphySession *session)
* has been re-presented to the user.
**/
gboolean
-ephy_session_autoresume (EphySession *session)
+ephy_session_autoresume (EphySession *session,
+ guint32 user_time)
{
+ EphySessionPrivate *priv = session->priv;
char *saved_session;
gboolean retval = FALSE;
LOG ("ephy_session_autoresume");
- if (session->priv->windows != NULL || session->priv->tool_windows != NULL) return FALSE;
+ if (priv->windows != NULL || priv->tool_windows != NULL) return FALSE;
- if (session->priv->resume_dialog)
+ if (priv->resume_dialog)
{
- gtk_window_present (GTK_WINDOW (session->priv->resume_dialog));
+ ephy_gui_window_update_user_time (session->priv->resume_dialog,
+ user_time);
+ gtk_window_present (GTK_WINDOW (priv->resume_dialog));
return TRUE;
}
saved_session = get_session_filename (SESSION_CRASHED);
if (g_file_test (saved_session, G_FILE_TEST_EXISTS)
- && offer_to_resume (session))
+ && offer_to_resume (session, user_time))
{
session->priv->dont_save = TRUE;
- retval = ephy_session_load (session, saved_session);
+ retval = ephy_session_load (session, saved_session,
+ user_time);
session->priv->dont_save = FALSE;
ephy_session_save (session, SESSION_CRASHED);
}
@@ -738,6 +749,7 @@ restore_geometry (GtkWindow *window,
* ephy_session_load:
* @session: a #EphySession
* @filename: the path of the source file
+ * @user_time: a timestamp, or 0
*
* Load a session from disk, restoring the windows and their state
*
@@ -745,7 +757,8 @@ restore_geometry (GtkWindow *window,
**/
gboolean
ephy_session_load (EphySession *session,
- const char *filename)
+ const char *filename,
+ guint32 user_time)
{
xmlDocPtr doc;
xmlNodePtr child;
@@ -776,6 +789,9 @@ ephy_session_load (EphySession *session,
widget = GTK_WIDGET (ephy_window_new ());
restore_geometry (GTK_WINDOW (widget), child);
parse_embed (child->children, EPHY_WINDOW (widget));
+
+ ephy_gui_window_update_user_time (widget, user_time);
+
gtk_window_present (GTK_WINDOW (widget));
}
else if (xmlStrEqual (child->name, (const xmlChar *) "toolwindow"))
@@ -800,6 +816,9 @@ ephy_session_load (EphySession *session,
}
restore_geometry (GTK_WINDOW (widget), child);
+
+ ephy_gui_window_update_user_time (widget, user_time);
+
gtk_window_present (GTK_WINDOW (widget));
}
diff --git a/src/ephy-session.h b/src/ephy-session.h
index d595ef06a..025f8425d 100644
--- a/src/ephy-session.h
+++ b/src/ephy-session.h
@@ -63,9 +63,11 @@ gboolean ephy_session_save (EphySession *session,
const char *filename);
gboolean ephy_session_load (EphySession *session,
- const char *filename);
+ const char *filename,
+ guint32 user_time);
-gboolean ephy_session_autoresume (EphySession *session);
+gboolean ephy_session_autoresume (EphySession *session,
+ guint32 user_time);
void ephy_session_close (EphySession *session);
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 191f552bc..dc9647df5 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -46,6 +46,7 @@
#include "ephy-automation.h"
#include "print-dialog.h"
#include "ephy-prefs.h"
+#include "ephy-gui.h"
#ifdef ENABLE_DBUS
#include "ephy-dbus.h"
@@ -308,8 +309,11 @@ path_from_command_line_arg (const char *arg)
static void
open_urls (GNOME_EphyAutomation automation,
- const char **args, CORBA_Environment *ev,
- gboolean new_tab, gboolean existing_window,
+ guint32 user_time,
+ const char **args,
+ CORBA_Environment *ev,
+ gboolean new_tab,
+ gboolean existing_window,
gboolean fullscreen)
{
int i;
@@ -317,9 +321,9 @@ open_urls (GNOME_EphyAutomation automation,
if (args == NULL)
{
/* Homepage or resume */
- GNOME_EphyAutomation_loadurl
+ GNOME_EphyAutomation_loadUrlWithStartupId
(automation, "", fullscreen,
- existing_window, new_tab, ev);
+ existing_window, new_tab, user_time, ev);
}
else
{
@@ -329,9 +333,9 @@ open_urls (GNOME_EphyAutomation automation,
path = path_from_command_line_arg (args[i]);
- GNOME_EphyAutomation_loadurl
+ GNOME_EphyAutomation_loadUrlWithStartupId
(automation, path, fullscreen,
- existing_window, new_tab, ev);
+ existing_window, new_tab, user_time, ev);
g_free (path);
}
@@ -410,6 +414,7 @@ gnome_session_init (EphyShell *shell)
gboolean
ephy_shell_startup (EphyShell *shell,
EphyShellStartupFlags flags,
+ guint32 user_time,
const char **args,
const char *string_arg,
GError **error)
@@ -465,13 +470,13 @@ ephy_shell_startup (EphyShell *shell,
}
else if (flags & EPHY_SHELL_STARTUP_BOOKMARKS_EDITOR)
{
- GNOME_EphyAutomation_openBookmarksEditor
- (automation, &ev);
+ GNOME_EphyAutomation_openBookmarksEditorWithStartupId
+ (automation, user_time, &ev);
}
else if (flags & EPHY_SHELL_STARTUP_SESSION)
{
- GNOME_EphyAutomation_loadSession
- (automation, string_arg, &ev);
+ GNOME_EphyAutomation_loadSessionWithStartupId
+ (automation, string_arg, user_time, &ev);
}
else if (flags & EPHY_SHELL_STARTUP_IMPORT_BOOKMARKS)
{
@@ -485,7 +490,7 @@ ephy_shell_startup (EphyShell *shell,
}
else
{
- open_urls (automation, args, &ev,
+ open_urls (automation, user_time, args, &ev,
flags & EPHY_SHELL_STARTUP_TABS,
flags & EPHY_SHELL_STARTUP_EXISTING_WINDOW,
flags & EPHY_SHELL_STARTUP_FULLSCREEN);
@@ -639,11 +644,12 @@ load_homepage (EphyEmbed *embed)
}
/**
- * ephy_shell_new_tab:
+ * ephy_shell_new_tab_full:
* @shell: a #EphyShell
* @parent_window: the target #EphyWindow or %NULL
* @previous_tab: the referrer tab or %NULL
* @url: an url to load or %NULL
+ * @user_time: a timestamp, or 0
*
* Create a new tab and the parent window when necessary.
* Use this function to open urls in new window/tabs.
@@ -651,11 +657,12 @@ load_homepage (EphyEmbed *embed)
* ReturnValue: the created #EphyTab
**/
EphyTab *
-ephy_shell_new_tab (EphyShell *shell,
- EphyWindow *parent_window,
- EphyTab *previous_tab,
- const char *url,
- EphyNewTabFlags flags)
+ephy_shell_new_tab_full (EphyShell *shell,
+ EphyWindow *parent_window,
+ EphyTab *previous_tab,
+ const char *url,
+ EphyNewTabFlags flags,
+ guint32 user_time)
{
EphyWindow *window;
EphyTab *tab;
@@ -705,6 +712,9 @@ ephy_shell_new_tab (EphyShell *shell,
embed = ephy_tab_get_embed (tab);
ephy_window_add_tab (window, tab, position, jump_to);
+
+ ephy_gui_window_update_user_time (GTK_WIDGET (window), user_time);
+
gtk_widget_show (GTK_WIDGET (window));
if (flags & EPHY_NEW_TAB_HOME_PAGE ||
@@ -729,6 +739,29 @@ ephy_shell_new_tab (EphyShell *shell,
}
/**
+ * ephy_shell_new_tab:
+ * @shell: a #EphyShell
+ * @parent_window: the target #EphyWindow or %NULL
+ * @previous_tab: the referrer tab or %NULL
+ * @url: an url to load or %NULL
+ *
+ * Create a new tab and the parent window when necessary.
+ * Use this function to open urls in new window/tabs.
+ *
+ * ReturnValue: the created #EphyTab
+ **/
+EphyTab *
+ephy_shell_new_tab (EphyShell *shell,
+ EphyWindow *parent_window,
+ EphyTab *previous_tab,
+ const char *url,
+ EphyNewTabFlags flags)
+{
+ return ephy_shell_new_tab_full (shell, parent_window,
+ previous_tab, url, flags, 0);
+}
+
+/**
* ephy_shell_get_session:
* @shell: the #EphyShell
*
diff --git a/src/ephy-shell.h b/src/ephy-shell.h
index 9bc1fe06d..84b86d340 100644
--- a/src/ephy-shell.h
+++ b/src/ephy-shell.h
@@ -112,6 +112,7 @@ EphyShell *ephy_shell_new (void);
gboolean ephy_shell_startup (EphyShell *shell,
EphyShellStartupFlags flags,
+ guint32 user_time,
const char **args,
const char *string_arg,
GError **error);
@@ -122,6 +123,13 @@ EphyTab *ephy_shell_new_tab (EphyShell *shell,
const char *url,
EphyNewTabFlags flags);
+EphyTab *ephy_shell_new_tab_full (EphyShell *shell,
+ EphyWindow *parent_window,
+ EphyTab *previous_tab,
+ const char *url,
+ EphyNewTabFlags flags,
+ guint32 user_time);
+
GObject *ephy_shell_get_session (EphyShell *shell);
EphyBookmarks *ephy_shell_get_bookmarks (EphyShell *shell);