summaryrefslogtreecommitdiff
path: root/tests/testoffscreenwindow.c
diff options
context:
space:
mode:
authorCody Russell <crussell@canonical.com>2009-12-18 13:43:11 +0100
committerCody Russell <bratsche@gnome.org>2009-12-28 09:33:41 -0600
commit8a523393acf46d8e31f5ab0f8bd9a44b2450c6e7 (patch)
treefe5b12804e9cf2320b91841d88a70592ae915f61 /tests/testoffscreenwindow.c
parent74b8191f5589f4f3373ab11e5e9ea0a6606dfe02 (diff)
downloadgtk+-8a523393acf46d8e31f5ab0f8bd9a44b2450c6e7.tar.gz
GtkOffscreenWindow implementation for #604901
Diffstat (limited to 'tests/testoffscreenwindow.c')
-rw-r--r--tests/testoffscreenwindow.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/tests/testoffscreenwindow.c b/tests/testoffscreenwindow.c
new file mode 100644
index 0000000000..a70e36b1ae
--- /dev/null
+++ b/tests/testoffscreenwindow.c
@@ -0,0 +1,92 @@
+#include <gtk/gtk.h>
+
+static gboolean
+da_expose (GtkWidget *widget,
+ GdkEventExpose *event,
+ gpointer user_data)
+{
+ GtkOffscreenWindow *offscreen = (GtkOffscreenWindow *)user_data;
+ GdkPixmap *pixmap;
+ cairo_t *cr;
+
+ if (GTK_WIDGET_DRAWABLE (widget))
+ {
+ pixmap = gdk_offscreen_window_get_pixmap (GTK_WIDGET (offscreen)->window);
+
+ cr = gdk_cairo_create (widget->window);
+ gdk_cairo_set_source_pixmap (cr, pixmap, 50, 50);
+ cairo_paint (cr);
+ cairo_destroy (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_draw (offscreen, NULL);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ da = gtk_drawing_area_new ();
+ gtk_container_add (GTK_CONTAINER (window), da);
+
+ g_signal_connect (da,
+ "expose-event",
+ G_CALLBACK (da_expose),
+ 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;
+}