diff options
author | jao <jao@gnu.org> | 2025-09-15 03:01:58 +0100 |
---|---|---|
committer | jao <jao@gnu.org> | 2025-09-15 03:01:58 +0100 |
commit | 79fee39ab74d0ebb89a559d7d1b8fdb6222e4a41 (patch) | |
tree | 9923f747cdbc0093965ecbb824365c412aa534d7 /custom/jao-custom-window-system.el | |
parent | 89aef17265d251a7e279bb890d903f34b288b792 (diff) | |
download | elibs-79fee39ab74d0ebb89a559d7d1b8fdb6222e4a41.tar.gz elibs-79fee39ab74d0ebb89a559d7d1b8fdb6222e4a41.tar.bz2 |
macos compatibility
Diffstat (limited to 'custom/jao-custom-window-system.el')
-rw-r--r-- | custom/jao-custom-window-system.el | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/custom/jao-custom-window-system.el b/custom/jao-custom-window-system.el new file mode 100644 index 0000000..32b3578 --- /dev/null +++ b/custom/jao-custom-window-system.el @@ -0,0 +1,198 @@ +;; -*- 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) |