From 0adb2b31e4a08906888cb10c03769f261cb4a125 Mon Sep 17 00:00:00 2001 From: jao Date: Wed, 17 Sep 2025 21:38:09 +0100 Subject: jao-custom-x11 --- custom/jao-custom-window-system.el | 198 ------------------------------------- custom/jao-custom-x11.el | 192 +++++++++++++++++++++++++++++++++++ init.el | 19 +++- 3 files changed, 210 insertions(+), 199 deletions(-) delete mode 100644 custom/jao-custom-window-system.el create mode 100644 custom/jao-custom-x11.el diff --git a/custom/jao-custom-window-system.el b/custom/jao-custom-window-system.el deleted file mode 100644 index 32b3578..0000000 --- a/custom/jao-custom-window-system.el +++ /dev/null @@ -1,198 +0,0 @@ -;; -*- lexical-binding: t -*- - -;;; x11 utils -(defun jao-xdotool (arg-or-wait &rest args) - (apply 'jao-shell-exec* - (if (stringp arg-or-wait) "xdotool" arg-or-wait) - (if (stringp arg-or-wait) arg-or-wait "xdotool") - args)) - -(defsubst jao-xdotool-string (&rest args) - (apply 'jao-shell-string "xdotool" args)) - -(defsubst jao-x11-focused-id () (jao-xdotool-string "getwindowfocus")) - -(defsubst jao-x11-window-name (&optional wid) - (jao-xdotool-string "getwindowname" (or wid (jao-x11-focused-id)))) - -(defsubst jao-x11-search-window (title) - (jao-xdotool-string "search" "--name" title)) - -(defsubst jao-x11-goto-ws (n) (jao-xdotool t "set_desktop" (format "%s" n))) - -;;; exwm -(defvar jao-exwm-enabled nil) -(defun jao-exwm-enabled-p () jao-exwm-enabled) - -(defun jao-exwm-enable () - (require 'jao-custom-exwm) - (setq jao-exwm-enabled t) - (display-time-mode -1) - (jao-ednc-setup 95) - (x-change-window-property "_XMONAD_TRAYPAD" "" nil nil nil nil 0) - (jao-mode-line-add-to-minibuffer-left 90) - (jao-xmobar-restart) - (jao-trisect t)) - -;;; xmonad -(defvar jao-xmonad-enabled (string= "xmonad" (or (getenv "wm") ""))) -(defun jao-xmonad-enabled-p () jao-xmonad-enabled) - -(defun jao-xmonad-enable () - (setq jao-browse-doc-use-emacs-p (display-graphic-p)) - (setq jao-mode-line-in-minibuffer nil) - (display-battery-mode -1) - (jao-trisect) - (message "Welcome to xmonad")) - -(when jao-xmonad-enabled - (add-hook 'after-init-hook #'jao-xmonad-enable)) - -;;; wayland - -(use-package jao-wayland :demand t) - -(defun jao-wayland-enable () - (interactive) - (defalias 'x-change-window-property #'ignore) - (jao-trisect) - (message "Welcome to wayland")) - -(defun jao-river-enable () - (jao-wayland-enable) - (when (jao-shell-running-p "i3bar-river") - (jao-tracking-set-log "")) - (message "Welcome to river")) - -(when jao-river-enabled - (add-hook 'after-init-hook #'jao-river-enable t)) - -(when jao-sway-enabled - (add-hook 'after-init-hook #'jao-wayland-enable t)) - -;;; wallpaper -(defvar jao-wallpaper-dir "~/.wallpapers/") - -(defvar jao-wallpaper-random-candidates - '("wallpaper.jpg" "wallpaper2.jpg")) - -(defvar jao-wallpaper-random-candidates-light - '("wallpaper.jpg" "wallpaper2.jpg")) - -(defvar jao-wallpaper-random-wake t - "Set to t for getting a new wallpaper on awaking from sleep") - -(defun jao-set-wallpaper (&optional path) - (interactive) - (let ((current (format "~/.wallpaper.%s" (jao-colors-scheme)))) - (when-let ((f (or (and path (expand-file-name path)) - (read-file-name "Image: " - jao-wallpaper-dir - (file-symlink-p current) - t)))) - (make-symbolic-link f current t) - (cond (jao-river-enabled (jao-river-set-wallpaper f)) - (jao-sway-enabled (jao-sway-set-wallpaper f)) - (t (shell-command-to-string (format "xwallpaper --zoom %s" f))))))) - -(defun jao-set-random-wallpaper () - (interactive) - (when (or (called-interactively-p 'interactive) - jao-wallpaper-random-wake) - (let* ((ws (if (jao-colors-scheme-dark-p) - jao-wallpaper-random-candidates - jao-wallpaper-random-candidates-light)) - (f (seq-random-elt ws))) - (jao-set-wallpaper (expand-file-name f jao-wallpaper-dir)) - (message "%s" f)))) - -(add-to-list 'jao-sleep-awake-functions #'jao-set-random-wallpaper) - -;;; screensaver and lock -(defun jao-screensaver-enabled () - (string= (jao-shell-string "xdg-screensaver status") "enabled")) - -(defvar jao-screensaver--wid nil) -(defun jao-screensaver-toggle () - (interactive) - (if (jao-screensaver-enabled) - (let ((wid (jao-x11-focused-id))) - (setq jao-screensaver--wid wid) - (jao-shell-exec* t "xdg-screensaver" "suspend" wid)) - (jao-shell-exec* t "xdg-screensaver" "resume" jao-screensaver--wid) - (setq jao-screensaver--wid nil)) - (jao-notify (format "Screensaver %s" - (jao-shell-string "xdg-screensaver status")))) - -(jao-shell-def-exec jao-xlock-screen "xdg-screensaver" "activate") -(jao-shell-def-exec jao-suspend "sudo" "systemctl" "suspend") -(jao-shell-def-exec jao-poweroff "sudo" "systemctl" "poweroff") - -(defun jao-lock-screen () - (interactive) - (if jao-wayland-enabled - (shell-command "swaylock -i ~/.lockimage") - (jao-xlock-screen))) - -(transient-define-prefix jao-transient-sleep () - ["Sleep" - ("l" "lock screen" jao-lock-screen) - ("z" "sleep" jao-suspend) - ("u" (lambda () - (if (jao-screensaver-enabled) "suspend screensaver" "resume screensaver")) - jao-screensaver-toggle) - ("poof" "power-off" jao-poweroff)]) - -;;; X clipboard -(setq select-enable-clipboard t - select-enable-primary t - selection-timeout 100 - xterm-select-active-regions t) - -(use-package xclip - :ensure t - :init (setq xclip-method (if jao-wayland-enabled 'wl-copy 'xclip))) - -(unless (display-graphic-p) (xclip-mode 1)) - -;;; pop-up frames -(defun jao-open-in-x-frame (&optional width height) - (interactive) - (make-frame `((window-system . x) - (name . "emacs popup") - (width . ,(or width (window-width))) - (height . ,(or height (window-height))))) - (define-key (current-local-map) "q" #'delete-frame)) - -;;; xmobar -(defun jao-xmobar-kill () - (interactive) - (shell-command "killall xmobar-single")) - -(defun jao-xmobar-restart () - (interactive) - (jao-xmobar-kill) - (start-process "" nil "xmobar-single" "-d")) - -(use-package tab-bar - :init (setq tab-bar-close-button-show nil - tab-bar-show (> emacs-major-version 28) - tab-bar-format ())) - -(use-package xmobar - :init (setq xmobar-tab-bar t - xmobar-tab-split "*" - xmobar-tab-bar-format - (if window-system - '(xmobar-left-string - tab-bar-format-align-right - xmobar-right-string) - '(xmobar-left-string - xmobar-elastic-space - xmobar-right-string)) - xmobar-command - (if window-system '("xmobar-emacs" "-TAnsi") "xmobar-emacs"))) - - -;;; - provide -(provide 'jao-custom-window-system) diff --git a/custom/jao-custom-x11.el b/custom/jao-custom-x11.el new file mode 100644 index 0000000..b72fe0b --- /dev/null +++ b/custom/jao-custom-x11.el @@ -0,0 +1,192 @@ +;; -*- lexical-binding: t -*- + +;;; x11 utils +(defun jao-xdotool (arg-or-wait &rest args) + (apply 'jao-shell-exec* + (if (stringp arg-or-wait) "xdotool" arg-or-wait) + (if (stringp arg-or-wait) arg-or-wait "xdotool") + args)) + +(defsubst jao-xdotool-string (&rest args) + (apply 'jao-shell-string "xdotool" args)) + +(defsubst jao-x11-focused-id () (jao-xdotool-string "getwindowfocus")) + +(defsubst jao-x11-window-name (&optional wid) + (jao-xdotool-string "getwindowname" (or wid (jao-x11-focused-id)))) + +(defsubst jao-x11-search-window (title) + (jao-xdotool-string "search" "--name" title)) + +(defsubst jao-x11-goto-ws (n) (jao-xdotool t "set_desktop" (format "%s" n))) + +;;; exwm +(defun jao-exwm-enable () + (require 'jao-custom-exwm) + (setq jao-exwm-enabled t) + (display-time-mode -1) + (jao-ednc-setup 95) + (x-change-window-property "_XMONAD_TRAYPAD" "" nil nil nil nil 0) + (jao-mode-line-add-to-minibuffer-left 90) + (jao-xmobar-restart) + (jao-trisect t)) + +;;; xmonad +(defun jao-xmonad-enable () + (setq jao-browse-doc-use-emacs-p (display-graphic-p)) + (setq jao-mode-line-in-minibuffer nil) + (display-battery-mode -1) + (jao-trisect) + (message "Welcome to xmonad")) + +(when jao-xmonad-enabled + (add-hook 'after-init-hook #'jao-xmonad-enable)) + +;;; wayland + +(use-package jao-wayland :demand t) + +(defun jao-wayland-enable () + (interactive) + (defalias 'x-change-window-property #'ignore) + (jao-trisect) + (message "Welcome to wayland")) + +(defun jao-river-enable () + (jao-wayland-enable) + (when (jao-shell-running-p "i3bar-river") + (jao-tracking-set-log "")) + (message "Welcome to river")) + +(when jao-river-enabled + (add-hook 'after-init-hook #'jao-river-enable t)) + +(when jao-sway-enabled + (add-hook 'after-init-hook #'jao-wayland-enable t)) + +;;; wallpaper +(defvar jao-wallpaper-dir "~/.wallpapers/") + +(defvar jao-wallpaper-random-candidates + '("wallpaper.jpg" "wallpaper2.jpg")) + +(defvar jao-wallpaper-random-candidates-light + '("wallpaper.jpg" "wallpaper2.jpg")) + +(defvar jao-wallpaper-random-wake t + "Set to t for getting a new wallpaper on awaking from sleep") + +(defun jao-set-wallpaper (&optional path) + (interactive) + (let ((current (format "~/.wallpaper.%s" (jao-colors-scheme)))) + (when-let ((f (or (and path (expand-file-name path)) + (read-file-name "Image: " + jao-wallpaper-dir + (file-symlink-p current) + t)))) + (make-symbolic-link f current t) + (cond (jao-river-enabled (jao-river-set-wallpaper f)) + (jao-sway-enabled (jao-sway-set-wallpaper f)) + (t (shell-command-to-string (format "xwallpaper --zoom %s" f))))))) + +(defun jao-set-random-wallpaper () + (interactive) + (when (or (called-interactively-p 'interactive) + jao-wallpaper-random-wake) + (let* ((ws (if (jao-colors-scheme-dark-p) + jao-wallpaper-random-candidates + jao-wallpaper-random-candidates-light)) + (f (seq-random-elt ws))) + (jao-set-wallpaper (expand-file-name f jao-wallpaper-dir)) + (message "%s" f)))) + +(add-to-list 'jao-sleep-awake-functions #'jao-set-random-wallpaper) + +;;; screensaver and lock +(defun jao-screensaver-enabled () + (string= (jao-shell-string "xdg-screensaver status") "enabled")) + +(defvar jao-screensaver--wid nil) +(defun jao-screensaver-toggle () + (interactive) + (if (jao-screensaver-enabled) + (let ((wid (jao-x11-focused-id))) + (setq jao-screensaver--wid wid) + (jao-shell-exec* t "xdg-screensaver" "suspend" wid)) + (jao-shell-exec* t "xdg-screensaver" "resume" jao-screensaver--wid) + (setq jao-screensaver--wid nil)) + (jao-notify (format "Screensaver %s" + (jao-shell-string "xdg-screensaver status")))) + +(jao-shell-def-exec jao-xlock-screen "xdg-screensaver" "activate") +(jao-shell-def-exec jao-suspend "sudo" "systemctl" "suspend") +(jao-shell-def-exec jao-poweroff "sudo" "systemctl" "poweroff") + +(defun jao-lock-screen () + (interactive) + (if jao-wayland-enabled + (shell-command "swaylock -i ~/.lockimage") + (jao-xlock-screen))) + +(transient-define-prefix jao-transient-sleep () + ["Sleep" + ("l" "lock screen" jao-lock-screen) + ("z" "sleep" jao-suspend) + ("u" (lambda () + (if (jao-screensaver-enabled) "suspend screensaver" "resume screensaver")) + jao-screensaver-toggle) + ("poof" "power-off" jao-poweroff)]) + +;;; X clipboard +(setq select-enable-clipboard t + select-enable-primary t + selection-timeout 100 + xterm-select-active-regions t) + +(use-package xclip + :ensure t + :init (setq xclip-method (if jao-wayland-enabled 'wl-copy 'xclip))) + +(unless (display-graphic-p) (xclip-mode 1)) + +;;; pop-up frames +(defun jao-open-in-x-frame (&optional width height) + (interactive) + (make-frame `((window-system . x) + (name . "emacs popup") + (width . ,(or width (window-width))) + (height . ,(or height (window-height))))) + (define-key (current-local-map) "q" #'delete-frame)) + +;;; xmobar +(defun jao-xmobar-kill () + (interactive) + (shell-command "killall xmobar-single")) + +(defun jao-xmobar-restart () + (interactive) + (jao-xmobar-kill) + (start-process "" nil "xmobar-single" "-d")) + +(use-package tab-bar + :init (setq tab-bar-close-button-show nil + tab-bar-show (> emacs-major-version 28) + tab-bar-format ())) + +(use-package xmobar + :init (setq xmobar-tab-bar t + xmobar-tab-split "*" + xmobar-tab-bar-format + (if window-system + '(xmobar-left-string + tab-bar-format-align-right + xmobar-right-string) + '(xmobar-left-string + xmobar-elastic-space + xmobar-right-string)) + xmobar-command + (if window-system '("xmobar-emacs" "-TAnsi") "xmobar-emacs"))) + + +;;; - provide +(provide 'jao-custom-x11) diff --git a/init.el b/init.el index 8660ed9..0ca0161 100644 --- a/init.el +++ b/init.el @@ -1656,7 +1656,24 @@ ;;; Graphical window system -(jao-when-linux (require 'jao-custom-window-system)) +(defvar jao-exwm-enabled nil) +(defun jao-exwm-enabled-p () jao-exwm-enabled) + +(defvar jao-xmonad-enabled + (jao-when-linux (string= "xmonad" (or (getenv "wm") "")))) +(defun jao-xmonad-enabled-p () jao-xmonad-enabled) + +(defvar jao-wayland-enabled + (jao-when-linux (string= "wayland" (or (getenv "XDG_SESSION_TYPE") "")))) + +(defvar jao-river-enabled + (jao-when-linux (jao-shell-running-p "river"))) + +(jao-when-darwin + (defun jao-wayland-enabled-p () nil) + (defun jao-river-enabled-p () nil)) + +(jao-when-linux (require 'jao-custom-x11)) ;;; Global transients (defun jao-list-packages () -- cgit v1.2.3