X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fprint.cpp;h=cc5d8c0a1fad582db858425eea2d24b4a0a33404;hb=abd8e5a4ae297f3958f7c2a443d2f1247b23cc14;hp=52a8d3c8236781337e53c6de3688396ad4c1e3fc;hpb=2751e196d4d22e5ea77e8d967dfed785262ee9fd;p=inkscape.git diff --git a/src/print.cpp b/src/print.cpp index 52a8d3c82..cc5d8c0a1 100644 --- a/src/print.cpp +++ b/src/print.cpp @@ -6,6 +6,7 @@ /* * Author: * Lauris Kaplinski + * Kees Cook * * This code is in public domain */ @@ -14,30 +15,15 @@ # include "config.h" #endif - - +#include "inkscape.h" +#include "desktop.h" #include "sp-item.h" #include "extension/print.h" #include "extension/system.h" #include "print.h" -#ifdef HAVE_GTK_UNIX_PRINT -#include -#include -#include -#endif - -#if 0 -# include +#include "ui/dialog/print.h" -# ifdef WIN32 -# include -# endif - -# ifdef WITH_GNOME_PRINT -# include -# endif -#endif /* Identity typedef */ @@ -136,142 +122,26 @@ sp_print_preview_document(SPDocument *doc) return; } -#ifdef HAVE_GTK_UNIX_PRINT -static void -unix_print_complete (GtkPrintJob *print_job, - gpointer user_data, - GError *error) -{ - fprintf(stderr,"print job finished: %s\n",error ? error->message : "no error"); -} - -static void -unix_print_dialog (const gchar * ps_file, const gchar * jobname) -{ - Glib::ustring title = _("Print"); - title += " "; - title += jobname; - GtkWidget* dlg = gtk_print_unix_dialog_new(title.c_str(), NULL); - - // force output system to only handle our pre-generated PS output - gtk_print_unix_dialog_set_manual_capabilities (GTK_PRINT_UNIX_DIALOG(dlg), - GTK_PRINT_CAPABILITY_GENERATE_PS); - -/* - * It would be nice to merge the PrintPS::setup routine with a custom - * configuration dialog: - - gtk_print_unix_dialog_add_custom_tab (GtkPrintUnixDialog *dialog, - GtkWidget *child, - GtkWidget *tab_label); -*/ - - int const response = gtk_dialog_run(GTK_DIALOG(dlg)); - - if (response == GTK_RESPONSE_OK) { - GtkPrinter* printer = gtk_print_unix_dialog_get_selected_printer(GTK_PRINT_UNIX_DIALOG(dlg)); - - if (gtk_printer_accepts_ps (printer)) { - GtkPrintJob* job = gtk_print_job_new (jobname, printer, - gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dlg)), - gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dlg))); - - - GError * error = NULL; - if ( gtk_print_job_set_source_file (job, ps_file, &error)) { - gtk_print_job_send (job, unix_print_complete, NULL, NULL); - } - else { - g_warning(_("Could not set print source: %s"),error ? error->message : _("unknown error")); - } - if (error) g_error_free(error); - } - else { - g_warning(_("Printer '%s' does not support PS output"), gtk_printer_get_name (printer)); - } - } - else if (response == GTK_RESPONSE_APPLY) { - // since we didn't include the Preview capability, - // this should never happen. - g_warning(_("Print Preview not available")); - } - - gtk_widget_destroy(dlg); -} -#endif // HAVE_GTK_UNIX_PRINT - - void -sp_print_document(SPDocument *doc, unsigned int direct) +sp_print_document(Gtk::Window& parentWindow, SPDocument *doc) { - Inkscape::Extension::Print *mod; - unsigned int ret; -#ifdef HAVE_GTK_UNIX_PRINT - Glib::ustring tmpfile = ""; -#endif - sp_document_ensure_up_to_date(doc); - if (direct) { - mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_PS); - } else { - mod = Inkscape::Extension::get_print(SP_MODULE_KEY_PRINT_DEFAULT); - -#ifdef HAVE_GTK_UNIX_PRINT - // unix print dialog reads from the exported tempfile - gchar *filename = NULL; - GError *error = NULL; - gint tmpfd = g_file_open_tmp("inkscape-ps-XXXXXX", - &filename, - &error); - if (tmpfd<0) { - g_warning(_("Failed to create tempfile for printing: %s"), - error ? error->message : _("unknown error")); - if (error) g_error_free(error); - return; - } - tmpfile = filename; - g_free(filename); - close(tmpfd); - - Glib::ustring destination = ">" + tmpfile; - mod->set_param_string("destination", destination.c_str()); -#endif - } - - ret = mod->setup(); - - if (ret) { - SPPrintContext context; - context.module = mod; - - /* fixme: This has to go into module constructor somehow */ - /* Create new arena */ - mod->base = SP_ITEM(sp_document_root(doc)); - mod->arena = NRArena::create(); - mod->dkey = sp_item_display_key_new(1); - mod->root = sp_item_invoke_show(mod->base, mod->arena, mod->dkey, SP_ITEM_SHOW_DISPLAY); - /* Print document */ - ret = mod->begin(doc); - sp_item_invoke_print(mod->base, &context); - ret = mod->finish(); - /* Release arena */ - sp_item_invoke_hide(mod->base, mod->dkey); - mod->base = NULL; - nr_arena_item_unref(mod->root); - mod->root = NULL; - nr_object_unref((NRObject *) mod->arena); - mod->arena = NULL; - -#ifdef HAVE_GTK_UNIX_PRINT - // redirect output to new print dialog - unix_print_dialog(tmpfile.c_str(),doc->name ? doc->name : _("SVG Document")); - unlink(tmpfile.c_str()); - // end redirected new print dialog -#endif - } - - return; + // Build arena + SPItem *base = SP_ITEM(sp_document_root(doc)); + NRArena *arena = NRArena::create(); + unsigned int dkey = sp_item_display_key_new(1); + NRArenaItem *root = sp_item_invoke_show(base, arena, dkey, SP_ITEM_SHOW_DISPLAY); + + // Run print dialog + Inkscape::UI::Dialog::Print printop(doc,base); + Gtk::PrintOperationResult res = printop.run(Gtk::PRINT_OPERATION_ACTION_PRINT_DIALOG, parentWindow); + (void)res; // TODO handle this + + // Release arena + sp_item_invoke_hide(base, dkey); + nr_arena_item_unref(root); + nr_object_unref((NRObject *) arena); } void