Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/libview
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2009-05-17 14:29:16 (GMT)
committer Carlos Garcia Campos <carlosgc@gnome.org>2009-05-17 14:40:31 (GMT)
commitcc0f0ef258d6540cb2a264a1a53a717d836c79d4 (patch)
treead3d2812f9caafd5633a8426bd290ee7feaffd78 /libview
parentc561c0a1ff7ff46f1a1cf781b0d9b30a1599d1d7 (diff)
[libview] Add a new job for printing using cairo
Diffstat (limited to 'libview')
-rw-r--r--libview/ev-jobs.c112
-rw-r--r--libview/ev-jobs.h29
2 files changed, 141 insertions, 0 deletions
diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c
index b5b4282..55e76a4 100644
--- a/libview/ev-jobs.c
+++ b/libview/ev-jobs.c
@@ -33,6 +33,7 @@
#include "ev-document-security.h"
#include "ev-document-find.h"
#include "ev-document-layers.h"
+#include "ev-document-print.h"
#include "ev-document-annotations.h"
#include "ev-debug.h"
@@ -61,6 +62,8 @@ static void ev_job_layers_init (EvJobLayers *job);
static void ev_job_layers_class_init (EvJobLayersClass *class);
static void ev_job_export_init (EvJobExport *job);
static void ev_job_export_class_init (EvJobExportClass *class);
+static void ev_job_print_init (EvJobPrint *job);
+static void ev_job_print_class_init (EvJobPrintClass *class);
enum {
CANCELLED,
@@ -99,6 +102,7 @@ G_DEFINE_TYPE (EvJobSave, ev_job_save, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobFind, ev_job_find, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobLayers, ev_job_layers, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobExport, ev_job_export, EV_TYPE_JOB)
+G_DEFINE_TYPE (EvJobPrint, ev_job_print, EV_TYPE_JOB)
/* EvJob */
static void
@@ -1369,3 +1373,111 @@ ev_job_export_set_page (EvJobExport *job,
{
job->page = page;
}
+
+/* EvJobPrint */
+static void
+ev_job_print_init (EvJobPrint *job)
+{
+ EV_JOB (job)->run_mode = EV_JOB_RUN_THREAD;
+ job->page = -1;
+}
+
+static void
+ev_job_print_dispose (GObject *object)
+{
+ EvJobPrint *job;
+
+ ev_debug_message (DEBUG_JOBS, NULL);
+
+ job = EV_JOB_PRINT (object);
+
+ if (job->cr) {
+ cairo_destroy (job->cr);
+ job->cr = NULL;
+ }
+
+ (* G_OBJECT_CLASS (ev_job_print_parent_class)->dispose) (object);
+}
+
+static gboolean
+ev_job_print_run (EvJob *job)
+{
+ EvJobPrint *job_print = EV_JOB_PRINT (job);
+ EvPage *ev_page;
+ cairo_status_t cr_status;
+
+ g_assert (job_print->page != -1);
+ g_assert (job_print->cr != NULL);
+
+ ev_debug_message (DEBUG_JOBS, NULL);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
+
+ job->failed = FALSE;
+ job->finished = FALSE;
+ g_clear_error (&job->error);
+
+ ev_document_doc_mutex_lock ();
+
+ ev_page = ev_document_get_page (job->document, job_print->page);
+ ev_document_print_print_page (EV_DOCUMENT_PRINT (job->document),
+ ev_page, job_print->cr);
+ g_object_unref (ev_page);
+
+ ev_document_doc_mutex_unlock ();
+
+ cr_status = cairo_status (job_print->cr);
+ if (cr_status == CAIRO_STATUS_SUCCESS) {
+ ev_job_succeeded (job);
+ } else {
+ ev_job_failed (job,
+ GTK_PRINT_ERROR,
+ GTK_PRINT_ERROR_GENERAL,
+ _("Failed to print page %d: %s"),
+ job_print->page,
+ cairo_status_to_string (cr_status));
+ }
+
+ return FALSE;
+}
+
+static void
+ev_job_print_class_init (EvJobPrintClass *class)
+{
+ GObjectClass *oclass = G_OBJECT_CLASS (class);
+ EvJobClass *job_class = EV_JOB_CLASS (class);
+
+ oclass->dispose = ev_job_print_dispose;
+ job_class->run = ev_job_print_run;
+}
+
+EvJob *
+ev_job_print_new (EvDocument *document)
+{
+ EvJob *job;
+
+ ev_debug_message (DEBUG_JOBS, NULL);
+
+ job = g_object_new (EV_TYPE_JOB_PRINT, NULL);
+ job->document = g_object_ref (document);
+
+ return job;
+}
+
+void
+ev_job_print_set_page (EvJobPrint *job,
+ gint page)
+{
+ job->page = page;
+}
+
+void
+ev_job_print_set_cairo (EvJobPrint *job,
+ cairo_t *cr)
+{
+ if (job->cr == cr)
+ return;
+
+ if (job->cr)
+ cairo_destroy (job->cr);
+ job->cr = cr ? cairo_reference (cr) : NULL;
+}
diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h
index 17f1b3c..144ec06 100644
--- a/libview/ev-jobs.h
+++ b/libview/ev-jobs.h
@@ -27,6 +27,7 @@
#include <gio/gio.h>
#include <gtk/gtk.h>
+#include <cairo.h>
#include <evince-document.h>
@@ -65,6 +66,9 @@ typedef struct _EvJobLayersClass EvJobLayersClass;
typedef struct _EvJobExport EvJobExport;
typedef struct _EvJobExportClass EvJobExportClass;
+typedef struct _EvJobPrint EvJobPrint;
+typedef struct _EvJobPrintClass EvJobPrintClass;
+
#define EV_TYPE_JOB (ev_job_get_type())
#define EV_JOB(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB, EvJob))
#define EV_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB, EvJobClass))
@@ -121,6 +125,11 @@ typedef struct _EvJobExportClass EvJobExportClass;
#define EV_JOB_EXPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB_EXPORT, EvJobExportClass))
#define EV_IS_JOB_EXPORT(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_EXPORT))
+#define EV_TYPE_JOB_PRINT (ev_job_print_get_type())
+#define EV_JOB_PRINT(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB_PRINT, EvJobPrint))
+#define EV_JOB_PRINT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB_PRINT, EvJobPrintClass))
+#define EV_IS_JOB_PRINT(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_PRINT))
+
typedef enum {
EV_JOB_RUN_THREAD,
EV_JOB_RUN_MAIN_LOOP
@@ -332,6 +341,19 @@ struct _EvJobExportClass
EvJobClass parent_class;
};
+struct _EvJobPrint
+{
+ EvJob parent;
+
+ gint page;
+ cairo_t *cr;
+};
+
+struct _EvJobPrintClass
+{
+ EvJobClass parent_class;
+};
+
/* Base job class */
GType ev_job_get_type (void) G_GNUC_CONST;
gboolean ev_job_run (EvJob *job);
@@ -418,6 +440,13 @@ GType ev_job_export_get_type (void) G_GNUC_CONST;
EvJob *ev_job_export_new (EvDocument *document);
void ev_job_export_set_page (EvJobExport *job,
gint page);
+/* EvJobPrint */
+GType ev_job_print_get_type (void) G_GNUC_CONST;
+EvJob *ev_job_print_new (EvDocument *document);
+void ev_job_print_set_page (EvJobPrint *job,
+ gint page);
+void ev_job_print_set_cairo (EvJobPrint *job,
+ cairo_t *cr);
G_END_DECLS