[gnome-shell] brightness: Ignore slider changes we initiated ourselves



commit 21e14bd46f9774e6c0146cb2169d938e782dba3c
Author: Florian Müllner <fmuellner gnome org>
Date:   Mon Aug 12 14:10:43 2019 +0200

    brightness: Ignore slider changes we initiated ourselves
    
    Since we set the proxy value when the slider changes and set the slider
    value on proxy property changes, we run into a cycle.
    
    Before commit 3d3dca4aa this was addressed by not notifying on all slider
    changes, but only in reaction to direct user action. Given that since the
    splitting out of the BarLevel class those events are handled in a subclass,
    that approach is at least unconvential and fairly fragile.
    
    Instead, make the brightness indicator ignore any changes to the slider it
    initiated itself.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/issues/1500

 js/ui/status/brightness.js | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)
---
diff --git a/js/ui/status/brightness.js b/js/ui/status/brightness.js
index 16c1e9dbb5..662b39a860 100644
--- a/js/ui/status/brightness.js
+++ b/js/ui/status/brightness.js
@@ -1,7 +1,7 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 /* exported Indicator */
 
-const { Gio, St } = imports.gi;
+const { Gio, GObject, St } = imports.gi;
 
 const PanelMenu = imports.ui.panelMenu;
 const PopupMenu = imports.ui.popupMenu;
@@ -33,7 +33,8 @@ var Indicator = class extends PanelMenu.SystemIndicator {
         this.menu.addMenuItem(this._item);
 
         this._slider = new Slider.Slider(0);
-        this._slider.connect('notify::value', this._sliderChanged.bind(this));
+        this._sliderChangedId = this._slider.connect('notify::value',
+            this._sliderChanged.bind(this));
         this._slider.accessible_name = _("Brightness");
 
         let icon = new St.Icon({ icon_name: 'display-brightness-symbolic',
@@ -54,10 +55,16 @@ var Indicator = class extends PanelMenu.SystemIndicator {
         this._proxy.Brightness = percent;
     }
 
+    _changeSlider(value) {
+        GObject.signal_handler_block(this._slider, this._sliderChangedId);
+        this._slider.value = value;
+        GObject.signal_handler_unblock(this._slider, this._sliderChangedId);
+    }
+
     _sync() {
         let visible = this._proxy.Brightness >= 0;
         this._item.visible = visible;
         if (visible)
-            this._slider.value = this._proxy.Brightness / 100.0;
+            this._changeSlider(this._proxy.Brightness / 100.0);
     }
 };


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]