Blame tests/testoffscreenwindow.c

Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
da_expose (GtkWidget *widget,
Packit 98cdb6
           GdkEventExpose *event,
Packit 98cdb6
           gpointer user_data)
Packit 98cdb6
{
Packit 98cdb6
  GtkOffscreenWindow *offscreen = (GtkOffscreenWindow *)user_data;
Packit 98cdb6
  GdkPixmap *pixmap;
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
Packit 98cdb6
  if (gtk_widget_is_drawable (widget))
Packit 98cdb6
    {
Packit 98cdb6
      pixmap = gtk_offscreen_window_get_pixmap (offscreen);
Packit 98cdb6
Packit 98cdb6
      cr = gdk_cairo_create (widget->window);
Packit 98cdb6
      gdk_cairo_set_source_pixmap (cr, pixmap, 50, 50);
Packit 98cdb6
      cairo_paint (cr);
Packit 98cdb6
      cairo_destroy (cr);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
offscreen_damage (GtkWidget      *widget,
Packit 98cdb6
                  GdkEventExpose *event,
Packit 98cdb6
                  GtkWidget      *da)
Packit 98cdb6
{
Packit 98cdb6
  gtk_widget_queue_draw (da);
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
da_button_press (GtkWidget *area, GdkEventButton *event, GtkWidget *button)
Packit 98cdb6
{
Packit 98cdb6
  gtk_widget_set_size_request (button, 150, 60);
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
int
Packit 98cdb6
main (int argc, char **argv)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *window;
Packit 98cdb6
  GtkWidget *button;
Packit 98cdb6
  GtkWidget *offscreen;
Packit 98cdb6
  GtkWidget *da;
Packit 98cdb6
Packit 98cdb6
  gtk_init (&argc, &argv);
Packit 98cdb6
Packit 98cdb6
  offscreen = gtk_offscreen_window_new ();
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Test");
Packit 98cdb6
  gtk_widget_set_size_request (button, 50, 50);
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (offscreen), button);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  gtk_widget_show (offscreen);
Packit 98cdb6
Packit 98cdb6
  /* Queue exposures and ensure they are handled so
Packit 98cdb6
   * that the result is uptodate for the first
Packit 98cdb6
   * expose of the window. If you want to get further
Packit 98cdb6
   * changes, also track damage on the offscreen
Packit 98cdb6
   * as done above.
Packit 98cdb6
   */
Packit 98cdb6
  gtk_widget_queue_draw (offscreen);
Packit 98cdb6
Packit 98cdb6
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 98cdb6
  g_signal_connect (window, "delete-event",
Packit 98cdb6
                    G_CALLBACK (gtk_main_quit), window);
Packit 98cdb6
  da = gtk_drawing_area_new ();
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (window), da);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (da,
Packit 98cdb6
                    "expose-event",
Packit 98cdb6
                    G_CALLBACK (da_expose),
Packit 98cdb6
                    offscreen);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (offscreen,
Packit 98cdb6
                    "damage-event",
Packit 98cdb6
                    G_CALLBACK (offscreen_damage),
Packit 98cdb6
                    da);
Packit 98cdb6
Packit 98cdb6
  gtk_widget_add_events (da, GDK_BUTTON_PRESS_MASK);
Packit 98cdb6
  g_signal_connect (da, "button_press_event", G_CALLBACK (da_button_press),
Packit 98cdb6
                    button);
Packit 98cdb6
Packit 98cdb6
  gtk_widget_show_all (window);
Packit 98cdb6
Packit 98cdb6
  gtk_main();
Packit 98cdb6
Packit 98cdb6
  return 0;
Packit 98cdb6
}