]> www.fi.muni.cz Git - evince.git/blobdiff - shell/main.c
Tamil Translation updated
[evince.git] / shell / main.c
index b874b28bb3856abb02a49b862a067deb966e2681..1f3da854cc555a96c66bfd484f40020edf01d1ce 100644 (file)
 #include "ev-file-helpers.h"
 
 static char *ev_page_label;
 #include "ev-file-helpers.h"
 
 static char *ev_page_label;
+static const char **file_arguments = NULL;
 
 
-static struct poptOption popt_options[] =
+static const GOptionEntry goption_options[] =
 {
 {
-       { "page-label", 'p', POPT_ARG_STRING, &ev_page_label, 0, N_("The page of the document to display."), N_("PAGE")},
-       { NULL, 0, 0, NULL, 0, NULL, NULL }
+       { "page-label", 'p', 0, G_OPTION_ARG_STRING, &ev_page_label, N_("The page of the document to display."), N_("PAGE")},
+       { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, N_("[FILE...]") },
+       { NULL }
 };
 
 static void
 };
 
 static void
@@ -63,57 +65,26 @@ load_files (const char **files)
 
        for (i = 0; files[i]; i++) {
                char *uri;
 
        for (i = 0; files[i]; i++) {
                char *uri;
+               char *label;
 
                uri = gnome_vfs_make_uri_from_shell_arg (files[i]);
 
                uri = gnome_vfs_make_uri_from_shell_arg (files[i]);
-               ev_application_open_uri (EV_APP, uri, ev_page_label,
-                                        GDK_CURRENT_TIME, NULL);
+               
+               label = strchr (uri, GNOME_VFS_URI_MAGIC_CHR);
+               
+               if (label) {
+                       *label = 0; label++;
+                       ev_application_open_uri (EV_APP, uri, label,
+                                                GDK_CURRENT_TIME, NULL);
+               } else {        
+                       ev_application_open_uri (EV_APP, uri, ev_page_label,
+                                                GDK_CURRENT_TIME, NULL);
+               }
                g_free (uri);
         }
 }
 
 #ifdef ENABLE_DBUS
 
                g_free (uri);
         }
 }
 
 #ifdef ENABLE_DBUS
 
-#ifndef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
-static guint32
-get_startup_time (void)
-{
-       const char *envvar, *timestamp;
-       unsigned long value;
-       char *end;
-
-       envvar = getenv ("DESKTOP_STARTUP_ID");
-
-       if (envvar == NULL)
-               return 0;
-
-/* DESKTOP_STARTUP_ID is of form "<unique>_TIME<timestamp>".
- *
- * <unique> might contain a T but <timestamp> is an integer.  As such,
- * the last 'T' in the string must be the start of "TIME".
- */
-       timestamp = rindex (envvar, 'T');
-
-/* Maybe the word "TIME" was not found... */
-       if (timestamp == NULL || strncmp (timestamp, "TIME", 4))
-               return 0;
-
-       timestamp += 4;
-
-/* strtoul sets errno = ERANGE on overflow, but it is not specified
- * if it sets it to 0 on success.  Doing so ourselves is the only
- * way to know for sure.
- */
-       errno = 0;
-       value = strtoul (timestamp, &end, 10);
-
-/* unsigned long might be 64bit, so double-check! */
-       if (errno != 0 || *end != '\0' || value > G_MAXINT32)
-               return 0;
-
-       return value;
-}
-#endif
-
 static gboolean
 load_files_remote (const char **files)
 {
 static gboolean
 load_files_remote (const char **files)
 {
@@ -125,19 +96,13 @@ load_files_remote (const char **files)
        DBusGPendingCall *call;
 #endif
        DBusGProxy *remote_object;
        DBusGPendingCall *call;
 #endif
        DBusGProxy *remote_object;
-#ifdef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
        GdkDisplay *display;
        GdkDisplay *display;
-#endif
        guint32 timestamp;
 
        guint32 timestamp;
 
-#ifdef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
        display = gdk_display_get_default();
        timestamp = gdk_x11_display_get_user_time (display);
        display = gdk_display_get_default();
        timestamp = gdk_x11_display_get_user_time (display);
-#else
-       /* Fake it for GTK+2.6 */
-       timestamp = get_startup_time ();
-#endif
        connection = dbus_g_bus_get (DBUS_BUS_STARTER, &error);
        connection = dbus_g_bus_get (DBUS_BUS_STARTER, &error);
+
        if (connection == NULL) {
                g_warning (error->message);
                g_error_free (error);   
        if (connection == NULL) {
                g_warning (error->message);
                g_error_free (error);   
@@ -158,6 +123,8 @@ load_files_remote (const char **files)
                if (!dbus_g_proxy_end_call (remote_object, call, &error, DBUS_TYPE_INVALID)) {
                        g_warning (error->message);
                        g_clear_error (&error);
                if (!dbus_g_proxy_end_call (remote_object, call, &error, DBUS_TYPE_INVALID)) {
                        g_warning (error->message);
                        g_clear_error (&error);
+                       g_object_unref (remote_object);
+                       dbus_g_connection_unref (connection);
                        return FALSE;
                }
 #elif DBUS_VERSION == 34
                        return FALSE;
                }
 #elif DBUS_VERSION == 34
@@ -168,6 +135,8 @@ load_files_remote (const char **files)
                if (!dbus_g_proxy_end_call (remote_object, call, &error, G_TYPE_INVALID)) {
                        g_warning (error->message);
                        g_clear_error (&error);
                if (!dbus_g_proxy_end_call (remote_object, call, &error, G_TYPE_INVALID)) {
                        g_warning (error->message);
                        g_clear_error (&error);
+                       g_object_unref (remote_object);
+                       dbus_g_connection_unref (connection);
                        return FALSE;
                }
 #else
                        return FALSE;
                }
 #else
@@ -177,9 +146,14 @@ load_files_remote (const char **files)
                                        G_TYPE_INVALID)) {
                        g_warning (error->message);
                        g_clear_error (&error);
                                        G_TYPE_INVALID)) {
                        g_warning (error->message);
                        g_clear_error (&error);
+                       g_object_unref (remote_object);
+                       dbus_g_connection_unref (connection);
                        return FALSE;
                }
 #endif
                        return FALSE;
                }
 #endif
+               g_object_unref (remote_object);
+               dbus_g_connection_unref (connection);
+               
                return TRUE;
        }
 
                return TRUE;
        }
 
@@ -188,7 +162,7 @@ load_files_remote (const char **files)
                char *uri;
 
                uri = gnome_vfs_make_uri_from_shell_arg (files[i]);
                char *uri;
 
                uri = gnome_vfs_make_uri_from_shell_arg (files[i]);
-               page_label = ev_page_label ? ev_page_label : ""; 
+               page_label = ev_page_label ? ev_page_label : "";
 #if DBUS_VERSION <= 33
                call = dbus_g_proxy_begin_call (remote_object, "OpenURI",
                                                DBUS_TYPE_STRING, &uri,
 #if DBUS_VERSION <= 33
                call = dbus_g_proxy_begin_call (remote_object, "OpenURI",
                                                DBUS_TYPE_STRING, &uri,
@@ -232,6 +206,9 @@ load_files_remote (const char **files)
                result = TRUE;
         }
 
                result = TRUE;
         }
 
+       g_object_unref (remote_object);
+       dbus_g_connection_unref (connection);
+
        gdk_notify_startup_complete ();
 
        return result;
        gdk_notify_startup_complete ();
 
        return result;
@@ -242,42 +219,41 @@ int
 main (int argc, char *argv[])
 {
        gboolean enable_metadata = FALSE;
 main (int argc, char *argv[])
 {
        gboolean enable_metadata = FALSE;
-       poptContext context;
-        GValue context_as_value = { 0 };
+       GOptionContext *context;
        GnomeProgram *program;
 
        GnomeProgram *program;
 
+       context = g_option_context_new (_("GNOME Document Viewer"));
+
 #ifdef ENABLE_NLS
        /* Initialize the i18n stuff */
        bindtextdomain(GETTEXT_PACKAGE, GNOMELOCALEDIR);
        bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
        textdomain(GETTEXT_PACKAGE);
 #ifdef ENABLE_NLS
        /* Initialize the i18n stuff */
        bindtextdomain(GETTEXT_PACKAGE, GNOMELOCALEDIR);
        bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
        textdomain(GETTEXT_PACKAGE);
+       g_option_context_add_main_entries (context, goption_options, GETTEXT_PACKAGE);
+#else
+       g_option_context_add_main_entries (context, goption_options, NULL);
 #endif
 
        program = gnome_program_init (PACKAGE, VERSION,
                                       LIBGNOMEUI_MODULE, argc, argv,
 #endif
 
        program = gnome_program_init (PACKAGE, VERSION,
                                       LIBGNOMEUI_MODULE, argc, argv,
-                                      GNOME_PARAM_POPT_TABLE, popt_options,
+                                      GNOME_PARAM_GOPTION_CONTEXT, context,
                                       GNOME_PARAM_HUMAN_READABLE_NAME, _("Evince"),
                                      GNOME_PARAM_APP_DATADIR, GNOMEDATADIR,
                                       NULL);
                                       GNOME_PARAM_HUMAN_READABLE_NAME, _("Evince"),
                                      GNOME_PARAM_APP_DATADIR, GNOMEDATADIR,
                                       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);
-
 
 #ifdef ENABLE_DBUS
        if (!ev_application_register_service (EV_APP)) {
 
 #ifdef ENABLE_DBUS
        if (!ev_application_register_service (EV_APP)) {
-               if (load_files_remote (poptGetArgs (context))) {
+               if (load_files_remote (file_arguments)) {
                        return 0;
                }
        } else {
                enable_metadata = TRUE;
        }
 #endif
                        return 0;
                }
        } else {
                enable_metadata = TRUE;
        }
 #endif
-
+       
+       gdk_threads_init ();
        gnome_authentication_manager_init ();
 
        gnome_authentication_manager_init ();
 
-
        if (enable_metadata) {
                ev_metadata_manager_init ();
        }
        if (enable_metadata) {
                ev_metadata_manager_init ();
        }
@@ -290,17 +266,17 @@ main (int argc, char *argv[])
        ev_stock_icons_init ();
        gtk_window_set_default_icon_name ("evince");
 
        ev_stock_icons_init ();
        gtk_window_set_default_icon_name ("evince");
 
-       load_files (poptGetArgs (context));
+       load_files (file_arguments);
 
        gtk_main ();
 
        gnome_accelerators_sync ();
 
        gtk_main ();
 
        gnome_accelerators_sync ();
-       poptFreeContext (context);
        ev_file_helpers_shutdown ();
 
        if (enable_metadata) {
                ev_metadata_manager_shutdown ();
        }
        ev_file_helpers_shutdown ();
 
        if (enable_metadata) {
                ev_metadata_manager_shutdown ();
        }
+       g_object_unref(program);
 
        return 0;
 }
 
        return 0;
 }