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