Re: capture window for printing



Fabian Förg wrote:
Hello,

as the topic suggests, I am trying to capture a window which should be printed afterwards.

This is my code:

/* appl_t is a struct created by me which contains "GtkWidget *print_win",
* the window I want to print. Moreover, appl_t contains gints for the
* width and height of the window */

/* callback for my print button */
static void print_cb(appl_t * appl)
{
   values_t *val = &appl->values;
   GtkPrintOperation *op;
   GtkPrintOperationResult res;

output_print(appl); /* This function creates the window which I want to print */

   op = gtk_print_operation_new();

   gtk_print_operation_set_n_pages(op, 1);
   gtk_print_operation_set_unit(op, GTK_UNIT_MM);
   g_signal_connect(op, "draw_page", G_CALLBACK(draw_page), appl);
   res =
gtk_print_operation_run(op, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
                   NULL, NULL);
   }
}

static void draw_page(GtkPrintOperation * operation,
             GtkPrintContext * print_context, gint page_nr,
             appl_t * appl)
{
   gdouble print_width, print_height, scale;
   cairo_t *cr, *cr_win;
   cairo_surface_t *surface;
   values_t *val = &appl->values;

   /* create a surface of the print window */
   cr_win = gdk_cairo_create(appl->print_win->window);

   /* get width and height of the print window */
gdk_drawable_get_size(appl->print_win->window, &(val->width), &(val->height));

   gtk_widget_hide_all(appl->print_win);

   /* create the cairo surface for cr_win */
   surface = cairo_get_target(cr_win);
   cairo_surface_reference(surface);
   cairo_destroy(cr_win);

   /* get width and heigth of print_context */
   print_width = gtk_print_context_get_width(print_context);
   print_height = gtk_print_context_get_height(print_context);

   /* transform the print_context into a cairo_context */
   cr = gtk_print_context_get_cairo_context(print_context);

   scale = (gdouble) print_width / val->width;

   /* scale, keep aspect ratio */
   cairo_scale(cr, scale, scale);

   cairo_set_source_surface(cr, surface, 0., 0.);
   cairo_surface_destroy(surface);

   cairo_paint(cr);
}

The problem is that the window is often captured with the print dialog.
This is most likely due to the fact that the window is captured when the draw_page signal is emitted. I. e. gdk_cairo_create creates a cairo_t * when the print button of the print dialog is pressed, and so the print dialog is also on the resulting paper. Is this correct? When the gdk_cairo_create function is inserted after output print, but before gtk_print_operation_new, it is the same. Thus, the window is supposed to be captured BEFORE even creating the Gtk print dialog, but why doesn't it make any difference? Moreover, the window is maximized, but the correct width and height of the window are only retrieved if gdk_drawable_get_size is called in the draw_page callback funtion draw_page. If it is called after output_win, gdk_drawable_get_size retrieves the width and height of the "shrinked" window. Why?
[...]

Questions:
- Are there any better ways to achieve what I want?
- Can I capture the window without showing it?
?
Regards,
Fabian



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]