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