X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=9c74f3970fd45443ba53630e9fc860c9a01ae43e;hb=67dbdd12a75b63b11f1a7ebe7324445ad17ceb13;hp=1a964f84c1b6a9cd7fe00707309cb1ec39a0c799;hpb=b346c5664d27a77e9068ea91eaf9a0c0d6210b0f;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 1a964f84..9c74f397 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -177,6 +177,7 @@ struct _EvWindowPrivate { #endif EvJob *load_job; + EvJob *thumbnail_job; #ifdef WITH_GNOME_PRINT GnomePrintJob *print_job; #endif @@ -217,6 +218,8 @@ static void ev_window_set_page_mode (EvWindow *windo EvWindowPageMode page_mode); static void ev_window_load_job_cb (EvJobLoad *job, gpointer data); +static void ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, + EvWindow *ev_window); #ifdef WITH_GTK_PRINT static void ev_window_print_job_cb (EvJobPrint *job, EvWindow *window); @@ -428,13 +431,6 @@ ev_window_update_actions (EvWindow *ev_window) ev_view_can_zoom_out (view) && !presentation_mode); - ev_window_set_action_sensitive (ev_window, "Plus", !presentation_mode); - ev_window_set_action_sensitive (ev_window, "Minus", !presentation_mode); - ev_window_set_action_sensitive (ev_window, "KpPlus", !presentation_mode); - ev_window_set_action_sensitive (ev_window, "KpMinus", !presentation_mode); - ev_window_set_action_sensitive (ev_window, "CtrlKpPlus", !presentation_mode); - ev_window_set_action_sensitive (ev_window, "CtrlKpMinus", !presentation_mode); - /* Go menu */ if (has_pages) { ev_window_set_action_sensitive (ev_window, "GoPreviousPage", page > 0); @@ -661,8 +657,8 @@ page_changed_cb (EvPageCache *page_cache, } typedef struct _FindTask { - const gchar *page_label; - gchar *chapter; + const gchar *page_label; + gchar *chapter; } FindTask; static gboolean @@ -671,26 +667,26 @@ ev_window_find_chapter (GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) { - FindTask *task = (FindTask *)data; - gchar *page_string; - - gtk_tree_model_get (tree_model, iter, - EV_DOCUMENT_LINKS_COLUMN_PAGE_LABEL, &page_string, - -1); - - if (!page_string) - return FALSE; - - if (!strcmp (page_string, task->page_label)) { - gtk_tree_model_get (tree_model, iter, - EV_DOCUMENT_LINKS_COLUMN_MARKUP, &task->chapter, - -1); - g_free (page_string); - return TRUE; - } - - g_free (page_string); - return FALSE; + FindTask *task = (FindTask *)data; + gchar *page_string; + + gtk_tree_model_get (tree_model, iter, + EV_DOCUMENT_LINKS_COLUMN_PAGE_LABEL, &page_string, + -1); + + if (!page_string) + return FALSE; + + if (!strcmp (page_string, task->page_label)) { + gtk_tree_model_get (tree_model, iter, + EV_DOCUMENT_LINKS_COLUMN_MARKUP, &task->chapter, + -1); + g_free (page_string); + return TRUE; + } + + g_free (page_string); + return FALSE; } static void @@ -1013,6 +1009,32 @@ setup_view_from_metadata (EvWindow *window) } } +static void +ev_window_clear_thumbnail_job (EvWindow *ev_window) +{ + if (ev_window->priv->thumbnail_job != NULL) { + ev_job_queue_remove_job (ev_window->priv->thumbnail_job); + + g_signal_handlers_disconnect_by_func (ev_window->priv->thumbnail_job, + ev_window_set_icon_from_thumbnail, + ev_window); + g_object_unref (ev_window->priv->thumbnail_job); + ev_window->priv->thumbnail_job = NULL; + } +} + +static void +ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, + EvWindow *ev_window) +{ + if (job->thumbnail) { + gtk_window_set_icon (GTK_WINDOW (ev_window), + job->thumbnail); + } + + ev_window_clear_thumbnail_job (ev_window); +} + static void ev_window_setup_document (EvWindow *ev_window) { @@ -1024,8 +1046,10 @@ ev_window_setup_document (EvWindow *ev_window) document = ev_window->priv->document; ev_window->priv->page_cache = ev_page_cache_get (ev_window->priv->document); - g_signal_connect (ev_window->priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), ev_window); - g_signal_connect (ev_window->priv->page_cache, "history-changed", G_CALLBACK (history_changed_cb), ev_window); + g_signal_connect (ev_window->priv->page_cache, "page-changed", + G_CALLBACK (page_changed_cb), ev_window); + g_signal_connect (ev_window->priv->page_cache, "history-changed", + G_CALLBACK (history_changed_cb), ev_window); if (EV_IS_DOCUMENT_FIND (document)) { g_signal_connect_object (G_OBJECT (document), @@ -1034,6 +1058,27 @@ ev_window_setup_document (EvWindow *ev_window) ev_window, 0); } + if (EV_IS_DOCUMENT_THUMBNAILS (document)) { + EvRenderContext *rc; + gint page_width, page_height; + gdouble scale; + + ev_window_clear_thumbnail_job (ev_window); + + ev_page_cache_get_size (ev_window->priv->page_cache, + 0, 0, 1.0, + &page_width, &page_height); + scale = (gdouble)128 / (gdouble)page_width; + + rc = ev_render_context_new (0, 0, scale); + ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, rc); + g_signal_connect (ev_window->priv->thumbnail_job, "finished", + G_CALLBACK (ev_window_set_icon_from_thumbnail), + ev_window); + ev_job_queue_add_job (EV_JOB (ev_window->priv->thumbnail_job), EV_JOB_PRIORITY_LOW); + g_object_unref (rc); + } + ev_sidebar_set_document (sidebar, document); if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) { @@ -1119,7 +1164,7 @@ ev_window_popup_password_dialog (EvWindow *ev_window) gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->password_dialog), GTK_WINDOW (ev_window)); g_object_add_weak_pointer (G_OBJECT (ev_window->priv->password_dialog), - (gpointer *) &(ev_window->priv->password_dialog)); + (gpointer) &(ev_window->priv->password_dialog)); g_signal_connect (ev_window->priv->password_dialog, "response", G_CALLBACK (password_dialog_response), @@ -1498,11 +1543,11 @@ ev_window_create_tmp_symlink (const gchar *filename, GError **error) static void ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest) { - GError *error = NULL; - gchar *symlink_uri; - gchar *old_filename; - gchar *new_filename; - gchar *uri_unc; + GError *error = NULL; + gchar *symlink_uri; + gchar *old_filename; + gchar *new_filename; + const gchar *uri_unc; uri_unc = g_object_get_data (G_OBJECT (window->priv->document), "uri-uncompressed"); @@ -1651,13 +1696,11 @@ ev_window_get_recent_file_label (gint index, const gchar *filename) p = filename; end = filename + length; - while (p != end) - { + while (p != end) { const gchar *next; next = g_utf8_next_char (p); - switch (*p) - { + switch (*p) { case '_': g_string_append (str, "__"); break; @@ -1773,63 +1816,100 @@ file_save_dialog_response_cb (GtkWidget *fc, gint response_id, EvWindow *ev_window) { - gboolean success; + const gchar *uri_unc; + gint fd; + gchar *filename; + gchar *tmp_filename; + GError *error = NULL; - if (response_id == GTK_RESPONSE_OK) { - gint fd; - gchar *filename; - gchar *tmp_filename; - GError *error = NULL; + if (response_id != GTK_RESPONSE_OK) { + gtk_widget_destroy (fc); + return; + } + - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc)); - tmp_filename = g_strdup_printf ("%s.XXXXXX", filename); + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc)); + tmp_filename = g_strdup_printf ("%s.XXXXXX", filename); + + fd = g_mkstemp (tmp_filename); + if (fd == -1) { + gchar *display_name; + gint save_errno = errno; - fd = g_mkstemp (tmp_filename); - if (fd == -1) { - gchar *display_name; - gint save_errno = errno; - - display_name = g_filename_display_name (tmp_filename); - g_set_error (&error, - G_FILE_ERROR, - g_file_error_from_errno (save_errno), - _("Failed to create file “%s”: %s"), - display_name, g_strerror (save_errno)); - g_free (display_name); - } else { - gchar *uri; + display_name = g_filename_display_name (tmp_filename); + g_set_error (&error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to create file “%s”: %s"), + display_name, g_strerror (save_errno)); + g_free (display_name); + } else { + gchar *uri; + + uri = g_filename_to_uri (tmp_filename, NULL, NULL); + + ev_document_doc_mutex_lock (); + ev_document_save (ev_window->priv->document, uri, &error); + ev_document_doc_mutex_unlock (); + + g_free (uri); + close (fd); + } - uri = g_filename_to_uri (tmp_filename, NULL, NULL); - - ev_document_doc_mutex_lock (); - success = ev_document_save (ev_window->priv->document, - uri, - &error); - ev_document_doc_mutex_unlock (); + if (!error) { + uri_unc = g_object_get_data (G_OBJECT (ev_window->priv->document), + "uri-uncompressed"); + if (uri_unc) { + EvCompressionType ctype; + gchar *uri_comp; + gchar *uri; + const gchar *ext; + ctype = EV_COMPRESSION_NONE; + + ext = g_strrstr (ev_window->priv->uri, ".gz"); + if (ext && g_ascii_strcasecmp (ext, ".gz") == 0) + ctype = EV_COMPRESSION_GZIP; + + ext = g_strrstr (ev_window->priv->uri, ".bz2"); + if (ext && g_ascii_strcasecmp (ext, ".bz2") == 0) + ctype = EV_COMPRESSION_BZIP2; + + uri = g_filename_to_uri (tmp_filename, NULL, NULL); + uri_comp = ev_file_compress (uri, ctype, &error); g_free (uri); - close (fd); - } + g_unlink (tmp_filename); + g_free (tmp_filename); - if (!error) { - if (g_rename (tmp_filename, filename) == -1) { - g_unlink (tmp_filename); + if (!uri_comp || error) { + tmp_filename = NULL; + } else { + tmp_filename = g_filename_from_uri (uri_comp, + NULL, NULL); } - } else { - gchar *msg; - gchar *uri; - - uri = g_filename_to_uri (filename, NULL, NULL); - msg = g_strdup_printf (_("The file could not be saved as “%s”."), uri); - ev_window_error_dialog (GTK_WINDOW (ev_window), msg, error); - g_free (msg); - g_free (uri); - g_error_free (error); + + g_free (uri_comp); } + } + + if (tmp_filename && g_rename (tmp_filename, filename) == -1) { + g_unlink (tmp_filename); + } + + if (error) { + gchar *msg; + gchar *uri; - g_free (tmp_filename); - g_free (filename); + uri = g_filename_to_uri (filename, NULL, NULL); + msg = g_strdup_printf (_("The file could not be saved as “%s”."), uri); + ev_window_error_dialog (GTK_WINDOW (ev_window), msg, error); + g_free (msg); + g_free (uri); + g_error_free (error); } + + g_free (tmp_filename); + g_free (filename); gtk_widget_destroy (fc); } @@ -2334,7 +2414,7 @@ ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window) ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties), ev_window->priv->document); g_object_add_weak_pointer (G_OBJECT (ev_window->priv->properties), - (gpointer *) &(ev_window->priv->properties)); + (gpointer) &(ev_window->priv->properties)); gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->properties), GTK_WINDOW (ev_window)); } @@ -3705,8 +3785,6 @@ find_bar_search_changed_cb (EggFindBar *find_bar, gboolean visible; const char *search_string; - g_return_if_fail (EV_IS_WINDOW (ev_window)); - /* Either the string or case sensitivity could have changed, * we connect this callback to both. We also connect it * to ::visible so when the find bar is hidden, we should @@ -3862,9 +3940,14 @@ ev_window_dispose (GObject *object) if (priv->load_job) { ev_window_clear_load_job (window); } + + if (priv->thumbnail_job) { + ev_window_clear_thumbnail_job (window); + } if (priv->local_uri) { ev_window_clear_local_uri (window); + priv->local_uri = NULL; } ev_window_close_dialogs (window);