diff options
Diffstat (limited to 'src/ephy-main.c')
-rw-r--r-- | src/ephy-main.c | 657 |
1 files changed, 321 insertions, 336 deletions
diff --git a/src/ephy-main.c b/src/ephy-main.c index 896cdcb53..86d1f2160 100644 --- a/src/ephy-main.c +++ b/src/ephy-main.c @@ -1,6 +1,8 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* * Copyright © 2000-2002 Marco Pesenti Gritti * Copyright © 2006, 2008 Christian Persch + * Copyright © 2011 Igalia S.L. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,7 +50,7 @@ #endif static GQuark startup_error_quark = 0; -#define STARTUP_ERROR_QUARK (startup_error_quark) +#define STARTUP_ERROR_QUARK (startup_error_quark) static gboolean open_in_new_tab = FALSE; static gboolean open_in_new_window = FALSE; @@ -74,40 +76,40 @@ option_version_cb (const gchar *option_name, g_print ("%s %s\n", _("GNOME Web Browser"), VERSION); exit (EXIT_SUCCESS); - return FALSE; + return FALSE; } static const GOptionEntry option_entries[] = { - { "new-tab", 'n', 0, G_OPTION_ARG_NONE, &open_in_new_tab, - N_("Open a new tab in an existing browser window"), NULL }, - { "new-window", 0, 0, G_OPTION_ARG_NONE, &open_in_new_window, - N_("Open a new browser window"), NULL }, - { "bookmarks-editor", 'b', 0, G_OPTION_ARG_NONE, &open_as_bookmarks_editor, - N_("Launch the bookmarks editor"), NULL }, - { "import-bookmarks", '\0', 0, G_OPTION_ARG_FILENAME, &bookmarks_file, - N_("Import bookmarks from the given file"), N_("FILE") }, - { "load-session", 'l', 0, G_OPTION_ARG_FILENAME, &session_filename, - N_("Load the given session file"), N_("FILE") }, - { "add-bookmark", 't', 0, G_OPTION_ARG_STRING, &bookmark_url, - N_("Add a bookmark"), N_("URL") }, - { "private-instance", 'p', 0, G_OPTION_ARG_NONE, &private_instance, - N_("Start a private instance"), 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, - "", N_("URL …")}, - { "version", 0, G_OPTION_FLAG_NO_ARG | G_OPTION_FLAG_HIDDEN, - G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL }, - { NULL } + { "new-tab", 'n', 0, G_OPTION_ARG_NONE, &open_in_new_tab, + N_("Open a new tab in an existing browser window"), NULL }, + { "new-window", 0, 0, G_OPTION_ARG_NONE, &open_in_new_window, + N_("Open a new browser window"), NULL }, + { "bookmarks-editor", 'b', 0, G_OPTION_ARG_NONE, &open_as_bookmarks_editor, + N_("Launch the bookmarks editor"), NULL }, + { "import-bookmarks", '\0', 0, G_OPTION_ARG_FILENAME, &bookmarks_file, + N_("Import bookmarks from the given file"), N_("FILE") }, + { "load-session", 'l', 0, G_OPTION_ARG_FILENAME, &session_filename, + N_("Load the given session file"), N_("FILE") }, + { "add-bookmark", 't', 0, G_OPTION_ARG_STRING, &bookmark_url, + N_("Add a bookmark"), N_("URL") }, + { "private-instance", 'p', 0, G_OPTION_ARG_NONE, &private_instance, + N_("Start a private instance"), 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, + "", N_("URL …")}, + { "version", 0, G_OPTION_FLAG_NO_ARG | G_OPTION_FLAG_HIDDEN, + G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL }, + { NULL } }; #ifdef GNOME_ENABLE_DEBUG static GOptionEntry debug_option_entries[] = { - { "keep-tempdir", 0, 0, G_OPTION_ARG_NONE, &keep_temp_directory, - "Don't delete the temporary directory on exit", NULL }, - { NULL } + { "keep-tempdir", 0, 0, G_OPTION_ARG_NONE, &keep_temp_directory, + "Don't delete the temporary directory on exit", NULL }, + { NULL } }; #endif /* GNOME_ENABLE_DEBUG */ @@ -115,33 +117,30 @@ static GOptionEntry debug_option_entries[] = 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; + 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; } /* Copied from libnautilus/nautilus-program-choosing.c; Needed in case @@ -150,318 +149,304 @@ get_startup_id (void) static Time slowly_and_stupidly_obtain_timestamp (Display *xdisplay) { - Window xwindow; - XEvent event; - - { - XSetWindowAttributes attrs; - Atom atom_name; - Atom atom_type; - char* name; - - attrs.override_redirect = True; - attrs.event_mask = PropertyChangeMask | StructureNotifyMask; - - xwindow = - XCreateWindow (xdisplay, - RootWindow (xdisplay, 0), - -100, -100, 1, 1, - 0, - CopyFromParent, - CopyFromParent, - CopyFromParent, - CWOverrideRedirect | CWEventMask, - &attrs); - - atom_name = XInternAtom (xdisplay, "WM_NAME", TRUE); - g_assert (atom_name != None); - atom_type = XInternAtom (xdisplay, "STRING", TRUE); - g_assert (atom_type != None); - - name = "Fake Window"; - XChangeProperty (xdisplay, - xwindow, atom_name, - atom_type, - 8, PropModeReplace, (unsigned char *)name, strlen (name)); - } - - XWindowEvent (xdisplay, - xwindow, - PropertyChangeMask, - &event); - - XDestroyWindow(xdisplay, xwindow); - - return event.xproperty.time; + Window xwindow; + XEvent event; + + { + XSetWindowAttributes attrs; + Atom atom_name; + Atom atom_type; + char* name; + + attrs.override_redirect = True; + attrs.event_mask = PropertyChangeMask | StructureNotifyMask; + + xwindow = + XCreateWindow (xdisplay, + RootWindow (xdisplay, 0), + -100, -100, 1, 1, + 0, + CopyFromParent, + CopyFromParent, + CopyFromParent, + CWOverrideRedirect | CWEventMask, + &attrs); + + atom_name = XInternAtom (xdisplay, "WM_NAME", TRUE); + g_assert (atom_name != None); + atom_type = XInternAtom (xdisplay, "STRING", TRUE); + g_assert (atom_type != None); + + name = "Fake Window"; + XChangeProperty (xdisplay, + xwindow, atom_name, + atom_type, + 8, PropModeReplace, (unsigned char *)name, strlen (name)); + } + + XWindowEvent (xdisplay, + xwindow, + PropertyChangeMask, + &event); + + XDestroyWindow(xdisplay, xwindow); + + return event.xproperty.time; } static void show_error_message (GError **error) { - GtkWidget *dialog; - - /* FIXME better texts!!! */ - dialog = gtk_message_dialog_new (NULL, - GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - _("Could not start GNOME Web Browser")); - gtk_message_dialog_format_secondary_text - (GTK_MESSAGE_DIALOG (dialog), - _("Startup failed because of the following error:\n%s"), - (*error)->message); - - g_clear_error (error); - - gtk_dialog_run (GTK_DIALOG (dialog)); + GtkWidget *dialog; + + /* FIXME better texts!!! */ + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Could not start GNOME Web Browser")); + gtk_message_dialog_format_secondary_text + (GTK_MESSAGE_DIALOG (dialog), + _("Startup failed because of the following error:\n%s"), + (*error)->message); + + g_clear_error (error); + + gtk_dialog_run (GTK_DIALOG (dialog)); } static EphyStartupFlags get_startup_flags (void) { - EphyStartupFlags flags = 0; + EphyStartupFlags flags = 0; - if (open_in_new_tab) - flags |= EPHY_STARTUP_NEW_TAB; - if (open_in_new_window) - flags |= EPHY_STARTUP_NEW_WINDOW; - if (open_as_bookmarks_editor) - flags |= EPHY_STARTUP_BOOKMARKS_EDITOR; + if (open_in_new_tab) + flags |= EPHY_STARTUP_NEW_TAB; + if (open_in_new_window) + flags |= EPHY_STARTUP_NEW_WINDOW; + if (open_as_bookmarks_editor) + flags |= EPHY_STARTUP_BOOKMARKS_EDITOR; - return flags; + return flags; } int main (int argc, char *argv[]) { - GOptionContext *option_context; - GOptionGroup *option_group; - GError *error = NULL; - guint32 user_time; - gboolean arbitrary_url; - EphyApplication *application; - EphyApplicationStartupContext *ctx; - EphyStartupFlags startup_flags; - int status; + GOptionContext *option_context; + GOptionGroup *option_group; + GError *error = NULL; + guint32 user_time; + gboolean arbitrary_url; + EphyApplication *application; + EphyApplicationStartupContext *ctx; + EphyStartupFlags startup_flags; + int status; #ifdef ENABLE_NLS - /* Initialize the i18n stuff */ - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); + /* Initialize the i18n stuff */ + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); #endif - /* Threads have to be initialised before calling ANY glib function */ - g_thread_init (NULL); - - /* check libxml2 API version epiphany was compiled with against the - * version we're running with. - */ - LIBXML_TEST_VERSION; - - /* sets name to help matching with the .desktop file */ - g_set_prgname ("epiphany"); - - /* If we're given -remote arguments, translate them */ - if (argc >= 2 && - strcmp (argv[1], "-remote") == 0) - { - const char *opening, *closing; - char *command, *argument; - char **arguments; - - if (argc != 3) - { - g_print ("-remote allows exactly one argument\n"); - exit (1); - } - - opening = strchr (argv[2], '('); - closing = strchr (argv[2], ')'); - - if (opening == NULL || - closing == NULL || - opening == argv[2] || - opening + 1 >= closing) - { - g_print ("Invalid argument for -remote\n"); - exit (1); - } - - command = g_strstrip (g_strndup (argv[2], opening - argv[2])); - - /* See http://lxr.mozilla.org/seamonkey/source/xpfe/components/xremote/src/XRemoteService.cpp - * for the commands that mozilla supports; we'll just support openURL here. - */ - if (g_ascii_strcasecmp (command, "openURL") != 0) - { - g_print ("-remote command \"%s\" not supported\n", command); - g_free (command); - exit (1); - } - - g_free (command); - - argument = g_strstrip (g_strndup (opening + 1, closing - opening - 1)); - arguments = g_strsplit (argument, ",", -1); - g_free (argument); - if (arguments == NULL) - { - g_print ("Invalid argument for -remote\n"); - - exit (1); - } - - /* replace arguments */ - argv[1] = g_strstrip (g_strdup (arguments[0])); - argc = 2; - - g_strfreev (arguments); - } - - /* Initialise our debug helpers */ - ephy_debug_init (); - - /* get this early, since gdk will unset the env var */ - user_time = get_startup_id (); - - option_context = g_option_context_new (""); - option_group = g_option_group_new ("epiphany", - N_("GNOME Web Browser"), - N_("GNOME Web Browser options"), - NULL, NULL); - - g_option_group_set_translation_domain (option_group, GETTEXT_PACKAGE); - - g_option_group_add_entries (option_group, option_entries); - - g_option_context_set_main_group (option_context, option_group); + /* Threads have to be initialised before calling ANY glib function */ + g_thread_init (NULL); + + /* check libxml2 API version epiphany was compiled with against the + * version we're running with. + */ + LIBXML_TEST_VERSION; + + /* sets name to help matching with the .desktop file */ + g_set_prgname ("epiphany"); + + /* If we're given -remote arguments, translate them */ + if (argc >= 2 && strcmp (argv[1], "-remote") == 0) { + const char *opening, *closing; + char *command, *argument; + char **arguments; + + if (argc != 3) { + g_print ("-remote allows exactly one argument\n"); + exit (1); + } + + opening = strchr (argv[2], '('); + closing = strchr (argv[2], ')'); + + if (opening == NULL || + closing == NULL || + opening == argv[2] || + opening + 1 >= closing) { + g_print ("Invalid argument for -remote\n"); + exit (1); + } + + command = g_strstrip (g_strndup (argv[2], opening - argv[2])); + + /* See http://lxr.mozilla.org/seamonkey/source/xpfe/components/xremote/src/XRemoteService.cpp + * for the commands that mozilla supports; we'll just support openURL here. + */ + if (g_ascii_strcasecmp (command, "openURL") != 0) { + g_print ("-remote command \"%s\" not supported\n", command); + g_free (command); + exit (1); + } + + g_free (command); + + argument = g_strstrip (g_strndup (opening + 1, closing - opening - 1)); + arguments = g_strsplit (argument, ",", -1); + g_free (argument); + if (arguments == NULL) { + g_print ("Invalid argument for -remote\n"); + + exit (1); + } + + /* replace arguments */ + argv[1] = g_strstrip (g_strdup (arguments[0])); + argc = 2; + + g_strfreev (arguments); + } + + /* Initialise our debug helpers */ + ephy_debug_init (); + + /* get this early, since gdk will unset the env var */ + user_time = get_startup_id (); + + option_context = g_option_context_new (""); + option_group = g_option_group_new ("epiphany", + N_("GNOME Web Browser"), + N_("GNOME Web Browser options"), + NULL, NULL); + + g_option_group_set_translation_domain (option_group, GETTEXT_PACKAGE); + + g_option_group_add_entries (option_group, option_entries); + + g_option_context_set_main_group (option_context, option_group); #ifdef ENABLE_INTROSPECTION - g_option_context_add_group (option_context, g_irepository_get_option_group ()); + g_option_context_add_group (option_context, g_irepository_get_option_group ()); #endif - g_option_context_add_group (option_context, gtk_get_option_group (TRUE)); - g_option_context_add_group (option_context, egg_sm_client_get_option_group ()); + g_option_context_add_group (option_context, gtk_get_option_group (TRUE)); + g_option_context_add_group (option_context, egg_sm_client_get_option_group ()); #ifdef GNOME_ENABLE_DEBUG - option_group = g_option_group_new ("debug", - "Epiphany debug options", - "Epiphany debug options", - NULL, NULL); - g_option_group_add_entries (option_group, debug_option_entries); - g_option_context_add_group (option_context, option_group); + option_group = g_option_group_new ("debug", + "Epiphany debug options", + "Epiphany debug options", + NULL, NULL); + g_option_group_add_entries (option_group, debug_option_entries); + g_option_context_add_group (option_context, option_group); #endif /* GNOME_ENABLE_DEBUG */ - if (!g_option_context_parse (option_context, &argc, &argv, &error)) - { - g_print ("Failed to parse arguments: %s\n", error->message); - g_error_free (error); - g_option_context_free (option_context); - exit (1); - } + if (!g_option_context_parse (option_context, &argc, &argv, &error)) { + g_print ("Failed to parse arguments: %s\n", error->message); + g_error_free (error); + g_option_context_free (option_context); + exit (1); + } - g_option_context_free (option_context); - - /* Some argument sanity checks*/ - if (arguments != NULL && (session_filename != NULL || open_as_bookmarks_editor)) - { - g_print ("Cannot use --bookmarks-editor or --load-session with URL arguments\n"); - exit (1); - } - - if (profile_directory != NULL && private_instance == FALSE) - { - g_print ("--profile can only be used in combination with --private-instance\n"); - exit (1); - } - - arbitrary_url = g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, - EPHY_PREFS_LOCKDOWN_ARBITRARY_URL); - - if (arguments != NULL && arbitrary_url) - { - g_print ("URL loading is locked down\n"); - exit (1); - } - - /* convert arguments to uris or at least to utf8 */ - if (arguments != NULL) { - char **args = ephy_string_commandline_args_to_uris (arguments, - &error); - if (error) { - g_print ("Could not convert to UTF-8: %s!\n", - error->message); - g_error_free (error); - exit (1); - } - g_strfreev (arguments); - arguments = args; - } - - /* Get a timestamp manually if need be */ - if (user_time == 0) - { - user_time = slowly_and_stupidly_obtain_timestamp (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); - } - - /* sets the name to appear in the window list applet when grouping windows */ - g_set_application_name (_("Web Browser")); - - /* Set default window icon */ - gtk_window_set_default_icon_name (EPHY_STOCK_EPHY); - - startup_error_quark = g_quark_from_static_string ("epiphany-startup-error"); - - /* Start our services */ - if (!ephy_file_helpers_init (profile_directory, - private_instance, - keep_temp_directory || profile_directory, - &error)) - { - show_error_message (&error); - - exit (1); - } - - ephy_stock_icons_init (); - ephy_file_load_accels (); - - /* Work-around Flash Player crash */ - g_setenv ("XLIB_SKIP_ARGB_VISUALS", "1", FALSE); - - /* Now create the shell */ - _ephy_shell_create_instance (); - - application = ephy_shell_get_application (ephy_shell_get_default()); - if (private_instance) { - GApplicationFlags flags; - - flags = g_application_get_flags (G_APPLICATION (application)); - flags |= G_APPLICATION_NON_UNIQUE; - - g_application_set_flags (G_APPLICATION (application), flags); - } - startup_flags = get_startup_flags (); - ctx = ephy_application_startup_context_new (startup_flags, - bookmarks_file, - session_filename, - bookmark_url, - arguments, - user_time); - g_strfreev (arguments); - ephy_application_set_startup_context (application, ctx); - status = g_application_run (G_APPLICATION (application), argc, argv); - - /* Shutdown */ - g_object_unref (ephy_shell); - - ephy_file_save_accels (); - ephy_state_save (); - ephy_settings_shutdown (); - ephy_file_helpers_shutdown (); - xmlCleanupParser (); - - return status; + g_option_context_free (option_context); + + /* Some argument sanity checks*/ + if (arguments != NULL && (session_filename != NULL || open_as_bookmarks_editor)) { + g_print ("Cannot use --bookmarks-editor or --load-session with URL arguments \n"); + exit (1); + } + + if (profile_directory != NULL && private_instance == FALSE) { + g_print ("--profile can only be used in combination wit h --private-instance\n"); + exit (1); + } + + arbitrary_url = g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, + EPHY_PREFS_LOCKDOWN_ARBITRARY_URL); + + if (arguments != NULL && arbitrary_url) { + g_print ("URL loading is locked dow n\n"); + exit (1); + } + + /* convert arguments to uris or at least to utf8 */ + if (arguments != NULL) { + char **args = ephy_string_commandline_args_to_uris (arguments, + &error); + if (error) { + g_print ("Could not convert to UTF-8: %s!\n", + error->message); + g_error_free (error); + exit (1); + } + g_strfreev (arguments); + arguments = args; + } + + /* Get a timestamp manually if need be */ + if (user_time == 0) + user_time = slowly_and_stupidly_obtain_timestamp (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); + + /* sets the name to appear in the window list applet when grouping windows */ + g_set_application_name (_("Web Browser")); + + /* Set default window icon */ + gtk_window_set_default_icon_name (EPHY_STOCK_EPHY); + + startup_error_quark = g_quark_from_static_string ("epiphany-startup-error"); + + /* Start our services */ + if (!ephy_file_helpers_init (profile_directory, + private_instance, + keep_temp_directory || profile_directory, + &error)) { + show_error_message (&error); + exit (1); + } + + ephy_stock_icons_init (); + ephy_file_load_accels (); + + /* Work-around Flash Player crash */ + g_setenv ("XLIB_SKIP_ARGB_VISUALS", "1", FALSE); + + /* Now create the shell */ + _ephy_shell_create_instance (); + + application = ephy_shell_get_application (ephy_shell_get_default()); + if (private_instance) { + GApplicationFlags flags; + + flags = g_application_get_flags (G_APPLICATION (application)); + flags |= G_APPLICATION_NON_UNIQUE; + + g_application_set_flags (G_APPLICATION (application), flags); + } + startup_flags = get_startup_flags (); + ctx = ephy_application_startup_context_new (startup_flags, + bookmarks_file, + session_filename, + bookmark_url, + arguments, + user_time); + g_strfreev (arguments); + ephy_application_set_startup_context (application, ctx); + status = g_application_run (G_APPLICATION (application), argc, argv); + + /* Shutdown */ + g_object_unref (ephy_shell); + + ephy_file_save_accels (); + ephy_state_save (); + ephy_settings_shutdown (); + ephy_file_helpers_shutdown (); + xmlCleanupParser (); + + return status; } |