(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" (user-homedir-pathname)))) (when (probe-file quicklisp-init) (load quicklisp-init))) (in-package :stumpwm) (setf *default-package* :stumpwm) (set-module-dir "~/.stumpwm.d/modules") (load-module "beckon") (load-module "end-session") (load-module "globalwindows") (load-module "mpd") (load-module "stump-backlight") (load-module "urgentwindows") (load-module "pinentry") (load-module "swm-gaps") (load-module "pass") (load-module "kbd-layouts") (load-module "ttf-fonts") (load-module "battery-portable") (mpd:mpd-connect) (ql:quickload :slynk) (stumpwm:defcommand sly-start-server () () "Start a slynk server for sly." (sb-thread:make-thread (lambda () (slynk:create-server :dont-close t)))) (stumpwm:defcommand sly-stop-server () () "Stop current slynk server for sly." (sb-thread:make-thread (lambda () (slynk:stop-server 4005)))) (setf *wallpapers* "~/wallpapers/") (defun feh-set-wallpaper (wallpaper-name) "Set wallpaper using feh" (let ((wallpaper-dir "~/wallpapers/")) (format t "Setting wallpaper: ~a~%" wallpaper-name) (stumpwm:run-shell-command (format nil "feh --bg-scale ~a~a" wallpaper-dir wallpaper-name)))) (defun thanos/set-wallpapers () "Set wallpapers depending on hostname." (cond ((equal (asdf:hostname) "zeus") (feh-set-wallpaper "anime-night-mountains.jpg")) ((equal (asdf:hostname) "hermes") (feh-set-wallpaper "library-old-house.jpg")))) (when *initializing* (mapc #'stumpwm:run-shell-command '("emacs --daemon" "picom" "transmission-daemon" "xsetroot -cursor_name left_ptr")) (thanos/set-wallpapers)) (setf kbd-layouts:*caps-lock-behavior* :swapped) (kbd-layouts:keyboard-layout-list "us" "gr" "ru -variant phonetic") (setf *startup-message* "Welcome back, Thanos") ;; Web jump (works for DuckDuckGo) (defmacro make-web-jump (name prefix) `(defcommand ,(intern name) (search) ((:rest ,(concatenate 'string "Ask the " name ": "))) (nsubstitute #\+ #\Space search) (run-shell-command (concatenate 'string ,prefix search)))) (make-web-jump "Duck" "firefox https://duckduckgo.com/?q=") (make-web-jump "Invidious" "firefox https://yewtu.be/search?q=") (defcommand firefox () () "Run or raise Firefox." (sb-thread:make-thread (lambda () (run-or-raise "firefox" '(:class "firefox") t nil)))) (defcommand delete-window-and-frame () () "Delete the current frame with its window." (delete-window) (remove-split)) (defcommand mpv-play-url (url) ((:string "URL: ")) "Play video URL with mpv." (stumpwm:run-shell-command (format nil "mpv '~s'" url))) (defcommand hsplit-and-focus () () "Create a new frame on the right and focus it." (hsplit) (move-focus :right)) (defcommand vsplit-and-focus () () "Create a new frame below and move focus to it." (vsplit) (move-focus :down)) (defcommand term (&optional program) () "Invoke a terminal, possibly with a @arg{program}." (sb-thread:make-thread (lambda () (run-shell-command (if program (format nil "kitty ~A" program) "kitty"))))) (defvar *my/desktop-dump-file* "~/.cache/stump-at-work" "Where my desktop dump should go and be loaded from.") (defcommand dump-work () () "Save desktop layout when at work." (dump-desktop-to-file *my/desktop-dump-file*)) (defcommand at-work () () "Restore desktop layout when at work." (restore-from-file *my/desktop-dump-file*) (run-shell-command "gpclient") (run-shell-command "bluetoothctl power on && bluetoothctl connect 14:3F:A6:6D:E3:D9")) (setf *message-window-gravity* :center *input-window-gravity* :center *window-border-style :thin *mouse-focus-policy* :click *float-window-modifier* :META *transient-border-width* 2 *normal-size-border-width* 2 *message-window-padding* 10 *message-window-y-padding* 10) ;; Colors (load ".stumpwm.d/colors.lisp") (when *initializing* (update-color-map (current-screen))) (set-border-color thanos-hope) (set-focus-color thanos-hope) (set-unfocus-color thanos-hope-alt) (set-float-focus-color thanos-hope1) (set-float-unfocus-color thanos-hope3) (set-fg-color thanos-hope-fg) (set-bg-color thanos-hope-alt) (setf swm-gaps:*head-gaps-size* 0 swm-gaps:*inner-gaps-size* 5 swm-gaps:*outer-gaps-size* 5) (when *initializing* (swm-gaps:toggle-gaps-on)) (ql:quickload :clx-truetype) (set-font `(,(make-instance 'xft:font :family "JetBrains Mono" :subfamily "Regular" :size 12 :antialias t) ;; ,(make-instance 'xft:font :family "DejaVu Sans Mono for Powerline" :subfamily "Book" :size 8.5 :antialias t) ;; ,(make-instance 'xft:font :family "siji" :subfamily "Medium" :size 10 :antialias t) ;; ,(make-instance 'xft:font :family "FantasqueSansMono Nerd Font Mono" :subfamily "Regular" :size 9.5 :antialias t) )) (setf *mode-line-timeout* 2) (setf *group-format* "%t") (setf *window-format* "%n: %30t") ;; set modeline colors and highlight (setf *mode-line-background-color* thanos-hope *mode-line-foreground-color* thanos-hope-fg stumpwm:*mode-line-border-color* thanos-hope stumpwm:*mode-line-highlight-template* "«~A»") (setf *mode-line-border-color* thanos-hope1 *mode-line-border-width* 2) (when *initializing* (grename "[ALPHA]") (gnewbg "[BETA]") (gnewbg "[GAMMA]") (gnewbg-dynamic "[DELTA]") (gnewbg "[LAMBDA]")) (clear-window-placement-rules) (setf *dynamic-group-master-split-ratio* 1/2) (setf) (setf *time-modeline-string* "%a %d/%m/%Y | %H:%M") (setf stumpwm:*screen-mode-line-format* (list "%g ^>" "RAM:" '(:eval (string-trim '(#\Newline) (stumpwm:run-shell-command "free | awk '/Mem/ { printf(\"%.2f%\"), $3/$2 * 100.0 }'" t))) "% | CPU:" '(:eval (string-trim '(#\Newline) (stumpwm:run-shell-command "grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {printf(\"%.2f\", usage)}'" t))) "% | VOL:" '(:eval (string-trim '(#\Newline) (stumpwm:run-shell-command "pamixer --get-volume" t))) "% | " ;; Check when hermes(laptop) t display battery (when (equal (asdf:hostname) "hermes") "BAT:%B |") "%d")) (when stumpwm:*initializing* (mode-line)) (defcommand colon1 (&optional (initial "")) (:rest) (let ((cmd (read-one-line (current-screen) ": " :initial-input initial))) (when cmd (eval-command cmd t)))) (define-key *root-map* (kbd "C-r") "exec emacsclient -e '(thanos/app-launcher\)'") (define-key *root-map* (kbd ",") "exec flameshot gui") (define-key *root-map* (kbd "C-R") "restart-hard") (define-key *root-map* (kbd "M-r") "restart-soft") (define-key *root-map* (kbd "p") "exec emacsclient -e '(thanos/pass-launcher)'") (define-key *root-map* (kbd "F") "float-this") (define-key *root-map* (kbd "U") "unfloat-this") (define-key *root-map* (kbd "b") "windowlist") (define-key *root-map* (kbd "d") "delete-window") (define-key *root-map* (kbd "C-d") "remove") ;; Focus (define-key *root-map* (kbd "C-f") "move-focus right") (define-key *root-map* (kbd "C-b") "move-focus left") (defvar *thanos-buffers-map* (let ((m (make-sparse-keymap))) (define-key m (kbd "0") "delete-window-and-frame") (define-key m (kbd "3") "hsplit-and-focus") (define-key m (kbd "b") "windowlist") m ; NOTE: this is important )) (define-key *root-map* (kbd "C-x") *thanos-buffers-map*) (define-key *root-map* (kbd "e") "exec emacsclient -c") (define-key *root-map* (kbd "C-e") "exec emacs") ;; Ssh somewhere (define-key *root-map* (kbd "C-S") "colon1 exec xterm -e ssh ") ;; Lock screen (define-key *root-map* (kbd "C-l") "exec slock") (define-key *top-map* (kbd "F11") "fullscreen") ;; Audio (define-key *top-map* (kbd "XF86AudioLowerVolume") "exec pamixer -d 5") (define-key *top-map* (kbd "XF86AudioRaiseVolume") "exec pamixer -i 5") ;; x220 specific (define-key *top-map* (kbd "F1") "exec brightnessctl --device='intel_backlight' set 5%-") (define-key *top-map* (kbd "F2") "exec brightnessctl --device='intel_backlight' set +5%") (define-key *top-map* (kbd "F3") "exec ~/.scripts/keyboard-light-x220.sh") ;;; Groups ;; Switch to group (define-key *root-map* (kbd "M-1") "gselect 1") (define-key *root-map* (kbd "M-2") "gselect 2") (define-key *root-map* (kbd "M-3") "gselect 3") (define-key *root-map* (kbd "M-4") "gselect 4") (define-key *root-map* (kbd "M-5") "gselect 5") (define-key *root-map* (kbd "M-6") "gselect 6") (define-key *root-map* (kbd "M-7") "gselect 7") (define-key *root-map* (kbd "M-0") "gselect 5") (define-key *root-map* (kbd "M-9") "gselect") ;; Move window to group (define-key *root-map* (kbd "M-!") "gmove 1") (define-key *root-map* (kbd "M-@") "gmove 2") (define-key *root-map* (kbd "M-#") "gmove 3") (define-key *root-map* (kbd "M-$") "gmove 4") (define-key *root-map* (kbd "M-%") "gmove 5") (define-key *root-map* (kbd "M-^") "gmove 6") (define-key *root-map* (kbd "M-)") "gmove 5") (define-key *root-map* (kbd "M-(") "gmove") ;; Focus (define-key *root-map* (kbd "M-b") "move-window left") (define-key *root-map* (kbd "M-f") "move-window right") (define-key *root-map* (kbd "M-n") "move-window down") (define-key *root-map* (kbd "s") "Duck") ;(define-key *root-map* (kbd "v") "Invidious")