aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-format-html-print.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/em-format-html-print.c')
-rw-r--r--mail/em-format-html-print.c110
1 files changed, 57 insertions, 53 deletions
diff --git a/mail/em-format-html-print.c b/mail/em-format-html-print.c
index ebda5aaf2a..a674b59368 100644
--- a/mail/em-format-html-print.c
+++ b/mail/em-format-html-print.c
@@ -112,84 +112,88 @@ em_format_html_print_new (EMFormatHTML *source, GtkPrintOperationAction action)
return efhp;
}
-struct footer_info {
- PangoLayout *layout;
- gint page_num, pages;
-};
-
-static void
-efhp_footer_cb (GtkHTML *html, GtkPrintContext *context, gdouble x, gdouble y,
- gdouble width, gdouble height, gpointer data)
+static gint
+efhp_calc_footer_height (GtkHTML *html,
+ GtkPrintOperation *operation,
+ GtkPrintContext *context)
{
- struct footer_info *info = data;
- gchar *footer_text;
- cairo_t *cr;
-
- footer_text = g_strdup_printf (_("Page %d of %d"),
- info->page_num++, info->pages);
+ PangoContext *pango_context;
+ PangoFontDescription *desc;
+ PangoFontMetrics *metrics;
+ gint footer_height;
- pango_layout_set_text (info->layout, footer_text, -1);
- pango_layout_set_width (info->layout, pango_units_from_double (width));
+ pango_context = gtk_print_context_create_pango_context (context);
+ desc = pango_font_description_from_string ("Sans Regular 10");
- cr = gtk_print_context_get_cairo_context (context);
+ metrics = pango_context_get_metrics (
+ pango_context, desc, pango_language_get_default ());
+ footer_height =
+ pango_font_metrics_get_ascent (metrics) +
+ pango_font_metrics_get_descent (metrics);
+ pango_font_metrics_unref (metrics);
- cairo_save (cr);
- cairo_set_source_rgb (cr, .0, .0, .0);
- cairo_move_to (cr, x, y);
- pango_cairo_show_layout (cr, info->layout);
- cairo_restore (cr);
+ pango_font_description_free (desc);
+ g_object_unref (pango_context);
- g_free (footer_text);
+ return footer_height;
}
-static void
-mail_draw_page (GtkPrintOperation *print, GtkPrintContext *context,
- gint page_nr, EMFormatHTMLPrint *efhp)
+static void
+efhp_draw_footer (GtkHTML *html,
+ GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ PangoRectangle *rec)
{
- GtkHTML *html = efhp->parent.html;
PangoFontDescription *desc;
- PangoFontMetrics *metrics;
- struct footer_info info;
- gdouble footer_height;
+ PangoLayout *layout;
+ gdouble x, y;
+ gint n_pages;
+ gchar *text;
+ cairo_t *cr;
+
+ g_object_get (operation, "n-pages", &n_pages, NULL);
+ text = g_strdup_printf (_("Page %d of %d"), page_nr + 1, n_pages);
desc = pango_font_description_from_string ("Sans Regular 10");
+ layout = gtk_print_context_create_pango_layout (context);
+ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_width (layout, rec->width);
- info.layout = gtk_print_context_create_pango_layout (context);
- pango_layout_set_alignment (info.layout, PANGO_ALIGN_CENTER);
- pango_layout_set_font_description (info.layout, desc);
+ x = pango_units_to_double (rec->x);
+ y = pango_units_to_double (rec->y);
- metrics = pango_context_get_metrics (
- pango_layout_get_context (info.layout),
- desc, pango_language_get_default ());
- footer_height = pango_units_to_double (
- pango_font_metrics_get_ascent (metrics) +
- pango_font_metrics_get_descent (metrics));
- pango_font_metrics_unref (metrics);
+ cr = gtk_print_context_get_cairo_context (context);
- pango_font_description_free (desc);
+ cairo_save (cr);
+ cairo_set_source_rgb (cr, .0, .0, .0);
+ cairo_move_to (cr, x, y);
+ pango_cairo_show_layout (cr, layout);
+ cairo_restore (cr);
- info.page_num = 1;
- info.pages = gtk_html_print_page_get_pages_num (
- html, context, 0.0, footer_height);
+ g_object_unref (layout);
+ pango_font_description_free (desc);
- gtk_html_print_page_with_header_footer (
- html, context, 0.0, footer_height,
- NULL, efhp_footer_cb, &info);
+ g_free (text);
}
static void
emfhp_complete (EMFormatHTMLPrint *efhp)
{
GtkPrintOperation *operation;
+ GError *error = NULL;
operation = e_print_operation_new ();
- gtk_print_operation_set_n_pages (operation, 1);
-
- g_signal_connect (
- operation, "draw-page",
- G_CALLBACK (mail_draw_page), efhp);
- gtk_print_operation_run (operation, efhp->action, NULL, NULL);
+ gtk_html_print_operation_run (
+ efhp->parent.html, operation, efhp->action, NULL,
+ (GtkHTMLPrintCalcHeight) NULL,
+ (GtkHTMLPrintCalcHeight) efhp_calc_footer_height,
+ (GtkHTMLPrintDrawFunc) NULL,
+ (GtkHTMLPrintDrawFunc) efhp_draw_footer,
+ NULL, &error);
g_object_unref (operation);
}