From a50c30a4fde52e0173754f84f2990a4b70ca5b7a Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Fri, 6 May 2011 17:34:19 +0100 Subject: [PATCH] volume.js: make slider menu items activatable Keeping the volume menu open after setting the desired volume isn't that useful and forces a second click (or an Esc press) to dismiss it. Allow for the sliders to be used with a single click-hold-move-release. https://bugzilla.gnome.org/show_bug.cgi?id=649586 --- js/ui/popupMenu.js | 4 ++-- js/ui/status/volume.js | 31 +++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index 9e256b58f..1291cbe76 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -482,8 +482,8 @@ function PopupSliderMenuItem() { PopupSliderMenuItem.prototype = { __proto__: PopupBaseMenuItem.prototype, - _init: function(value) { - PopupBaseMenuItem.prototype._init.call(this, { activate: false }); + _init: function(value, params) { + PopupBaseMenuItem.prototype._init.call(this, params ? params : { activate: false }); this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent)); diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js index bd74cd9d5..438a87275 100644 --- a/js/ui/status/volume.js +++ b/js/ui/status/volume.js @@ -41,7 +41,7 @@ Indicator.prototype = { this._outputVolumeId = 0; this._outputMutedId = 0; this._outputTitle = new PopupMenu.PopupMenuItem(_("Volume"), { reactive: false }); - this._outputSlider = new PopupMenu.PopupSliderMenuItem(0); + this._outputSlider = new VolumeSliderMenuItem(0); this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output')); this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange)); this.menu.addMenuItem(this._outputTitle); @@ -54,7 +54,7 @@ Indicator.prototype = { this._inputVolumeId = 0; this._inputMutedId = 0; this._inputTitle = new PopupMenu.PopupMenuItem(_("Microphone"), { reactive: false }); - this._inputSlider = new PopupMenu.PopupSliderMenuItem(0); + this._inputSlider = new VolumeSliderMenuItem(0); this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input')); this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange)); this.menu.addMenuItem(this._inputTitle); @@ -231,3 +231,30 @@ Indicator.prototype = { this.setIcon(this._volumeToIcon(this._output.volume)); } }; + +function VolumeSliderMenuItem() { + this._init.apply(this, arguments); +} + +VolumeSliderMenuItem.prototype = { + __proto__: PopupMenu.PopupSliderMenuItem.prototype, + + _init: function(value) { + PopupMenu.PopupSliderMenuItem.prototype._init.call(this, value, { activate: true }); + + this.actor.connect('motion-event', Lang.bind(this, this._onMotionEvent)); + }, + + activate: function(event) { + this._motionEvent(this.actor, event); + this.emit('drag-end'); + this.emit('activate', event); + }, + + _onMotionEvent: function(actor, event) { + let button_pressed = Shell.get_event_state(event) & Clutter.ModifierType.BUTTON1_MASK; + if (button_pressed && !this._dragging) + return this._motionEvent(actor, event); + return false; + } +};