;; -*- lexical-binding: t; -*- ;;;; utilities ;; desktop (use-package desktop-environment :custom (desktop-environment-screenshot-directory (xdg-user-dir "PICTURES")) (desktop-environment-screenshot-command "flameshot full") (desktop-environment-screenshot-partial-command "flameshot launcher")) (defun bd/exwm-update-class () "Changes the buffer name to reflect the class name for that buffer." (exwm-workspace-rename-buffer exwm-class-name)) (defun bd/exwm-init-hook () "Make workspace 1 the default startup workspace." (exwm-workspace-switch-create 1)) (defun toggle-current-window-dedication () "Adds or revokes dedicated window status from a buffer. A dedicated buffer will never be automatically orphaned." (interactive) (let* ((window (selected-window)) (dedicated (window-dedicated-p window))) (set-window-dedicated-p window (not dedicated)) (message "Window %sdedicated to %s" (if dedicated "no longer " "") (buffer-name)))) ;;;; bookmarks, passwords (defun insert-bookmark () "Inserts a url or string from permanent bookmark file. If an x window, place in kill-ring." ;; note xdotool had issues with repeated keys when sending to windowid (interactive) (let ((url (car (last (split-string (choose-line-from-file "~/Personal/scripts/bookmarks.txt")))))) (if (exwm--buffer->id (current-buffer)) (kill-new url) (insert url)))) (defun choose-line-from-file (file) "Uses completion-framework to allow user to select a line from a file." (let* ((choices (read-file-into-list file))) (completing-read "Recall: " choices))) (defun read-file-into-list (file) (with-current-buffer (find-file-noselect file) (split-string (save-restriction (widen) (buffer-substring-no-properties (point-min) (point-max))) "\n" t))) (use-package password-store :custom (password-store-time-before-clipboard-restore 20) (define-key global-map (kbd "C-c k") #'password-store-copy)) ;; emacs-pinentry; wonderful in EXWM, has security flaws (use-package pinentry :init (pinentry-start) :custom (pinentry-popup-prompt-window nil)) (use-package exwm :config (add-hook 'exwm-init-hook #'bd/exwm-init-hook) (add-hook 'exwm-update-class-hook #'bd/exwm-update-class) ;; order is important (require 'exwm-randr) (exwm-randr-enable) ;; because my nvidia card is currently unsupported with nouveau, ;; xrandr seems to be entirely broken. This line is only here for ;; future reference ;; (start-process-shell-command "xrandr" nil (expand-file-name "exwm_xrandr.sh" user-emacs-directory)) (start-process-shell-command "picom" nil "picom") (start-process-shell-command "bg" nil "set-bg") (start-process-shell-command "xrate" nil "xset r rate 250 70") (dolist (k '(("s-B" "icecat"))) (let ((f (lambda () (interactive) (save-window-excursion (start-process-shell-command (cadr k) nil (cadr k)))))) (exwm-input-set-key (kbd (car k)) f) (define-key exwm-mode-map (kbd (car k)) f))) (define-key exwm-mode-map [?\C-q] 'exwm-input-send-next-key) (exwm-enable) (server-start) :custom (exwm-workspace-number 10) ; puts scratch buffer everywhere (exwm-input-prefix-keys '(?\C-x ?\C-u ?\C-g ?\C-h ?\C-z ?\M-x ?\M-` ?\M-& ?\M-: )) (exwm-input-global-keys `(([?\s-n] . other-window) ([?\s-p] . (lambda () (interactive) (other-window -1))) ([?\s-L] . desktop-environment-lock-screen) ([f2] . desktop-environment-brightness-decrement) ([f3] . desktop-environment-brightness-increment) ([f7] . emms-volume-lower) ([f8] . emms-volume-raise) ([f9] . emms-next) ([f10] . emms-pause) ([f11] . emms-previous) ([print] . desktop-environment-screenshot-part) ([S-print] . desktop-environment-screenshot) ([?\s-O] . insert-bookmark) ([?\s-P] . password-store-copy) ([?\s-r] . exwm-reset) ([?\s-d] . toggle-current-window-dedication) ([?\s-q] . kill-current-buffer) ([?\s-x] . (lambda (command) (interactive (list (read-shell-command "s-x "))) (start-process-shell-command command nil command))) ,@(mapcar (lambda (i) `(,(kbd (format "s-%d" i)) . (lambda () (interactive) (exwm-workspace-switch-create ,i)))) (number-sequence 0 9)))) (exwm-input-simulation-keys '(([?\C-b] . [left]) ([?\C-f] . [right]) ([?\C-p] . [up]) ([?\C-n] . [down]) ([?\C-a] . [home]) ([?\C-e] . [end]) ([?\M-v] . [prior]) ([?\C-v] . [next]) ([?\C-d] . [delete]) ([?\C-k] . [S-end delete]) ([?\M-w] . [C-c]) ([?\C-y] . [C-v]))) ;; ,@(mapcar (lambda (i) ;; `(,(kbd (format "s-%s" (car i))) . ;; (lambda () ;; (interactive ;; (exwm-workspace-switch-create ,(car (cdr i))))))) ;; '((! 0) (@ 1) (\# 2) ($ 3) (% 4) (^ 5) (& 6) (* 7) (\( 8) (\) 9))))) (exwm-workspace-show-all-buffers t) (exwm-layout-show-all-buffers t) (exwm-randr-workspace-monitor-plist '(0 "HDMI-1" 6 "HDMI-1" 7 "HDMI-1" 8 "HDMI-1" 9 "HDMI-1"))) (provide 'bd--exwm-windowing)