Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-window.c
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2008-12-27 18:37:13 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2008-12-27 18:37:13 (GMT)
commit48e488b596bc73000d172234f87ffd46e9f4032e (patch)
tree7dc5f3ea66bedbf493223c179fb13bbd19e59e15 /shell/ev-window.c
parent6b3613c2246624b0d9e0234096c95ad8daa20632 (diff)
First step of the printing system rework. EvJobPrint has been replaced by
2008-12-24 Carlos Garcia Campos <carlosgc@gnome.org> * shell/Makefile.am: * shell/ev-print-operation.[ch]: * shell/ev-jobs.[ch]: (ev_job_export_init), (ev_job_export_dispose), (ev_job_export_run), (ev_job_export_class_init), (ev_job_export_new), (ev_job_export_set_page): * shell/ev-window.c: (ev_window_print_operation_done), (ev_window_print_range), (ev_window_dispose): First step of the printing system rework. EvJobPrint has been replaced by EvJobExport so that every page is scheduled to be exported in a thread instead of scheduling the whole printing process. This way the gui is responsive during printing. svn path=/trunk/; revision=3306
Diffstat (limited to 'shell/ev-window.c')
-rw-r--r--shell/ev-window.c328
1 files changed, 37 insertions, 291 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c
index e3c225c..324cdda 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -87,6 +87,7 @@
#include "ev-view.h"
#include "ev-window.h"
#include "ev-window-title.h"
+#include "ev-print-operation.h"
#ifdef ENABLE_DBUS
#include "ev-media-player-keys.h"
@@ -184,12 +185,10 @@ struct _EvWindowPrivate {
EvJob *reload_job;
EvJob *thumbnail_job;
EvJob *save_job;
- EvJob *print_job;
EvJob *find_job;
/* Printing */
gboolean print_preview;
- GtkPrintJob *gtk_print_job;
GtkPrinter *printer;
GtkPrintSettings *print_settings;
GtkPageSetup *print_page_setup;
@@ -239,8 +238,6 @@ static void ev_window_reload_job_cb (EvJob *job,
EvWindow *window);
static void ev_window_set_icon_from_thumbnail (EvJobThumbnail *job,
EvWindow *ev_window);
-static void ev_window_print_job_cb (EvJob *job,
- EvWindow *window);
static void ev_window_save_job_cb (EvJob *save,
EvWindow *window);
static void ev_window_sizing_mode_changed_cb (EvView *view,
@@ -2292,26 +2289,6 @@ ev_window_cmd_file_print_setup (GtkAction *action, EvWindow *ev_window)
}
static void
-ev_window_clear_print_job (EvWindow *window)
-{
- if (window->priv->print_job) {
- if (!ev_job_is_finished (window->priv->print_job))
- ev_job_cancel (window->priv->print_job);
-
- g_signal_handlers_disconnect_by_func (window->priv->print_job,
- ev_window_print_job_cb,
- window);
- g_object_unref (window->priv->print_job);
- window->priv->print_job = NULL;
- }
-
- if (window->priv->gtk_print_job) {
- g_object_unref (window->priv->gtk_print_job);
- window->priv->gtk_print_job = NULL;
- }
-}
-
-static void
ev_window_load_print_settings_from_metadata (EvWindow *window)
{
gchar *uri = window->priv->uri;
@@ -2348,267 +2325,58 @@ ev_window_save_print_settings (EvWindow *window)
}
static void
-ev_window_print_finished (GtkPrintJob *print_job,
- EvWindow *window,
- GError *error)
-{
- ev_window_clear_print_job (window);
-
- if (error) {
- ev_window_error_message (window, error,
- "%s", _("Failed to print document"));
- } else {
- /* If printed successfully, save print settings */
- ev_application_set_print_settings (EV_APP,
- window->priv->print_settings);
- ev_window_save_print_settings (window);
- }
-}
-
-static void
-ev_window_print_send (EvWindow *window,
- const gchar *filename)
-{
- GtkPrintSettings *settings;
- EvFileExporterCapabilities capabilities;
-
- /* Some printers take into account some print settings,
- * and others don't. However we have exported the document
- * to a ps or pdf file according to such print settings. So,
- * we want to send the exported file to printer with those
- * settings set to default values.
- */
- settings = gtk_print_settings_copy (window->priv->print_settings);
- capabilities = ev_file_exporter_get_capabilities (EV_FILE_EXPORTER (window->priv->document));
-
- gtk_print_settings_set_page_ranges (settings, NULL, 0);
- gtk_print_settings_set_print_pages (settings, GTK_PRINT_PAGES_ALL);
- if (capabilities & EV_FILE_EXPORTER_CAN_COPIES)
- gtk_print_settings_set_n_copies (settings, 1);
- if (capabilities & EV_FILE_EXPORTER_CAN_PAGE_SET)
- gtk_print_settings_set_page_set (settings, GTK_PAGE_SET_ALL);
- if (capabilities & EV_FILE_EXPORTER_CAN_SCALE)
- gtk_print_settings_set_scale (settings, 1.0);
- if (capabilities & EV_FILE_EXPORTER_CAN_COLLATE)
- gtk_print_settings_set_collate (settings, FALSE);
- if (capabilities & EV_FILE_EXPORTER_CAN_REVERSE)
- gtk_print_settings_set_reverse (settings, FALSE);
- if (capabilities & EV_FILE_EXPORTER_CAN_NUMBER_UP) {
- gtk_print_settings_set_number_up (settings, 1);
- gtk_print_settings_set_int (settings, "cups-"GTK_PRINT_SETTINGS_NUMBER_UP, 1);
- }
-
- if (window->priv->print_preview) {
- gchar *uri;
- gchar *print_settings_file = NULL;
-
- ev_application_set_print_settings (EV_APP,
- window->priv->print_settings);
-
- print_settings_file = ev_tmp_filename ("print-settings");
- gtk_print_settings_to_file (settings, print_settings_file, NULL);
-
- uri = g_filename_to_uri (filename, NULL, NULL);
- ev_application_open_uri_at_dest (EV_APP,
- uri,
- gtk_window_get_screen (GTK_WINDOW (window)),
- NULL,
- EV_WINDOW_MODE_PREVIEW,
- NULL,
- TRUE,
- print_settings_file,
- GDK_CURRENT_TIME);
- g_free (print_settings_file);
- g_free (uri);
- } else {
- GtkPrintJob *job;
- GError *error = NULL;
-
- job = gtk_print_job_new (gtk_window_get_title (GTK_WINDOW (window)),
- window->priv->printer,
- settings,
- window->priv->print_page_setup);
-
- if (window->priv->gtk_print_job)
- g_object_unref (window->priv->gtk_print_job);
- window->priv->gtk_print_job = job;
-
- if (gtk_print_job_set_source_file (job, filename, &error)) {
- gtk_print_job_send (job,
- (GtkPrintJobCompleteFunc)ev_window_print_finished,
- window, NULL);
- } else {
- ev_window_clear_print_job (window);
- g_warning ("%s", error->message);
- g_error_free (error);
- }
- }
-
- g_object_unref (settings);
-}
-
-static void
-ev_window_print_job_cb (EvJob *job,
- EvWindow *window)
+ev_window_print_operation_done (EvPrintOperation *op,
+ GtkPrintOperationResult result,
+ EvWindow *ev_window)
{
- if (ev_job_is_failed (job)) {
- g_warning ("%s", job->error->message);
- ev_window_clear_print_job (window);
- return;
- }
-
- g_assert (EV_JOB_PRINT (job)->temp_file != NULL);
-
- ev_window_print_send (window, EV_JOB_PRINT (job)->temp_file);
-}
-
-static gboolean
-ev_window_print_dialog_response_cb (GtkDialog *dialog,
- gint response,
- EvWindow *window)
-{
- EvPrintRange *ranges = NULL;
- EvPrintPageSet page_set;
- gint n_ranges = 0;
- gint copies;
- gint pages_per_sheet;
- gboolean collate;
- gboolean reverse;
- gdouble scale;
- gint current_page;
- gdouble width;
- gdouble height;
- GtkPrintPages print_pages;
- const gchar *file_format;
-
- if (response != GTK_RESPONSE_OK &&
- response != GTK_RESPONSE_APPLY) {
- gtk_widget_destroy (GTK_WIDGET (dialog));
- window->priv->print_dialog = NULL;
-
- return FALSE;
- }
-
- window->priv->print_preview = (response == GTK_RESPONSE_APPLY);
-
- if (window->priv->printer)
- g_object_unref (window->priv->printer);
- if (window->priv->print_settings)
- g_object_unref (window->priv->print_settings);
- if (window->priv->print_page_setup)
- g_object_unref (window->priv->print_page_setup);
-
- window->priv->printer = g_object_ref (
- gtk_print_unix_dialog_get_selected_printer (GTK_PRINT_UNIX_DIALOG (dialog)));
- window->priv->print_settings = g_object_ref (
- gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dialog)));
- window->priv->print_page_setup = g_object_ref (
- gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (dialog)));
-
- file_format = gtk_print_settings_get (window->priv->print_settings,
- GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT);
-
- if (!gtk_printer_accepts_ps (window->priv->printer)) {
- ev_window_error_message (window, NULL, "%s",
- _("Printing is not supported on this printer."));
- return FALSE;
- }
+ switch (result) {
+ case GTK_PRINT_OPERATION_RESULT_APPLY: {
+ GtkPrintSettings *print_settings;
- ev_window_clear_print_job (window);
-
- current_page = gtk_print_unix_dialog_get_current_page (GTK_PRINT_UNIX_DIALOG (dialog));
- print_pages = gtk_print_settings_get_print_pages (window->priv->print_settings);
-
- switch (print_pages) {
- case GTK_PRINT_PAGES_CURRENT:
- ranges = g_new0 (EvPrintRange, 1);
-
- ranges->start = current_page;
- ranges->end = current_page;
- n_ranges = 1;
-
- break;
- case GTK_PRINT_PAGES_RANGES: {
- GtkPageRange *page_range;
+ if (ev_window->priv->print_settings)
+ g_object_unref (ev_window->priv->print_settings);
+ print_settings = ev_print_operation_get_print_settings (op);
- page_range = gtk_print_settings_get_page_ranges (window->priv->print_settings,
- &n_ranges);
- if (n_ranges > 0)
- ranges = g_memdup (page_range, n_ranges * sizeof (GtkPageRange));
+ ev_application_set_print_settings (EV_APP, print_settings);
+ ev_window->priv->print_settings = g_object_ref (print_settings);
+ ev_window_save_print_settings (ev_window);
}
break;
- case GTK_PRINT_PAGES_ALL: {
- gint n_pages;
-
- n_pages = ev_page_cache_get_n_pages (ev_page_cache_get (window->priv->document));
-
- ranges = g_new0 (EvPrintRange, 1);
+ case GTK_PRINT_OPERATION_RESULT_ERROR: {
+ GError *error = NULL;
- ranges->start = 0;
- ranges->end = n_pages - 1;
- n_ranges = 1;
+ ev_print_operation_get_error (op, &error);
+ ev_window_error_message (ev_window, error,
+ "%s", _("Failed to print document"));
+ g_error_free (error);
}
break;
+ case GTK_PRINT_OPERATION_RESULT_CANCEL:
+ default:
+ break;
}
- page_set = (EvPrintPageSet)gtk_print_settings_get_page_set (window->priv->print_settings);
-
- scale = gtk_print_settings_get_scale (window->priv->print_settings) * 0.01;
-
- width = gtk_page_setup_get_paper_width (window->priv->print_page_setup,
- GTK_UNIT_POINTS);
- height = gtk_page_setup_get_paper_height (window->priv->print_page_setup,
- GTK_UNIT_POINTS);
-
- if (scale != 1.0) {
- width *= scale;
- height *= scale;
- }
-
- pages_per_sheet = gtk_print_settings_get_number_up (window->priv->print_settings);
-
- copies = gtk_print_settings_get_n_copies (window->priv->print_settings);
- collate = gtk_print_settings_get_collate (window->priv->print_settings);
- reverse = gtk_print_settings_get_reverse (window->priv->print_settings);
-
- window->priv->print_job = ev_job_print_new (window->priv->document,
- file_format ? file_format : "ps",
- width, height,
- ranges, n_ranges,
- page_set,
- pages_per_sheet,
- copies, collate,
- reverse);
-
- g_signal_connect (window->priv->print_job, "finished",
- G_CALLBACK (ev_window_print_job_cb),
- window);
- /* The priority doesn't matter for this job */
- ev_job_scheduler_push_job (window->priv->print_job, EV_JOB_PRIORITY_NONE);
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- window->priv->print_dialog = NULL;
-
- return TRUE;
+ g_object_unref (op);
}
void
-ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
+ev_window_print_range (EvWindow *ev_window,
+ gint first_page,
+ gint last_page)
{
- GtkWidget *dialog;
+ EvPrintOperation *op;
EvPageCache *page_cache;
gint current_page;
gint document_last_page;
- GtkPrintCapabilities capabilities;
g_return_if_fail (EV_IS_WINDOW (ev_window));
g_return_if_fail (ev_window->priv->document != NULL);
- if (ev_window->priv->print_dialog) {
- gtk_window_present (GTK_WINDOW (ev_window->priv->print_dialog));
- return;
- }
-
+ op = ev_print_operation_new (ev_window->priv->document);
+ g_signal_connect (G_OBJECT (op), "done",
+ G_CALLBACK (ev_window_print_operation_done),
+ (gpointer)ev_window);
+
page_cache = ev_page_cache_get (ev_window->priv->document);
current_page = ev_page_cache_get_current_page (page_cache);
document_last_page = ev_page_cache_get_n_pages (page_cache);
@@ -2632,29 +2400,13 @@ ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
&range, 1);
}
- dialog = gtk_print_unix_dialog_new (_("Print"), GTK_WINDOW (ev_window));
- ev_window->priv->print_dialog = dialog;
-
- capabilities = GTK_PRINT_CAPABILITY_PREVIEW |
- ev_file_exporter_get_capabilities (EV_FILE_EXPORTER (ev_window->priv->document));
- gtk_print_unix_dialog_set_manual_capabilities (GTK_PRINT_UNIX_DIALOG (dialog),
- capabilities);
-
- gtk_print_unix_dialog_set_current_page (GTK_PRINT_UNIX_DIALOG (dialog),
- current_page);
-
- gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG (dialog),
- ev_window->priv->print_settings);
-
+ ev_print_operation_set_job_name (op, gtk_window_get_title (GTK_WINDOW (ev_window)));
+ ev_print_operation_set_current_page (op, current_page);
+ ev_print_operation_set_print_settings (op, ev_window->priv->print_settings);
if (ev_window->priv->print_page_setup)
- gtk_print_unix_dialog_set_page_setup (GTK_PRINT_UNIX_DIALOG (dialog),
- ev_window->priv->print_page_setup);
-
- g_signal_connect (G_OBJECT (dialog), "response",
- G_CALLBACK (ev_window_print_dialog_response_cb),
- ev_window);
+ ev_print_operation_set_default_page_setup (op, ev_window->priv->print_page_setup);
- gtk_widget_show (dialog);
+ ev_print_operation_run (op, GTK_WINDOW (ev_window));
}
static void
@@ -4395,13 +4147,7 @@ ev_window_dispose (GObject *object)
}
ev_window_close_dialogs (window);
- ev_window_clear_print_job (window);
- if (window->priv->gtk_print_job) {
- g_object_unref (window->priv->gtk_print_job);
- window->priv->gtk_print_job = NULL;
- }
-
if (window->priv->printer) {
g_object_unref (window->priv->printer);
window->priv->printer = NULL;