.s/.stumpwm.d/modeline.lisp

61 lines
2.4 KiB
Common Lisp

(defun make-bar (label percentage-function &optional (format-string "(~a\%)"))
(let
((percentage (funcall percentage-function)))
(concat label ": \[" (bar percentage 5 #\X #\=) "\]" (format nil format-string percentage))))
(defun get-volume ()
;; Return the volume as a percentage
(parse-integer (run-shell-command "pamixer --get-volume" t)))
(defun get-battery ()
;; Return the current battery level as a percentage
(parse-integer (run-shell-command "acpi | awk -F ',' '{print $2}' | grep -Po '\\d+'" t)))
(defun get-ip ()
;; Return the current ip of the default network interface
(run-shell-command "printf $(ifconfig $(route | grep '^default' | grep -o '[^ ]*$' | head -n1) | grep -Po '\\d+\\.\\d+\\.\\d+\\.\\d+' | head -n1)" t))
;; UGLY AF BUT I DONT GIVE A SINGLE SHITE :3
(defparameter *seconds-between-shift-poll* 4)
(defvar *last-shift* 0)
(defvar *last-shift-line* "")
(defun get-shift ()
(let ((line (run-shell-command "cat /tmp/aggietime_status" t)))
(if (= *last-shift* 0)
(run-shell-command "aggietimed --action status-line | jq -r .status | head -n1 > /tmp/aggietime_status" nil))
(if (> (length line) 0) (setf *last-line* line))
(setf *last-shift* (rem (incf *last-shift*) *seconds-between-shift-poll*)
*last-shift-line* line)
(string-trim '(#\Space #\Tab #\Newline) *last-line*)))
(defun get-cpu-temp ()
;; Return current temperature of the first cpu package (core)
(parse-integer (run-shell-command "sensors -A | grep 'Package' | awk '{print $4+0}'" t)))
(setf *status-seperator* " ^3|^] ")
(setf *mode-line* '(
"[^B%n^b]"
"%g"
"%W"
"^>"
"%d"
(:eval (make-bar "VOL" #'get-volume))
(:eval (make-bar "TEMP" #'get-cpu-temp "(~a°C)"))
(:eval (get-ip))))
(if (is-laptop)
(push '(:eval (make-bar "BAT" #'get-battery)) (cdr (last *mode-line*))))
(if (is-work-machine)
(push '(:eval (get-shift)) (cdr (last *mode-line*))))
(setf *screen-mode-line-format* (insert-seperators *mode-line* *status-seperator*))
(setf *window-format* "%n%s%c")
(setf *time-modeline-string* "%a %b %e %k:%M:%S")
(setf *mode-line-timeout* 1)
;; Show on each screen
(mapcar
(lambda (x)
(stumpwm:enable-mode-line (stumpwm:current-screen) x t))
(stumpwm:screen-heads (stumpwm:current-screen)))