[gnome-shell/wip/carlosg/update-pad-osd-actions] padOsd: Re-query action labels after mode switches



commit b85d97f7e809db8691a4fabf1079667069d6f3af
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Dec 16 12:39:49 2019 +0100

    padOsd: Re-query action labels after mode switches
    
    Do this so the pad OSD is able to update dynamically to mode changes,
    showing immediately the new actions for the current mode(s).

 js/ui/padOsd.js | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/padOsd.js b/js/ui/padOsd.js
index 55b3d0b8c4..149e70ad64 100644
--- a/js/ui/padOsd.js
+++ b/js/ui/padOsd.js
@@ -564,6 +564,14 @@ var PadDiagram = GObject.registerClass({
         this.add_actor(label);
     }
 
+    updateLabels(callback) {
+        for (let i = 0; i < this._labels.length; i++) {
+            let [label, action, idx, dir] = this._labels[i];
+            let str = callback(action, idx, dir);
+            label.set_text(str);
+        }
+    }
+
     _applyLabel(label, action, idx, dir, str) {
         if (str != null) {
             label.set_text(str);
@@ -776,17 +784,30 @@ var PadOsd = GObject.registerClass({
         global.display.request_pad_osd(pad, editionMode);
     }
 
+    _getActionText(type, number, dir) {
+        let str = global.display.get_pad_action_label(this.padDevice, type, number);
+        return str ? str : _("None");
+    }
+
     _createLabel(type, number, dir) {
         let str = global.display.get_pad_action_label(this.padDevice, type, number);
-        let label = new St.Label({ text: str ? str : _("None") });
+        let label = new St.Label({ text: this._getActionText(type, number, dir) });
         this._padDiagram.addLabel(label, type, number, dir);
     }
 
+    _updateActionLabels() {
+        this._padDiagram.updateLabels(this._getActionText.bind(this));
+    }
+
     _onCapturedEvent(actor, event) {
+        let isModeSwitch =
+            (event.type() == Clutter.EventType.PAD_BUTTON_PRESS ||
+             event.type() == Clutter.EventType.PAD_BUTTON_RELEASE) &&
+            this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0;
+
         if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
             event.get_source_device() == this.padDevice) {
             this._padDiagram.activateButton(event.get_button());
-            let isModeSwitch = this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0;
 
             /* Buttons that switch between modes cannot be edited */
             if (this._editionMode && !isModeSwitch)
@@ -795,6 +816,11 @@ var PadOsd = GObject.registerClass({
         } else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE &&
                    event.get_source_device() == this.padDevice) {
             this._padDiagram.deactivateButton(event.get_button());
+
+            if (isModeSwitch) {
+                this._endActionEdition();
+                this._updateActionLabels();
+            }
             return Clutter.EVENT_STOP;
         } else if (event.type() == Clutter.EventType.KEY_PRESS &&
                    (!this._editionMode || event.get_key_symbol() === Clutter.KEY_Escape)) {


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