]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-pixbuf-cache.c
Show better warning message when temp file cannot be deleted.
[evince.git] / shell / ev-pixbuf-cache.c
index 25b6f2cf883dfc3631d0c64c78a717ee73144880..46976afe2d23b564912204b0fe3459523c477d9a 100644 (file)
@@ -1,6 +1,6 @@
 #include <config.h>
 #include "ev-pixbuf-cache.h"
-#include "ev-job-queue.h"
+#include "ev-job-scheduler.h"
 #include "ev-page-cache.h"
 #include "ev-document-images.h"
 #include "ev-document-forms.h"
@@ -94,8 +94,8 @@ static gboolean      new_selection_surface_needed(EvPixbufCache      *pixbuf_cac
 
 
 /* These are used for iterating through the prev and next arrays */
-#define FIRST_VISABLE_PREV(pixbuf_cache) \
-       (MAX (0, pixbuf_cache->preload_cache_size + 1 - pixbuf_cache->start_page))
+#define FIRST_VISIBLE_PREV(pixbuf_cache) \
+       (MAX (0, pixbuf_cache->preload_cache_size - pixbuf_cache->start_page))
 #define VISIBLE_NEXT_LEN(pixbuf_cache, page_cache) \
        (MIN(pixbuf_cache->preload_cache_size, ev_page_cache_get_n_pages (page_cache) - (1 + pixbuf_cache->end_page)))
 #define PAGE_CACHE_LEN(pixbuf_cache) \
@@ -163,8 +163,8 @@ dispose_cache_job_info (CacheJobInfo *job_info,
                g_signal_handlers_disconnect_by_func (job_info->job,
                                                      G_CALLBACK (job_finished_cb),
                                                      data);
-               ev_job_queue_remove_job (job_info->job);
-               g_object_unref (G_OBJECT (job_info->job));
+               ev_job_cancel (job_info->job);
+               g_object_unref (job_info->job);
                job_info->job = NULL;
        }
        if (job_info->surface) {
@@ -313,7 +313,7 @@ check_job_size_and_unref (EvPixbufCache *pixbuf_cache,
        g_signal_handlers_disconnect_by_func (job_info->job,
                                              G_CALLBACK (job_finished_cb),
                                              pixbuf_cache);
-       ev_job_queue_remove_job (job_info->job);
+       ev_job_cancel (job_info->job);
        g_object_unref (job_info->job);
        job_info->job = NULL;
 }
@@ -330,11 +330,11 @@ move_one_job (CacheJobInfo  *job_info,
              CacheJobInfo  *new_next_job,
              int            start_page,
              int            end_page,
-             EvJobPriority  priority)
+             gint           priority)
 {
        CacheJobInfo *target_page = NULL;
        int page_offset;
-       EvJobPriority new_priority;
+       gint new_priority;
 
        if (page < (start_page - pixbuf_cache->preload_cache_size) ||
            page > (end_page + pixbuf_cache->preload_cache_size)) {
@@ -361,7 +361,7 @@ move_one_job (CacheJobInfo  *job_info,
                page_offset = page - start_page;
                g_assert (page_offset >= 0 &&
                          page_offset <= ((end_page - start_page) + 1));
-               new_priority = EV_JOB_PRIORITY_HIGH;
+               new_priority = EV_JOB_PRIORITY_URGENT;
                target_page = new_job_list + page_offset;
        }
 
@@ -374,7 +374,7 @@ move_one_job (CacheJobInfo  *job_info,
        job_info->form_field_mapping = NULL;
 
        if (new_priority != priority && target_page->job) {
-               ev_job_queue_update_job (target_page->job, new_priority);
+               ev_job_scheduler_update_job (target_page->job, new_priority);
        }
 }
 
@@ -421,7 +421,7 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache,
                move_one_job (pixbuf_cache->job_list + i,
                              pixbuf_cache, page,
                              new_job_list, new_prev_job, new_next_job,
-                             start_page, end_page, EV_JOB_PRIORITY_HIGH);
+                             start_page, end_page, EV_JOB_PRIORITY_URGENT);
                page ++;
        }
 
@@ -501,6 +501,13 @@ copy_job_to_job_info (EvJobRender   *job_render,
                      CacheJobInfo  *job_info,
                      EvPixbufCache *pixbuf_cache)
 {
+       if (!job_info->page_ready) {
+               g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region);
+               copy_job_page_and_selection_to_job_info (job_render,
+                                                        job_info,
+                                                        pixbuf_cache);
+       }
+       
        if (job_render->flags & EV_RENDER_INCLUDE_LINKS) {
                if (job_info->link_mapping)
                        ev_link_mapping_free (job_info->link_mapping);
@@ -529,8 +536,8 @@ copy_job_to_job_info (EvJobRender   *job_render,
                g_signal_handlers_disconnect_by_func (job_info->job,
                                                      G_CALLBACK (job_finished_cb),
                                                      pixbuf_cache);
-               ev_job_queue_remove_job (job_info->job);
-               g_object_unref (G_OBJECT (job_info->job));
+               ev_job_cancel (job_info->job);
+               g_object_unref (job_info->job);
                job_info->job = NULL;
        }
 }
@@ -586,9 +593,6 @@ ev_pixbuf_cache_clear_job_sizes (EvPixbufCache *pixbuf_cache,
        }
 }
 
-#define FIRST_VISABLE_PREV(pixbuf_cache) \
-       (MAX (0, pixbuf_cache->preload_cache_size + 1 - pixbuf_cache->start_page))
-
 static void
 get_selection_colors (GtkWidget *widget, GdkColor **text, GdkColor **base)
 {
@@ -647,13 +651,13 @@ add_job (EvPixbufCache *pixbuf_cache,
                                                  text, base);
        }
 
-       ev_job_queue_add_job (job_info->job, priority);
        g_signal_connect (G_OBJECT (job_info->job), "page-ready",
                          G_CALLBACK (job_page_ready_cb),
                          pixbuf_cache);
        g_signal_connect (G_OBJECT (job_info->job), "finished",
                          G_CALLBACK (job_finished_cb),
                          pixbuf_cache);
+       ev_job_scheduler_push_job (job_info->job, priority);
 }
 
 static void
@@ -701,10 +705,10 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache,
 
                add_job_if_needed (pixbuf_cache, job_info,
                                   page_cache, page, rotation, scale,
-                                  EV_JOB_PRIORITY_HIGH);
+                                  EV_JOB_PRIORITY_URGENT);
        }
 
-       for (i = FIRST_VISABLE_PREV(pixbuf_cache); i < pixbuf_cache->preload_cache_size; i++) {
+       for (i = FIRST_VISIBLE_PREV(pixbuf_cache); i < pixbuf_cache->preload_cache_size; i++) {
                job_info = (pixbuf_cache->prev_job + i);
                page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size + i;
 
@@ -852,7 +856,7 @@ new_selection_surface_needed (EvPixbufCache *pixbuf_cache,
 {
        EvPageCache *page_cache;
 
-       if (job_info->selection) {
+       if (job_info->selection && job_info->rc) {
                gint width, height;
                gint selection_width, selection_height;
                
@@ -978,8 +982,15 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache  *pixbuf_cache,
        if (!job_info->points_set)
                return NULL;
 
+       /* Create new render context if needed (selection + fast scrolling) */
+       if (job_info->rc == NULL) {
+               EvPage  *ev_page;
+               ev_page = ev_document_get_page (pixbuf_cache->document, page);
+               job_info->rc = ev_render_context_new (ev_page, 0, scale);
+               g_object_unref (ev_page);
+       }
+
        /* Update the rc */
-       g_assert (job_info->rc);
        ev_render_context_set_scale (job_info->rc, scale);
 
        /* If we have a running job, we just return what we have under the
@@ -1235,7 +1246,7 @@ ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache,
 
         add_job (pixbuf_cache, job_info, page_cache, region,
                 width, height, page, rotation, scale,
-                EV_JOB_PRIORITY_HIGH);
+                EV_JOB_PRIORITY_URGENT);
 }