diff options
author | Nickolay V. Shmyrev <nshmyrev@src.gnome.org> | 2005-06-07 23:28:54 (GMT) |
---|---|---|
committer | Nickolay V. Shmyrev <nshmyrev@src.gnome.org> | 2005-06-07 23:28:54 (GMT) |
commit | bca369672136e5ff831ece9832afd42085808fba (patch) | |
tree | f40b0b02036bb97a0d4586077298be7a02e2de03 /shell/ev-jobs.c | |
parent | 11bd1d65957b444c7491e4fb252f3f50ce8ad3d2 (diff) |
PageCache and EvJobs are moved from backend to shell. Two new jobs to
load document in background and a statusbar to display this process.
FileChooser now can select multiple uris.
Diffstat (limited to 'shell/ev-jobs.c')
-rw-r--r-- | shell/ev-jobs.c | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c new file mode 100644 index 0000000..be1d3bc --- /dev/null +++ b/shell/ev-jobs.c @@ -0,0 +1,343 @@ +#include "ev-jobs.h" +#include "ev-job-queue.h" +#include "ev-document-thumbnails.h" +#include "ev-document-links.h" +#include "ev-async-renderer.h" + +static void ev_job_init (EvJob *job); +static void ev_job_class_init (EvJobClass *class); +static void ev_job_links_init (EvJobLinks *job); +static void ev_job_links_class_init (EvJobLinksClass *class); +static void ev_job_render_init (EvJobRender *job); +static void ev_job_render_class_init (EvJobRenderClass *class); +static void ev_job_thumbnail_init (EvJobThumbnail *job); +static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class); +static void ev_job_load_init (EvJobLoad *job); +static void ev_job_load_class_init (EvJobLoadClass *class); + +enum +{ + FINISHED, + LAST_SIGNAL +}; + +static guint job_signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT) +G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB) +G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB) +G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB) +G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB) + +static void ev_job_init (EvJob *job) { /* Do Nothing */ } + +static void +ev_job_dispose (GObject *object) +{ + EvJob *job; + + job = EV_JOB (object); + + if (job->document) { + g_object_unref (job->document); + job->document = NULL; + } + + (* G_OBJECT_CLASS (ev_job_parent_class)->dispose) (object); +} + +static void +ev_job_class_init (EvJobClass *class) +{ + GObjectClass *oclass; + + oclass = G_OBJECT_CLASS (class); + + oclass->dispose = ev_job_dispose; + + job_signals [FINISHED] = + g_signal_new ("finished", + EV_TYPE_JOB, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvJobClass, finished), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + + +static void ev_job_links_init (EvJobLinks *job) { /* Do Nothing */ } + +static void +ev_job_links_dispose (GObject *object) +{ + EvJobLinks *job; + + job = EV_JOB_LINKS (object); + + if (job->model) { + g_object_unref (job->model); + job->model = NULL; + } + + (* G_OBJECT_CLASS (ev_job_links_parent_class)->dispose) (object); +} + +static void +ev_job_links_class_init (EvJobLinksClass *class) +{ + GObjectClass *oclass; + + oclass = G_OBJECT_CLASS (class); + + oclass->dispose = ev_job_links_dispose; +} + + +static void ev_job_render_init (EvJobRender *job) { /* Do Nothing */ } + +static void +ev_job_render_dispose (GObject *object) +{ + EvJobRender *job; + + job = EV_JOB_RENDER (object); + + if (job->pixbuf) { + g_object_unref (job->pixbuf); + job->pixbuf = NULL; + } + + (* G_OBJECT_CLASS (ev_job_render_parent_class)->dispose) (object); +} + +static void +ev_job_render_class_init (EvJobRenderClass *class) +{ + GObjectClass *oclass; + + oclass = G_OBJECT_CLASS (class); + + oclass->dispose = ev_job_render_dispose; +} + +static void ev_job_thumbnail_init (EvJobThumbnail *job) { /* Do Nothing */ } + +static void +ev_job_thumbnail_dispose (GObject *object) +{ + EvJobThumbnail *job; + + job = EV_JOB_THUMBNAIL (object); + + if (job->thumbnail) { + g_object_unref (job->thumbnail); + job->thumbnail = NULL; + } + + (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object); +} + +static void +ev_job_thumbnail_class_init (EvJobThumbnailClass *class) +{ + GObjectClass *oclass; + + oclass = G_OBJECT_CLASS (class); + + oclass->dispose = ev_job_thumbnail_dispose; +} + +static void ev_job_load_init (EvJobLoad *job) { /* Do Nothing */ } + +static void +ev_job_load_dispose (GObject *object) +{ + EvJobLoad *job; + + job = EV_JOB_LOAD (object); + + if (job->uri) { + g_free (job->uri); + job->uri = NULL; + } + + if (job->error) { + g_error_free (job->error); + job->error = NULL; + } + + (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object); +} + +static void +ev_job_load_class_init (EvJobLoadClass *class) +{ + GObjectClass *oclass; + + oclass = G_OBJECT_CLASS (class); + + oclass->dispose = ev_job_load_dispose; +} + +/* Public functions */ +void +ev_job_finished (EvJob *job) +{ + g_return_if_fail (EV_IS_JOB (job)); + + g_signal_emit (job, job_signals[FINISHED], 0); +} + +EvJob * +ev_job_links_new (EvDocument *document) +{ + EvJob *job; + + job = g_object_new (EV_TYPE_JOB_LINKS, NULL); + job->document = g_object_ref (document); + + return job; +} + +void +ev_job_links_run (EvJobLinks *job) +{ + g_return_if_fail (EV_IS_JOB_LINKS (job)); + + ev_document_doc_mutex_lock (); + job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document)); + EV_JOB (job)->finished = TRUE; + ev_document_doc_mutex_unlock (); +} + + +EvJob * +ev_job_render_new (EvDocument *document, + gint page, + double scale, + gint width, + gint height, + gboolean include_links) +{ + EvJobRender *job; + + job = g_object_new (EV_TYPE_JOB_RENDER, NULL); + + EV_JOB (job)->document = g_object_ref (document); + job->page = page; + job->scale = scale; + job->target_width = width; + job->target_height = height; + job->include_links = include_links; + + if (EV_IS_ASYNC_RENDERER (document)) { + EV_JOB (job)->async = TRUE; + } + + return EV_JOB (job); +} + +static void +render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, EvJobRender *job) +{ + g_signal_handlers_disconnect_by_func (EV_JOB (job)->document, + render_finished_cb, job); + + EV_JOB (job)->finished = TRUE; + job->pixbuf = g_object_ref (pixbuf); + ev_job_finished (EV_JOB (job)); +} + +void +ev_job_render_run (EvJobRender *job) +{ + g_return_if_fail (EV_IS_JOB_RENDER (job)); + + ev_document_doc_mutex_lock (); + + if (EV_JOB (job)->async) { + EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document); + ev_async_renderer_render_pixbuf (renderer, job->page, job->scale); + g_signal_connect (EV_JOB (job)->document, "render_finished", + G_CALLBACK (render_finished_cb), job); + } else { + job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document, + job->page, + job->scale); + if (job->include_links) + job->link_mapping = ev_document_get_links (EV_JOB (job)->document, job->page); + + EV_JOB (job)->finished = TRUE; + } + + ev_document_doc_mutex_unlock (); +} + +EvJob * +ev_job_thumbnail_new (EvDocument *document, + gint page, + gint requested_width) +{ + EvJobThumbnail *job; + + job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL); + + EV_JOB (job)->document = g_object_ref (document); + job->page = page; + job->requested_width = requested_width; + + return EV_JOB (job); +} + +void +ev_job_thumbnail_run (EvJobThumbnail *job) +{ + g_return_if_fail (EV_IS_JOB_THUMBNAIL (job)); + + ev_document_doc_mutex_lock (); + + job->thumbnail = + ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document), + job->page, + job->requested_width, + TRUE); + EV_JOB (job)->finished = TRUE; + + ev_document_doc_mutex_unlock (); +} + +EvJob * +ev_job_load_new (EvDocument *document, + const gchar *uri) +{ + EvJobLoad *job; + + job = g_object_new (EV_TYPE_JOB_LOAD, NULL); + + EV_JOB (job)->document = g_object_ref (document); + job->uri = g_strdup (uri); + + return EV_JOB (job); +} + +void +ev_job_load_run (EvJobLoad *job) +{ + g_return_if_fail (EV_IS_JOB_LOAD (job)); + + ev_document_doc_mutex_lock (); + + if (job->error) { + g_error_free (job->error); + job->error = NULL; + } + + ev_document_load (EV_JOB(job)->document, job->uri, &job->error); + + EV_JOB (job)->finished = TRUE; + + ev_document_doc_mutex_unlock (); +} + + |