[gnome-shell] padOsd: Allow to switch between pads in the same group
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] padOsd: Allow to switch between pads in the same group
- Date: Mon, 13 Mar 2017 20:24:50 +0000 (UTC)
commit e039871298fc907c5ed45486c687fa2be6f7da31
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Feb 13 15:25:20 2017 +0100
padOsd: Allow to switch between pads in the same group
Whenever there's more than one pad in the same group (eg. Wacom ExpressKey
Remotes), show a popdown menu to allow configuring those extra pads.
Devices are hot-pluggable, so the popdown menu will update its state
whenever pads are added/removed.
Also, allow to quickly change between pads by switching to its OSD by
just interacting with them. Always given they are in the same group.
https://bugzilla.gnome.org/show_bug.cgi?id=779986
js/ui/padOsd.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 57 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/padOsd.js b/js/ui/padOsd.js
index 9214410..27dfb66 100644
--- a/js/ui/padOsd.js
+++ b/js/ui/padOsd.js
@@ -599,12 +599,27 @@ const PadOsd = new Lang.Class({
this._imagePath = imagePath;
this._editionMode = editionMode;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this,
this._onCapturedEvent));
+ this._padChooser = null;
let deviceManager = Clutter.DeviceManager.get_default();
+ this._deviceAddedId = deviceManager.connect('device-added', Lang.bind(this, function (manager,
device) {
+ if (device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE &&
+ this.padDevice.is_grouped(device)) {
+ this._groupPads.push(device);
+ this._updatePadChooser();
+ }
+ }));
this._deviceRemovedId = deviceManager.connect('device-removed', Lang.bind(this, function (manager,
device) {
// If the device is being removed, destroy the padOsd.
- if (device == this.padDevice)
+ if (device == this.padDevice) {
this.destroy();
+ } else if (this._groupPads.indexOf(device) != -1) {
+ // Or update the pad chooser if the device belongs to
+ // the same group.
+ this._groupPads.splice(this._groupPads.indexOf(device), 1);
+ this._updatePadChooser();
+
+ }
}));
deviceManager.list_devices().forEach(Lang.bind(this, function(device) {
@@ -644,6 +659,8 @@ const PadOsd = new Lang.Class({
this._tipLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER });
labelBox.add_actor(this._tipLabel);
+ this._updatePadChooser();
+
this._actionEditor = new ActionEditor();
this._actionEditor.connect('done', Lang.bind(this, this._endButtonActionEdition));
@@ -689,6 +706,33 @@ const PadOsd = new Lang.Class({
Main.pushModal(this.actor);
},
+ _updatePadChooser: function () {
+ if (this._groupPads.length > 1) {
+ if (this._padChooser == null) {
+ this._padChooser = new PadChooser(this.padDevice, this._groupPads)
+ this._padChooser.connect('pad-selected', Lang.bind(this, function (chooser, pad) {
+ this._requestForOtherPad(pad);
+ }));
+ this._titleBox.add_child(this._padChooser.actor);
+ } else {
+ this._padChooser.update(this._groupPads);
+ }
+ } else if (this._padChooser != null) {
+ this._padChooser.destroy();
+ this._padChooser = null;
+ }
+ },
+
+ _requestForOtherPad: function (pad) {
+ if (pad == this.padDevice ||
+ this._groupPads.indexOf(pad) == -1)
+ return;
+
+ let editionMode = this._editionMode;
+ this.destroy();
+ global.display.request_pad_osd(pad, editionMode);
+ },
+
_createLabel: function (type, number, dir) {
let str = global.display.get_pad_action_label(this.padDevice, type, number);
let label = new St.Label({ text: str ? str : _("None") });
@@ -716,6 +760,13 @@ const PadOsd = new Lang.Class({
return Clutter.EVENT_STOP;
}
+ // If the event comes from another pad in the same group,
+ // show the OSD for it.
+ if (this._groupPads.indexOf(event.get_source_device()) != -1) {
+ this._requestForOtherPad(event.get_source_device());
+ return Clutter.EVENT_STOP;
+ }
+
return Clutter.EVENT_PROPAGATE;
},
@@ -784,11 +835,15 @@ const PadOsd = new Lang.Class({
Main.popModal(this.actor);
this._actionEditor.close();
+ let deviceManager = Clutter.DeviceManager.get_default();
if (this._deviceRemovedId != 0) {
- let deviceManager = Clutter.DeviceManager.get_default();
deviceManager.disconnect(this._deviceRemovedId);
this._deviceRemovedId = 0;
}
+ if (this._deviceAddedId != 0) {
+ deviceManager.disconnect(this._deviceAddedId);
+ this._deviceAddedId = 0;
+ }
if (this._capturedEventId != 0) {
global.stage.disconnect(this._capturedEventId);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]