wayland: Make window opacity work

Under wayland, the compositor doesn't have a 'overall window alpha'
knob, we just need to add the alpha to the buffers we send.
Client-side alpha, if you want to call it that.

Implement this by reusing the existing alpha support for non-toplevel
widgets. As a side-effect of the implementation, windows with RGBA
visual under X will now also use per-pixel alpha, instead of
overall alpha.
This commit is contained in:
Matthias Clasen 2014-10-28 10:28:23 -04:00
parent d58c750db5
commit 4cf6edda55
2 changed files with 8 additions and 3 deletions

View File

@ -7122,8 +7122,9 @@ _gtk_widget_draw (GtkWidget *widget,
cairo_save (cr); cairo_save (cr);
push_group = push_group =
(widget->priv->alpha != 255 && widget->priv->alpha != 255 &&
!gtk_widget_is_toplevel (widget)); (!gtk_widget_is_toplevel (widget) ||
gtk_widget_get_visual (widget) == gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)));
if (push_group) if (push_group)
cairo_push_group (cr); cairo_push_group (cr);
@ -15958,7 +15959,8 @@ gtk_widget_update_alpha (GtkWidget *widget)
if (gtk_widget_get_realized (widget)) if (gtk_widget_get_realized (widget))
{ {
if (gtk_widget_is_toplevel (widget)) if (gtk_widget_is_toplevel (widget) &&
gtk_widget_get_visual (widget) != gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)))
gdk_window_set_opacity (priv->window, priv->alpha / 255.0); gdk_window_set_opacity (priv->window, priv->alpha / 255.0);
gtk_widget_queue_draw (widget); gtk_widget_queue_draw (widget);

View File

@ -6761,6 +6761,9 @@ update_opaque_region (GtkWindow *window,
is_opaque = (color->alpha >= 1.0); is_opaque = (color->alpha >= 1.0);
} }
if (gtk_widget_get_opacity (widget) < 1.0)
is_opaque = FALSE;
if (is_opaque) if (is_opaque)
{ {
cairo_rectangle_int_t rect; cairo_rectangle_int_t rect;