#include <math.h>
#include <pango/pangocairo.h>
#include <gtk/gtk.h>
-#include <gtk/gtkprintoperation.h>
static GtkWidget *main_window;
static char *filename = NULL;
GtkWidget *vbox, *hbox, *font, *label;
gtk_print_operation_set_custom_tab_label (operation, "Other");
- vbox = gtk_vbox_new (FALSE, 0);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
- hbox = gtk_hbox_new (FALSE, 8);
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
{
GtkPrintOperation *op;
GtkPrintOperationPreview *preview;
+ GtkPrintContext *context;
GtkWidget *spin;
GtkWidget *area;
gint page;
} PreviewOp;
static gboolean
-preview_expose (GtkWidget *widget,
- GdkEventExpose *event,
- gpointer data)
+preview_draw (GtkWidget *widget,
+ cairo_t *cr,
+ gpointer data)
{
PreviewOp *pop = data;
+ cairo_t *prev_cr;
+ double dpi_x, dpi_y;
- gdk_window_clear (pop->area->window);
+ prev_cr = gtk_print_context_get_cairo_context (pop->context);
+ cairo_reference (prev_cr);
+ dpi_x = gtk_print_context_get_dpi_x (pop->context);
+ dpi_y = gtk_print_context_get_dpi_y (pop->context);
+
+ gtk_print_context_set_cairo_context (pop->context,
+ cr, dpi_x, dpi_y);
gtk_print_operation_preview_render_page (pop->preview,
pop->page - 1);
+ gtk_print_context_set_cairo_context (pop->context,
+ prev_cr, dpi_x, dpi_y);
+ cairo_destroy (prev_cr);
return TRUE;
}
gtk_spin_button_set_range (GTK_SPIN_BUTTON (pop->spin),
1.0, n_pages);
- g_signal_connect (pop->area, "expose_event",
- G_CALLBACK (preview_expose),
+ g_signal_connect (pop->area, "draw",
+ G_CALLBACK (preview_draw),
pop);
gtk_widget_queue_draw (pop->area);
gpointer data)
{
PreviewOp *pop = data;
+ GtkAllocation allocation;
GtkPaperSize *paper_size;
double w, h;
cairo_t *cr;
w = gtk_paper_size_get_width (paper_size, GTK_UNIT_INCH);
h = gtk_paper_size_get_height (paper_size, GTK_UNIT_INCH);
- cr = gdk_cairo_create (pop->area->window);
+ cr = gdk_cairo_create (gtk_widget_get_window (pop->area));
- dpi_x = pop->area->allocation.width/w;
- dpi_y = pop->area->allocation.height/h;
+ gtk_widget_get_allocation (pop->area, &allocation);
+ dpi_x = allocation.width/w;
+ dpi_y = allocation.height/h;
if (fabs (dpi_x - pop->dpi_x) > 0.001 ||
fabs (dpi_y - pop->dpi_y) > 0.001)
GtkWindow *parent,
gpointer data)
{
- GtkPrintSettings *settings;
GtkWidget *window, *close, *page, *hbox, *vbox, *da;
gdouble width, height;
cairo_t *cr;
pop = g_new0 (PreviewOp, 1);
pop->data = print_data;
- settings = gtk_print_operation_get_print_settings (op);
width = 200;
height = 300;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_transient_for (GTK_WINDOW (window),
GTK_WINDOW (main_window));
- vbox = gtk_vbox_new (FALSE, 0);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
- hbox = gtk_hbox_new (FALSE, 0);
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox,
FALSE, FALSE, 0);
page = gtk_spin_button_new_with_range (1, 100, 1);
gtk_widget_set_size_request (GTK_WIDGET (da), width, height);
gtk_box_pack_start (GTK_BOX (vbox), da, TRUE, TRUE, 0);
- gtk_widget_set_double_buffered (da, FALSE);
-
gtk_widget_realize (da);
-
- cr = gdk_cairo_create (da->window);
+ cr = gdk_cairo_create (gtk_widget_get_window (da));
/* TODO: What dpi to use here? This will be used for pagination.. */
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->context = context;
pop->spin = page;
pop->area = da;
pop->page = 1;
g_free (print_data->text);
g_free (print_data->font);
- g_list_free (print_data->page_breaks);
- g_object_unref (print_data->layout);
g_free (print_data);
if (!gtk_print_operation_is_finished (op))
}
}
+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_or_preview (GtkAction *action, GtkPrintOperationAction print_action)
{
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);
update_statusbar ();
}
-static void
-update_resize_grip (GtkWidget *widget,
- GdkEventWindowState *event,
- GtkStatusbar *statusbar)
-{
- if (event->changed_mask & (GDK_WINDOW_STATE_MAXIMIZED |
- GDK_WINDOW_STATE_FULLSCREEN))
- {
- gboolean maximized;
-
- maximized = event->new_window_state & (GDK_WINDOW_STATE_MAXIMIZED |
- GDK_WINDOW_STATE_FULLSCREEN);
- gtk_statusbar_set_has_resize_grip (statusbar, !maximized);
- }
-}
-
static void
create_window (void)
{
GtkWidget *bar;
- GtkWidget *table;
+ GtkWidget *box;
GtkWidget *contents;
GtkUIManager *ui;
GtkWidget *sw;
g_error_free (error);
}
- table = gtk_table_new (1, 3, FALSE);
- gtk_container_add (GTK_CONTAINER (main_window), table);
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add (GTK_CONTAINER (main_window), box);
bar = gtk_ui_manager_get_widget (ui, "/MenuBar");
gtk_widget_show (bar);
- gtk_table_attach (GTK_TABLE (table),
- bar,
- /* X direction */ /* Y direction */
- 0, 1, 0, 1,
- GTK_EXPAND | GTK_FILL, 0,
- 0, 0);
+ gtk_container_add (GTK_CONTAINER (box), bar);
/* Create document */
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
GTK_SHADOW_IN);
- gtk_table_attach (GTK_TABLE (table),
- sw,
- /* X direction */ /* Y direction */
- 0, 1, 1, 2,
- GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
- 0, 0);
+ gtk_widget_set_vexpand (sw, TRUE);
+ gtk_container_add (GTK_CONTAINER (box), sw);
contents = gtk_text_view_new ();
gtk_widget_grab_focus (contents);
/* Create statusbar */
statusbar = gtk_statusbar_new ();
- gtk_table_attach (GTK_TABLE (table),
- statusbar,
- /* X direction */ /* Y direction */
- 0, 1, 2, 3,
- GTK_EXPAND | GTK_FILL, 0,
- 0, 0);
+ gtk_container_add (GTK_CONTAINER (box), statusbar);
/* Show text widget info in the statusbar */
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents));
G_CALLBACK (mark_set_callback),
NULL,
0);
-
- g_signal_connect_object (main_window,
- "window_state_event",
- G_CALLBACK (update_resize_grip),
- statusbar,
- 0);
-
+
update_ui ();
gtk_widget_show_all (main_window);