aboutsummaryrefslogtreecommitdiff
path: root/src/volume-warning.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/volume-warning.vala')
-rw-r--r--src/volume-warning.vala105
1 files changed, 91 insertions, 14 deletions
diff --git a/src/volume-warning.vala b/src/volume-warning.vala
index 423f129..29a049b 100644
--- a/src/volume-warning.vala
+++ b/src/volume-warning.vala
@@ -40,8 +40,6 @@ public class VolumeWarning : VolumeControl
warning("set_mute not supported for VolumeWarning");
}
- private IndicatorSound.WarnNotification _notification = new IndicatorSound.WarnNotification();
-
/* this is static to ensure it being freed after @context (loop does not have ref counting) */
private static PulseAudio.GLibMainLoop loop;
@@ -103,7 +101,10 @@ public class VolumeWarning : VolumeControl
init_all_properties();
this.reconnect_to_pulse ();
- }
+
+ _notification = new IndicatorSound.WarnNotification();
+ _notification.user_responded.connect((n, response) => on_user_response(response));
+ }
private void init_all_properties()
{
@@ -123,6 +124,7 @@ public class VolumeWarning : VolumeControl
_reconnect_timer = 0;
}
stop_high_volume_approved_timer();
+ stop_clamp_to_loud_timeout();
}
private VolumeControl.ActiveOutput calculate_active_output (SinkInfo? sink) {
@@ -672,16 +674,6 @@ public class VolumeWarning : VolumeControl
&& (stream == "multimedia");
}
- public void clamp_to_high_volume() {
- if (_high_volume && _options.is_loud(_volume)) {
- var vol = new VolumeControl.Volume();
- vol.volume = _volume.volume.clamp(0, volume_to_double(_options.loud_volume()));
- vol.reason = _volume.reason;
- debug("Clamping from %f down to %f", _volume.volume, vol.volume);
- volume = vol;
- }
- }
-
public void set_warning_volume() {
var vol = new VolumeControl.Volume();
vol.volume = volume_to_double(_options.loud_volume());
@@ -694,7 +686,7 @@ public class VolumeWarning : VolumeControl
public bool high_volume_approved { get; private set; default = false; }
- public void approve_high_volume() {
+ private void approve_high_volume() {
_high_volume_approved_at = GLib.get_monotonic_time();
update_high_volume_approved();
update_high_volume_approved_timer();
@@ -843,4 +835,89 @@ public class VolumeWarning : VolumeControl
}
return objp;
}
+
+ private void set_multimedia_volume(VolumeControl.Volume volume)
+ {
+ // FIXME
+ }
+
+ // NOTIFICATION
+
+ private IndicatorSound.WarnNotification _notification = new IndicatorSound.WarnNotification();
+
+ private VolumeControl.Volume _cancel_volume = null;
+ private VolumeControl.Volume _ok_volume = null;
+
+ public void show(VolumeControl.Volume volume) {
+
+ // the volume to use if user hits 'cancel'
+ _cancel_volume = new VolumeControl.Volume();
+ _cancel_volume.volume = VolumeControlPulse.volume_to_double(_options.loud_volume());
+ _cancel_volume.reason = VolumeControl.VolumeReasons.USER_KEYPRESS;
+
+ // the volume to use if user hits 'ok'
+ _ok_volume = new VolumeControl.Volume();
+ _ok_volume.volume = volume.volume;
+ _ok_volume.reason = VolumeControl.VolumeReasons.USER_KEYPRESS;
+
+ _notification.show();
+ this.active = true;
+ }
+
+ public enum Key {
+ VOLUME_UP,
+ VOLUME_DOWN
+ }
+
+ public void user_keypress(Key key) {
+ if (key == Key.VOLUME_DOWN)
+ on_user_response(IndicatorSound.WarnNotification.Response.CANCEL);
+ }
+
+ private void on_user_response(IndicatorSound.WarnNotification.Response response) {
+ _notification.close();
+ stop_clamp_to_loud_timeout();
+
+ if (response == IndicatorSound.WarnNotification.Response.OK) {
+ approve_high_volume();
+ set_multimedia_volume(_ok_volume);
+ } else { // WarnNotification.CANCEL
+ set_multimedia_volume(_cancel_volume);
+ }
+
+ _cancel_volume = null;
+ _ok_volume = null;
+
+ this.active = false;
+ }
+
+ // VOLUME CLAMPING
+
+ private uint _clamp_to_loud_timeout = 0;
+
+ private void stop_clamp_to_loud_timeout() {
+ if (_clamp_to_loud_timeout != 0) {
+ Source.remove(_clamp_to_loud_timeout);
+ _clamp_to_loud_timeout = 0;
+ }
+ }
+
+ private void clamp_to_loud_soon() {
+ const uint interval_msec = 200;
+ if (_clamp_to_loud_timeout == 0)
+ _clamp_to_loud_timeout = Timeout.add(interval_msec, clamp_to_loud_idle);
+ }
+
+ private bool clamp_to_loud_idle() {
+ _clamp_to_loud_timeout = 0;
+ clamp_to_loud_volume();
+ return false; // Source.REMOVE;
+ }
+
+ private void clamp_to_loud_volume() {
+ if ((_cancel_volume != null) && (_volume.volume > _cancel_volume.volume)) {
+ debug("Clamping from %f down to %f", _volume.volume, _cancel_volume.volume);
+ set_multimedia_volume (_cancel_volume);
+ }
+ }
}