]> www.fi.muni.cz Git - evince.git/blobdiff - shell/main.c
Updated Translation
[evince.git] / shell / main.c
index 9b38ee6bbf9851de9555456567f8aa19f6b0388a..91a62d258b5299519f59bf293c45bf281151233c 100644 (file)
@@ -26,6 +26,8 @@
 #include <glib/gi18n.h>
 #include <gdk/gdkx.h>
 #include <gtk/gtkmain.h>
+#include <stdlib.h>
+#include <string.h>
 #include <libgnome/gnome-program.h>
 #include <libgnomeui/gnome-ui-init.h>
 #include <libgnomeui/gnome-app-helper.h>
@@ -70,6 +72,48 @@ load_files (const char **files)
 }
 
 #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)
 {
@@ -81,13 +125,19 @@ load_files_remote (const char **files)
        DBusGPendingCall *call;
 #endif
        DBusGProxy *remote_object;
+#ifdef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
        GdkDisplay *display;
+#endif
        guint32 timestamp;
 
+#ifdef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
        display = gdk_display_get_default();
        timestamp = gdk_x11_display_get_user_time (display);
-
-       connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+#else
+       /* Fake it for GTK+2.6 */
+       timestamp = get_startup_time ();
+#endif
+       connection = dbus_g_bus_get (DBUS_BUS_STARTER, &error);
        if (connection == NULL) {
                g_warning (error->message);
                g_error_free (error);   
@@ -102,12 +152,14 @@ load_files_remote (const char **files)
        if (!files) {
 #if DBUS_VERSION <= 33
                call = dbus_g_proxy_begin_call (remote_object, "OpenWindow",
-                                               DBUS_TYPE_UINT32, timestamp,
+                                               DBUS_TYPE_UINT32, &timestamp,
                                                DBUS_TYPE_INVALID);
 
                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
@@ -118,6 +170,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);
+                       g_object_unref (remote_object);
+                       dbus_g_connection_unref (connection);
                        return FALSE;
                }
 #else
@@ -127,9 +181,14 @@ load_files_remote (const char **files)
                                        G_TYPE_INVALID)) {
                        g_warning (error->message);
                        g_clear_error (&error);
+                       g_object_unref (remote_object);
+                       dbus_g_connection_unref (connection);
                        return FALSE;
                }
 #endif
+               g_object_unref (remote_object);
+               dbus_g_connection_unref (connection);
+               
                return TRUE;
        }
 
@@ -138,12 +197,12 @@ load_files_remote (const char **files)
                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,
                                                DBUS_TYPE_STRING, &page_label,
-                                               DBUS_TYPE_UINT32, timestamp,
+                                               DBUS_TYPE_UINT32, &timestamp,
                                                DBUS_TYPE_INVALID);
 
                if (!dbus_g_proxy_end_call (remote_object, call, &error, DBUS_TYPE_INVALID)) {
@@ -182,6 +241,9 @@ load_files_remote (const char **files)
                result = TRUE;
         }
 
+       g_object_unref (remote_object);
+       dbus_g_connection_unref (connection);
+
        gdk_notify_startup_complete ();
 
        return result;
@@ -238,7 +300,7 @@ main (int argc, char *argv[])
        ev_file_helpers_init ();
        ev_debug_init ();
        ev_stock_icons_init ();
-       gtk_window_set_default_icon_name ("postscript-viewer");
+       gtk_window_set_default_icon_name ("evince");
 
        load_files (poptGetArgs (context));