From 0316bea7b62a35a692afad8cef9ecfb4a1d6a4f5 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Thu, 26 Jul 2007 17:19:49 +0000 Subject: Add page_ready signal to notify that page is ready as soon as possible 2007-07-26 Carlos Garcia Campos * shell/ev-pixbuf-cache.c: (job_page_ready_cb), (job_finished_cb), (copy_job_page_and_selection_to_job_info), (copy_job_to_job_info), (add_job), (ev_pixbuf_cache_get_surface), (ev_pixbuf_cache_get_link_mapping), (ev_pixbuf_cache_get_image_mapping), (ev_pixbuf_cache_get_form_field_mapping), (ev_pixbuf_cache_get_text_mapping): * shell/ev-jobs.[ch]: (ev_job_render_class_init), (notify_page_ready), (ev_job_render_page_ready), (ev_job_render_run): Add page_ready signal to notify that page is ready as soon as possible even if other page elements like links, forms, images or text mapping are not ready yet. svn path=/trunk/; revision=2581 --- (limited to 'shell/ev-jobs.c') diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index d61185c..d5d45f2 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -32,13 +32,18 @@ static void ev_job_load_class_init (EvJobLoadClass *class); static void ev_job_print_init (EvJobPrint *job); static void ev_job_print_class_init (EvJobPrintClass *class); -enum -{ +enum { FINISHED, LAST_SIGNAL }; +enum { + PAGE_READY, + RENDER_LAST_SIGNAL +}; + static guint job_signals[LAST_SIGNAL] = { 0 }; +static guint job_render_signals[RENDER_LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT) G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB) @@ -152,6 +157,15 @@ ev_job_render_class_init (EvJobRenderClass *class) oclass = G_OBJECT_CLASS (class); + job_render_signals [PAGE_READY] = + g_signal_new ("page-ready", + EV_TYPE_JOB_RENDER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvJobRenderClass, page_ready), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + oclass->dispose = ev_job_render_dispose; } @@ -316,6 +330,21 @@ render_finished_cb (EvDocument *document, ev_job_finished (EV_JOB (job)); } +static gboolean +notify_page_ready (EvJobRender *job) +{ + g_signal_emit (job, job_render_signals[PAGE_READY], 0); + + return FALSE; +} + +static void +ev_job_render_page_ready (EvJobRender *job) +{ + job->page_ready = TRUE; + g_idle_add ((GSourceFunc)notify_page_ready, job); +} + void ev_job_render_run (EvJobRender *job) { @@ -333,23 +362,6 @@ ev_job_render_run (EvJobRender *job) ev_document_fc_mutex_lock (); job->surface = ev_document_render (EV_JOB (job)->document, job->rc); - - if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document)) - job->link_mapping = - ev_document_links_get_links (EV_DOCUMENT_LINKS (EV_JOB (job)->document), - job->rc->page); - if (job->include_images && EV_IS_DOCUMENT_IMAGES (EV_JOB (job)->document)) - job->image_mapping = - ev_document_images_get_images (EV_DOCUMENT_IMAGES (EV_JOB (job)->document), - job->rc->page); - if (job->include_forms && EV_IS_DOCUMENT_FORMS (EV_JOB (job)->document)) - job->form_field_mapping = - ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (EV_JOB(job)->document), - job->rc->page); - if (job->include_text && EV_IS_SELECTION (EV_JOB (job)->document)) - job->text_mapping = - ev_selection_get_selection_map (EV_SELECTION (EV_JOB (job)->document), - job->rc); if (job->include_selection && EV_IS_SELECTION (EV_JOB (job)->document)) { ev_selection_render_selection (EV_SELECTION (EV_JOB (job)->document), job->rc, @@ -362,8 +374,27 @@ ev_job_render_run (EvJobRender *job) job->rc, &(job->selection_points)); } + + ev_job_render_page_ready (job); ev_document_fc_mutex_unlock (); + + if (job->include_text && EV_IS_SELECTION (EV_JOB (job)->document)) + job->text_mapping = + ev_selection_get_selection_map (EV_SELECTION (EV_JOB (job)->document), + job->rc); + if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document)) + job->link_mapping = + ev_document_links_get_links (EV_DOCUMENT_LINKS (EV_JOB (job)->document), + job->rc->page); + if (job->include_forms && EV_IS_DOCUMENT_FORMS (EV_JOB (job)->document)) + job->form_field_mapping = + ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (EV_JOB(job)->document), + job->rc->page); + if (job->include_images && EV_IS_DOCUMENT_IMAGES (EV_JOB (job)->document)) + job->image_mapping = + ev_document_images_get_images (EV_DOCUMENT_IMAGES (EV_JOB (job)->document), + job->rc->page); EV_JOB (job)->finished = TRUE; } -- cgit v0.9.1