diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index 59d4b334ab..fd281cf020 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -394,6 +394,7 @@ gdk_window_constrain_size gdk_window_beep gdk_window_get_scale_factor gdk_window_set_opaque_region +gdk_window_mark_paint_from_clip gdk_window_get_clip_region diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index f5c06100bb..71400708c0 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -2813,6 +2813,26 @@ gdk_window_begin_paint_region (GdkWindow *window, gdk_window_clear_backing_region (window); } +/** + * gdk_window_mark_paint_from_clip: + * @window: a #GdkWindow + * @cr: a #cairo_t + * + * If you call this during a paint (e.g. between gdk_window_begin_paint_region() + * and gdk_window_end_paint() then gdk will mark the current clip region of the + * window as being drawn. This is required when mixing GL rendering via + * gdk_cairo_draw_from_gl() and cairo rendering, as otherwise gdk has no way + * of knowing when something paints over the gl drawn regions. + * + * This is typically called automatically by Gtk and you don't need + * to care about this. + **/ +void +gdk_window_mark_paint_from_clip (GdkWindow *window, + cairo_t *cr) +{ +} + /** * gdk_window_end_paint: * @window: a #GdkWindow diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index 38a67b5afc..55c5898dc8 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -739,6 +739,9 @@ cairo_region_t *gdk_window_get_visible_region(GdkWindow *window); GDK_AVAILABLE_IN_ALL void gdk_window_begin_paint_rect (GdkWindow *window, const GdkRectangle *rectangle); +GDK_AVAILABLE_IN_3_14 +void gdk_window_mark_paint_from_clip (GdkWindow *window, + cairo_t *cr); GDK_AVAILABLE_IN_ALL void gdk_window_begin_paint_region (GdkWindow *window, const cairo_region_t *region); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index b2d3424910..0008519282 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -6948,6 +6948,8 @@ _gtk_widget_draw_internal (GtkWidget *widget, { gboolean result; + gdk_window_mark_paint_from_clip (window, cr); + g_signal_emit (widget, widget_signals[DRAW], 0, cr, &result);