1bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron#include <gtk/gtk.h>
2bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron#include <cairo.h>
3bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
4bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron#include "gfio.h"
5bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron#include "cairo_text_helpers.h"
6bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron#include "printing.h"
7bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
8bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
9bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameronstatic struct printing_parameters {
10bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	gdouble width, height, xdpi, ydpi;
11bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	GtkPrintSettings *settings;
12bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	GtkPageSetup *page_setup;
13bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron} print_params = { 0 };
14bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
15bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameronstatic void begin_print(GtkPrintOperation *operation,
16bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			GtkPrintContext *context, gpointer data)
17bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron{
18bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	print_params.page_setup = gtk_print_context_get_page_setup(context);
19bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
20bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	print_params.width = gtk_print_context_get_width(context);
21bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	print_params.height = gtk_print_context_get_height(context);
22bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	print_params.xdpi = gtk_print_context_get_dpi_x(context);
23bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	print_params.ydpi = gtk_print_context_get_dpi_y(context);
24bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
25bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	/* assume 1 page for now. */
26bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	gtk_print_operation_set_n_pages(operation, 1);
27bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron}
28bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
295570ec6a71be9adde6d5f7a6114ba7c9b4a0d680Jens Axboestatic void results_draw_page(GtkPrintOperation *operation,
305570ec6a71be9adde6d5f7a6114ba7c9b4a0d680Jens Axboe			      GtkPrintContext *context, gint page_nr,
315570ec6a71be9adde6d5f7a6114ba7c9b4a0d680Jens Axboe			      gpointer data)
32bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron{
33bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_t *cr;
34bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	char str[20];
35bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	double x, y;
36bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
37bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cr = gtk_print_context_get_cairo_context(context);
38bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
393c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe	cairo_set_source_rgb(cr, 0, 0, 0);
403c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe	cairo_set_line_width(cr, 5.0);
41bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_move_to(cr, 0.0, 0.0);
42bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_line_to(cr, print_params.width, print_params.height);
43bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_move_to(cr, 0.0, print_params.height);
44bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_line_to(cr, print_params.width, 0.0);
45bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_stroke(cr);
46bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
47bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	x = print_params.width / 4.0;
48bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	y = print_params.height / 5.0;
49bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	sprintf(str, "(%g,%g)", x, y);
50bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	draw_right_justified_text(cr, "Sans", x, y, 12.0, str);
513c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe	cairo_set_source_rgb(cr, 0, 0, 0);
523c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe	cairo_set_line_width(cr, 2.0);
53bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_move_to(cr, x, y - 30.0);
54bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_line_to(cr, x, y + 30.0);
55bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_move_to(cr, x - 30, y);
56bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_line_to(cr, x + 30, y);
57bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
58bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	y *= 4.0;
59bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	x *= 2.0;
60bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	sprintf(str, "(%g,%g)", x, y);
61bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	draw_right_justified_text(cr, "Sans", x, y, 12.0, str);
623c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe	cairo_set_source_rgb(cr, 0, 0, 0);
633c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe	cairo_set_line_width(cr, 2.0);
64bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_move_to(cr, x, y - 30.0);
65bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_line_to(cr, x, y + 30.0);
66bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_move_to(cr, x - 30, y);
67bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_line_to(cr, x + 30, y);
68bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	cairo_stroke(cr);
69bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron}
70bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
71bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameronstatic void printing_error_dialog(GtkWidget *window, GError *print_error)
72bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron{
73bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	GtkWidget *error_dialog;
74bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
75bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	printf("printing_error_dialog called\n");
76bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	printf("error message = %s\n", print_error->message);
77bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	error_dialog = gtk_message_dialog_new(GTK_WINDOW(window),
78bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
79bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			GTK_BUTTONS_CLOSE, "Print error:\n%s",
80bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			print_error->message);
815570ec6a71be9adde6d5f7a6114ba7c9b4a0d680Jens Axboe	g_signal_connect(error_dialog, "response",
82bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			G_CALLBACK(gtk_widget_destroy), NULL);
83bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	gtk_widget_show(error_dialog);
84bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron}
85bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
86bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameronstatic void results_print_done(GtkPrintOperation *operation,
87bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			GtkPrintOperationResult result, gpointer data)
88bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron{
89bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	GError *print_error;
90bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	struct gui_entry *ge = data;
91bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
92bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	if (result != GTK_PRINT_OPERATION_RESULT_ERROR)
93bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		return;
94bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
95bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	gtk_print_operation_get_error(operation, &print_error);
96bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	printing_error_dialog(ge->results_window, print_error);
97bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	g_error_free(print_error);
98bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron}
99bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
100bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameronvoid gfio_print_results(struct gui_entry *ge)
101bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron{
102bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	GtkPrintOperation *print;
103bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	GtkPrintOperationResult res;
104bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	GError *print_error;
105bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
106bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	print = gtk_print_operation_new();
107bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	if (print_params.settings != NULL)
108bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		gtk_print_operation_set_print_settings(print, print_params.settings);
109bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
110bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	if (print_params.page_setup != NULL)
111bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		gtk_print_operation_set_default_page_setup(print, print_params.page_setup);
112bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
113bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	g_signal_connect(print, "begin_print", G_CALLBACK(begin_print), NULL);
114bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	g_signal_connect(print, "draw_page", G_CALLBACK(results_draw_page), NULL);
115bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	g_signal_connect(print, "done", G_CALLBACK(results_print_done), NULL);
116bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	gtk_print_operation_set_allow_async(print, TRUE);
117bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	res = gtk_print_operation_run(print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
118bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		GTK_WINDOW(ge->results_window), &print_error);
119bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
120bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	/*
121bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	 * Something's not quite right about the error handling.  If I print
122bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	 * to a file, and the file exists, and I don't have write permission
123bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	 * on that file but attempt to replace it anyway, then it just kind of
124bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	 * hangs and I don't get into any of this error handling stuff at all,
125bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	 * neither here, nor in results_print_done().
126bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	 */
127bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron
128bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	if (res == GTK_PRINT_OPERATION_RESULT_ERROR) {
129bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		printing_error_dialog(ge->results_window, print_error);
130bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		g_error_free(print_error);
131bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	} else {
132bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
133bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			if (print_params.settings != NULL)
134bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron				g_object_unref(print_params.settings);
135bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron			print_params.settings = g_object_ref(gtk_print_operation_get_print_settings(print));
136bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron		}
137bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	}
138bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron	g_object_unref(print);
139bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron}
140