[gtk+] wayland: Make window opacity work
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] wayland: Make window opacity work
- Date: Tue, 28 Oct 2014 14:36:07 +0000 (UTC)
commit 4cf6edda55edb57228e9a1b545dd72c90c3d22af
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Oct 28 10:28:23 2014 -0400
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.
gtk/gtkwidget.c | 8 +++++---
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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]