iso-profiles-settings/tromjaro/gnome/desktop-overlay/etc/skel/.local/share/gnome-shell/extensions/volume_scroll@qord.si/extension.js
2019-11-06 21:43:51 +00:00

101 lines
2.0 KiB
JavaScript

const Main = imports.ui.main;
const Clutter = imports.gi.Clutter;
const Volume = imports.ui.status.volume;
const Gio = imports.gi.Gio;
const VOL_ICONS = [
'audio-volume-muted-symbolic',
'audio-volume-low-symbolic',
'audio-volume-medium-symbolic',
'audio-volume-high-symbolic'
];
let panel,
panelBinding,
volumeControl,
volumeStep;
function init() {
volumeControl = Volume.getMixerControl();
volumeStep = 500;
panel = Main.panel;
panelBinding = null;
}
function enable() {
panel.reactive = true;
if (panelBinding) {
disable();
}
panelBinding = panel.actor.connect('scroll-event',_onScroll);
}
function disable() {
if (panelBinding) {
panel.actor.disconnect(panelBinding);
panelBinding = null;
}
}
/**
* Returns the max volume.
*/
function _getVolumeMax() {
return volumeControl.get_vol_max_norm();
//return volumeControl.get_vol_max_amplified(); // boost volume (150%)
}
/**
* Handles panel mouse scroll event.
*/
function _onScroll(actor, event) {
let volume = volumeControl.get_default_sink().volume;
switch(event.get_scroll_direction()) {
case Clutter.ScrollDirection.UP:
volume += volumeStep;
break;
case Clutter.ScrollDirection.DOWN:
volume -= volumeStep;
break;
default:
return Clutter.EVENT_PROPAGATE;
}
if (volume > _getVolumeMax()) {
volume = _getVolumeMax();
}
else if (volume < volumeStep) {
volume = 0;
}
volumeControl.get_default_sink().volume = volume;
volumeControl.get_default_sink().push_volume();
_showVolumeOsd(volume, volume/_getVolumeMax() * 100);
return Clutter.EVENT_STOP;
}
/**
* Shows the current volume on OSD.
*
* @see gsd-media-keys-manager.c
*/
function _showVolumeOsd (level, percent) {
let monitor = -1;
let n;
if (level === 0) {
n = 0;
} else {
n = parseInt(3 * percent / 100 + 1);
n = Math.max(1, n);
n = Math.min(3, n);
}
let icon = Gio.Icon.new_for_string(VOL_ICONS[n]);
Main.osdWindowManager.show(monitor, icon, null, percent);
}