gchar * ev_document_links_get_dest_page_label (EvDocumentLinks *document_links, EvLinkDest *dest) { gchar *label = NULL; if (ev_link_dest_get_dest_type (dest) == EV_LINK_DEST_TYPE_PAGE_LABEL) { label = g_strdup (ev_link_dest_get_page_label (dest)); } else { gint page; page = ev_document_links_get_dest_page (document_links, dest); if (page != -1) label = ev_document_get_page_label (EV_DOCUMENT (document_links), page); } return label; }
/* Helper functions */ gint ev_document_links_get_dest_page (EvDocumentLinks *document_links, EvLinkDest *dest) { gint page = -1; switch (ev_link_dest_get_dest_type (dest)) { case EV_LINK_DEST_TYPE_NAMED: { page = ev_document_links_find_link_page (document_links, ev_link_dest_get_named_dest (dest)); } break; case EV_LINK_DEST_TYPE_PAGE_LABEL: ev_document_find_page_by_label (EV_DOCUMENT (document_links), ev_link_dest_get_page_label (dest), &page); break; default: page = ev_link_dest_get_page (dest); } return page; }
static void on_register_uri_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { GDBusConnection *connection = G_DBUS_CONNECTION (source_object); EvRegisterDocData *data = (EvRegisterDocData *)user_data; EvApplication *application = EV_APP; GVariant *value; const gchar *owner; GVariantBuilder builder; GError *error = NULL; value = g_dbus_connection_call_finish (connection, res, &error); if (!value) { g_warning ("Error registering document: %s\n", error->message); g_error_free (error); _ev_application_open_uri_at_dest (application, data->uri, data->screen, data->dest, data->mode, data->search_string, data->timestamp); ev_register_doc_data_free (data); return; } 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); application->doc_registered = TRUE; _ev_application_open_uri_at_dest (application, data->uri, data->screen, data->dest, data->mode, data->search_string, data->timestamp); ev_register_doc_data_free (data); return; } /* Already registered */ g_variant_builder_init (&builder, G_VARIANT_TYPE ("(a{sv}u)")); 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 (data->screen)))); g_variant_builder_add (&builder, "{sv}", "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))); } if (data->search_string) { g_variant_builder_add (&builder, "{sv}", "find-string", g_variant_new_string (data->search_string)); } if (data->mode != EV_WINDOW_MODE_NORMAL) { g_variant_builder_add (&builder, "{sv}", "mode", g_variant_new_uint32 (data->mode)); } g_variant_builder_close (&builder); g_variant_builder_add (&builder, "u", data->timestamp); g_dbus_connection_call (connection, owner, APPLICATION_DBUS_OBJECT_PATH, APPLICATION_DBUS_INTERFACE, "Reload", g_variant_builder_end (&builder), NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, on_reload_cb, NULL); g_variant_unref (value); ev_register_doc_data_free (data); }
static void ev_spawn (const char *uri, GdkScreen *screen, EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string, guint timestamp) { GString *cmd; gchar *path, *cmdline; GAppInfo *app; GdkAppLaunchContext *ctx; GError *error = NULL; cmd = g_string_new (NULL); #ifdef G_OS_WIN32 { gchar *dir; dir = g_win32_get_package_installation_directory_of_module (NULL); path = g_build_filename (dir, "bin", "atril", NULL); g_free (dir); } #else path = g_build_filename (BINDIR, "atril", NULL); #endif g_string_append_printf (cmd, " %s", path); g_free (path); /* Page label */ if (dest) { const gchar *page_label; page_label = ev_link_dest_get_page_label (dest); if (page_label) g_string_append_printf (cmd, " --page-label=%s", page_label); else g_string_append_printf (cmd, " --page-label=%d", ev_link_dest_get_page (dest)); } /* Find string */ if (search_string) { g_string_append_printf (cmd, " --find=%s", search_string); } /* Mode */ switch (mode) { case EV_WINDOW_MODE_FULLSCREEN: g_string_append (cmd, " -f"); break; case EV_WINDOW_MODE_PRESENTATION: g_string_append (cmd, " -s"); break; default: break; } cmdline = g_string_free (cmd, FALSE); app = g_app_info_create_from_commandline (cmdline, NULL, 0, &error); if (app != NULL) { GList uri_list; GList *uris = NULL; #if GTK_CHECK_VERSION (3, 0, 0) ctx = gdk_display_get_app_launch_context (gdk_screen_get_display (screen)); #else ctx = gdk_app_launch_context_new (); gdk_app_launch_context_set_display (ctx, gdk_screen_get_display (screen)); #endif gdk_app_launch_context_set_screen (ctx, screen); gdk_app_launch_context_set_timestamp (ctx, timestamp); if (uri) { uri_list.data = (gchar *)uri; uri_list.prev = uri_list.next = NULL; uris = &uri_list; } g_app_info_launch_uris (app, uris, G_APP_LAUNCH_CONTEXT (ctx), &error); g_object_unref (app); g_object_unref (ctx); } if (error != NULL) { g_warning ("Error launching atril %s: %s\n", uri, error->message); g_error_free (error); } g_free (cmdline); }