[gtk+] widget: Don't assume opacity is 100%
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] widget: Don't assume opacity is 100%
- Date: Sat, 6 Sep 2014 23:57:38 +0000 (UTC)
commit 9a8a4a8b1479d004d1fb65a9ac6714318129bdad
Author: Benjamin Otte <otte redhat com>
Date: Sat Sep 6 06:41:05 2014 +0200
widget: Don't assume opacity is 100%
... just because there is no style context instantiated yet. Instead,
instantiate a style context during realize() and ask it.
Fixes problems with dim labels not being dimmed on first show.
Testcase included.
https://bugzilla.gnome.org/show_bug.cgi?id=735240
gtk/gtkwidget.c | 21 +++++++++------------
testsuite/reftests/Makefile.am | 3 +++
testsuite/reftests/opacity-initial.css | 3 +++
testsuite/reftests/opacity-initial.ref.ui | 11 +++++++++++
testsuite/reftests/opacity-initial.ui | 29 +++++++++++++++++++++++++++++
5 files changed, 55 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 6f93a59..2593cbf 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -5527,9 +5527,7 @@ gtk_widget_realize (GtkWidget *widget)
_gtk_widget_enable_device_events (widget);
gtk_widget_update_devices_mask (widget, TRUE);
- if (gtk_widget_is_toplevel (widget))
- gdk_window_set_opacity (priv->window,
- priv->alpha / 255.0);
+ gtk_widget_update_alpha (widget);
if (priv->context)
gtk_style_context_set_scale (priv->context, gtk_widget_get_scale_factor (widget));
@@ -15913,6 +15911,7 @@ static void
gtk_widget_update_alpha (GtkWidget *widget)
{
GtkWidgetPrivate *priv;
+ GtkStyleContext *context;
gdouble opacity;
guint8 alpha;
@@ -15920,15 +15919,13 @@ gtk_widget_update_alpha (GtkWidget *widget)
alpha = priv->user_alpha;
- if (priv->context)
- {
- opacity =
- _gtk_css_number_value_get (_gtk_style_context_peek_property (priv->context,
- GTK_CSS_PROPERTY_OPACITY),
- 100);
- opacity = CLAMP (opacity, 0.0, 1.0);
- alpha = round (priv->user_alpha * opacity);
- }
+ context = gtk_widget_get_style_context (widget);
+ opacity =
+ _gtk_css_number_value_get (_gtk_style_context_peek_property (context,
+ GTK_CSS_PROPERTY_OPACITY),
+ 100);
+ opacity = CLAMP (opacity, 0.0, 1.0);
+ alpha = round (priv->user_alpha * opacity);
if (alpha == priv->alpha)
return;
diff --git a/testsuite/reftests/Makefile.am b/testsuite/reftests/Makefile.am
index 5f84f8c..0853a00 100644
--- a/testsuite/reftests/Makefile.am
+++ b/testsuite/reftests/Makefile.am
@@ -314,6 +314,9 @@ testdata = \
opacity.css \
opacity.ui \
opacity.ref.ui \
+ opacity-initial.css \
+ opacity-initial.ref.ui \
+ opacity-initial.ui \
overlay-no-main-widget.ref.ui \
overlay-no-main-widget.ui \
paned-undersized.css \
diff --git a/testsuite/reftests/opacity-initial.css b/testsuite/reftests/opacity-initial.css
new file mode 100644
index 0000000..611a8cd
--- /dev/null
+++ b/testsuite/reftests/opacity-initial.css
@@ -0,0 +1,3 @@
+GtkLabel {
+ opacity: 0;
+}
diff --git a/testsuite/reftests/opacity-initial.ref.ui b/testsuite/reftests/opacity-initial.ref.ui
new file mode 100644
index 0000000..1240351
--- /dev/null
+++ b/testsuite/reftests/opacity-initial.ref.ui
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <object class="GtkWindow" id="window1">
+ <property name="width_request">200</property>
+ <property name="height_request">100</property>
+ <property name="can_focus">False</property>
+ <property name="type">popup</property>
+ </object>
+</interface>
diff --git a/testsuite/reftests/opacity-initial.ui b/testsuite/reftests/opacity-initial.ui
new file mode 100644
index 0000000..9e02798
--- /dev/null
+++ b/testsuite/reftests/opacity-initial.ui
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <object class="GtkWindow" id="window1">
+ <property name="width_request">200</property>
+ <property name="height_request">100</property>
+ <property name="can_focus">False</property>
+ <property name="type">popup</property>
+ <child>
+ <object class="GtkOverlay" id="overlay1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child type="overlay">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">I'm the invisible label.
+Incredible how you can
+see right through me.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]