1 #include <gtk/gtk.h>
2 
3 static gboolean
da_draw(GtkWidget * widget,cairo_t * cr,gpointer user_data)4 da_draw (GtkWidget *widget,
5          cairo_t   *cr,
6          gpointer   user_data)
7 {
8   GtkOffscreenWindow *offscreen = (GtkOffscreenWindow *)user_data;
9 
10   cairo_set_source_surface (cr,
11                             gtk_offscreen_window_get_surface (offscreen),
12                             50, 50);
13   cairo_paint (cr);
14 
15   return FALSE;
16 }
17 
18 static gboolean
offscreen_damage(GtkWidget * widget,GdkEventExpose * event,GtkWidget * da)19 offscreen_damage (GtkWidget      *widget,
20                   GdkEventExpose *event,
21                   GtkWidget      *da)
22 {
23   gtk_widget_queue_draw (da);
24 
25   return TRUE;
26 }
27 
28 static gboolean
da_button_press(GtkWidget * area,GdkEventButton * event,GtkWidget * button)29 da_button_press (GtkWidget *area, GdkEventButton *event, GtkWidget *button)
30 {
31   gtk_widget_set_size_request (button, 150, 60);
32   return TRUE;
33 }
34 
35 int
main(int argc,char ** argv)36 main (int argc, char **argv)
37 {
38   GtkWidget *window;
39   GtkWidget *button;
40   GtkWidget *offscreen;
41   GtkWidget *da;
42 
43   gtk_init (&argc, &argv);
44 
45   offscreen = gtk_offscreen_window_new ();
46 
47   button = gtk_button_new_with_label ("Test");
48   gtk_widget_set_size_request (button, 50, 50);
49   gtk_container_add (GTK_CONTAINER (offscreen), button);
50   gtk_widget_show (button);
51 
52   gtk_widget_show (offscreen);
53 
54   /* Queue exposures and ensure they are handled so
55    * that the result is uptodate for the first
56    * expose of the window. If you want to get further
57    * changes, also track damage on the offscreen
58    * as done above.
59    */
60   gtk_widget_queue_draw (offscreen);
61 
62   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
63   g_signal_connect (window, "delete-event",
64                     G_CALLBACK (gtk_main_quit), window);
65   da = gtk_drawing_area_new ();
66   gtk_container_add (GTK_CONTAINER (window), da);
67 
68   g_signal_connect (da,
69                     "draw",
70                     G_CALLBACK (da_draw),
71                     offscreen);
72 
73   g_signal_connect (offscreen,
74                     "damage-event",
75                     G_CALLBACK (offscreen_damage),
76                     da);
77 
78   gtk_widget_add_events (da, GDK_BUTTON_PRESS_MASK);
79   g_signal_connect (da, "button_press_event", G_CALLBACK (da_button_press),
80                     button);
81 
82   gtk_widget_show_all (window);
83 
84   gtk_main();
85 
86   return 0;
87 }
88