diff options
author | Marco Pesenti Gritti <mpeseng@src.gnome.org> | 2002-12-31 03:29:24 +0800 |
---|---|---|
committer | Marco Pesenti Gritti <mpeseng@src.gnome.org> | 2002-12-31 03:29:24 +0800 |
commit | 6876ede98282c7db318089bfefb292aa59e55d48 (patch) | |
tree | 76b23252d04da232d0ebf22e53bfe3e022686af9 /src/ephy-main.c | |
download | gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.gz gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.bz2 gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.lz gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.xz gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.zst gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.zip |
Initial revision
Diffstat (limited to 'src/ephy-main.c')
-rw-r--r-- | src/ephy-main.c | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/src/ephy-main.c b/src/ephy-main.c new file mode 100644 index 000000000..0a0093974 --- /dev/null +++ b/src/ephy-main.c @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2000-2002 Marco Pesenti Gritti + * + * 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 + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "ephy-shell.h" +#include "ephy-automation.h" +#include "ephy-window.h" +#include "EphyAutomation.h" + +#include <libbonoboui.h> +#include <libgnome/gnome-program.h> +#include <libgnomeui/gnome-ui-init.h> +#include <libgnomeui/gnome-window-icon.h> +#include <libgnomevfs/gnome-vfs-init.h> +#include <glade/glade-init.h> + +#define EPHY_FACTORY_OAFIID "OAFIID:GNOME_Epiphany_Automation_Factory" + +static gboolean +ephy_main_automation_init (void); +static gint +ephy_main_translate_url_arguments (poptContext context, gchar ***urls); +static gboolean +ephy_main_start (gpointer data); + +GnomeProgram *program; +CORBA_Environment corba_env; /* Global for downloader */ +static gboolean open_in_existing = FALSE; /* load in existing window? */ +static gboolean open_in_new_tab = FALSE; /* force open in a new tab? */ +static gboolean noraise = FALSE; /* no raise */ +static gboolean open_in_new_window = FALSE; /* force open in a new window? */ +static gboolean open_fullscreen = FALSE; /* open ephy in full screen ? */ +static gchar *session_filename = NULL; /* the session filename */ +static gchar *geometry_string = NULL; /* the geometry string */ +static gchar *bookmark_url = NULL; /* the temp bookmark to add */ +static gboolean close_option = FALSE; /* --close */ +static gboolean quit_option = FALSE; /* --quit */ +static gboolean ephy_server_mode = FALSE; +static gboolean open_as_nautilus_view = FALSE; + +static BonoboObject *automation_object; +static gint n_urls; +static gchar **url; +static gboolean first_instance; + +/* command line argument parsing structure */ +static struct poptOption popt_options[] = +{ + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, &bonobo_activation_popt_options, 0, NULL, + NULL }, + { "new-tab", 'n', POPT_ARG_NONE, &open_in_new_tab, 0, + N_("Open a new tab in an existing Ephy window"), + NULL }, + { "new-window", 'w', POPT_ARG_NONE, &open_in_new_window, 0, + N_("Open a new window in an existing Ephy process"), + NULL }, + { "noraise", '\0', POPT_ARG_NONE, &noraise, 0, + N_("Do not raise the window when opening a page in an existing Ephy process"), + NULL }, + { "fullscreen", 'f', POPT_ARG_NONE, &open_fullscreen, 0, + N_("Run Ephy in full screen mode"), + NULL }, + { "existing", 'x', POPT_ARG_NONE, &open_in_existing, 0, + N_("Attempt to load URL in existing Ephy window"), + NULL }, + { "load-session", 'l', POPT_ARG_STRING, &session_filename, 0, + N_("Load the given session file"), + N_("FILE") }, + { "server", 's', POPT_ARG_NONE, &ephy_server_mode, 0, + N_("Don't open any windows; instead act as a server " + "for quick startup of new Ephy instances"), + NULL }, + { "add-bookmark", 't', POPT_ARG_STRING, &bookmark_url, + 0, N_("Add a bookmark (don't open any window)"), + N_("URL")}, + { "geometry", 'g', POPT_ARG_STRING, &geometry_string, + 0, N_("Create the initial window with the given geometry.\n" + "see X(1) for the GEOMETRY format"), + N_("GEOMETRY")}, + { "close", 'c', POPT_ARG_NONE, &close_option, 0, + N_("Close all Ephy windows"), + NULL }, + { "quit", 'q', POPT_ARG_NONE, &quit_option, 0, + N_("Same as --close, but exits server mode too"), + NULL }, + { "nautilus-view", 'v', POPT_ARG_NONE, &open_as_nautilus_view, 0, + N_("Used internally by the nautilus view"), + NULL }, + + /* terminator, must be last */ + { NULL, 0, 0, NULL, 0, NULL, NULL } +}; + +int +main (int argc, char *argv[]) +{ + poptContext context; + GValue context_as_value = { 0 }; + GnomeProgram *program; + +#ifdef ENABLE_NLS + /* Initialize the i18n stuff */ + bindtextdomain(GETTEXT_PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + textdomain(GETTEXT_PACKAGE); +#endif + + program = gnome_program_init (PACKAGE, VERSION, + LIBGNOMEUI_MODULE, argc, argv, + GNOME_PARAM_POPT_TABLE, popt_options, + GNOME_PARAM_HUMAN_READABLE_NAME, _("Ephy"), + GNOME_PARAM_APP_DATADIR, DATADIR, + NULL); + + g_object_get_property (G_OBJECT (program), + GNOME_PARAM_POPT_CONTEXT, + g_value_init (&context_as_value, G_TYPE_POINTER)); + + context = g_value_get_pointer (&context_as_value); + + /* load arguments that aren't regular options (urls to load) */ + n_urls = ephy_main_translate_url_arguments (context, &url); + + first_instance = ephy_main_automation_init (); + + if (first_instance) + { + gnome_vfs_init (); + + glade_gnome_init (); + + gnome_window_icon_set_default_from_file (PIXMAP_DIR "/ephy.png"); + + ephy_shell_new (); + + g_idle_add ((GSourceFunc) ephy_main_start, NULL); + + bonobo_main (); + + gnome_vfs_shutdown (); + } + + return 0; +} + +static gboolean +ephy_main_start (gpointer data) +{ + GNOME_EphyAutomation gaserver; + int i; + + CORBA_exception_init (&corba_env); + + gaserver = bonobo_activation_activate_from_id ("OAFIID:GNOME_Epiphany_Automation", + 0, NULL, &corba_env); + + if (gaserver == NULL) + { + GtkWidget *dialog; + dialog = gtk_message_dialog_new + (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "Ephy can't be used now. " + "Running the command \"bonobo-slay\" " + "from the console may fix the problem. If not, " + "you can try rebooting the computer or " + "installing Ephy again.\n\n" + "Bonobo couldn't locate the GNOME_Epiphany_Automation.server. "); + gtk_dialog_run (GTK_DIALOG (dialog)); + + } + /* FIXME ephy --server doesnt work when not first istance */ + /* Server mode */ + else if (ephy_server_mode) + { + g_object_ref (G_OBJECT(ephy_shell)); + } + /* load the session if requested */ + else if (session_filename) + { + GNOME_EphyAutomation_loadSession + (gaserver, session_filename, &corba_env); + } + /* if found and we're given a bookmark to add... */ + else if (bookmark_url != NULL) + { + GNOME_EphyAutomation_addBookmark + (gaserver, bookmark_url, &corba_env); + } + else if (close_option || quit_option) + { + GNOME_EphyAutomation_quit + (gaserver, quit_option, &corba_env); + } + /* provided with urls? */ + else if (n_urls == 0 && + !open_as_nautilus_view) + { + /* no, open a default window */ + GNOME_EphyAutomation_loadurl + (gaserver, "", + geometry_string ? + geometry_string : "", + open_fullscreen, + open_in_existing, + open_in_new_window, + open_in_new_tab, + !noraise, + &corba_env); + } + else + { + /* open all of the urls */ + for (i = 0; i < n_urls; i++) + { + GNOME_EphyAutomation_loadurl + (gaserver, url[i], + geometry_string ? + geometry_string : "", + open_fullscreen, + open_in_existing, + open_in_new_window, + open_in_new_tab, + !noraise, + &corba_env); + } + } + + /* Unref so it will exit if no more used */ + if (first_instance) + { + g_object_unref (G_OBJECT(ephy_shell)); + } + + if (gaserver) + { + bonobo_object_release_unref (gaserver, &corba_env); + } + + CORBA_exception_free (&corba_env); + + return FALSE; +} + +static gboolean +ephy_main_automation_init (void) +{ + CORBA_Object factory; + + factory = bonobo_activation_activate_from_id + (EPHY_FACTORY_OAFIID, + Bonobo_ACTIVATION_FLAG_EXISTING_ONLY, + NULL, NULL); + + if (!factory) + { + automation_object = ephy_automation_new (); + return TRUE; + } + else + { + ephy_main_start (NULL); + g_message (_("Ephy already running, using existing process")); + return FALSE; + } +} + +/** + * translate_url_arguments: gather URL arguments and expand them fully + * with realpath if they're filenames + */ +static gint +ephy_main_translate_url_arguments (poptContext context, gchar ***urls) +{ + gchar buffer[PATH_MAX]; + gchar **args; + gint i, n; + + /* any context remaining? */ + if (context == NULL) + { + *urls = NULL; + return 0; + } + + /* get the args and check */ + args = (gchar **) poptGetArgs (context); + if (args == NULL) + { + poptFreeContext (context); + *urls = NULL; + return 0; + } + + /* count args */ + for (n = 0; args[n] != NULL; n++) + /* nothing */; + + /* allocate pointer array */ + *urls = g_new0 (gchar *, n + 1); + + /* translate each one */ + for (i = 0; i < n; i++) + { + /* try to expand as files */ + if (realpath (args[i], buffer) != NULL) + { + (*urls)[i] = g_strconcat ("file://", buffer, NULL); + } + else + { + (*urls)[i] = g_strdup (args[i]); + } + } + poptFreeContext (context); + (*urls)[i] = NULL; + + /* return the number of urls */ + return n; +} |