(in-package :stumpwm-user) (require 'swank) (set-prefix-key (kbd "s-x")) (defvar *screen-locking-hook* nil "Hook that gets called right before the screen gets locked.") (defvar *screen-unlocked-hook* nil "Hook that gets called right after the screen is unlocked.") (defun run-screen-unlocked-hook (process) "Run `*screen-unlocked-hook* if PROCESS' status is `:exited'." (when (eq (sb-ext:process-status process) :exited) (run-hook *screen-unlocked-hook*))) (defun vpn-connected-p () (probe-file "/sys/class/net/vpn")) (defcommand lock-screen () () "Lock the screen using i3lock. Run `*screen-locking-hook*' before locking it and run `*screen-unlocked-hook*' after it has been unlocked." (run-hook *screen-locking-hook*) (sb-ext:run-program *shell-program* `("-c" ,(format nil "~a --nofork --color=000000" *locker-program*)) :wait nil :status-hook #'run-screen-unlocked-hook)) (defcommand raise-browser () () "Open or show my browser" (run-or-raise "firefox" '(:class "firefox|zen(-beta)?|Org\.chromium\.Chromium|glide-glide"))) (defcommand raise-emacs () () "Open or show Emacs" (run-or-raise "emacsclient -c" '(:class "Emacs"))) (defcommand raise-terminal () () "Open or show my terminal" (run-or-raise "kitty" '(:class "kitty|org\.wezfurlong\.wezterm"))) (define-key *top-map* (kbd "C-M-l") "lock-screen") (define-key *top-map* (kbd "s-b") "raise-browser") (define-key *top-map* (kbd "s-e") "raise-emacs") (define-key *top-map* (kbd "s-t") "raise-terminal") (define-key *top-map* (kbd "s-!") "exec rofi -show drun"); ;; (define-key *top-map* (kbd "s-w") "exec rofi -show window") (define-key *top-map* (kbd "s-w") "windowlist") (define-key *top-map* (kbd "s-r") "exec") (define-key *top-map* (kbd "s-B") "move-window left") (define-key *top-map* (kbd "s-F") "move-window right") (define-key *top-map* (kbd "s-N") "move-window down") (define-key *top-map* (kbd "s-P") "move-window up") (define-remapped-keys `(("teams-for-linux" ;; Mute microphone in meetings. ("XF86Launch6" . "C-S-m")) ("[Ff]irefox" ;; Generally cancel action. ("XF86Launch6" . "ESC")) ("[Ee]macs" ;; Save document. ("XF86Launch5" . ("C-x" "C-s")) ;; Save some documents. ("S-XF86Launch5" . ("C-x" "s")) ;; Quit command. ("XF86Launch6" . "C-g") ;; Revert (reload) file. ("XF86Launch7" . ("C-x" "x" "g"))) ;; Portal: Revolution ("revolution" ;; Quick Save ("XF86Launch5" . "F6") ;; Quick Load ("XF86Launch7" . "F7")))) (set-bg-color "#222424") (set-border-color "#3f4242") (set-fg-color "#bfbfbf") (set-float-focus-color "#5b6161") (set-float-unfocus-color "#3f4242") (set-focus-color "#ff9800") (set-unfocus-color "#3f4242") (setf *mode-line-background-color* "#111414" *mode-line-foreground-color* "#bfbfbf" *mode-line-border-width* 0 *mode-line-pad-x* 10) (setf *screen-mode-line-format* (list "[ ^B%n^b ] " "^[^(:bg \"#f17272\")^(:fg \"#222424\")[ " '(:eval (or (ignore-errors (window-title (current-window))) "Unknown")) " ]^]^>" '(:eval (if (vpn-connected-p) "^*5^B[ VPN ]^b^n " "")) "[ %d ] ")) (setf *message-window-gravity* :center *message-window-input-gravity* :top-right *input-window-gravity* :top) ;;; Redefinition of the make mode-line window to add the Dock window type. (defun stumpwm::make-mode-line-window (screen) "Create a window suitable for a modeline." (let ((window (xlib:create-window :parent (screen-root screen) :x 0 :y 0 :width 1 :height 1 :background (stumpwm::alloc-color screen *mode-line-background-color*) :border (stumpwm::alloc-color screen *mode-line-border-color*) :border-width *mode-line-border-width* ;; You can click the modeline :event-mask (xlib:make-event-mask :button-press :exposure) ;; these windows are not controlled by the window manager :override-redirect :on))) (xlib:change-property window :_NET_WM_WINDOW_TYPE (list (xlib:find-atom *display* :_NET_WM_WINDOW_TYPE_DOCK)) :atom 32) window)) (mode-line) ;;; Screenshots (defvar *screenshot-bindings* (let ((m (make-sparse-keymap))) (define-key m (kbd "s") "exec flameshot gui") (define-key m (kbd "c") "exec flameshot screen") (define-key m (kbd "f") "exec flameshot full") m)) (defvar *notification-bindings* (let ((m (make-sparse-keymap))) (define-key m (kbd "RET") "exec dunstctl action") (define-key m (kbd "c") "exec dunstctl close") (define-key m (kbd "C") "exec dunstctl close-all") (define-key m (kbd "SPC") "exec dunstctl context") (define-key m (kbd ",") "exec dunstctl history-pop") (define-key m (kbd "p") "exec dunstctl set-paused toggle") m)) (defvar *user-bindings* (let ((m (make-sparse-keymap))) (define-key m (kbd "s") '*screenshot-bindings*) (define-key m (kbd "n") '*notification-bindings*) m)) (define-key *top-map* (kbd "s-c") '*user-bindings*) (grename "dev") (define-frame-preference "dev" (0 t nil :class "kitty") (0 t nil :class "org.wezfurlong.wezterm") (1 t nil :class "Emacs") (3 t nil :class "firefox") (3 t nil :class "Zen")) (define-frame-preference "chat" (0 t t :class "teams-for-linux" :create t) (0 t t :class "Slack")) (sb-ext:run-program *shell-program* '("-c" "feh --bg-center ~/pictures/wallpaper/5120x1440/wallhaven-v9ydgl.jpg")) (define-key *top-map* (kbd "s-.") "gnext") (define-key *top-map* (kbd "s-,") "gprev") (undefine-key *groups-map* (kbd "o")) (define-key *top-map* (kbd "s-o") "fnext") (undefine-key stumpwm::*tile-group-root-map* (kbd "o")) (undefine-key stumpwm::*group-root-map* (kbd "o")) (defun stop-swank () (swank:stop-server 4005)) (swank:create-server :dont-close t) (add-hook *restart-hook* 'stop-swank) (which-key-mode) (restore-from-file "default") (defun oni-move-floating-windows (current-window _last-window) (if (not (stumpwm::float-window-p current-window)) (let* ((current-frame (stumpwm::window-frame current-window)) (frame-left-edge (round (frame-x current-frame))) (frame-right-edge (+ frame-left-edge (round (frame-width current-frame)))) (screen-width (screen-width (current-screen)))) (mapc (lambda (window) (let* ((window-left-edge (window-x window)) (window-right-edge (+ window-left-edge (window-width window))) (window-distance-to-right-edge (abs (- frame-right-edge window-left-edge))) (window-distance-to-left-edge (abs (- window-right-edge frame-left-edge)))) (if (and (< frame-left-edge window-right-edge) (> frame-right-edge window-left-edge)) (stumpwm::float-window-move-resize window :x (if (> (+ frame-right-edge 10) screen-width) (- frame-left-edge (window-width window) 10) (if (< (- frame-left-edge (window-width window) 10) 0) (+ frame-right-edge 10) (if (> window-distance-to-left-edge window-distance-to-right-edge) (+ frame-right-edge 10) (- frame-left-edge (window-width window) 10)))))))) (stumpwm::group-on-top-windows (current-group))) (redisplay)))) (add-hook *focus-window-hook* 'oni-move-floating-windows)