]> Pileus Git - ~andy/gtk/blobdiff - tests/print-editor.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / print-editor.c
index 3999acf065c32f776a5a98f4b3793a8dec4e6e8a..e8399ceb6dc2d028c039d00212a2b2439d896d41 100644 (file)
@@ -1,7 +1,6 @@
 #include <math.h>
 #include <pango/pangocairo.h>
 #include <gtk/gtk.h>
-#include <gtk/gtkprintoperation.h>
 
 static GtkWidget *main_window;
 static char *filename = NULL;
@@ -400,10 +399,10 @@ create_custom_widget (GtkPrintOperation *operation,
   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);
 
@@ -434,6 +433,7 @@ typedef struct
 {
   GtkPrintOperation *op;
   GtkPrintOperationPreview *preview;
+  GtkPrintContext   *context;
   GtkWidget         *spin;
   GtkWidget         *area;
   gint               page;
@@ -442,15 +442,26 @@ typedef struct
 } 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;
 }
@@ -468,8 +479,8 @@ preview_ready (GtkPrintOperationPreview *preview,
   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);
@@ -482,6 +493,7 @@ preview_got_page_size (GtkPrintOperationPreview *preview,
                       gpointer                  data)
 {
   PreviewOp *pop = data;
+  GtkAllocation allocation;
   GtkPaperSize *paper_size;
   double w, h;
   cairo_t *cr;
@@ -492,10 +504,11 @@ preview_got_page_size (GtkPrintOperationPreview *preview,
   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)
@@ -536,7 +549,6 @@ preview_cb (GtkPrintOperation        *op,
            GtkWindow                *parent,
            gpointer                  data)
 {
-  GtkPrintSettings *settings;
   GtkWidget *window, *close, *page, *hbox, *vbox, *da;
   gdouble width, height;
   cairo_t *cr;
@@ -546,16 +558,15 @@ preview_cb (GtkPrintOperation        *op,
   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);
@@ -568,18 +579,16 @@ preview_cb (GtkPrintOperation        *op,
   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;
@@ -634,8 +643,6 @@ print_done (GtkPrintOperation *op,
 
   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))
@@ -650,6 +657,15 @@ print_done (GtkPrintOperation *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)
 {
@@ -672,6 +688,7 @@ 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);
@@ -801,27 +818,11 @@ mark_set_callback (GtkTextBuffer     *buffer,
   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;
@@ -857,17 +858,12 @@ create_window (void)
       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);
@@ -879,12 +875,8 @@ create_window (void)
   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);
@@ -895,12 +887,7 @@ create_window (void)
   /* 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));
@@ -916,13 +903,7 @@ create_window (void)
                           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);