static EvLinkDest * get_djvu_link_dest (const DjvuDocument *djvu_document, const gchar *link_name, int base_page) { /* #+pagenum #-pagenum #file_id.djvu */ if (g_str_has_prefix (link_name, "#")) { if (g_str_has_suffix (link_name, ".djvu") || (base_page > 0 && g_str_has_prefix (link_name + 1, "+")) || (base_page > 0 && g_str_has_prefix (link_name + 1, "-"))) { return ev_link_dest_new_page (get_djvu_link_page (djvu_document, link_name, base_page)); } else { /* #pagenum #page_label: the djvu spec is not clear on whether #pagenum represents * a link to a page number or to a page label. Here we mimick djview, * and always treat #pagenum as a link to a page label */ return ev_link_dest_new_page_label (link_name + 1); } } return NULL; }
static void load_files (const char **files) { GdkScreen *screen = gdk_screen_get_default (); EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL; gint i; EvLinkDest *global_dest = NULL; if (!files) { if (!ev_application_has_window (EV_APP)) ev_application_open_window (EV_APP, screen, GDK_CURRENT_TIME); return; } if (ev_page_label) global_dest = ev_link_dest_new_page_label (ev_page_label); else if (ev_page_index) global_dest = ev_link_dest_new_page (MAX (0, ev_page_index - 1)); else if (ev_named_dest) global_dest = ev_link_dest_new_named (ev_named_dest); if (fullscreen_mode) mode = EV_WINDOW_MODE_FULLSCREEN; else if (presentation_mode) mode = EV_WINDOW_MODE_PRESENTATION; for (i = 0; files[i]; i++) { const gchar *filename; gchar *uri; gchar *label; GFile *file; EvLinkDest *dest = NULL; const gchar *app_uri; filename = files[i]; label = get_label_from_filename (filename); if (label) { *label = 0; label++; dest = ev_link_dest_new_page_label (label); } else if (global_dest) { dest = g_object_ref (global_dest); } file = g_file_new_for_commandline_arg (filename); uri = g_file_get_uri (file); g_object_unref (file); app_uri = ev_application_get_uri (EV_APP); if (app_uri && strcmp (app_uri, uri) == 0) { g_free (uri); continue; } ev_application_open_uri_at_dest (EV_APP, uri, screen, dest, mode, ev_find_string, GDK_CURRENT_TIME); if (dest) g_object_unref (dest); g_free (uri); } }
static void method_call_cb (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data) { EvApplication *application = EV_APPLICATION (user_data); GList *windows, *l; guint timestamp; GVariantIter *iter; const gchar *key; GVariant *value; GdkDisplay *display = NULL; int screen_number = 0; EvLinkDest *dest = NULL; EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL; const gchar *search_string = NULL; GdkScreen *screen = NULL; if (g_strcmp0 (method_name, "Reload") == 0) { g_variant_get (parameters, "(a{sv}u)", &iter, ×tamp); while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) { if (strcmp (key, "display") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) { display = ev_display_open_if_needed (g_variant_get_string (value, NULL)); } else if (strcmp (key, "screen") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) { screen_number = g_variant_get_int32 (value); } else if (strcmp (key, "mode") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) { 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, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) { search_string = g_variant_get_string (value, NULL); } } g_variant_iter_free (iter); if (display != NULL && screen_number >= 0 && screen_number < gdk_display_get_n_screens (display)) screen = gdk_display_get_screen (display, screen_number); else screen = gdk_screen_get_default (); windows = ev_application_get_windows (application); for (l = windows; l != NULL; l = g_list_next (l)) { EvWindow *ev_window = EV_WINDOW (l->data); ev_application_open_uri_in_window (application, application->uri, ev_window, screen, dest, mode, search_string, timestamp); } g_list_free (windows); if (dest) g_object_unref (dest); g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); } else if (g_strcmp0 (method_name, "GetWindowList") == 0) { GList *windows = ev_application_get_windows (application); GVariantBuilder builder; GList *l; g_variant_builder_init (&builder, G_VARIANT_TYPE ("(ao)")); g_variant_builder_open (&builder, G_VARIANT_TYPE ("ao")); for (l = windows; l; l = g_list_next (l)) { EvWindow *window = (EvWindow *)l->data; g_variant_builder_add (&builder, "o", ev_window_get_dbus_object_path (window)); } g_variant_builder_close (&builder); g_list_free (windows); g_dbus_method_invocation_return_value (invocation, g_variant_builder_end (&builder)); } }