Blame tests/testoffscreenwindow.c

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