#+TITLE: StumpWM Configuration #+AUTHOR: Thanos Apollo #+PROPERTY: header-args :tangle ~/.stumpwm.d/init.lisp :mkdirp yes #+auto_tangle: t #+STARTUP: overview * Load Modules #+begin_src lisp (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") (mpd:mpd-connect) #+end_src * Setup slynk #+begin_src lisp (ql:quickload :slynk) (stumpwm:defcommand sly-start-server () () "Start a slynk server for sly." (ql:quickload :slynk) (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)))) #+end_src * Autostart #+begin_src lisp (when *initializing* (run-shell-command "emacs --daemon & feh --bg-scale ~/wallpapers/space-wall1.jpeg & picom & xss-lock -n /usr/lib/xsecurelock/dimmer -l -- ~/Developer/scripts/lock.sh & setxkbmap us -option ctrl:swapcaps")) (setf *startup-message* "Welcome back, Thanos") #+end_src * Functions #+begin_src lisp ;; 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 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")) #+end_src * UI ** Frames #+begin_src lisp (setf *message-window-gravity* :center ,*input-window-gravity* :center ,*window-border-style :thin ,*mouse-focus-policy* :click ,*transient-border-width* 2 ,*normal-size-border-width* 2 ,*message-window-padding* 10 ,*message-window-y-padding* 10) #+end_src ** Theme #+begin_src lisp (defvar thanos-nord0 "#2e3440") (defvar thanos-nord1 "#3b4252") (defvar thanos-nord2 "#434c5e") (defvar thanos-nord3 "#4c566a") (defvar thanos-nord4 "#d8dee9") (defvar thanos-nord5 "#e5e9f0") (defvar thanos-nord6 "#eceff4") (defvar thanos-nord7 "#8fbcbb") (defvar thanos-nord8 "#88c0d0") (defvar thanos-nord9 "#81a1c1") (defvar thanos-nord10 "#5e81ac") (defvar thanos-nord11 "#bf616a") (defvar thanos-nord12 "#d08770") (defvar thanos-nord13 "#ebcb8b") (defvar thanos-nord14 "#a3be8c") (defvar thanos-nord15 "#b48ead") (defvar thanos-hope "#1c1d20") (defvar thanos-hope-alt "#151619") (defvar thanos-hope0 "#1B2229") (defvar thanos-hope1 "#1c1f24") (defvar thanos-hope2 "#202328") (defvar thanos-hope3 "#23272e") (defvar thanos-hope4 "#3f444a") (defvar thanos-hope5 "#5B6268") (defvar thanos-hope6 "#686b78") (defvar thanos-hope7 "#9ca0a4") (defvar thanos-hope8 "#DFDFDF") (defvar thanos-hope-fg "#cbccd1") (defvar thanos-hope-alt "#5B6268") (setq *colors* `(,thanos-nord0 ;; 0 black ,thanos-nord11 ;; 1 red ,thanos-nord14 ;; 2 green ,thanos-nord13 ;; 3 yellow ,thanos-nord10 ;; 4 blue ,thanos-nord14 ;; 5 magenta ,thanos-nord8 ;; 6 cyan ,thanos-nord5)) ;; 7 white (setq *colors* `(,thanos-hope "#1c1d20" ,thanos-hope-alt "#151619" ,thanos-hope0 "#1B2229" ,thanos-hope1 "#1c1f24" ,thanos-hope2 "#202328" ,thanos-hope3 "#23272e" ,thanos-hope4 "#3f444a" ,thanos-hope5 "#5B6268" ,thanos-hope6 "#686b78" ,thanos-hope7 "#9ca0a4" ,thanos-hope8 "#DFDFDF" ,thanos-hope-fg "#cbccd1" ,thanos-hope-alt "#5B6268")) (when *initializing* (update-color-map (current-screen))) (load-module "swm-gaps") (setf swm-gaps:*head-gaps-size* 0 swm-gaps:*inner-gaps-size* 2 swm-gaps:*outer-gaps-size* 4) (when *initializing* (swm-gaps:toggle-gaps)) (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) #+end_src ** Fonts #+begin_src lisp (ql:quickload :clx-truetype) (load-module "ttf-fonts") (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) ) ) #+end_src * Modeline #+begin_src lisp ;; Modeline phun (load-module "battery-portable") (load-module "cpu") (load-module "mpd") (load-module "mem") ;(load-module "stumptray") (setf *mode-line-timeout* 2) (setf *group-format* "%t") (setf *window-format* "%n: %30t") (setf *mode-line-background-color* thanos-hope-alt ,*mode-line-foreground-color* thanos-hope-fg) (setf *mode-line-border-color* thanos-hope1 ,*mode-line-border-width* 0) (setf mem::*mem-modeline-fmt* "%a%p" mpd:*mpd-modeline-fmt* "%a - %t" mpd:*mpd-status-fmt* "%a - %t" ,*hidden-window-color* "^**" ,*mode-line-highlight-template* "«~A»") (defvar *mode-line-formatter-list* '(("%g") ("%W") ("^>") ("docker-running" . t) ("mu-unread" . t) ("%m") ("%C") ("%M") ("%B") ("%d")) "List of formatters for the modeline.") (defun generate-modeline (elements &optional not-invertedp rightp) "Generate a modeline for StumpWM. ELEMENTS should be a list of `cons'es which `car' is the modeline formatter or the shell command to run, and their `cdr' is either nil when the `car' is a formatter and t when it is a shell command." (when elements (cons (format nil " ^[~A^]^(:bg \"~A\") " (format nil "^(:fg \"~A\")^(:bg \"~A\")^f1~A^f0" (if (xor not-invertedp rightp) phundrak-nord1 phundrak-nord3) (if (xor not-invertedp rightp) phundrak-nord3 phundrak-nord1) (if rightp "" "")) (if not-invertedp phundrak-nord3 phundrak-nord1)) (let* ((current-element (car elements)) (formatter (car current-element)) (commandp (cdr current-element))) (cons (if commandp `(:eval (run-shell-command ,formatter t)) (format nil "~A" formatter)) (generate-modeline (cdr elements) (not not-invertedp) (if (string= "^>" (caar elements)) t rightp))))))) (defcommand reload-modeline () () "Reload modeline." (sb-thread:make-thread (lambda () (setf *screen-mode-line-format* (cdr (generate-modeline *mode-line-formatter-list*)))))) (when *initializing* (grename "[EMACS]") (gnewbg "[BROWSER]") (gnewbg "[LAMBDA]")) (clear-window-placement-rules) (setf *dynamic-group-master-split-ratio* 1/2) (setf *window-format* "%m%n%s%c") (setf *screen-mode-line-format* (list "%g ^> %d")) (enable-mode-line (current-screen) (current-head) t) (setf *mode-line-timeout* 2) (setf *time-modeline-string* "%F %H:%M") (setf *group-format* "%t") (setf *window-format* "%n: %30t") #+end_src * Keybindings #+begin_src lisp (defcommand colon1 (&optional (initial "")) (:rest) (let ((cmd (read-one-line (current-screen) ": " :initial-input initial))) (when cmd (eval-command cmd t)))) ;; Run rofi (define-key *root-map* (kbd "C-r") "exec rofi -show drun") (define-key *root-map* (kbd "C-R") "restart-soft") (define-key *root-map* (kbd "M-r") "restart-hard") (define-key *root-map* (kbd "p") "exec ~/Developer/rofi-pass/rofi-pass") (define-key *root-map* (kbd "f") "float-this") (define-key *root-map* (kbd "C-f") "unfloat-this") (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") m ; NOTE: this is important )) (define-key *root-map* (kbd "x") *thanos-buffers-map*) (define-key *root-map* (kbd "e") "exec emacsclient -c") (define-key *root-map* (kbd "C-e") "exec emacs --daemon") ;; Ssh somewhere (define-key *root-map* (kbd "C-S") "colon1 exec xterm -e ssh ") ;; Lock screen (define-key *root-map* (kbd "C-l") "exec ~/Developer/scripts/lock.sh") (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") ;;Keyboard-light (define-key *top-map* (kbd "XF86Explorer") "exec brightnessctl --device='tpacpi::kbd_backlight' set +1") (define-key *top-map* (kbd "XF86LaunchA") "exec brightnessctl --device='tpacpi::kbd_backlight' set 1-") ;; Keyboard layout (define-key *top-map* (kbd "F1") "exec setxkbmap us -option ctrl:swapcaps") (define-key *top-map* (kbd "F2") "exec setxkbmap gr -option ctrl:swapcaps") ;;; 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") ;; 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 7") ;; Focus (define-key *root-map* (kbd "M-b") "move-focus left") (define-key *root-map* (kbd "M-f") "move-focus right") (define-key *root-map* (kbd "M-n") "move-focus down") (define-key *root-map* (kbd "s") "Duck") ;(define-key *root-map* (kbd "v") "Invidious") #+end_src