From 710415d63ca723a41180800e047e022132b9bf26 Mon Sep 17 00:00:00 2001 From: BardofSprites <89086143+BardofSprites@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:47:04 -0400 Subject: stumpwm window manager --- stumpwm/init.lisp | 22 ++++++++++++ stumpwm/keybinds.lisp | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ stumpwm/modeline.lisp | 5 +++ stumpwm/style.lisp | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ stumpwm/window.lisp | 38 +++++++++++++++++++++ 5 files changed, 246 insertions(+) create mode 100644 stumpwm/init.lisp create mode 100644 stumpwm/keybinds.lisp create mode 100644 stumpwm/modeline.lisp create mode 100644 stumpwm/style.lisp create mode 100644 stumpwm/window.lisp diff --git a/stumpwm/init.lisp b/stumpwm/init.lisp new file mode 100644 index 0000000..2be7d39 --- /dev/null +++ b/stumpwm/init.lisp @@ -0,0 +1,22 @@ +(in-package :stumpwm) + +;;;; Modules + +;;;; REPL +(ql:quickload :slynk) + +;; do prefix ; (keybind), type slynk, enter port num, sly-connect with +;; correct port num +(defcommand slynk (port) ((:string "Port number: ")) + (sb-thread:make-thread + (lambda () + (slynk:create-server :port (parse-integer port) :dont-close t)) + :name "slynk-manual")) + +(setq *mouse-focus-policy* :sloppy + *float-window-modifier* :super) + +(load "~/.stumpwm.d/keybinds.lisp") +(load "~/.stumpwm.d/window.lisp") +(load "~/.stumpwm.d/style.lisp") +(load "~/.stumpwm.d/modeline.lisp") diff --git a/stumpwm/keybinds.lisp b/stumpwm/keybinds.lisp new file mode 100644 index 0000000..6a9e2d7 --- /dev/null +++ b/stumpwm/keybinds.lisp @@ -0,0 +1,88 @@ +(in-package :stumpwm) + +;; Remove default binds +(defvar *gross-default-binds* + (list "c" "C-c" "e" "C-e" "d" "C-d" "SPC" + "i" "f" "C-k" "w" "C-w" "a" "C-a" + "C-t" "o" "TAB" "F" "C-h" "v" + "#" "m" "C-m" "l" "C-l" "G" "C-N" + "A" "X" "C-SPC" "I" "r" "W" "+" + "RET" "C-RET" "C-0" "C-1" "C-2" + "C-3" "C-4" "C-5" "C-6" "C-7" "\"" + "C-8" "C-9" "0" "1" "2" "3" "4" + "5" "6" "7" "8" "9")) + +;; yuck! +(dolist (bind *gross-default-binds*) + (undefine-key *root-map* (kbd bind))) + +(set-prefix-key (kbd "s-z")) +(define-key *top-map* (kbd "s-q") "delete") + +;; programs +(define-key *top-map* (kbd "s-d") "exec dmenu_run") +(define-key *top-map* (kbd "s-RET") "exec st") +(define-key *top-map* (kbd "s-e") "emacs") +(define-key *top-map* (kbd "s-n") "exec emacsclient -c") +(define-key *top-map* (kbd "s-N") "exec emacs-launcher") +(define-key *top-map* (kbd "Print") "exec maimpick") +(define-key *top-map* (kbd "s-X") "exec sysact") +(define-key *top-map* (kbd "s-p") "exec st -e alsamixer") +(define-key *top-map* (kbd "s-w") "exec librewolf-bin") + +;; media +(define-key *top-map* (kbd "XF86AudioPlay") "exec playerctl play") +(define-key *top-map* (kbd "s-P") "exec playerctl pause") +(define-key *top-map* (kbd "XF86AudioPause") "exec playerctl pause") +(define-key *top-map* (kbd "XF86AudioNext") "exec playerctl next") +(define-key *top-map* (kbd "XF86AudioPrev") "exec playerctl previous") +(define-key *top-map* (kbd "XF86AudioRaiseVolume") "exec pactl set-sink-volume @DEFAULT_SINK@ +5%") +(define-key *top-map* (kbd "XF86AudioLowerVolume") "exec pactl set-sink-volume @DEFAULT_SINK@ -5%") +(define-key *top-map* (kbd "XF86AudioMute") "exec pactl set-sink-mute @DEFAULT_SINK@ toggle") + + +;; moving around +(define-key *top-map* (kbd "s-h") "move-focus left") +(define-key *top-map* (kbd "s-j") "move-focus down") +(define-key *top-map* (kbd "s-k") "move-focus up") +(define-key *top-map* (kbd "s-l") "move-focus right") +(define-key *top-map* (kbd "s-H") "move-window left") +(define-key *top-map* (kbd "s-J") "move-window down") +(define-key *top-map* (kbd "s-K") "move-window up") +(define-key *top-map* (kbd "s-L") "move-window right") + +;; frame movement +(define-key *root-map* (kbd "v") "hsplit") +(define-key *root-map* (kbd "s") "vsplit") +(define-key *root-map* (kbd "d") "remove-split") +(define-key *root-map* (kbd "V") "hsplit-and-focus") +(define-key *root-map* (kbd "S") "vsplit-and-focus") +(define-key *top-map* (kbd "s-Tab") "next-in-frame") +(define-key *top-map* (kbd "s-ISO_Left_Tab") "prev-in-frame") +(define-key *top-map* (kbd "s-o") "other-in-frame") +(define-key *top-map* (kbd "s-O") "other") +(define-key *top-map* (kbd "s-W") "frame-windowlist") + +;; group movement keybinds +(define-key *top-map* (kbd "s-1") "gselect 1") +(define-key *top-map* (kbd "s-2") "gselect 2") +(define-key *top-map* (kbd "s-3") "gselect 3") +(define-key *top-map* (kbd "s-4") "gselect 4") +(define-key *top-map* (kbd "s-5") "gselect 5") +(define-key *top-map* (kbd "s-6") "gselect 6") +(define-key *top-map* (kbd "s-7") "gselect 7") +(define-key *top-map* (kbd "s-8") "gselect 8") +(define-key *top-map* (kbd "s-9") "gselect 9") +(define-key *top-map* (kbd "s-0") "gselect 10") + +;; group shifting +(define-key *top-map* (kbd "s-S-1") "gmove 1") +(define-key *top-map* (kbd "s-S-2") "gmove 2") +(define-key *top-map* (kbd "s-S-3") "gmove 3") +(define-key *top-map* (kbd "s-S-4") "gmove 4") +(define-key *top-map* (kbd "s-S-5") "gmove 5") +(define-key *top-map* (kbd "s-S-6") "gmove 6") +(define-key *top-map* (kbd "s-S-7") "gmove 7") +(define-key *top-map* (kbd "s-S-8") "gmove 8") +(define-key *top-map* (kbd "s-S-9") "gmove 9") +(define-key *top-map* (kbd "s-S-0") "gmove 10") diff --git a/stumpwm/modeline.lisp b/stumpwm/modeline.lisp new file mode 100644 index 0000000..3f05948 --- /dev/null +++ b/stumpwm/modeline.lisp @@ -0,0 +1,5 @@ +(in-package :stumpwm) + +;; mode line on all heads +(dolist (h (screen-heads (current-screen))) + (enable-mode-line (current-screen) h t)) diff --git a/stumpwm/style.lisp b/stumpwm/style.lisp new file mode 100644 index 0000000..a8154d9 --- /dev/null +++ b/stumpwm/style.lisp @@ -0,0 +1,93 @@ +(in-package :stumpwm) + +(defparameter *reload-mode-line-p* nil) + +(defparameter *menu-prompt* "Select theme:") + +(defvar *themes* (make-hash-table :test 'equal)) + +(defmacro define-theme (name &body body) + `(setf (gethash ,name *themes*) #'(lambda () ,@body))) + +(defun select-from-themes-menu () + (when-let* ((items (hash-table-keys *themes*)) + (item (select-from-menu (current-screen) items *menu-prompt*))) + (gethash (car item) *themes*))) + +(defun reloads () + (update-color-map (current-screen)) + (when *reload-mode-line-p* + (mode-line) + (mode-line))) + +(defun themes-menu () + (when-let (theme (select-from-themes-menu)) + (funcall theme) + (reloads))) + +(define-theme "Ef Autumn" + (set-fg-color "#cfbcba") + (set-bg-color "#0f0e06") + (set-focus-color "#692a12") + (set-unfocus-color "#36322f") + (setf *mode-line-background-color* "#0f0e06" + *mode-line-foreground-color* "#cfbcba") + ) + +(define-theme "Ef Bio" + + (set-fg-color "#cfdfd5") + (set-bg-color "#111111") + (set-focus-color "#00552f") + (set-unfocus-color "#2a3644") + (setf *mode-line-background-color* "#111111" + *mode-line-foreground-color* "#cfdfd5") + ) + +(define-theme "Gruber Darker" + + (set-fg-color "#e4e4e4") + (set-bg-color "#181818") + (set-focus-color "#cc8c3c") + (set-unfocus-color "#282828") + (setf *mode-line-background-color* "#181818" + *mode-line-foreground-color* "#e4e4e4") + ) + +(define-theme "Gruvbox" + + (set-fg-color "#ebdbb2") + (set-bg-color "#1d2021") + (set-focus-color "#b8bb26") + (set-unfocus-color "#83a598") + (setf *mode-line-background-color* "#1d2021" + *mode-line-foreground-color* "#ebdbb2") + ) + +(defcommand theme () () (themes-menu)) + +(setq *startup-message* (format nil "^bWelcome Home!!!")) + +(setf *message-window-padding* 4 + *message-window-y-padding* 4 + *message-window-gravity* :center) + +(setf *input-window-gravity* :center) + +;;;; Fonts +(ql:quickload "clx-truetype") +(pushnew (concat (getenv "HOME") + "/.local/share/fonts/") + xft:*font-dirs* :test #'string=) +(xft:cache-fonts) + +(let ((parent-font "Iosevka Comfy")) + (when (find parent-font (the list (clx-truetype:get-font-families)) + :test #'string=) + (load-module "ttf-fonts") + (set-font `(,(make-instance 'xft:font + :family "Iosevka Comfy" + :subfamily "Regular" + :size 12 + :antialias t))) + (mode-line))) diff --git a/stumpwm/window.lisp b/stumpwm/window.lisp new file mode 100644 index 0000000..daa3ffc --- /dev/null +++ b/stumpwm/window.lisp @@ -0,0 +1,38 @@ +(in-package :stumpwm) + +;;;; Groups +(grename "home") +(gnew "alt") + +;;;; Window Format +(setf *window-format* "%s%n%30t" + *window-border-style* :tight + *normal-border-width* 5 + *maxsize-border-width* 5 + ) + +;;;; Gaps +(load-module "swm-gaps") +(setq swm-gaps:*gaps-on* t) + +;;; Focus +(load-module "beckon") +(defmacro with-focus-lost (&body body) + "Make sure WIN is on the top level while the body is running and +restore it's always-on-top state afterwords" + `(progn (banish) + ,@body + (when (current-window) + (beckon:beckon)))) +;;; Splits +(defcommand hsplit-and-focus () () + "create a new frame on the right and focus it." + (with-focus-lost + (hsplit) + (move-focus :right))) + +(defcommand vsplit-and-focus () () + "create a new frame below and focus it." + (with-focus-lost + (vsplit) + (move-focus :down))) -- cgit v1.2.3