|
Packit Service |
0e769b |
#include <gtk/gtk.h>
|
|
Packit Service |
0e769b |
#include <cairo.h>
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
#include "gfio.h"
|
|
Packit Service |
0e769b |
#include "cairo_text_helpers.h"
|
|
Packit Service |
0e769b |
#include "printing.h"
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
static struct printing_parameters {
|
|
Packit Service |
0e769b |
gdouble width, height, xdpi, ydpi;
|
|
Packit Service |
0e769b |
GtkPrintSettings *settings;
|
|
Packit Service |
0e769b |
GtkPageSetup *page_setup;
|
|
Packit Service |
0e769b |
} print_params = { 0 };
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
static void begin_print(GtkPrintOperation *operation,
|
|
Packit Service |
0e769b |
GtkPrintContext *context, gpointer data)
|
|
Packit Service |
0e769b |
{
|
|
Packit Service |
0e769b |
print_params.page_setup = gtk_print_context_get_page_setup(context);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
print_params.width = gtk_print_context_get_width(context);
|
|
Packit Service |
0e769b |
print_params.height = gtk_print_context_get_height(context);
|
|
Packit Service |
0e769b |
print_params.xdpi = gtk_print_context_get_dpi_x(context);
|
|
Packit Service |
0e769b |
print_params.ydpi = gtk_print_context_get_dpi_y(context);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
/* assume 1 page for now. */
|
|
Packit Service |
0e769b |
gtk_print_operation_set_n_pages(operation, 1);
|
|
Packit Service |
0e769b |
}
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
static void results_draw_page(GtkPrintOperation *operation,
|
|
Packit Service |
0e769b |
GtkPrintContext *context, gint page_nr,
|
|
Packit Service |
0e769b |
gpointer data)
|
|
Packit Service |
0e769b |
{
|
|
Packit Service |
0e769b |
cairo_t *cr;
|
|
Packit Service |
0e769b |
char str[32];
|
|
Packit Service |
0e769b |
double x, y;
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
cr = gtk_print_context_get_cairo_context(context);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
cairo_set_source_rgb(cr, 0, 0, 0);
|
|
Packit Service |
0e769b |
cairo_set_line_width(cr, 5.0);
|
|
Packit Service |
0e769b |
cairo_move_to(cr, 0.0, 0.0);
|
|
Packit Service |
0e769b |
cairo_line_to(cr, print_params.width, print_params.height);
|
|
Packit Service |
0e769b |
cairo_move_to(cr, 0.0, print_params.height);
|
|
Packit Service |
0e769b |
cairo_line_to(cr, print_params.width, 0.0);
|
|
Packit Service |
0e769b |
cairo_stroke(cr);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
x = print_params.width / 4.0;
|
|
Packit Service |
0e769b |
y = print_params.height / 5.0;
|
|
Packit Service |
0e769b |
sprintf(str, "(%g,%g)", x, y);
|
|
Packit Service |
0e769b |
draw_right_justified_text(cr, "Sans", x, y, 12.0, str);
|
|
Packit Service |
0e769b |
cairo_set_source_rgb(cr, 0, 0, 0);
|
|
Packit Service |
0e769b |
cairo_set_line_width(cr, 2.0);
|
|
Packit Service |
0e769b |
cairo_move_to(cr, x, y - 30.0);
|
|
Packit Service |
0e769b |
cairo_line_to(cr, x, y + 30.0);
|
|
Packit Service |
0e769b |
cairo_move_to(cr, x - 30, y);
|
|
Packit Service |
0e769b |
cairo_line_to(cr, x + 30, y);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
y *= 4.0;
|
|
Packit Service |
0e769b |
x *= 2.0;
|
|
Packit Service |
0e769b |
sprintf(str, "(%g,%g)", x, y);
|
|
Packit Service |
0e769b |
draw_right_justified_text(cr, "Sans", x, y, 12.0, str);
|
|
Packit Service |
0e769b |
cairo_set_source_rgb(cr, 0, 0, 0);
|
|
Packit Service |
0e769b |
cairo_set_line_width(cr, 2.0);
|
|
Packit Service |
0e769b |
cairo_move_to(cr, x, y - 30.0);
|
|
Packit Service |
0e769b |
cairo_line_to(cr, x, y + 30.0);
|
|
Packit Service |
0e769b |
cairo_move_to(cr, x - 30, y);
|
|
Packit Service |
0e769b |
cairo_line_to(cr, x + 30, y);
|
|
Packit Service |
0e769b |
cairo_stroke(cr);
|
|
Packit Service |
0e769b |
}
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
static void printing_error_dialog(GtkWidget *window, GError *print_error)
|
|
Packit Service |
0e769b |
{
|
|
Packit Service |
0e769b |
GtkWidget *error_dialog;
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
printf("printing_error_dialog called\n");
|
|
Packit Service |
0e769b |
printf("error message = %s\n", print_error->message);
|
|
Packit Service |
0e769b |
error_dialog = gtk_message_dialog_new(GTK_WINDOW(window),
|
|
Packit Service |
0e769b |
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
|
|
Packit Service |
0e769b |
GTK_BUTTONS_CLOSE, "Print error:\n%s",
|
|
Packit Service |
0e769b |
print_error->message);
|
|
Packit Service |
0e769b |
g_signal_connect(error_dialog, "response",
|
|
Packit Service |
0e769b |
G_CALLBACK(gtk_widget_destroy), NULL);
|
|
Packit Service |
0e769b |
gtk_widget_show(error_dialog);
|
|
Packit Service |
0e769b |
}
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
static void results_print_done(GtkPrintOperation *operation,
|
|
Packit Service |
0e769b |
GtkPrintOperationResult result, gpointer data)
|
|
Packit Service |
0e769b |
{
|
|
Packit Service |
0e769b |
GError *print_error;
|
|
Packit Service |
0e769b |
struct gui_entry *ge = data;
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
if (result != GTK_PRINT_OPERATION_RESULT_ERROR)
|
|
Packit Service |
0e769b |
return;
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
gtk_print_operation_get_error(operation, &print_error);
|
|
Packit Service |
0e769b |
printing_error_dialog(ge->results_window, print_error);
|
|
Packit Service |
0e769b |
g_error_free(print_error);
|
|
Packit Service |
0e769b |
}
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
void gfio_print_results(struct gui_entry *ge)
|
|
Packit Service |
0e769b |
{
|
|
Packit Service |
0e769b |
GtkPrintOperation *print;
|
|
Packit Service |
0e769b |
GtkPrintOperationResult res;
|
|
Packit Service |
0e769b |
GError *print_error;
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
print = gtk_print_operation_new();
|
|
Packit Service |
0e769b |
if (print_params.settings != NULL)
|
|
Packit Service |
0e769b |
gtk_print_operation_set_print_settings(print, print_params.settings);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
if (print_params.page_setup != NULL)
|
|
Packit Service |
0e769b |
gtk_print_operation_set_default_page_setup(print, print_params.page_setup);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
g_signal_connect(print, "begin_print", G_CALLBACK(begin_print), NULL);
|
|
Packit Service |
0e769b |
g_signal_connect(print, "draw_page", G_CALLBACK(results_draw_page), NULL);
|
|
Packit Service |
0e769b |
g_signal_connect(print, "done", G_CALLBACK(results_print_done), NULL);
|
|
Packit Service |
0e769b |
gtk_print_operation_set_allow_async(print, TRUE);
|
|
Packit Service |
0e769b |
res = gtk_print_operation_run(print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
|
|
Packit Service |
0e769b |
GTK_WINDOW(ge->results_window), &print_error);
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
/*
|
|
Packit Service |
0e769b |
* Something's not quite right about the error handling. If I print
|
|
Packit Service |
0e769b |
* to a file, and the file exists, and I don't have write permission
|
|
Packit Service |
0e769b |
* on that file but attempt to replace it anyway, then it just kind of
|
|
Packit Service |
0e769b |
* hangs and I don't get into any of this error handling stuff at all,
|
|
Packit Service |
0e769b |
* neither here, nor in results_print_done().
|
|
Packit Service |
0e769b |
*/
|
|
Packit Service |
0e769b |
|
|
Packit Service |
0e769b |
if (res == GTK_PRINT_OPERATION_RESULT_ERROR) {
|
|
Packit Service |
0e769b |
printing_error_dialog(ge->results_window, print_error);
|
|
Packit Service |
0e769b |
g_error_free(print_error);
|
|
Packit Service |
0e769b |
} else {
|
|
Packit Service |
0e769b |
if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
|
|
Packit Service |
0e769b |
if (print_params.settings != NULL)
|
|
Packit Service |
0e769b |
g_object_unref(print_params.settings);
|
|
Packit Service |
0e769b |
print_params.settings = g_object_ref(gtk_print_operation_get_print_settings(print));
|
|
Packit Service |
0e769b |
}
|
|
Packit Service |
0e769b |
}
|
|
Packit Service |
0e769b |
g_object_unref(print);
|
|
Packit Service |
0e769b |
}
|