]> www.fi.muni.cz Git - evince.git/blobdiff - shell/main.c
Updated Serbian translation
[evince.git] / shell / main.c
index 9b38ee6bbf9851de9555456567f8aa19f6b0388a..3a24e0583796898061569737025e264da5725d41 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,7 +152,7 @@ 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)) {
@@ -143,7 +193,7 @@ load_files_remote (const char **files)
                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)) {