diff options
| author | Matthias Clasen <mclasen@redhat.com> | 2014-10-28 14:28:23 (GMT) |
|---|---|---|
| committer | Matthias Clasen <mclasen@redhat.com> | 2014-10-28 14:28:23 (GMT) |
| commit | 4cf6edda55edb57228e9a1b545dd72c90c3d22af (patch) | |
| tree | 07eb4042ccb1df6728ce82c61883946ed4e1ac4b | |
| parent | d58c750db5085a6e7ffe3490acc938a0694743d4 (diff) | |
| download | gtk+-4cf6edda55edb57228e9a1b545dd72c90c3d22af.zip gtk+-4cf6edda55edb57228e9a1b545dd72c90c3d22af.tar.xz | |
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.
| -rw-r--r-- | gtk/gtkwidget.c | 8 | ||||
| -rw-r--r-- | gtk/gtkwindow.c | 3 |
2 files changed, 8 insertions, 3 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 9565439..f3e4958 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -7122,8 +7122,9 @@ _gtk_widget_draw (GtkWidget *widget, cairo_save (cr); push_group = - (widget->priv->alpha != 255 && - !gtk_widget_is_toplevel (widget)); + 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); @@ -15958,7 +15959,8 @@ gtk_widget_update_alpha (GtkWidget *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); gtk_widget_queue_draw (widget); diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 0b0365f..6bfe836 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -6761,6 +6761,9 @@ update_opaque_region (GtkWindow *window, is_opaque = (color->alpha >= 1.0); } + if (gtk_widget_get_opacity (widget) < 1.0) + is_opaque = FALSE; + if (is_opaque) { cairo_rectangle_int_t rect; |
