#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);
dpi_x = pop->area->allocation.width/w;
dpi_y = pop->area->allocation.height/h;
-
+
if (fabs (dpi_x - pop->dpi_x) > 0.001 ||
fabs (dpi_y - pop->dpi_y) > 0.001)
{
}
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;
return TRUE;
}
-/* FIXME had to move this to the heap, since previewing
- * returns too early from the sync api
- */
-PrintData *print_data;
+static void
+print_done (GtkPrintOperation *op,
+ GtkPrintOperationResult res,
+ PrintData *print_data)
+{
+ GError *error = NULL;
+
+ if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
+ {
+
+ GtkWidget *error_dialog;
+
+ gtk_print_operation_get_error (op, &error);
+
+ error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "Error printing file:\n%s",
+ error ? error->message : "no details");
+ g_signal_connect (error_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
+ gtk_widget_show (error_dialog);
+ }
+ else if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
+ {
+ if (settings != NULL)
+ g_object_unref (settings);
+ settings = g_object_ref (gtk_print_operation_get_print_settings (op));
+ }
+
+ g_free (print_data->text);
+ g_free (print_data->font);
+ g_free (print_data);
+
+ if (!gtk_print_operation_is_finished (op))
+ {
+ g_object_ref (op);
+ active_prints = g_list_append (active_prints, op);
+ update_statusbar ();
+
+ /* This ref is unref:ed when we get the final state change */
+ g_signal_connect (op, "status_changed",
+ G_CALLBACK (status_changed_cb), NULL);
+ }
+}
+
+static void
+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 (GtkAction *action)
+do_print_or_preview (GtkAction *action, GtkPrintOperationAction print_action)
{
- GtkWidget *error_dialog;
GtkPrintOperation *print;
- GtkPrintOperationResult res;
- GError *error;
+ PrintData *print_data;
print_data = g_new0 (PrintData, 1);
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);
-
- error = NULL;
+ g_signal_connect (print, "preview", G_CALLBACK (preview_cb), print_data);
-#if 1
- res = gtk_print_operation_run (print, GTK_WINDOW (main_window), &error);
+ g_signal_connect (print, "done", G_CALLBACK (print_done), print_data);
- if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
- {
- error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- "Error printing file:\n%s",
- error ? error->message : "no details");
- g_signal_connect (error_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
- gtk_widget_show (error_dialog);
- g_error_free (error);
- }
- else if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
- {
- if (settings != NULL)
- g_object_unref (settings);
- settings = g_object_ref (gtk_print_operation_get_print_settings (print));
- }
+ gtk_print_operation_set_export_filename (print, "test.pdf");
- if (!gtk_print_operation_is_finished (print))
- {
- g_object_ref (print);
- active_prints = g_list_append (active_prints, print);
- update_statusbar ();
-
- /* This ref is unref:ed when we get the final state change */
- g_signal_connect (print, "status_changed",
- G_CALLBACK (status_changed_cb), NULL);
- }
-#else
- gtk_print_operation_run_async (print, GTK_WINDOW (main_window));
+#if 0
+ gtk_print_operation_set_allow_async (print, TRUE);
#endif
+ gtk_print_operation_run (print, print_action, GTK_WINDOW (main_window), NULL);
g_object_unref (print);
-#if 0
- g_free (print_data.text);
- g_free (print_data.font);
-#endif
+}
+
+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
"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;
}