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.
Furthermore, the window is sometimes "incomplete". The PDF/PS output 
shows just parts of the window - it seems that print_win is captured 
before it is completely rendered.

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

Regards,
Fabian
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to