[gtk3] Backport a few upstream fixes for checkboxes

Kalev Lember kalev at fedoraproject.org
Wed Aug 27 11:57:03 UTC 2014


commit 580fbf448af5fcd6ac9780b6d33a3dbde76cb148
Author: Kalev Lember <kalevlember at gmail.com>
Date:   Wed Aug 27 13:50:38 2014 +0200

    Backport a few upstream fixes for checkboxes

 0001-checkbutton-Fix-redraw-issues.patch           |   58 +++
 ...ton-Remove-unnecessary-queue_redraw-calls.patch |   49 ++
 ...Adwaita-update-the-last-cases-for-checked.patch |  459 ++++++++++++++++++++
 ...e-an-unchecked-state-for-radio-checks-in-.patch |  169 +++++++
 gtk3.spec                                          |   14 +-
 5 files changed, 748 insertions(+), 1 deletions(-)
---
diff --git a/0001-checkbutton-Fix-redraw-issues.patch b/0001-checkbutton-Fix-redraw-issues.patch
new file mode 100644
index 0000000..e494353
--- /dev/null
+++ b/0001-checkbutton-Fix-redraw-issues.patch
@@ -0,0 +1,58 @@
+From 442353fa9d78d6ada6991d4dcf8ba81c2dc52e0d Mon Sep 17 00:00:00 2001
+From: Benjamin Otte <otte at redhat.com>
+Date: Sun, 17 Aug 2014 06:24:41 +0200
+Subject: [PATCH] checkbutton: Fix redraw issues
+
+This is a hack to get around the optimizations done by the CSS engine.
+
+The CSS engine will notice that no CSS properties changed on the
+widget itself when going from one state to another and not queue
+a redraw.
+And the reason for no properties changing will be that only the
+checkmark itself changes, but that is hidden behind a
+gtk_style_context_save()/_restore() pair, so it won't be caught.
+---
+ gtk/gtkcheckbutton.c | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/gtk/gtkcheckbutton.c b/gtk/gtkcheckbutton.c
+index 47dc6bb..c9adcc0 100644
+--- a/gtk/gtkcheckbutton.c
++++ b/gtk/gtkcheckbutton.c
+@@ -87,6 +87,25 @@ static void gtk_real_check_button_draw_indicator (GtkCheckButton      *check_but
+ G_DEFINE_TYPE (GtkCheckButton, gtk_check_button, GTK_TYPE_TOGGLE_BUTTON)
+ 
+ static void
++gtk_check_button_state_flags_changed (GtkWidget     *widget,
++				      GtkStateFlags  previous_state_flags)
++{
++  /* FIXME
++   * This is a hack to get around the optimizations done by the CSS engine.
++   *
++   * The CSS engine will notice that no CSS properties changed on the
++   * widget itself when going from one state to another and not queue
++   * a redraw.
++   * And the reason for no properties changing will be that only the
++   * checkmark itself changes, but that is hidden behind a
++   * gtk_style_context_save()/_restore() pair, so it won't be caught.
++   */
++  gtk_widget_queue_draw (widget);
++
++  GTK_WIDGET_CLASS (gtk_check_button_parent_class)->state_flags_changed (widget, previous_state_flags);
++}
++
++static void
+ gtk_check_button_class_init (GtkCheckButtonClass *class)
+ {
+   GtkWidgetClass *widget_class;
+@@ -100,6 +119,7 @@ gtk_check_button_class_init (GtkCheckButtonClass *class)
+   widget_class->get_preferred_height_and_baseline_for_width = gtk_check_button_get_preferred_height_and_baseline_for_width;
+   widget_class->size_allocate = gtk_check_button_size_allocate;
+   widget_class->draw = gtk_check_button_draw;
++  widget_class->state_flags_changed = gtk_check_button_state_flags_changed;
+ 
+   class->draw_indicator = gtk_real_check_button_draw_indicator;
+ 
+-- 
+2.1.0
+
diff --git a/0002-button-Remove-unnecessary-queue_redraw-calls.patch b/0002-button-Remove-unnecessary-queue_redraw-calls.patch
new file mode 100644
index 0000000..0a2742a
--- /dev/null
+++ b/0002-button-Remove-unnecessary-queue_redraw-calls.patch
@@ -0,0 +1,49 @@
+From b520d3b7fb68ae905f545ea410fe3c600b91250c Mon Sep 17 00:00:00 2001
+From: Benjamin Otte <otte at redhat.com>
+Date: Sun, 17 Aug 2014 06:47:17 +0200
+Subject: [PATCH] button: Remove unnecessary queue_redraw() calls
+
+Setting a state automatically triggers redraws via the CSS machinery.
+---
+ gtk/gtkbutton.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
+index 63fb9cf..ebe4f15 100644
+--- a/gtk/gtkbutton.c
++++ b/gtk/gtkbutton.c
+@@ -1504,7 +1504,6 @@ gtk_button_set_relief (GtkButton      *button,
+         gtk_style_context_remove_class (context, GTK_STYLE_CLASS_FLAT);
+ 
+       g_object_notify_by_pspec (G_OBJECT (button), props[PROP_RELIEF]);
+-      gtk_widget_queue_draw (GTK_WIDGET (button));
+     }
+ }
+ 
+@@ -2034,7 +2033,6 @@ gtk_real_button_activate (GtkButton *button)
+       g_source_set_name_by_id (priv->activate_timeout, "[gtk+] button_activate_timeout");
+       priv->button_down = TRUE;
+       gtk_button_update_state (button);
+-      gtk_widget_queue_draw (GTK_WIDGET (button));
+     }
+ }
+ 
+@@ -2058,7 +2056,6 @@ gtk_button_finish_activate (GtkButton *button,
+   priv->button_down = FALSE;
+ 
+   gtk_button_update_state (button);
+-  gtk_widget_queue_draw (GTK_WIDGET (button));
+ 
+   if (do_it)
+     gtk_button_clicked (button);
+@@ -2446,7 +2443,6 @@ static void
+ gtk_button_enter_leave (GtkButton *button)
+ {
+   gtk_button_update_state (button);
+-  gtk_widget_queue_draw (GTK_WIDGET (button));
+ }
+ 
+ static void
+-- 
+2.1.0
+
diff --git a/0003-Adwaita-update-the-last-cases-for-checked.patch b/0003-Adwaita-update-the-last-cases-for-checked.patch
new file mode 100644
index 0000000..5a79b21
--- /dev/null
+++ b/0003-Adwaita-update-the-last-cases-for-checked.patch
@@ -0,0 +1,459 @@
+From 9c4af41a59f6bcfd8969e8f597e5e7ed0dec597b Mon Sep 17 00:00:00 2001
+From: Jakub Steiner <jimmac at gmail.com>
+Date: Mon, 18 Aug 2014 10:52:52 +0200
+Subject: [PATCH] Adwaita: update the last cases for :checked
+
+- treeviews can now have the same default checkboxes and radios
+- only menus are special (but needed :active -> :checked)
+
+https://bugzilla.gnome.org/show_bug.cgi?id=733967
+https://bugzilla.gnome.org/show_bug.cgi?id=734290
+---
+ gtk/resources/theme/Adwaita/_common.scss           |  58 +---------
+ gtk/resources/theme/Adwaita/gtk-contained-dark.css | 128 ++++-----------------
+ gtk/resources/theme/Adwaita/gtk-contained.css      | 128 ++++-----------------
+ 3 files changed, 46 insertions(+), 268 deletions(-)
+
+diff --git a/gtk/resources/theme/Adwaita/_common.scss b/gtk/resources/theme/Adwaita/_common.scss
+index a81c9eb..0397937 100644
+--- a/gtk/resources/theme/Adwaita/_common.scss
++++ b/gtk/resources/theme/Adwaita/_common.scss
+@@ -1658,12 +1658,12 @@ $asset_suffix: if($variant=='dark', '-dark', '');
+   }
+ 
+   //menu
+-  .menuitem.#{$w} {
++  .menu .menuitem.#{$w} {
+     color: transparentize($fg_color,0.9);
+     background-image: none;
+     -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
+     &:hover { color: transparentize($selected_fg_color,0.9); }
+-    &:active {
++    &:checked {
+       color: $fg_color;
+       &:hover {
+         -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
+@@ -1690,60 +1690,6 @@ $asset_suffix: if($variant=='dark', '-dark', '');
+       color: transparentize($backdrop_fg_color,0.9);
+     }
+   }
+-
+-  //treeview & selection mode icon view
+-  .view.#{$w} {
+-    // FIXME .cell.check/.radio doesn't needs to be blue in bright var
+-    color: transparentize($fg_color,0.9);
+-    background-image: none;
+-    -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
+-    &:hover { -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic'); }
+-    &:active {
+-    color: $fg_color;
+-      &:insensitive {
+-        color: $insensitive_fg_color;
+-        &:backdrop { color: $backdrop_insensitive_color; }
+-      }
+-      &:backdrop { color: $backdrop_fg_color; }
+-    }
+-    &:insensitive {
+-      color: transparentize($insensitive_fg_color,0.9);
+-      &:backdrop { color: transparent; }
+-    }
+-    &:inconsistent {
+-      -gtk-icon-source: -gtk-icontheme('#{$a}-mixed-symbolic');
+-    }
+-    &:selected, &:selected:focus {
+-      // -gtk-icon-source needed it gets overridden
+-      -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
+-      // :selected:focus not to get overridden by .view style
+-      color: transparentize($selected_fg_color,0.9);
+-      &:active {
+-        color: $selected_fg_color;
+-        &:backdrop {
+-          color: if($variant=='light',$backdrop_base_color,$backdrop_fg_color);
+-        }
+-      }
+-    }
+-    &:backdrop {
+-      // -gtk-icon-source needed it gets overridden
+-      -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
+-      color: transparentize($backdrop_fg_color,0.9);
+-      &:selected { color: transparentize($backdrop_base_color,0.9); }
+-    }
+-  }
+-
+-  //popover
+-  .popover .button.#{$w} {
+-    &:hover {
+-      color: transparentize($fg_color,0.9);
+-      &:active {
+-        color: $fg_color;
+-        &:selected { color: $selected_fg_color; }
+-        &:backdrop { color: $backdrop_fg_color; }
+-      }
+-    }
+-  }
+ }
+ 
+ GtkCheckButton.text-button, GtkRadioButton.text-button {
+diff --git a/gtk/resources/theme/Adwaita/gtk-contained-dark.css b/gtk/resources/theme/Adwaita/gtk-contained-dark.css
+index ef47844..df7581a 100644
+--- a/gtk/resources/theme/Adwaita/gtk-contained-dark.css
++++ b/gtk/resources/theme/Adwaita/gtk-contained-dark.css
+@@ -1781,76 +1781,34 @@ GtkSwitch {
+ .check:backdrop:checked:insensitive {
+   -gtk-icon-source: -gtk-scaled(url("assets/checkbox-checked-backdrop-insensitive-dark.png"), url("assets/checkbox-checked-backdrop-insensitive-dark at 2.png")); }
+ 
+-.menuitem.check {
++.menu .menuitem.check {
+   color: rgba(238, 238, 236, 0.1);
+   background-image: none;
+   -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
+-  .menuitem.check:hover {
++  .menu .menuitem.check:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menuitem.check:active {
++  .menu .menuitem.check:checked {
+     color: #eeeeec; }
+-    .menuitem.check:active:hover {
++    .menu .menuitem.check:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: white; }
+-    .menuitem.check:active:insensitive {
++    .menu .menuitem.check:checked:insensitive {
+       color: #939695;
+       background-image: none; }
+-      .menuitem.check:active:insensitive:backdrop {
++      .menu .menuitem.check:checked:insensitive:backdrop {
+         color: #5d6767; }
+-    .menuitem.check:active:backdrop {
++    .menu .menuitem.check:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: #c9cbc9; }
+-  .menuitem.check:insensitive {
++  .menu .menuitem.check:insensitive {
+     color: rgba(147, 150, 149, 0.1); }
+-    .menuitem.check:insensitive:backdrop {
++    .menu .menuitem.check:insensitive:backdrop {
+       color: transparent; }
+-  .menuitem.check:inconsistent {
++  .menu .menuitem.check:inconsistent {
+     -gtk-icon-source: -gtk-icontheme("checkbox-mixed-symbolic"); }
+-  .menuitem.check:backdrop, .menuitem.check:backdrop:hover {
++  .menu .menuitem.check:backdrop, .menu .menuitem.check:backdrop:hover {
+     color: rgba(201, 203, 201, 0.1); }
+ 
+-.view.check {
+-  color: rgba(238, 238, 236, 0.1);
+-  background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
+-  .view.check:hover {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
+-  .view.check:active {
+-    color: #eeeeec; }
+-    .view.check:active:insensitive {
+-      color: #939695; }
+-      .view.check:active:insensitive:backdrop {
+-        color: #5d6767; }
+-    .view.check:active:backdrop {
+-      color: #c9cbc9; }
+-  .view.check:insensitive {
+-    color: rgba(147, 150, 149, 0.1); }
+-    .view.check:insensitive:backdrop {
+-      color: transparent; }
+-  .view.check:inconsistent {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-mixed-symbolic"); }
+-  .view.check:selected, .view.check:selected:focus {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+-    color: rgba(255, 255, 255, 0.1); }
+-    .view.check:selected:active, .view.check:selected:focus:active {
+-      color: white; }
+-      .view.check:selected:active:backdrop, .view.check:selected:focus:active:backdrop {
+-        color: #c9cbc9; }
+-  .view.check:backdrop {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+-    color: rgba(201, 203, 201, 0.1); }
+-    .view.check:backdrop:selected {
+-      color: rgba(44, 44, 44, 0.1); }
+-
+-.popover .button.check:hover {
+-  color: rgba(238, 238, 236, 0.1); }
+-  .popover .button.check:hover:active {
+-    color: #eeeeec; }
+-    .popover .button.check:hover:active:selected {
+-      color: white; }
+-    .popover .button.check:hover:active:backdrop {
+-      color: #c9cbc9; }
+-
+ .radio {
+   -gtk-icon-source: -gtk-scaled(url("assets/radio-unchecked-dark.png"), url("assets/radio-unchecked-dark at 2.png")); }
+ 
+@@ -1905,76 +1863,34 @@ GtkSwitch {
+ .radio:backdrop:checked:insensitive {
+   -gtk-icon-source: -gtk-scaled(url("assets/radio-checked-backdrop-insensitive-dark.png"), url("assets/radio-checked-backdrop-insensitive-dark at 2.png")); }
+ 
+-.menuitem.radio {
++.menu .menuitem.radio {
+   color: rgba(238, 238, 236, 0.1);
+   background-image: none;
+   -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
+-  .menuitem.radio:hover {
++  .menu .menuitem.radio:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menuitem.radio:active {
++  .menu .menuitem.radio:checked {
+     color: #eeeeec; }
+-    .menuitem.radio:active:hover {
++    .menu .menuitem.radio:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: white; }
+-    .menuitem.radio:active:insensitive {
++    .menu .menuitem.radio:checked:insensitive {
+       color: #939695;
+       background-image: none; }
+-      .menuitem.radio:active:insensitive:backdrop {
++      .menu .menuitem.radio:checked:insensitive:backdrop {
+         color: #5d6767; }
+-    .menuitem.radio:active:backdrop {
++    .menu .menuitem.radio:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: #c9cbc9; }
+-  .menuitem.radio:insensitive {
++  .menu .menuitem.radio:insensitive {
+     color: rgba(147, 150, 149, 0.1); }
+-    .menuitem.radio:insensitive:backdrop {
++    .menu .menuitem.radio:insensitive:backdrop {
+       color: transparent; }
+-  .menuitem.radio:inconsistent {
++  .menu .menuitem.radio:inconsistent {
+     -gtk-icon-source: -gtk-icontheme("radio-mixed-symbolic"); }
+-  .menuitem.radio:backdrop, .menuitem.radio:backdrop:hover {
++  .menu .menuitem.radio:backdrop, .menu .menuitem.radio:backdrop:hover {
+     color: rgba(201, 203, 201, 0.1); }
+ 
+-.view.radio {
+-  color: rgba(238, 238, 236, 0.1);
+-  background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
+-  .view.radio:hover {
+-    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
+-  .view.radio:active {
+-    color: #eeeeec; }
+-    .view.radio:active:insensitive {
+-      color: #939695; }
+-      .view.radio:active:insensitive:backdrop {
+-        color: #5d6767; }
+-    .view.radio:active:backdrop {
+-      color: #c9cbc9; }
+-  .view.radio:insensitive {
+-    color: rgba(147, 150, 149, 0.1); }
+-    .view.radio:insensitive:backdrop {
+-      color: transparent; }
+-  .view.radio:inconsistent {
+-    -gtk-icon-source: -gtk-icontheme("radio-mixed-symbolic"); }
+-  .view.radio:selected, .view.radio:selected:focus {
+-    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+-    color: rgba(255, 255, 255, 0.1); }
+-    .view.radio:selected:active, .view.radio:selected:focus:active {
+-      color: white; }
+-      .view.radio:selected:active:backdrop, .view.radio:selected:focus:active:backdrop {
+-        color: #c9cbc9; }
+-  .view.radio:backdrop {
+-    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+-    color: rgba(201, 203, 201, 0.1); }
+-    .view.radio:backdrop:selected {
+-      color: rgba(44, 44, 44, 0.1); }
+-
+-.popover .button.radio:hover {
+-  color: rgba(238, 238, 236, 0.1); }
+-  .popover .button.radio:hover:active {
+-    color: #eeeeec; }
+-    .popover .button.radio:hover:active:selected {
+-      color: white; }
+-    .popover .button.radio:hover:active:backdrop {
+-      color: #c9cbc9; }
+-
+ GtkCheckButton.text-button, GtkRadioButton.text-button {
+   padding: 1px 2px 4px;
+   outline-offset: 0; }
+diff --git a/gtk/resources/theme/Adwaita/gtk-contained.css b/gtk/resources/theme/Adwaita/gtk-contained.css
+index 0f244ab..585c1aa 100644
+--- a/gtk/resources/theme/Adwaita/gtk-contained.css
++++ b/gtk/resources/theme/Adwaita/gtk-contained.css
+@@ -1776,76 +1776,34 @@ GtkSwitch {
+ .check:backdrop:checked:insensitive {
+   -gtk-icon-source: -gtk-scaled(url("assets/checkbox-checked-backdrop-insensitive.png"), url("assets/checkbox-checked-backdrop-insensitive at 2.png")); }
+ 
+-.menuitem.check {
++.menu .menuitem.check {
+   color: rgba(46, 52, 54, 0.1);
+   background-image: none;
+   -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
+-  .menuitem.check:hover {
++  .menu .menuitem.check:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menuitem.check:active {
++  .menu .menuitem.check:checked {
+     color: #2e3436; }
+-    .menuitem.check:active:hover {
++    .menu .menuitem.check:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: white; }
+-    .menuitem.check:active:insensitive {
++    .menu .menuitem.check:checked:insensitive {
+       color: #8d9091;
+       background-image: none; }
+-      .menuitem.check:active:insensitive:backdrop {
++      .menu .menuitem.check:checked:insensitive:backdrop {
+         color: #c7c7c7; }
+-    .menuitem.check:active:backdrop {
++    .menu .menuitem.check:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: #54595a; }
+-  .menuitem.check:insensitive {
++  .menu .menuitem.check:insensitive {
+     color: rgba(141, 144, 145, 0.1); }
+-    .menuitem.check:insensitive:backdrop {
++    .menu .menuitem.check:insensitive:backdrop {
+       color: transparent; }
+-  .menuitem.check:inconsistent {
++  .menu .menuitem.check:inconsistent {
+     -gtk-icon-source: -gtk-icontheme("checkbox-mixed-symbolic"); }
+-  .menuitem.check:backdrop, .menuitem.check:backdrop:hover {
++  .menu .menuitem.check:backdrop, .menu .menuitem.check:backdrop:hover {
+     color: rgba(84, 89, 90, 0.1); }
+ 
+-.view.check {
+-  color: rgba(46, 52, 54, 0.1);
+-  background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
+-  .view.check:hover {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
+-  .view.check:active {
+-    color: #2e3436; }
+-    .view.check:active:insensitive {
+-      color: #8d9091; }
+-      .view.check:active:insensitive:backdrop {
+-        color: #c7c7c7; }
+-    .view.check:active:backdrop {
+-      color: #54595a; }
+-  .view.check:insensitive {
+-    color: rgba(141, 144, 145, 0.1); }
+-    .view.check:insensitive:backdrop {
+-      color: transparent; }
+-  .view.check:inconsistent {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-mixed-symbolic"); }
+-  .view.check:selected, .view.check:selected:focus {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+-    color: rgba(255, 255, 255, 0.1); }
+-    .view.check:selected:active, .view.check:selected:focus:active {
+-      color: white; }
+-      .view.check:selected:active:backdrop, .view.check:selected:focus:active:backdrop {
+-        color: #fcfcfc; }
+-  .view.check:backdrop {
+-    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+-    color: rgba(84, 89, 90, 0.1); }
+-    .view.check:backdrop:selected {
+-      color: rgba(252, 252, 252, 0.1); }
+-
+-.popover .button.check:hover {
+-  color: rgba(46, 52, 54, 0.1); }
+-  .popover .button.check:hover:active {
+-    color: #2e3436; }
+-    .popover .button.check:hover:active:selected {
+-      color: white; }
+-    .popover .button.check:hover:active:backdrop {
+-      color: #54595a; }
+-
+ .radio {
+   -gtk-icon-source: -gtk-scaled(url("assets/radio-unchecked.png"), url("assets/radio-unchecked at 2.png")); }
+ 
+@@ -1900,76 +1858,34 @@ GtkSwitch {
+ .radio:backdrop:checked:insensitive {
+   -gtk-icon-source: -gtk-scaled(url("assets/radio-checked-backdrop-insensitive.png"), url("assets/radio-checked-backdrop-insensitive at 2.png")); }
+ 
+-.menuitem.radio {
++.menu .menuitem.radio {
+   color: rgba(46, 52, 54, 0.1);
+   background-image: none;
+   -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
+-  .menuitem.radio:hover {
++  .menu .menuitem.radio:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menuitem.radio:active {
++  .menu .menuitem.radio:checked {
+     color: #2e3436; }
+-    .menuitem.radio:active:hover {
++    .menu .menuitem.radio:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: white; }
+-    .menuitem.radio:active:insensitive {
++    .menu .menuitem.radio:checked:insensitive {
+       color: #8d9091;
+       background-image: none; }
+-      .menuitem.radio:active:insensitive:backdrop {
++      .menu .menuitem.radio:checked:insensitive:backdrop {
+         color: #c7c7c7; }
+-    .menuitem.radio:active:backdrop {
++    .menu .menuitem.radio:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: #54595a; }
+-  .menuitem.radio:insensitive {
++  .menu .menuitem.radio:insensitive {
+     color: rgba(141, 144, 145, 0.1); }
+-    .menuitem.radio:insensitive:backdrop {
++    .menu .menuitem.radio:insensitive:backdrop {
+       color: transparent; }
+-  .menuitem.radio:inconsistent {
++  .menu .menuitem.radio:inconsistent {
+     -gtk-icon-source: -gtk-icontheme("radio-mixed-symbolic"); }
+-  .menuitem.radio:backdrop, .menuitem.radio:backdrop:hover {
++  .menu .menuitem.radio:backdrop, .menu .menuitem.radio:backdrop:hover {
+     color: rgba(84, 89, 90, 0.1); }
+ 
+-.view.radio {
+-  color: rgba(46, 52, 54, 0.1);
+-  background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
+-  .view.radio:hover {
+-    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
+-  .view.radio:active {
+-    color: #2e3436; }
+-    .view.radio:active:insensitive {
+-      color: #8d9091; }
+-      .view.radio:active:insensitive:backdrop {
+-        color: #c7c7c7; }
+-    .view.radio:active:backdrop {
+-      color: #54595a; }
+-  .view.radio:insensitive {
+-    color: rgba(141, 144, 145, 0.1); }
+-    .view.radio:insensitive:backdrop {
+-      color: transparent; }
+-  .view.radio:inconsistent {
+-    -gtk-icon-source: -gtk-icontheme("radio-mixed-symbolic"); }
+-  .view.radio:selected, .view.radio:selected:focus {
+-    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+-    color: rgba(255, 255, 255, 0.1); }
+-    .view.radio:selected:active, .view.radio:selected:focus:active {
+-      color: white; }
+-      .view.radio:selected:active:backdrop, .view.radio:selected:focus:active:backdrop {
+-        color: #fcfcfc; }
+-  .view.radio:backdrop {
+-    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+-    color: rgba(84, 89, 90, 0.1); }
+-    .view.radio:backdrop:selected {
+-      color: rgba(252, 252, 252, 0.1); }
+-
+-.popover .button.radio:hover {
+-  color: rgba(46, 52, 54, 0.1); }
+-  .popover .button.radio:hover:active {
+-    color: #2e3436; }
+-    .popover .button.radio:hover:active:selected {
+-      color: white; }
+-    .popover .button.radio:hover:active:backdrop {
+-      color: #54595a; }
+-
+ GtkCheckButton.text-button, GtkRadioButton.text-button {
+   padding: 1px 2px 4px;
+   outline-offset: 0; }
+-- 
+2.1.0
+
diff --git a/0004-Adwaita-have-an-unchecked-state-for-radio-checks-in-.patch b/0004-Adwaita-have-an-unchecked-state-for-radio-checks-in-.patch
new file mode 100644
index 0000000..0f08580
--- /dev/null
+++ b/0004-Adwaita-have-an-unchecked-state-for-radio-checks-in-.patch
@@ -0,0 +1,169 @@
+From aec4829d74aa2bc79b9271d84c4a4d71f6965f9f Mon Sep 17 00:00:00 2001
+From: Jakub Steiner <jimmac at gmail.com>
+Date: Mon, 18 Aug 2014 14:18:53 +0200
+Subject: [PATCH] Adwaita: have an unchecked state for radio/checks in menus
+
+more background in https://bugzilla.gnome.org/show_bug.cgi?id=734290
+---
+ gtk/resources/theme/Adwaita/_common.scss           |  9 ++++---
+ gtk/resources/theme/Adwaita/gtk-contained-dark.css | 30 ++++++++++++----------
+ gtk/resources/theme/Adwaita/gtk-contained.css      | 30 ++++++++++++----------
+ 3 files changed, 37 insertions(+), 32 deletions(-)
+
+diff --git a/gtk/resources/theme/Adwaita/_common.scss b/gtk/resources/theme/Adwaita/_common.scss
+index 0397937..3077b47 100644
+--- a/gtk/resources/theme/Adwaita/_common.scss
++++ b/gtk/resources/theme/Adwaita/_common.scss
+@@ -1661,12 +1661,13 @@ $asset_suffix: if($variant=='dark', '-dark', '');
+   .menu .menuitem.#{$w} {
+     color: transparentize($fg_color,0.9);
+     background-image: none;
+-    -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
++    -gtk-icon-source: -gtk-icontheme('#{$a}-symbolic');
+     &:hover { color: transparentize($selected_fg_color,0.9); }
+-    &:checked {
++    &:active, &:checked {
+       color: $fg_color;
++      -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
+       &:hover {
+-        -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
++        -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic'); //specificity workaround
+         color: $selected_fg_color;
+       }
+       &:insensitive {
+@@ -1675,7 +1676,7 @@ $asset_suffix: if($variant=='dark', '-dark', '');
+         &:backdrop { color: $backdrop_insensitive_color; };
+       }
+       &:backdrop {
+-        -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic');
++        -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic'); //specificity workaround
+         color: $backdrop_fg_color;
+       }
+     }
+diff --git a/gtk/resources/theme/Adwaita/gtk-contained-dark.css b/gtk/resources/theme/Adwaita/gtk-contained-dark.css
+index df7581a..1b0b9fd 100644
+--- a/gtk/resources/theme/Adwaita/gtk-contained-dark.css
++++ b/gtk/resources/theme/Adwaita/gtk-contained-dark.css
+@@ -1784,20 +1784,21 @@ GtkSwitch {
+ .menu .menuitem.check {
+   color: rgba(238, 238, 236, 0.1);
+   background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
++  -gtk-icon-source: -gtk-icontheme("checkbox-symbolic"); }
+   .menu .menuitem.check:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menu .menuitem.check:checked {
+-    color: #eeeeec; }
+-    .menu .menuitem.check:checked:hover {
++  .menu .menuitem.check:active, .menu .menuitem.check:checked {
++    color: #eeeeec;
++    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
++    .menu .menuitem.check:active:hover, .menu .menuitem.check:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: white; }
+-    .menu .menuitem.check:checked:insensitive {
++    .menu .menuitem.check:active:insensitive, .menu .menuitem.check:checked:insensitive {
+       color: #939695;
+       background-image: none; }
+-      .menu .menuitem.check:checked:insensitive:backdrop {
++      .menu .menuitem.check:active:insensitive:backdrop, .menu .menuitem.check:checked:insensitive:backdrop {
+         color: #5d6767; }
+-    .menu .menuitem.check:checked:backdrop {
++    .menu .menuitem.check:active:backdrop, .menu .menuitem.check:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: #c9cbc9; }
+   .menu .menuitem.check:insensitive {
+@@ -1866,20 +1867,21 @@ GtkSwitch {
+ .menu .menuitem.radio {
+   color: rgba(238, 238, 236, 0.1);
+   background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
++  -gtk-icon-source: -gtk-icontheme("radio-symbolic"); }
+   .menu .menuitem.radio:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menu .menuitem.radio:checked {
+-    color: #eeeeec; }
+-    .menu .menuitem.radio:checked:hover {
++  .menu .menuitem.radio:active, .menu .menuitem.radio:checked {
++    color: #eeeeec;
++    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
++    .menu .menuitem.radio:active:hover, .menu .menuitem.radio:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: white; }
+-    .menu .menuitem.radio:checked:insensitive {
++    .menu .menuitem.radio:active:insensitive, .menu .menuitem.radio:checked:insensitive {
+       color: #939695;
+       background-image: none; }
+-      .menu .menuitem.radio:checked:insensitive:backdrop {
++      .menu .menuitem.radio:active:insensitive:backdrop, .menu .menuitem.radio:checked:insensitive:backdrop {
+         color: #5d6767; }
+-    .menu .menuitem.radio:checked:backdrop {
++    .menu .menuitem.radio:active:backdrop, .menu .menuitem.radio:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: #c9cbc9; }
+   .menu .menuitem.radio:insensitive {
+diff --git a/gtk/resources/theme/Adwaita/gtk-contained.css b/gtk/resources/theme/Adwaita/gtk-contained.css
+index 585c1aa..023363e 100644
+--- a/gtk/resources/theme/Adwaita/gtk-contained.css
++++ b/gtk/resources/theme/Adwaita/gtk-contained.css
+@@ -1779,20 +1779,21 @@ GtkSwitch {
+ .menu .menuitem.check {
+   color: rgba(46, 52, 54, 0.1);
+   background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
++  -gtk-icon-source: -gtk-icontheme("checkbox-symbolic"); }
+   .menu .menuitem.check:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menu .menuitem.check:checked {
+-    color: #2e3436; }
+-    .menu .menuitem.check:checked:hover {
++  .menu .menuitem.check:active, .menu .menuitem.check:checked {
++    color: #2e3436;
++    -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic"); }
++    .menu .menuitem.check:active:hover, .menu .menuitem.check:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: white; }
+-    .menu .menuitem.check:checked:insensitive {
++    .menu .menuitem.check:active:insensitive, .menu .menuitem.check:checked:insensitive {
+       color: #8d9091;
+       background-image: none; }
+-      .menu .menuitem.check:checked:insensitive:backdrop {
++      .menu .menuitem.check:active:insensitive:backdrop, .menu .menuitem.check:checked:insensitive:backdrop {
+         color: #c7c7c7; }
+-    .menu .menuitem.check:checked:backdrop {
++    .menu .menuitem.check:active:backdrop, .menu .menuitem.check:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("checkbox-checked-symbolic");
+       color: #54595a; }
+   .menu .menuitem.check:insensitive {
+@@ -1861,20 +1862,21 @@ GtkSwitch {
+ .menu .menuitem.radio {
+   color: rgba(46, 52, 54, 0.1);
+   background-image: none;
+-  -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
++  -gtk-icon-source: -gtk-icontheme("radio-symbolic"); }
+   .menu .menuitem.radio:hover {
+     color: rgba(255, 255, 255, 0.1); }
+-  .menu .menuitem.radio:checked {
+-    color: #2e3436; }
+-    .menu .menuitem.radio:checked:hover {
++  .menu .menuitem.radio:active, .menu .menuitem.radio:checked {
++    color: #2e3436;
++    -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic"); }
++    .menu .menuitem.radio:active:hover, .menu .menuitem.radio:checked:hover {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: white; }
+-    .menu .menuitem.radio:checked:insensitive {
++    .menu .menuitem.radio:active:insensitive, .menu .menuitem.radio:checked:insensitive {
+       color: #8d9091;
+       background-image: none; }
+-      .menu .menuitem.radio:checked:insensitive:backdrop {
++      .menu .menuitem.radio:active:insensitive:backdrop, .menu .menuitem.radio:checked:insensitive:backdrop {
+         color: #c7c7c7; }
+-    .menu .menuitem.radio:checked:backdrop {
++    .menu .menuitem.radio:active:backdrop, .menu .menuitem.radio:checked:backdrop {
+       -gtk-icon-source: -gtk-icontheme("radio-checked-symbolic");
+       color: #54595a; }
+   .menu .menuitem.radio:insensitive {
+-- 
+2.1.0
+
diff --git a/gtk3.spec b/gtk3.spec
index ba8c936..06a3e54 100644
--- a/gtk3.spec
+++ b/gtk3.spec
@@ -17,7 +17,7 @@
 Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X
 Name: gtk3
 Version: 3.13.7
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: LGPLv2+
 Group: System Environment/Libraries
 URL: http://www.gtk.org
@@ -26,6 +26,11 @@ URL: http://www.gtk.org
 # not the actual tarball, rebuilt for missing files
 Source: http://download.gnome.org/sources/gtk+/3.13/gtk+-%{version}.tar.xz
 
+Patch1: 0001-checkbutton-Fix-redraw-issues.patch
+Patch2: 0002-button-Remove-unnecessary-queue_redraw-calls.patch
+Patch3: 0003-Adwaita-update-the-last-cases-for-checked.patch
+Patch4: 0004-Adwaita-have-an-unchecked-state-for-radio-checks-in-.patch
+
 BuildRequires: gnome-common autoconf automake intltool gettext
 BuildRequires: atk-devel >= %{atk_version}
 BuildRequires: at-spi2-atk-devel
@@ -146,6 +151,10 @@ the functionality of the installed %{name} package.
 
 %prep
 %setup -q -n gtk+-%{version}
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
 
 %build
 
@@ -316,6 +325,9 @@ gtk-query-immodules-3.0-%{__isa_bits} --update-cache
 %{_datadir}/installed-tests
 
 %changelog
+* Wed Aug 27 2014 Kalev Lember <kalevlember at gmail.com> - 3.13.7-2
+- Backport a few upstream fixes for checkboxes
+
 * Sun Aug 17 2014 Kalev Lember <kalevlember at gmail.com> - 3.13.7-1
 - Update to 3.13.7
 


More information about the scm-commits mailing list