X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkprintoperation.c;h=3fd4f93dc7c0b746515f244dc74e39f08d057e9f;hb=79695ee64d41c9aadfe2c6f18dc7dd1e3fd44852;hp=15eadf1c38d4ecbb1820dd69f1dcbe1951ff332e;hpb=2f0d40335b83d70d04a205dd17e8a5514b79f2d4;p=~andy%2Fgtk diff --git a/gtk/gtkprintoperation.c b/gtk/gtkprintoperation.c index 15eadf1c3..3fd4f93dc 100644 --- a/gtk/gtkprintoperation.c +++ b/gtk/gtkprintoperation.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -31,14 +29,83 @@ #include "gtkmarshalers.h" #include "gtkintl.h" #include "gtkprivate.h" -#include "gtkmainprivate.h" #include "gtkmessagedialog.h" #include "gtktypebuiltins.h" +/** + * SECTION:gtkprintoperation + * @Title: GtkPrintOperation + * @Short_description: High-level Printing API + * @See_also: #GtkPrintContext, #GtkPrintUnixDialog + * + * GtkPrintOperation is the high-level, portable printing API. + * It looks a bit different than other GTK+ dialogs such as the + * #GtkFileChooser, since some platforms don't expose enough + * infrastructure to implement a good print dialog. On such + * platforms, GtkPrintOperation uses the native print dialog. + * On platforms which do not provide a native print dialog, GTK+ + * uses its own, see #GtkPrintUnixDialog. + * + * The typical way to use the high-level printing API is to create + * a GtkPrintOperation object with gtk_print_operation_new() when + * the user selects to print. Then you set some properties on it, + * e.g. the page size, any #GtkPrintSettings from previous print + * operations, the number of pages, the current page, etc. + * + * Then you start the print operation by calling gtk_print_operation_run(). + * It will then show a dialog, let the user select a printer and + * options. When the user finished the dialog various signals will + * be emitted on the #GtkPrintOperation, the main one being + * #GtkPrintOperation::draw-page, which you are supposed to catch + * and render the page on the provided #GtkPrintContext using Cairo. + * + * + * The high-level printing API + * + * static GtkPrintSettings *settings = NULL; + * + * static void + * do_print (void) + * { + * GtkPrintOperation *print; + * GtkPrintOperationResult res; + * + * print = gtk_print_operation_new (); + * + * if (settings != NULL) + * gtk_print_operation_set_print_settings (print, settings); + * + * g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), NULL); + * g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), NULL); + * + * res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, + * GTK_WINDOW (main_window), NULL); + * + * if (res == GTK_PRINT_OPERATION_RESULT_APPLY) + * { + * if (settings != NULL) + * g_object_unref (settings); + * settings = g_object_ref (gtk_print_operation_get_print_settings (print)); + * } + * + * g_object_unref (print); + * } + * + * + * + * By default GtkPrintOperation uses an external application to do + * print preview. To implement a custom print preview, an application + * must connect to the preview signal. The functions + * gtk_print_operation_preview_render_page(), + * gtk_print_operation_preview_end_preview() and + * gtk_print_operation_preview_is_selected() + * are useful when implementing a print preview. + */ + #define SHOW_PROGRESS_TIME 1200 -enum +enum { DONE, BEGIN_PRINT, @@ -181,7 +248,7 @@ gtk_print_operation_init (GtkPrintOperation *operation) priv->page_drawing_state = GTK_PAGE_DRAWING_STATE_READY; priv->rloop = NULL; - priv->unit = GTK_UNIT_PIXEL; + priv->unit = GTK_UNIT_NONE; appname = g_get_application_name (); if (appname == NULL) @@ -481,11 +548,19 @@ preview_print_idle_done (gpointer data) op = GTK_PRINT_OPERATION (pop->preview); cairo_surface_finish (pop->surface); - /* Surface is destroyed in launch_preview */ - _gtk_print_operation_platform_backend_launch_preview (op, - pop->surface, - pop->parent, - pop->filename); + + if (op->priv->status == GTK_PRINT_STATUS_FINISHED_ABORTED) + { + cairo_surface_destroy (pop->surface); + } + else + { + /* Surface is destroyed in launch_preview */ + _gtk_print_operation_platform_backend_launch_preview (op, + pop->surface, + pop->parent, + pop->filename); + } g_free (pop->filename); @@ -511,10 +586,14 @@ preview_print_idle (gpointer data) op = GTK_PRINT_OPERATION (pop->preview); priv = op->priv; - if (priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_READY) { - if (!pop->pages_data->initialized) + if (priv->cancelled) + { + done = TRUE; + _gtk_print_operation_set_status (op, GTK_PRINT_STATUS_FINISHED_ABORTED, NULL); + } + else if (!pop->pages_data->initialized) { pop->pages_data->initialized = TRUE; prepare_data (pop->pages_data); @@ -953,7 +1032,7 @@ gtk_print_operation_class_init (GtkPrintOperationClass *class) /** * GtkPrintOperation::preview: * @operation: the #GtkPrintOperation on which the signal was emitted - * @preview: the #GtkPrintPreviewOperation for the current operation + * @preview: the #GtkPrintOperationPreview for the current operation * @context: the #GtkPrintContext that will be used * @parent: (allow-none): the #GtkWindow to use as window parent, or %NULL * @@ -1154,7 +1233,7 @@ gtk_print_operation_class_init (GtkPrintOperationClass *class) P_("Unit"), P_("The unit in which distances can be measured in the context"), GTK_TYPE_UNIT, - GTK_UNIT_PIXEL, + GTK_UNIT_NONE, GTK_PARAM_READWRITE)); @@ -1321,7 +1400,7 @@ gtk_print_operation_class_init (GtkPrintOperationClass *class) PROP_EMBED_PAGE_SETUP, g_param_spec_boolean ("embed-page-setup", P_("Embed Page Setup"), - P_("TRUE if page setup combos are embedded in GtkPrintDialog"), + P_("TRUE if page setup combos are embedded in GtkPrintUnixDialog"), FALSE, GTK_PARAM_READWRITE)); /** @@ -1763,7 +1842,7 @@ gtk_print_operation_get_status (GtkPrintOperation *op) * * Since: 2.10 **/ -G_CONST_RETURN gchar * +const gchar * gtk_print_operation_get_status_string (GtkPrintOperation *op) { g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), ""); @@ -1971,14 +2050,11 @@ pdf_start_page (GtkPrintOperation *op, GtkPrintContext *print_context, GtkPageSetup *page_setup) { - GtkPaperSize *paper_size; cairo_surface_t *surface = op->priv->platform_data; gdouble w, h; - paper_size = gtk_page_setup_get_paper_size (page_setup); - - w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS); - h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS); + w = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_POINTS); + h = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_POINTS); cairo_pdf_surface_set_size (surface, w, h); } @@ -2067,7 +2143,7 @@ run_pdf (GtkPrintOperation *op, priv->manual_reverse = FALSE; priv->manual_page_set = GTK_PAGE_SET_ALL; priv->manual_scale = 1.0; - priv->manual_orientation = TRUE; + priv->manual_orientation = FALSE; priv->manual_number_up = 1; priv->manual_number_up_layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM; @@ -2310,7 +2386,7 @@ gtk_print_operation_set_defer_drawing (GtkPrintOperation *op) /** * gtk_print_operation_set_embed_page_setup: * @op: a #GtkPrintOperation - * @embed: %TRUE to embed page setup selection in the #GtkPrintDialog + * @embed: %TRUE to embed page setup selection in the #GtkPrintUnixDialog * * Embed page size combo box and orientation combo box into page setup page. * Selected page setup is stored as default page setup in #GtkPrintOperation. @@ -2339,7 +2415,7 @@ gtk_print_operation_set_embed_page_setup (GtkPrintOperation *op, * gtk_print_operation_get_embed_page_setup: * @op: a #GtkPrintOperation * - * Gets the value of #GtkPrintOperation::embed-page-setup property. + * Gets the value of #GtkPrintOperation:embed-page-setup property. * * Returns: whether page setup selection combos are embedded * @@ -2419,6 +2495,8 @@ common_render_page (GtkPrintOperation *op, if (priv->manual_orientation) _gtk_print_context_rotate_according_to_orientation (print_context); + else + _gtk_print_context_reverse_according_to_orientation (print_context); if (priv->manual_number_up > 1) { @@ -2969,7 +3047,7 @@ print_pages (GtkPrintOperation *op, priv->manual_reverse = gtk_print_settings_get_reverse (priv->print_settings); priv->manual_page_set = gtk_print_settings_get_page_set (priv->print_settings); priv->manual_scale = gtk_print_settings_get_scale (priv->print_settings) / 100.0; - priv->manual_orientation = TRUE; + priv->manual_orientation = FALSE; priv->manual_number_up = gtk_print_settings_get_number_up (priv->print_settings); priv->manual_number_up_layout = gtk_print_settings_get_number_up_layout (priv->print_settings); } @@ -2985,9 +3063,9 @@ print_pages (GtkPrintOperation *op, priv->rloop = g_main_loop_new (NULL, FALSE); g_object_ref (op); - GDK_THREADS_LEAVE (); + gdk_threads_leave (); g_main_loop_run (priv->rloop); - GDK_THREADS_ENTER (); + gdk_threads_enter (); g_main_loop_unref (priv->rloop); priv->rloop = NULL; @@ -3224,7 +3302,7 @@ gtk_print_operation_set_support_selection (GtkPrintOperation *op, * gtk_print_operation_get_support_selection: * @op: a #GtkPrintOperation * - * Gets the value of #GtkPrintOperation::support-selection property. + * Gets the value of #GtkPrintOperation:support-selection property. * * Returns: whether the application supports print of selection * @@ -3273,7 +3351,7 @@ gtk_print_operation_set_has_selection (GtkPrintOperation *op, * gtk_print_operation_get_has_selection: * @op: a #GtkPrintOperation * - * Gets the value of #GtkPrintOperation::has-selection property. + * Gets the value of #GtkPrintOperation:has-selection property. * * Returns: whether there is a selection *