volume: Show OSD popup when changing volume via scroll

It is possible to use the scroll wheel to adjust the volume without
opening the system menu, but there is no feedback other than the
icon itself in that case. To provide a less coarse indication for
the volume level, display the OSD window when adjusting the volume
while the slider isn't visible.

https://bugzilla.gnome.org/show_bug.cgi?id=781028
This commit is contained in:
Florian Müllner 2017-06-09 16:06:39 +02:00
parent 2339c39ae6
commit 79aa404c14

View File

@ -7,6 +7,7 @@ const Gvc = imports.gi.Gvc;
const St = imports.gi.St;
const Signals = imports.signals;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Slider = imports.ui.slider;
@ -149,6 +150,13 @@ const StreamSlider = new Lang.Class({
return 'audio-volume-high-symbolic';
return 'audio-volume-medium-symbolic';
}
},
getLevel: function() {
if (!this._stream)
return null;
return 100 * this._stream.volume / this._control.get_vol_max_norm();
}
});
Signals.addSignalMethods(StreamSlider.prototype);
@ -298,6 +306,10 @@ const VolumeMenu = new Lang.Class({
getIcon: function() {
return this._output.getIcon();
},
getLevel: function() {
return this._output.getLevel();
}
});
@ -329,6 +341,13 @@ const Indicator = new Lang.Class({
},
_onScrollEvent: function(actor, event) {
return this._volumeMenu.scroll(event);
let result = this._volumeMenu.scroll(event);
if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped)
return result;
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() });
let level = this._volumeMenu.getLevel();
Main.osdWindowManager.show(-1, gicon, null, level);
return result;
}
});