+ EvWindow *empty_window = NULL;
+ GList *windows = ev_application_get_windows (application);
+ GList *l;
+
+ for (l = windows; l != NULL; l = l->next) {
+ EvWindow *window = EV_WINDOW (l->data);
+
+ if (ev_window_is_empty (window) &&
+ gtk_window_get_screen (GTK_WINDOW (window)) == screen) {
+ empty_window = window;
+ break;
+ }
+ }
+
+ g_list_free (windows);
+
+ return empty_window;
+}
+
+
+#ifdef ENABLE_DBUS
+/*
+ * ev_application_register_uri:
+ * @application:
+ * @uri:
+ * @screen:
+ * @dest:
+ * @mode:
+ * @search_string:
+ * @timestamp:
+ *
+ * Registers @uri with evince-daemon.
+ *
+ * Returns: %TRUE to continue by opening @uri in this instance,
+ * or %FALSE if the request was forwarded to an existing evince
+ * instance for @uri
+ */
+static gboolean
+ev_application_register_uri (EvApplication *application,
+ const gchar *uri,
+ GdkScreen *screen,
+ EvLinkDest *dest,
+ EvWindowRunMode mode,
+ const gchar *search_string,
+ guint timestamp)
+{
+ GVariant *value, *value2;
+ const gchar *owner;
+ GVariantBuilder builder;
+ GError *error = NULL;
+
+ if (!application->connection)
+ return TRUE;
+
+ /* FIXME: Don't make sync dbus calls, they block the UI! */
+ value = g_dbus_connection_call_sync
+ (application->connection,
+ "org.gnome.evince.Daemon",
+ "/org/gnome/evince/Daemon",
+ "org.gnome.evince.Daemon",
+ "RegisterDocument",
+ g_variant_new ("(s)", uri),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (value == NULL) {
+ g_warning ("Error registering document: %s\n", error->message);
+ g_error_free (error);
+ return TRUE;
+ }
+
+ g_variant_get (value, "(&s)", &owner);
+
+ /* This means that the document wasn't already registered; go
+ * ahead with opening it.
+ */
+ if (owner[0] == '\0') {
+ g_variant_unref (value);
+ return TRUE;
+ }
+
+ /* Already registered */
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("(sa{sv}u)"));
+ g_variant_builder_add (&builder, "s", uri);
+
+ g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_add (&builder, "{sv}",
+ "display",
+ g_variant_new_string (gdk_display_get_name (gdk_screen_get_display (screen))));
+ g_variant_builder_add (&builder, "{sv}",
+ "screen",
+ g_variant_new_int32 (gdk_screen_get_number (screen)));
+ if (dest) {
+ g_variant_builder_add (&builder, "{sv}",
+ "page-label",
+ g_variant_new_string (ev_link_dest_get_page_label (dest)));
+ }
+ if (search_string) {
+ g_variant_builder_add (&builder, "{sv}",
+ "find-string",
+ g_variant_new_string (search_string));
+ }
+ if (mode != EV_WINDOW_MODE_NORMAL) {
+ g_variant_builder_add (&builder, "{sv}",
+ "mode",
+ g_variant_new_uint32 (mode));
+ }
+ g_variant_builder_close (&builder);
+
+ g_variant_builder_add (&builder, "u", timestamp);
+
+ value2 = g_dbus_connection_call_sync
+ (application->connection,
+ owner,
+ APPLICATION_DBUS_OBJECT_PATH,
+ APPLICATION_DBUS_INTERFACE,
+ "OpenURI",
+ g_variant_builder_end (&builder),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (value2 == NULL) {
+ g_warning ("Failed to OpenURI: %s", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ g_variant_unref (value);
+ g_variant_unref (value2);
+
+ /* Do not continue opening this document */
+ return FALSE;
+}
+
+static void
+ev_application_unregister_uri (EvApplication *application,
+ const gchar *uri)
+{
+ GVariant *value;
+ GError *error = NULL;
+
+ if (!application->connection)
+ return;
+
+ /* FIXME: Don't make sync dbus calls, they block the UI! */
+ value = g_dbus_connection_call_sync
+ (application->connection,
+ "org.gnome.evince.Daemon",
+ "/org/gnome/evince/Daemon",
+ "org.gnome.evince.Daemon",
+ "UnregisterDocument",
+ g_variant_new ("(s)", uri),
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
+ -1,
+ NULL,
+ &error);
+ if (value == NULL) {
+ g_warning ("Error unregistering document: %s\n", error->message);
+ g_error_free (error);
+ } else {
+ g_variant_unref (value);
+ }
+}
+#endif /* ENABLE_DBUS */
+
+static void
+ev_application_open_uri_in_window (EvApplication *application,
+ const char *uri,
+ EvWindow *ev_window,
+ GdkScreen *screen,
+ EvLinkDest *dest,
+ EvWindowRunMode mode,
+ const gchar *search_string,
+ guint timestamp)
+{
+#ifdef GDK_WINDOWING_X11
+ GdkWindow *gdk_window;
+#endif
+
+ if (screen) {
+ ev_stock_icons_set_screen (screen);
+ gtk_window_set_screen (GTK_WINDOW (ev_window), screen);
+ }
+
+ /* We need to load uri before showing the window, so
+ we can restore window size without flickering */
+ ev_window_open_uri (ev_window, uri, dest, mode, search_string);
+
+ if (!gtk_widget_get_realized (GTK_WIDGET (ev_window)))
+ gtk_widget_realize (GTK_WIDGET (ev_window));
+
+#ifdef GDK_WINDOWING_X11
+ gdk_window = gtk_widget_get_window (GTK_WIDGET (ev_window));