#include <math.h>
#include <pango/pangocairo.h>
#include <gtk/gtk.h>
-#include <gtk/gtkprintoperation.h>
static GtkWidget *main_window;
static char *filename = NULL;
}
while (i < end &&
pango_layout_iter_next_line (iter));
+
+ pango_layout_iter_free (iter);
}
static void
{
GtkPageSetup *new_page_setup;
- if (settings == NULL)
- settings = gtk_print_settings_new ();
-
new_page_setup = gtk_print_run_page_setup_dialog (GTK_WINDOW (main_window),
page_setup, settings);
}
static gboolean
-do_preview (GtkPrintOperation *op,
+preview_cb (GtkPrintOperation *op,
GtkPrintOperationPreview *preview,
GtkPrintContext *context,
GtkWindow *parent,
gtk_print_context_set_cairo_context (context, cr, 72, 72);
cairo_destroy (cr);
- pop->op = op;
+ pop->op = g_object_ref (op);
pop->preview = preview;
pop->spin = page;
pop->area = da;
GtkPrintOperationResult res,
PrintData *print_data)
{
- GError *error;
+ GError *error = NULL;
if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
{
GtkWidget *error_dialog;
- error = gtk_print_operation_get_error (op);
+ gtk_print_operation_get_error (op, &error);
error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
GTK_DIALOG_DESTROY_WITH_PARENT,
}
static void
-do_print (GtkAction *action)
+end_print (GtkPrintOperation *op, GtkPrintContext *context, PrintData *print_data)
+{
+ g_list_free (print_data->page_breaks);
+ print_data->page_breaks = NULL;
+ g_object_unref (print_data->layout);
+ print_data->layout = NULL;
+}
+
+static void
+do_print_or_preview (GtkAction *action, GtkPrintOperationAction print_action)
{
GtkPrintOperation *print;
PrintData *print_data;
gtk_print_operation_set_default_page_setup (print, page_setup);
g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), print_data);
+ g_signal_connect (print, "end-print", G_CALLBACK (end_print), print_data);
g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), print_data);
g_signal_connect (print, "create_custom_widget", G_CALLBACK (create_custom_widget), print_data);
g_signal_connect (print, "custom_widget_apply", G_CALLBACK (custom_widget_apply), print_data);
- g_signal_connect (print, "preview", G_CALLBACK (do_preview), print_data);
+ g_signal_connect (print, "preview", G_CALLBACK (preview_cb), print_data);
g_signal_connect (print, "done", G_CALLBACK (print_done), print_data);
- gtk_print_operation_set_pdf_target (print, "test.pdf");
+ gtk_print_operation_set_export_filename (print, "test.pdf");
#if 0
gtk_print_operation_set_allow_async (print, TRUE);
#endif
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, GTK_WINDOW (main_window), NULL);
+ gtk_print_operation_run (print, print_action, GTK_WINDOW (main_window), NULL);
g_object_unref (print);
}
+static void
+do_print (GtkAction *action)
+{
+ do_print_or_preview (action, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+}
+
+static void
+do_preview (GtkAction *action)
+{
+ do_print_or_preview (action, GTK_PRINT_OPERATION_ACTION_PREVIEW);
+}
+
static void
do_about (GtkAction *action)
{
"Page _Setup", NULL, /* label, accelerator */
"Set up the page", /* tooltip */
G_CALLBACK (do_page_setup) },
+ { "Preview", NULL, /* name, stock id */
+ "Print Preview", NULL, /* label, accelerator */
+ "Preview the printed document", /* tooltip */
+ G_CALLBACK (do_preview) },
{ "Print", GTK_STOCK_PRINT, /* name, stock id */
NULL, NULL, /* label, accelerator */
"Print the document", /* tooltip */
- G_CALLBACK (do_print) },
+ G_CALLBACK (do_print) }
};
static guint n_entries = G_N_ELEMENTS (entries);
" <menuitem action='Save'/>"
" <menuitem action='SaveAs'/>"
" <menuitem action='PageSetup'/>"
+" <menuitem action='Preview'/>"
" <menuitem action='Print'/>"
" <separator/>"
" <menuitem action='Quit'/>"
GtkWidget *sw;
GtkActionGroup *actions;
GError *error;
+ GtkWindowGroup *group;
main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ group = gtk_window_group_new ();
+ gtk_window_group_add_window (group, GTK_WINDOW (main_window));
+ g_object_unref (group);
+
gtk_window_set_default_size (GTK_WINDOW (main_window),
400, 600);
int
main (int argc, char **argv)
{
+ GError *error = NULL;
+
g_set_application_name ("Print editor");
gtk_init (&argc, &argv);
+ settings = gtk_print_settings_new_from_file ("print-settings.ini", &error);
+ if (error) {
+ g_print ("Failed to load print settings: %s\n", error->message);
+ g_clear_error (&error);
+
+ settings = gtk_print_settings_new ();
+ }
+ g_assert (settings != NULL);
+
+ page_setup = gtk_page_setup_new_from_file ("page-setup.ini", &error);
+ if (error) {
+ g_print ("Failed to load page setup: %s\n", error->message);
+ g_clear_error (&error);
+ }
+
create_window ();
if (argc == 2)
load_file (argv[1]);
gtk_main ();
+
+ if (!gtk_print_settings_to_file (settings, "print-settings.ini", &error)) {
+ g_print ("Failed to save print settings: %s\n", error->message);
+ g_clear_error (&error);
+ }
+ if (page_setup &&
+ !gtk_page_setup_to_file (page_setup, "page-setup.ini", &error)) {
+ g_print ("Failed to save page setup: %s\n", error->message);
+ g_clear_error (&error);
+ }
+
return 0;
}