Re-fix opacity group handling

The last change fixed the windowed widget case but broke
opacity group handling for windowed child widgets. This fixes
up the code by making sure we norender_children in when there
is an opacity group.

This also cleans up the comments about how this works to something
that is hopefully more understandable.
This commit is contained in:
Alexander Larsson 2013-03-01 14:56:30 +01:00
parent 8ee578468d
commit c4539df2f2

View File

@ -14230,21 +14230,25 @@ gtk_widget_propagate_alpha (GtkWidget *widget)
parent = priv->parent;
norender =
/* If this widget has an opacity group and no window don't render it */
(priv->opacity_group && !gtk_widget_get_has_window (widget)) ||
/* If the parent has norender_children, propagate that here */
(parent != NULL && parent->priv->norender_children);
/* Norender affects only windowed widget and means don't render widget->window in the
normal fashion.
We only set this if the parent has norender_children, because:
a) For an opacity group (that does not have a norender_children parent) we still
need to render the window or we will never get an expose event.
b) For alpha we set the opacity of window->widget directly, so no other
work is needed.
*/
norender = (parent != NULL && parent->priv->norender_children);
/* Windowed widget children should norender if: */
/* windows under this widget should not render if:
a) This widget has an opacity group
b) This widget has alpha and is no-windowed (otherwise we'd set alpha on widget->window)
c) This widget has norender but is no-windowed (a windowed widget would "swallow" the norender)
*/
norender_children =
/* The widget is no_window (otherwise its enought to mark it norender/alpha), and */
!gtk_widget_get_has_window (widget) &&
( /* norender is set, or */
norender ||
/* widget has an alpha */
priv->alpha != 255
);
priv->opacity_group ||
(!gtk_widget_get_has_window (widget) &&
( norender || priv->alpha != 255));
if (gtk_widget_get_has_window (widget))
{