dotfiles/stumpwm/stumpwmrc

419 lines
12 KiB
Text
Raw Normal View History

2016-06-02 21:30:02 +02:00
;; -*-lisp-*-
;;
2018-03-13 16:50:36 +01:00
;; StumpWM configuration file
;; <https://stumpwm.github.io/>
;;
2019-04-06 07:46:17 +02:00
;; 2016 - 2019 (c) Marcel Kapfer <opensource@mmk2410.org>
2018-03-13 16:50:36 +01:00
;; MIT License
2016-06-02 21:30:02 +02:00
(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")
2019-04-06 07:47:09 +02:00
;; set correct module directory
(set-module-dir "~/.stumpwm.d/contrib")
2016-12-04 23:18:21 +01:00
2017-09-19 16:06:17 +02:00
;; creating or rename groups
2017-11-25 22:54:00 +01:00
(setf (group-name (first (screen-groups (current-screen)))) "web")
2017-09-19 16:06:17 +02:00
(gnewbg "work")
2017-11-25 22:54:00 +01:00
(gnewbg "misc")
2017-09-19 16:06:17 +02:00
(gnewbg "music")
2017-11-25 22:54:00 +01:00
(gnewbg "winkel")
2016-12-04 23:18:21 +01:00
;; border width
2017-09-19 16:06:17 +02:00
(setf *maxsize-border-width* 3)
(setf *transient-border-width* 3)
(setf *normal-border-width* 3)
2016-12-04 23:18:21 +01:00
;; border style
(setf *window-border-style* :tight)
(set-focus-color "#b00045")
2017-09-19 16:06:17 +02:00
(set-win-bg-color "#b00045")
(set-unfocus-color "#333333")
2016-12-04 23:18:21 +01:00
(set-float-focus-color "#b00045")
2017-09-19 16:06:17 +02:00
(set-float-unfocus-color "#333333")
2016-12-04 23:18:21 +01:00
;; window gravity
(set-normal-gravity :center)
(set-maxsize-gravity :center)
(set-transient-gravity :center)
(gravity :center)
2017-09-19 16:06:17 +02:00
;; input bar position
2018-02-23 09:28:35 +01:00
(setf *input-window-gravity* :bottom)
2017-09-19 16:06:17 +02:00
;; message bar position
2018-02-23 09:28:35 +01:00
(setf *message-window-gravity* :bottom)
2017-09-19 16:06:17 +02:00
;; message timeout
(setf *timeout-wait* 3)
;; set the mouse focus
2017-11-25 23:07:00 +01:00
(setf *mouse-focus-policy* :click)
2017-09-19 16:06:17 +02:00
;; 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")
2017-09-19 16:06:17 +02:00
;; style message windows
(set-bg-color "#333333")
(set-border-color "#b00045")
;; loading modeline modules
(load-module "battery-portable")
(load-module "hostname")
2017-11-25 23:00:56 +01:00
(load-module "stumptray")
2017-09-19 16:06:17 +02:00
;; 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
2018-11-17 09:16:30 +01:00
*screen-mode-line-format* (list "[" '(:eval (RUN-SHELL-COMMAND "date '+%F %H:%M'|tr -d [:cntrl:]" T)) "] [%n] %w ^> [%B] [marcel@%h] %T"))
2017-09-19 16:06:17 +02:00
;; 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")))
2017-09-19 16:06:17 +02:00
2016-12-04 23:18:21 +01:00
;; root keybindings
2017-07-21 10:13:45 +02:00
;
;; 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"))
2016-12-04 23:18:21 +01:00
;;; terminal
(define-key *root-map* (kbd "c") (concatenate 'string "exec " *terminal*))
2016-12-04 23:18:21 +01:00
;;; (text) editor
(define-key *root-map* (kbd "e") (concatenate 'string "exec " *editor*))
2016-12-23 22:06:39 +01:00
2017-08-10 09:46:29 +02:00
;;; ranger
(define-key *root-map* (kbd "C-c") (concatenate 'string "exec " *file-manager*))
2018-02-03 18:25:29 +01:00
2018-02-03 18:25:41 +01:00
;;; spotify
(define-key *root-map* (kbd "m") (concatenate 'string "exec " *music-player*))
2017-08-10 09:46:29 +02:00
2017-11-25 22:54:00 +01:00
;;; 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")
2016-06-02 21:30:02 +02:00
2017-07-21 10:13:45 +02:00
;;; mode-line key
(define-key *root-map* (kbd "Menu") "mode-line")
2017-09-19 16:06:17 +02:00
;; 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*)
2017-09-19 16:06:17 +02:00
;; lockscreen
2017-11-25 22:55:28 +01:00
(define-key *root-map* (kbd "M-l") "exec blurlock")
2017-09-19 16:06:17 +02:00
;; battery status
(define-key *root-map* (kbd "b") "exec ~/scripts/rat/bat.sh")
2016-06-02 21:30:02 +02:00
;; xserver
2017-07-21 10:13:45 +02:00
2016-06-02 21:30:02 +02:00
(run-shell-command "xrdb -merge ~/.Xresources")
;;; HiDPI stuff.
;;; TODO: Only run if required
2017-03-20 22:48:25 +01:00
;; (run-shell-command "xrdb -merge ~/.Xresources-hidpi")
2016-06-02 21:30:02 +02:00
2016-12-04 23:18:21 +01:00
;; dunst notify server
(run-shell-command "dunst")
;; nitrogen (wallpaper)
2016-06-02 21:30:02 +02:00
(run-shell-command "nitrogen --restore")
2018-03-13 16:53:45 +01:00
;; start compton (compositor)
2018-03-13 21:26:06 +01:00
(run-shell-command "compton --config ~/.config/compton.conf")
2018-03-13 16:53:45 +01:00
2017-09-19 16:06:17 +02:00
;; start mode line
2018-02-03 18:26:11 +01:00
;; (if (not (head-mode-line (current-head)))
;; (toggle-mode-line (current-screen) (current-head)))
2016-12-04 23:18:21 +01:00
(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)))))
2016-12-04 23:18:21 +01:00
(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)))))
2016-12-04 23:18:21 +01:00
(define-key *root-map* (kbd "B") "change-backlight")
(define-key *top-map* (kbd "XF86MonBrightnessUp") "increase-backlight")
(define-key *top-map* (kbd "XF86MonBrightnessDown") "decrease-backlight")
2016-12-04 23:18:21 +01:00
;; 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"))
2016-12-04 23:18:21 +01:00
;; switch key layout automatically
(defcommand switch-layout ()
()
"Switch the layout"
(if (string= "us -variant altgr-intl" *key-layout*)
2016-12-04 23:18:21 +01:00
(switch-layout-to "de")
(switch-layout-to "us -variant altgr-intl")))
2016-12-04 23:18:21 +01:00
(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)))
2016-12-23 22:06:39 +01:00
;; 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")
2016-12-23 22:06:39 +01:00
;; 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))))
2017-03-28 11:59:26 +02:00
2017-09-19 16:06:17 +02:00
;; 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=")
2018-03-13 16:50:36 +01:00
(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")
2017-07-21 10:13:45 +02:00
2017-07-31 17:58:12 +02:00
;; font configuration
(load-module "ttf-fonts")
2017-08-10 09:48:08 +02:00
(set-font (make-instance 'xft:font :family "Hack" :subfamily "Regular" :size 10))
2017-07-31 17:58:12 +02:00
2017-09-19 16:06:17 +02:00
;; window placement rules
2017-11-25 22:54:00 +01:00
(define-frame-preference "winkel"
2017-09-19 16:06:17 +02:00
(0 nil t :class "keepassxc")
(0 nil t :class "Nextcloud")
(0 nil t :class "de-dal33t-Start") ;; bwSyncAndShare
(0 nil t :class "TelegramDesktop"))
2017-09-19 16:06:17 +02:00
(define-frame-preference "web"
(0 nil t :class "Firefox"))
2017-09-19 16:06:17 +02:00
(define-frame-preference "music"
2017-11-25 22:54:00 +01:00
(0 nil t :class "Spotify"))
2017-09-19 16:06:17 +02:00
;; autostart programs
;; emacs
(run-commands "emacs")
2017-09-19 16:06:17 +02:00
;; keepassxc
2018-08-14 13:50:09 +02:00
(run-shell-command "keepassxc-wrapper")
2017-09-19 16:06:17 +02:00
;; owncloud
(run-shell-command "nextcloud")
2017-09-19 16:06:17 +02:00
;; bwSyncAndShare
(run-shell-command "bwsyncandshare")
;; web browser
(run-shell-command *web-browser*)
2017-09-19 16:06:17 +02:00
;; telegram
(run-shell-command "telegram-desktop")
2017-09-19 16:06:17 +02:00
;; redshift
(run-shell-command "redshift")
2018-10-30 06:57:33 +01:00
;; orage
(run-shell-command "orage")
2017-09-19 16:06:17 +02:00
;; last settings
2018-02-03 18:28:40 +01:00
;; (stumptray:stumptray)
2017-09-19 16:06:17 +02:00
2017-07-21 10:13:45 +02:00
(switch-layout-to *key-layout*)
(run-shell-command "xmodmap $HOME/.Xmodmap" t)
2018-02-03 18:28:51 +01:00
;; Local Variables:
;; mode: stumpwm
;; End: