widget: Add forgotten push_group code
... and remove the also forgotten void function that lingered around with it. Fixes opacity=0 parts like inactive spinners or sort indicators in treeview headers being drawn since last commit. Oops.
This commit is contained in:
@ -6957,9 +6957,18 @@ gtk_widget_draw_internal (GtkWidget *widget,
|
|||||||
if (gdk_cairo_get_clip_rectangle (cr, NULL))
|
if (gdk_cairo_get_clip_rectangle (cr, NULL))
|
||||||
{
|
{
|
||||||
gboolean result;
|
gboolean result;
|
||||||
|
gboolean push_group;
|
||||||
|
|
||||||
//gdk_window_mark_paint_from_clip (window, cr);
|
//gdk_window_mark_paint_from_clip (window, cr);
|
||||||
|
|
||||||
|
push_group =
|
||||||
|
widget->priv->alpha != 255 &&
|
||||||
|
(!_gtk_widget_is_toplevel (widget) ||
|
||||||
|
gtk_widget_get_visual (widget) == gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)));
|
||||||
|
|
||||||
|
if (push_group)
|
||||||
|
cairo_push_group (cr);
|
||||||
|
|
||||||
if (g_signal_has_handler_pending (widget, widget_signals[DRAW], 0, FALSE))
|
if (g_signal_has_handler_pending (widget, widget_signals[DRAW], 0, FALSE))
|
||||||
{
|
{
|
||||||
g_signal_emit (widget, widget_signals[DRAW],
|
g_signal_emit (widget, widget_signals[DRAW],
|
||||||
@ -7009,6 +7018,13 @@ gtk_widget_draw_internal (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (push_group)
|
||||||
|
{
|
||||||
|
cairo_pop_group_to_source (cr);
|
||||||
|
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
|
||||||
|
cairo_paint_with_alpha (cr, widget->priv->alpha / 255.0);
|
||||||
|
}
|
||||||
|
|
||||||
if (cairo_status (cr) &&
|
if (cairo_status (cr) &&
|
||||||
gtk_cairo_get_event_window (cr))
|
gtk_cairo_get_event_window (cr))
|
||||||
{
|
{
|
||||||
@ -7024,49 +7040,6 @@ gtk_widget_draw_internal (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
_gtk_widget_draw (GtkWidget *widget,
|
|
||||||
cairo_t *cr)
|
|
||||||
{
|
|
||||||
gboolean push_group;
|
|
||||||
|
|
||||||
/* We get expose events only on native windows, so the draw
|
|
||||||
* implementation has to walk the entire widget hierarchy, except
|
|
||||||
* that it stops at native subwindows while we're in an expose
|
|
||||||
* event (_gtk_cairo_get_event () != NULL).
|
|
||||||
*
|
|
||||||
* However, we need to properly clip drawing into child windows
|
|
||||||
* to avoid drawing outside if widgets use e.g. cairo_paint(), so
|
|
||||||
* we traverse over GdkWindows as well as GtkWidgets.
|
|
||||||
*
|
|
||||||
* In order to be able to have opacity groups for entire widgets
|
|
||||||
* that consists of multiple windows we collect all the windows
|
|
||||||
* that belongs to a widget and draw them in one go. This means
|
|
||||||
* we may somewhat reorder GdkWindows when we paint them, but
|
|
||||||
* that’s not generally a problem, as if you want a guaranteed
|
|
||||||
* order you generally use a windowed widget where you control
|
|
||||||
* the window hierarchy.
|
|
||||||
*/
|
|
||||||
|
|
||||||
push_group =
|
|
||||||
widget->priv->alpha != 255 &&
|
|
||||||
(!_gtk_widget_is_toplevel (widget) ||
|
|
||||||
gtk_widget_get_visual (widget) == gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)));
|
|
||||||
|
|
||||||
if (push_group)
|
|
||||||
cairo_push_group (cr);
|
|
||||||
|
|
||||||
gtk_widget_draw_internal (widget, cr, TRUE);
|
|
||||||
|
|
||||||
if (push_group)
|
|
||||||
{
|
|
||||||
cairo_pop_group_to_source (cr);
|
|
||||||
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
|
|
||||||
cairo_paint_with_alpha (cr, widget->priv->alpha / 255.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gtk_widget_draw:
|
* gtk_widget_draw:
|
||||||
* @widget: the widget to draw. It must be drawable (see
|
* @widget: the widget to draw. It must be drawable (see
|
||||||
|
|||||||
Reference in New Issue
Block a user