/* * ev_application_register_uri: * @application: * @uri: * @screen: * @dest: * @mode: * @search_string: * @timestamp: * * Registers @uri with atril-daemon. * */ static void ev_application_register_uri (EvApplication *application, const gchar *uri, GdkScreen *screen, EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string, guint timestamp) { EvRegisterDocData *data; if (!application->connection) return; if (application->doc_registered) { /* Already registered, reload */ GList *windows, *l; 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, uri, ev_window, screen, dest, mode, search_string, timestamp); } g_list_free (windows); return; } data = g_new (EvRegisterDocData, 1); data->uri = g_strdup (uri); data->screen = screen; data->dest = dest ? g_object_ref (dest) : NULL; data->mode = mode; data->search_string = search_string ? g_strdup (search_string) : NULL; data->timestamp = timestamp; g_dbus_connection_call (application->connection, ATRIL_DAEMON_SERVICE, ATRIL_DAEMON_OBJECT_PATH, ATRIL_DAEMON_INTERFACE, "RegisterDocument", g_variant_new ("(s)", uri), G_VARIANT_TYPE ("(s)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, on_register_uri_cb, data); }
static void _ev_application_open_uri_at_dest (EvApplication *application, const gchar *uri, GdkScreen *screen, EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string, guint timestamp) { EvWindow *ev_window; ev_window = ev_application_get_empty_window (application, screen); if (!ev_window) ev_window = EV_WINDOW (ev_window_new ()); ev_application_open_uri_in_window (application, uri, ev_window, screen, dest, mode, search_string, timestamp); }
static EvWindow * ev_application_get_empty_window (EvApplication *application, GdkScreen *screen) { 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; }
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)); } }
static void ev_window_title_update (EvWindowTitle *window_title) { GtkWindow *window = GTK_WINDOW (window_title->window); GtkHeaderBar *toolbar = GTK_HEADER_BAR (ev_window_get_toolbar (EV_WINDOW (window))); char *title = NULL, *p; char *subtitle = NULL, *title_header = NULL; if (window_title->type == EV_WINDOW_TITLE_RECENT) { gtk_header_bar_set_subtitle (toolbar, NULL); gtk_window_set_title (window, _("Recent Documents")); return; } if (window_title->doc_title && window_title->uri) { title = g_strdup (window_title->doc_title); ev_window_title_sanitize_title (window_title, &title); subtitle = get_filename_from_uri (window_title->uri); title_header = title; title = g_strdup_printf ("%s — %s", subtitle, title); for (p = title; *p; ++p) { /* an '\n' byte is always ASCII, no need for UTF-8 special casing */ if (*p == '\n') *p = ' '; } } else if (window_title->uri) { title = get_filename_from_uri (window_title->uri); } else if (!title) { title = g_strdup (_("Document Viewer")); } switch (window_title->type) { case EV_WINDOW_TITLE_DOCUMENT: gtk_window_set_title (window, title); if (title_header && subtitle) { gtk_header_bar_set_title (toolbar, title_header); gtk_header_bar_set_subtitle (toolbar, subtitle); } break; case EV_WINDOW_TITLE_PASSWORD: { gchar *password_title; password_title = g_strdup_printf ("%s — %s", title, _("Password Required")); gtk_window_set_title (window, password_title); g_free (password_title); gtk_header_bar_set_title (toolbar, _("Password Required")); gtk_header_bar_set_subtitle (toolbar, title); } break; case EV_WINDOW_TITLE_RECENT: g_assert_not_reached (); break; } g_free (title); g_free (subtitle); g_free (title_header); }