;; -*-lisp-*- ;; ;; StumpWM configuration file ;; ;; ;; 2016 - 2019 (c) Marcel Kapfer ;; MIT License (in-package :stumpwm) ;; Other parameters (defparameter *key-layout* "de" "Stores the current key layout") ;; Default applicatoins (defparameter *web-browser* "firefox" "Stores the web browser") (defparameter *editor* "emacsclient -c" "Stores the editor") (defparameter *terminal* "urxvt" "Stores the terminal emulator") (defparameter *file-manager* "dolphin" "Stores the terminal emulator") (defparameter *music-player* "spotify" "Stores the terminal emulator") ;; set correct module directory (set-module-dir "~/.stumpwm.d/contrib") ;; creating or rename groups (setf (group-name (first (screen-groups (current-screen)))) "web") (gnewbg "work") (gnewbg "misc") (gnewbg "music") (gnewbg "winkel") ;; border width (setf *maxsize-border-width* 3) (setf *transient-border-width* 3) (setf *normal-border-width* 3) ;; border style (setf *window-border-style* :tight) (set-focus-color "#b00045") (set-win-bg-color "#b00045") (set-unfocus-color "#333333") (set-float-focus-color "#b00045") (set-float-unfocus-color "#333333") ;; window gravity (set-normal-gravity :center) (set-maxsize-gravity :center) (set-transient-gravity :center) (gravity :center) ;; input bar position (setf *input-window-gravity* :bottom) ;; message bar position (setf *message-window-gravity* :bottom) ;; message timeout (setf *timeout-wait* 3) ;; set the mouse focus (setf *mouse-focus-policy* :click) ;; set DESKTOP_SESSION variable (setf (getenv "DESKTOP_SESSION") "stumpwm") ;; bugfix for scrolling doesn't work with an external mouse in GTK+3 Apps (setf (getenv "GDK_CORE_DEVICE_EVENTS") "1") ;; style message windows (set-bg-color "#333333") (set-border-color "#b00045") ;; loading modeline modules (load-module "battery-portable") (load-module "hostname") (load-module "stumptray") ;; mode-line style (setf *mode-line-background-color* "#333333" *mode-line-foreground-color* "#cccccc" *mode-line-border-color* "#b00045" *mode-line-timeout* 5 *mode-line-border-width* 3 *mode-line-pad-x* 3 *mode-line-pad-y* 3 *screen-mode-line-format* (list "[" '(:eval (RUN-SHELL-COMMAND "date '+%F %H:%M'|tr -d [:cntrl:]" T)) "] [%n] %w ^> [%B] [marcel@%h] %T")) ;; customize texts (setf *window-format* "^B %n ^b %20t " *group-format* "%t") ;; program runners ;;; emacs (defcommand emacs () () "run emacs" (run-or-raise *editor* '(:class "Emacs"))) ;; root keybindings ; ;; browser (define-key *root-map* (kbd "W") (concatenate 'string "exec " *web-browser*)) (define-key *root-map* (kbd "P") (concatenate 'string "exec " *web-browser* " --private-window")) ;;; terminal (define-key *root-map* (kbd "c") (concatenate 'string "exec " *terminal*)) ;;; (text) editor (define-key *root-map* (kbd "e") (concatenate 'string "exec " *editor*)) ;;; ranger (define-key *root-map* (kbd "C-c") (concatenate 'string "exec " *file-manager*)) ;;; spotify (define-key *root-map* (kbd "m") (concatenate 'string "exec " *music-player*)) ;;; bind keys for changing workspace (define-key *root-map* (kbd "C-1") "change-workspace web") (define-key *root-map* (kbd "C-2") "change-workspace work") (define-key *root-map* (kbd "C-3") "change-workspace misc") (define-key *root-map* (kbd "C-4") "change-workspace music") (define-key *root-map* (kbd "C-s") "change-workspace winkel") ;; bind keys for moving the current window to another workspace (define-key *root-map* (kbd "M-1") "gmove web") (define-key *root-map* (kbd "M-2") "gmove work") (define-key *root-map* (kbd "M-3") "gmove misc") (define-key *root-map* (kbd "M-4") "gmove music") (define-key *root-map* (kbd "M-s") "gmove winkel") ;;; mode-line key (define-key *root-map* (kbd "Menu") "mode-line") ;; define volume control keys (define-key *top-map* (kbd "XF86AudioLowerVolume") "exec amixer set Master 5%-") (define-key *top-map* (kbd "XF86AudioRaiseVolume") "exec amixer set Master 5%+") (define-key *top-map* (kbd "XF86AudioMute") "exec amixer set Master toggle") (define-key *top-map* (kbd "XF86AudioMicMute") "exec amixer set Capture toggle") ;; webjump keys (defvar *webjump-frame-bindings* (let ((m (make-sparse-keymap))) (define-key m (kbd "g") "google") (define-key m (kbd "G") "googlede") (define-key m (kbd "d") "duckduckgo") (define-key m (kbd "D") "packages") (define-key m (kbd "w") "wikipedia") (define-key m (kbd "W") "wikipediade") m)) (define-key *root-map* (kbd "j") '*webjump-frame-bindings*) ;; computer power state keys (defvar *powerstate-frame-bindings* (let ((m (make-sparse-keymap))) (define-key m (kbd "M-s") "systemctl suspend") (define-key m (kbd "M-p") "systemctl poweroff") (define-key m (kbd "M-r") "systemctl reboot") (define-key m (kbd "M-h") "systemctl hibernate") m)) (define-key *root-map* (kbd "C-F12") '*powerstate-frame-bindings*) ;; lockscreen (define-key *root-map* (kbd "M-l") "exec blurlock") ;; battery status (define-key *root-map* (kbd "b") "exec ~/scripts/rat/bat.sh") ;; xserver (run-shell-command "xrdb -merge ~/.Xresources") ;;; HiDPI stuff. ;;; TODO: Only run if required ;; (run-shell-command "xrdb -merge ~/.Xresources-hidpi") ;; dunst notify server (run-shell-command "dunst") ;; nitrogen (wallpaper) (run-shell-command "nitrogen --restore") ;; start compton (compositor) (run-shell-command "compton --config ~/.config/compton.conf") ;; start mode line ;; (if (not (head-mode-line (current-head))) ;; (toggle-mode-line (current-screen) (current-head))) (defparameter *backlight-sysfs* "/sys/class/backlight/intel_backlight/") (defun get-max-backlight () "Retrieve maximal backlight brightness from sysfs" (let ((max-backlight-file (concatenate 'string *backlight-sysfs* "max_brightness"))) (if (probe-file max-backlight-file) (with-open-file (in max-backlight-file) (parse-integer (read-line in)))))) (defun get-backlight () "Retrieve current backlight brightness from sysfs" (let ((backlight-file (concatenate 'string *backlight-sysfs* "brightness"))) (if (probe-file backlight-file) (with-open-file (in backlight-file) (parse-integer (read-line in)))))) (defun get-backlight-rel () "Retrieve current backlight brightness relative to maximum" (round (* 100 (float (/ (get-backlight) (get-max-backlight)))))) (defun set-backlight (value) "Set backlight brightness to given value using sysfs" (let ((backlight-file (concatenate 'string *backlight-sysfs* "brightness"))) (if (probe-file backlight-file) (progn (with-open-file (out backlight-file :direction :output :if-exists :overwrite) (format out "~D" (truncate value))) value)))) (defun set-backlight-rel (value) "Set backlight brightness relative to maximum" (let ((max-backlight (get-max-backlight))) (if max-backlight (set-backlight (* 0.01 value max-backlight))))) (defcommand change-backlight (value) ((:number "Backlight in %: ")) "Setting a new backlight value" (unless (set-backlight-rel value) (echo "Can't set backlight"))) (defcommand increase-backlight () () "Increase backlight by 5%" (let ((current (get-backlight-rel))) (if (> current 95) (set-backlight-rel 100) (set-backlight-rel (+ current 5))))) (defcommand decrease-backlight () () "Decrease backlight by 5%" (let ((current (get-backlight-rel))) (if (< current 6) (set-backlight-rel 1) (set-backlight-rel (- current 5))))) (define-key *root-map* (kbd "B") "change-backlight") (define-key *top-map* (kbd "XF86MonBrightnessUp") "increase-backlight") (define-key *top-map* (kbd "XF86MonBrightnessDown") "decrease-backlight") ;; switch key layout (defun switch-layout-to (new-lang) "Switch the key layout to the given one" (setq *key-layout* new-lang) (run-shell-command (concatenate 'string "setxkbmap -layout " new-lang " && xmodmap ~/.Xmodmap")) (echo (concatenate 'string "Set keyboard layout to " new-lang))) ;; switch key leyout to german (defcommand layout-de () () "Set the keyboard layout to de (german)" (switch-layout-to "de")) ;; switch key leyout to american english (defcommand layout-en () () "Set the keyboard layout to US International AltGr" (switch-layout-to "us -variant altgr-intl")) ;; switch key layout automatically (defcommand switch-layout () () "Switch the layout" (if (string= "us -variant altgr-intl" *key-layout*) (switch-layout-to "de") (switch-layout-to "us -variant altgr-intl"))) (define-key *top-map* (kbd "s-SPC" ) "switch-layout") ;; switch workspace with a message (defcommand change-workspace (n) ((:string n)) "Switch workspace" (run-commands (concatenate 'string "gselect " n)) (echo (concatenate 'string "Switched to " n))) ;; toggle window floating (defcommand toggle-float () () "Toggle weather window is floating or not" (if (typep (current-window) 'STUMPWM::FLOAT-WINDOW) (unfloat-this) (float-this))) ;; and the key for it (define-key *root-map* (kbd "C-f") "toggle-float") ;; key for keeping window always on top (define-key *root-map* (kbd "C-T") "toggle-always-on-top") ;; working with emacsclient (defvar *es-win* nil "to hold the window called emacsclient") (defun save-es-called-win () (setf *es-win* (current-window))) (defun return-es-called-window (win) (let* ((group (window-group win)) (frame (window-frame win)) (old-frame (tile-group-current-frame group))) (frame-raise-window group frame win) (focus-all win) (unless (eq frame old-frame) (show-frame-indicator group)))) ;; webjumps (defmacro make-web-jump (name prefix) `(defcommand ,(intern name) (search) ((:rest ,(concatenate 'string name " search: "))) (substitute #\+ #\Space search) (run-shell-command (concatenate 'string *www-browser* " " ,prefix search)))) (make-web-jump "google" "http://www.google.com/search?q=") (make-web-jump "googlede" "http://www.google.de/search?q=") (make-web-jump "duckduckgo" "https://duckduckgo.com/?q=") (make-web-jump "packages" "https://packages.debian.org/") (make-web-jump "wikipedia" "https://en.wikipedia.org/w/index.php?search=") (make-web-jump "wikipediade" "https://de.wikipedia.org/w/index.php?search=") (defun list-screen-layouts () "Return an alist of possible screen layouts. Those are the layouts saved in ~/.screenlayout.sh. First is the name of the layout and second the path to the script." (loop for file in (mapcar 'namestring (directory "~/.screenlayout/*.sh")) collect `(,(subseq file (+ 1 (search "/" file :from-end t)) (- (length file) 3)) ,file))) (defcommand switch-screen-layout () () "Menu to switch the screen layout. Possible options are the scripts saved in ~/.screenlayout/" (labels ((pick (options) (let ((selection (select-from-menu (current-screen) options nil 0))) (cond ((null selection) nil) (t (stringp (second selection)) (run-shell-command (second selection))))))) (pick (list-screen-layouts)))) (define-key *root-map* (kbd "l") "switch-screen-layout") ;; font configuration (load-module "ttf-fonts") (set-font (make-instance 'xft:font :family "Hack" :subfamily "Regular" :size 10)) ;; window placement rules (define-frame-preference "winkel" (0 nil t :class "keepassxc") (0 nil t :class "Nextcloud") (0 nil t :class "de-dal33t-Start") ;; bwSyncAndShare (0 nil t :class "TelegramDesktop")) (define-frame-preference "web" (0 nil t :class "Firefox")) (define-frame-preference "music" (0 nil t :class "Spotify")) ;; autostart programs ;; emacs (run-commands "emacs") ;; keepassxc (run-shell-command "keepassxc-wrapper") ;; owncloud (run-shell-command "nextcloud") ;; bwSyncAndShare (run-shell-command "bwsyncandshare") ;; web browser (run-shell-command *web-browser*) ;; telegram (run-shell-command "telegram-desktop") ;; redshift (run-shell-command "redshift") ;; orage (run-shell-command "orage") ;; last settings ;; (stumptray:stumptray) (switch-layout-to *key-layout*) (run-shell-command "xmodmap $HOME/.Xmodmap" t) ;; Local Variables: ;; mode: stumpwm ;; End: