]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-application.c
Send page dest as int to other evince instances when -i switch is used
[evince.git] / shell / ev-application.c
index 59ddf31758a1d55121f22a282418a268fac65c23..bf828a61d51887df2ffcc5c389b213ac658504a3 100644 (file)
@@ -283,18 +283,26 @@ ev_spawn (const char     *uri,
                break;
        }
 
-       g_string_append_printf (cmd, " %s", uri);
-
        cmdline = g_string_free (cmd, FALSE);
        app = g_app_info_create_from_commandline (cmdline, NULL, 0, &error);
 
        if (app != NULL) {
+                GList uri_list;
+
                ctx = gdk_display_get_app_launch_context (gdk_screen_get_display (screen));
                gdk_app_launch_context_set_screen (ctx, screen);
                gdk_app_launch_context_set_timestamp (ctx, timestamp);
 
-               g_app_info_launch (app, NULL,
-                                  G_APP_LAUNCH_CONTEXT (ctx), &error);
+                /* Some URIs can be changed when passed through a GFile
+                 * (for instance unsupported uris with strange formats like mailto:),
+                 * so if you have a textual uri you want to pass in as argument,
+                 * consider using g_app_info_launch_uris() instead.
+                 * See https://bugzilla.gnome.org/show_bug.cgi?id=644604
+                 */
+                uri_list.data = (gchar *)uri;
+                uri_list.prev = uri_list.next = NULL;
+               g_app_info_launch_uris (app, &uri_list,
+                                        G_APP_LAUNCH_CONTEXT (ctx), &error);
 
                g_object_unref (app);
                g_object_unref (ctx);
@@ -392,6 +400,10 @@ on_reload_cb (GObject      *source_object,
        }
        g_variant_unref (value);
 
+       /* We did not open a window, so manually clear the startup
+        * notification. */
+       gdk_notify_startup_complete ();
+
        ev_application_shutdown (EV_APP);
 }
 
@@ -457,9 +469,17 @@ on_register_uri_cb (GObject      *source_object,
                                "screen",
                                g_variant_new_int32 (gdk_screen_get_number (data->screen)));
        if (data->dest) {
-                g_variant_builder_add (&builder, "{sv}",
-                                       "page-label",
-                                       g_variant_new_string (ev_link_dest_get_page_label (data->dest)));
+                const gchar *page_label = ev_link_dest_get_page_label (data->dest);
+
+                if (page_label) {
+                        g_variant_builder_add (&builder, "{sv}",
+                                               "page-label",
+                                               g_variant_new_string (page_label));
+                } else {
+                        g_variant_builder_add (&builder, "{sv}",
+                                               "page-index",
+                                               g_variant_new_uint32 (ev_link_dest_get_page (data->dest)));
+                }
        }
        if (data->search_string) {
                 g_variant_builder_add (&builder, "{sv}",
@@ -764,6 +784,8 @@ method_call_cb (GDBusConnection       *connection,
                        mode = g_variant_get_uint32 (value);
                        } else if (strcmp (key, "page-label") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
                                dest = ev_link_dest_new_page_label (g_variant_get_string (value, NULL));
+                        } else if (strcmp (key, "page-index") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
+                                dest = ev_link_dest_new_page (g_variant_get_uint32 (value));
                        } else if (strcmp (key, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
                                search_string = g_variant_get_string (value, NULL);
                        }