From 44b6f251700769281695c7a4cfe5cc4dddd01bde Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Tue, 2 Aug 2022 15:41:51 +0200 Subject: [PATCH] xss-dimmer: try again to have sound using Gstreamer --- bin/xss-dimmer | 25 +++++++++++++++++++++++-- dotfiles/systemd/xss-dimmer@.service | 3 ++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/bin/xss-dimmer b/bin/xss-dimmer index c105514..65bbaa9 100755 --- a/bin/xss-dimmer +++ b/bin/xss-dimmer @@ -11,12 +11,14 @@ will stop itself when the locker window is mapped. import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, GdkPixbuf +gi.require_version("Gst", "1.0") +from gi.repository import Gtk, Gdk, GLib, GdkPixbuf, GObject, Gst import cairo import argparse import threading import time import math +import os from Xlib import display, X from Xlib.error import BadWindow from Xlib.protocol.event import MapNotify @@ -89,7 +91,22 @@ def on_refresh(window, options, start): elapsed = time.monotonic() - start if elapsed < options.delay: next_step = min(options.step, options.delay - elapsed) - GLib.timeout_add(options.step * 1000, on_refresh, window, options, start) + GLib.timeout_add(next_step * 1000, on_refresh, window, options, start) + + +def on_sound_ticker(options, sound, start): + elapsed = time.monotonic() - start + if elapsed < options.delay: + if sound is None: + Gst.init([]) + sound = Gst.ElementFactory.make("playbin", "xss-dimmer") + sound.set_property("uri", f"file://{os.path.abspath(options.sound)}") + sound.set_state(Gst.State.NULL) + sound.seek_simple( + Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, 0 + ) + sound.set_state(Gst.State.PLAYING) + GLib.timeout_add(1000, on_sound_ticker, options, sound, now) # See: https://easings.net/ @@ -144,6 +161,7 @@ if __name__ == "__main__": choices=easing_functions.keys(), help="easing function for opacity", ) + add("--sound", help="play a sound for each second elapsed while dimmer running") options = parser.parse_args() background = None @@ -192,5 +210,8 @@ if __name__ == "__main__": ) xdisplay.pending_events() # otherwise, socket is inactive + if options.sound: + GLib.timeout_add(options.delay * 1000 // 3, on_sound_ticker, options, None, now) + # Main loop Gtk.main() diff --git a/dotfiles/systemd/xss-dimmer@.service b/dotfiles/systemd/xss-dimmer@.service index 2486d53..0029fdb 100644 --- a/dotfiles/systemd/xss-dimmer@.service +++ b/dotfiles/systemd/xss-dimmer@.service @@ -3,5 +3,6 @@ Description=Screen dimmer [Service] ExecStart=%h/.config/i3/bin/xss-dimmer --delay=%i \ - --background=%t/i3/current-wallpaper.png + --background=%t/i3/current-wallpaper.png \ + --sound=/usr/share/sounds/freedesktop/stereo/audio-volume-change.oga TimeoutSec=1