* .emacs.d/init.el: Show system volumes in mode-line.
[~bandali/configs] / .emacs.d / init.el
index d9ec432..94f1ccb 100644 (file)
   (setq battery-mode-line-format " [%p%% %t]")
   (display-battery-mode))
 
+(progn ; display system volume in mode-line
+  (defun b/get-volume-level (&optional mic)
+    "Returns the current system sound volume.
+If MIC is non-nil, it returns the microphone volume instead."
+    (string-to-number
+     (string-trim
+      (shell-command-to-string
+       (mapconcat
+        #'identity
+        `("pamixer" ,(when mic "--default-source") "--get-volume")
+        " ")))))
+
+  (defun b/set-volume-level (level &optional mic)
+    "Set the system sound volume to LEVEL.
+If MIC is non-nil, set the volume level for the microphone
+instead."
+    (let ((v (if mic 'b/volume-level-mic 'b/volume-level)))
+      (eval `(setq ,v ,level))))
+
+  (defun b/get-volume-mute (&optional mic)
+    "Returns t if system sound is currently muted.
+If MIC is non-nil, it instead returns t if the microphone is
+muted."
+    (string=
+     "true"
+     (string-trim
+      (shell-command-to-string
+       (mapconcat
+        #'identity
+        `("pamixer" ,(when mic "--default-source") "--get-mute")
+        " ")))))
+
+  (defun b/set-volume-mute (mute &optional mic)
+    "Set the system sound mutedness to MUTE.
+If MIC is non-nil, set the mutedness for the microphone instead."
+    (let ((v (if mic 'b/volume-mute-mic 'b/volume-mute)))
+      (eval `(setq ,v ,mute))))
+
+  (defvar b/volume-level (b/get-volume-level))
+  (defvar b/volume-mute (b/get-volume-mute))
+  (defvar b/volume-level-mic (b/get-volume-level 'mic))
+  (defvar b/volume-mute-mic (b/get-volume-mute 'mic))
+
+  (setq-default
+   mode-line-format
+   (append
+    mode-line-format
+    '((:eval
+       (format
+        " [%s%%%%%s %s%%%%%s]"
+        (number-to-string b/volume-level)
+        (if b/volume-mute "-" "+")
+        (number-to-string b/volume-level-mic)
+        (if b/volume-mute-mic "-" "+")))))))
+
 ;; (with-eval-after-load 'fringe
 ;;   ;; smaller fringe
 ;;   (fringe-mode '(3 . 1)))