static VALUE rg_region_intersect(VALUE self, VALUE region) { return BOXED2RVAL(gtk_widget_region_intersect(_SELF(self), (GdkRegion*)RVAL2BOXED(region, GDK_TYPE_REGION)), GDK_TYPE_REGION); }
/* * Strategy to painting a Widget: * 1.) do not paint if there is no GtkWidget set * 2.) We assume that GTK_NO_WINDOW is set and that geometryChanged positioned * the widget correctly. ATM we do not honor the GraphicsContext translation. */ void Widget::paint(GraphicsContext* context, const IntRect&) { if (!gtkWidget()) return; GtkWidget* widget = gtkWidget(); ASSERT(GTK_WIDGET_NO_WINDOW(widget)); GdkEvent* event = gdk_event_new(GDK_EXPOSE); event->expose = *context->gdkExposeEvent(); event->expose.region = gtk_widget_region_intersect(widget, event->expose.region); /* * This will be unref'ed by gdk_event_free. */ g_object_ref(event->expose.window); /* * If we are going to paint do the translation and GtkAllocation manipulation. */ if (!gdk_region_empty(event->expose.region)) { gdk_region_get_clipbox(event->expose.region, &event->expose.area); gtk_widget_send_expose(widget, event); } gdk_event_free(event); }
/* From gtkcontainer.c */ void _container_propagate_expose (GtkContainer *container, GtkWidget *child, GdkEventExpose *event) { GdkEvent *child_event; g_return_if_fail (GTK_IS_CONTAINER (container)); g_return_if_fail (GTK_IS_WIDGET (child)); g_return_if_fail (event != NULL); g_assert (child->parent == GTK_WIDGET (container)); if (GTK_WIDGET_DRAWABLE (child) && GTK_WIDGET_NO_WINDOW (child) && (child->window == event->window)&& AWN_IS_CAIRO_MENU_ITEM(child)) { child_event = gdk_event_new (GDK_EXPOSE); child_event->expose = *event; g_object_ref (child_event->expose.window); child_event->expose.region = gtk_widget_region_intersect (child, event->region); if (!gdk_region_empty (child_event->expose.region)) { gdk_region_get_clipbox (child_event->expose.region, &child_event->expose.area); gtk_widget_send_expose (child, child_event); } gdk_event_free (child_event); } }
static gint gtk_form_expose(GtkWidget *widget, GdkEventExpose *event) { GList *tmp_list; GtkForm *form; g_return_val_if_fail(GTK_IS_FORM(widget), FALSE); form = GTK_FORM(widget); if (event->window == form->bin_window) return FALSE; for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next) { #ifdef HAVE_GTK2 GtkFormChild *formchild = tmp_list->data; GtkWidget *child = formchild->widget; /* * The following chunk of code is taken from gtkcontainer.c. The * gtk1.x code synthesized expose events directly on the child widgets, * which can't be done in gtk2 */ if (GTK_WIDGET_DRAWABLE(child) && GTK_WIDGET_NO_WINDOW(child) && child->window == event->window) { GdkEventExpose child_event; child_event = *event; child_event.region = gtk_widget_region_intersect(child, event->region); if (!gdk_region_empty(child_event.region)) { gdk_region_get_clipbox(child_event.region, &child_event.area); gtk_widget_send_expose(child, (GdkEvent *)&child_event); } } #else /* !HAVE_GTK2 */ GtkFormChild *child = tmp_list->data; if (event->window == child->window) return gtk_widget_event(child->widget, (GdkEvent *) event); #endif /* !HAVE_GTK2 */ } return FALSE; }