#include #include #include static gboolean expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data) { const char *object = data; printf ("Expose event on %s: (%d, %d) %dx%d\n", object, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; } int main (int argc, char **argv) { GtkWidget *window, *event; Window xwindow; int base, err; gtk_init (&argc, &argv); if (!XCompositeQueryExtension (GDK_DISPLAY (), &base, &err)) { fprintf (stderr, "testing composite without composite? hmm.."); return 1; } window = gtk_window_new (GTK_WINDOW_TOPLEVEL); event = gtk_event_box_new (); g_signal_connect (window, "expose-event", G_CALLBACK (expose_event), "parent"); g_signal_connect (event, "expose-event", G_CALLBACK (expose_event), "child"); gtk_container_add (GTK_CONTAINER (window), event); gtk_widget_show_all (window); xwindow = GDK_WINDOW_XWINDOW (event->window); XCompositeRedirectWindow (GDK_DISPLAY (), xwindow, CompositeRedirectManual); #ifdef I_LIKE_XLIB for (;;) { XEvent ev; XNextEvent (GDK_DISPLAY (), &ev); switch (ev.type) { case Expose: if (ev.xexpose.window == xwindow) printf ("expose on the child\n"); else printf ("expose on the parent\n"); break; default: printf ("non-expose event: %d\n", ev.type); } } #endif gtk_main (); return 0; }