-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
tweak(lib): interactively set opacity for current and future frames #8395
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
(defun doom/set-frame-opacity (opacity &optional all-frames?)
"Interactively change the current frame's opacity.
OPACITY is an integer between 0 to 100, inclusive. If ALL-FRAMES? is non-nil,
apply this to all existing frames, as well as future frames."
(interactive (list 'interactive current-prefix-arg))
(let* ((parameter
(if (eq window-system 'pgtk)
'alpha-background
'alpha))
(opacity
(if (eq opacity 'interactive)
(read-number "Opacity (0-100): "
(or (frame-parameter nil parameter)
100))
opacity)))
(if (not all-frames?)
(set-frame-parameter nil parameter opacity)
(modify-all-frames-parameters (cons parameter opacity))
(setf (alist-get parameter default-frame-alist) opacity)))) However, from the way you describe it, ;;; add to $DOOMDIR/config.el
(add-to-list 'default-frame-alist '(alpha-background . 95)) Interactive commands (any command whose name is formatted as |
085f2ef
to
84ee9eb
Compare
dcd4f9a
to
4dee5ed
Compare
@hlissner Thanks a lot for the feedback! Directly changing The snippet you sent with the new API for After some digging, I noticed that Evaluating Debugger entered--Lisp error: (wrong-type-argument listp (alpha-background . 70))
modify-all-frames-parameters((alpha-background . 70))
(if (not all-frames?) (set-frame-parameter nil parameter opacity) (modify-all-frames-parameters (cons parameter opacity)) (let* ((p (assq parameter default-frame-alist)) (v opacity)) (progn (if p (setcdr p v) (setq default-frame-alist (cons (setq p (cons parameter v)) default-frame-alist))) v)))
(let* ((parameter (if (eq window-system 'pgtk) 'alpha-background 'alpha)) (opacity (if (eq opacity 'interactive) (read-number "Opacity (0-100): " (or (frame-parameter nil parameter) 100)) opacity))) (if (not all-frames?) (set-frame-parameter nil parameter opacity) (modify-all-frames-parameters (cons parameter opacity)) (let* ((p (assq parameter default-frame-alist)) (v opacity)) (progn (if p (setcdr p v) (setq default-frame-alist (cons (setq p ...) default-frame-alist))) v))))
doom/set-frame-opacity(70 t)
eval-region(298 328 #<buffer *+eval-output*> read) ; Reading at buffer position 298
(let ((doom-context doom-context)) (doom-context-push 'eval) (eval-region beg end buffer load-read-function))
(let ((doom-module-context (let ((key (doom-module-from-path (or ... default-directory)))) (if key (doom-module-context key) (let ((index nil) (key nil) (path nil) (flags nil) (features nil)) (progn (record ... index key path flags features))))))) (if (and (not doom-inhibit-log) (or (not noninteractive) (<= 2 doom-log-level))) (progn (doom--log 2 ":context:module: =%s" doom-module-context))) (let ((doom-context doom-context)) (doom-context-push 'eval) (eval-region beg end buffer load-read-function)) (save-current-buffer (set-buffer buffer) (let ((pp-max-width nil)) (require 'pp) (pp-buffer) (replace-regexp-in-string "\\\\n" "\n" (string-trim-left (buffer-string))))))
(condition-case e (let ((doom-module-context (let ((key (doom-module-from-path ...))) (if key (doom-module-context key) (let (... ... ... ... ...) (progn ...)))))) (if (and (not doom-inhibit-log) (or (not noninteractive) (<= 2 doom-log-level))) (progn (doom--log 2 ":context:module: =%s" doom-module-context))) (let ((doom-context doom-context)) (doom-context-push 'eval) (eval-region beg end buffer load-read-function)) (save-current-buffer (set-buffer buffer) (let ((pp-max-width nil)) (require 'pp) (pp-buffer) (replace-regexp-in-string "\\\\n" "\n" (string-trim-left (buffer-string)))))) ((debug error) (format "ERROR: %s" e)))
(unwind-protect (condition-case e (let ((doom-module-context (let ((key ...)) (if key (doom-module-context key) (let ... ...))))) (if (and (not doom-inhibit-log) (or (not noninteractive) (<= 2 doom-log-level))) (progn (doom--log 2 ":context:module: =%s" doom-module-context))) (let ((doom-context doom-context)) (doom-context-push 'eval) (eval-region beg end buffer load-read-function)) (save-current-buffer (set-buffer buffer) (let ((pp-max-width nil)) (require 'pp) (pp-buffer) (replace-regexp-in-string "\\\\n" "\n" (string-trim-left (buffer-string)))))) ((debug error) (format "ERROR: %s" e))) (kill-buffer buffer))
(save-current-buffer (set-buffer working-buffer) (unwind-protect (condition-case e (let ((doom-module-context (let (...) (if key ... ...)))) (if (and (not doom-inhibit-log) (or (not noninteractive) (<= 2 doom-log-level))) (progn (doom--log 2 ":context:module: =%s" doom-module-context))) (let ((doom-context doom-context)) (doom-context-push 'eval) (eval-region beg end buffer load-read-function)) (save-current-buffer (set-buffer buffer) (let ((pp-max-width nil)) (require 'pp) (pp-buffer) (replace-regexp-in-string "\\\\n" "\n" (string-trim-left ...))))) ((debug error) (format "ERROR: %s" e))) (kill-buffer buffer)))
(let ((buffer (generate-new-buffer " *+eval-output*")) (working-buffer (or +emacs-lisp-eval-working-buffer (current-buffer))) (debug-on-error t)) (if (buffer-live-p working-buffer) nil (progn (setq +emacs-lisp-eval-working-buffer nil) (setq working-buffer (current-buffer)))) (save-current-buffer (set-buffer working-buffer) (unwind-protect (condition-case e (let ((doom-module-context (let ... ...))) (if (and (not doom-inhibit-log) (or ... ...)) (progn (doom--log 2 ":context:module: =%s" doom-module-context))) (let ((doom-context doom-context)) (doom-context-push 'eval) (eval-region beg end buffer load-read-function)) (save-current-buffer (set-buffer buffer) (let (...) (require ...) (pp-buffer) (replace-regexp-in-string "\\\\n" "\n" ...)))) ((debug error) (format "ERROR: %s" e))) (kill-buffer buffer))))
(string-trim-right (let ((buffer (generate-new-buffer " *+eval-output*")) (working-buffer (or +emacs-lisp-eval-working-buffer (current-buffer))) (debug-on-error t)) (if (buffer-live-p working-buffer) nil (progn (setq +emacs-lisp-eval-working-buffer nil) (setq working-buffer (current-buffer)))) (save-current-buffer (set-buffer working-buffer) (unwind-protect (condition-case e (let ((doom-module-context ...)) (if (and ... ...) (progn ...)) (let (...) (doom-context-push ...) (eval-region beg end buffer load-read-function)) (save-current-buffer (set-buffer buffer) (let ... ... ... ...))) ((debug error) (format "ERROR: %s" e))) (kill-buffer buffer)))))
(+eval-display-results (string-trim-right (let ((buffer (generate-new-buffer " *+eval-output*")) (working-buffer (or +emacs-lisp-eval-working-buffer (current-buffer))) (debug-on-error t)) (if (buffer-live-p working-buffer) nil (progn (setq +emacs-lisp-eval-working-buffer nil) (setq working-buffer (current-buffer)))) (save-current-buffer (set-buffer working-buffer) (unwind-protect (condition-case e (let (...) (if ... ...) (let ... ... ...) (save-current-buffer ... ...)) ((debug error) (format "ERROR: %s" e))) (kill-buffer buffer))))) (current-buffer))
+emacs-lisp-eval(298 328)
funcall(+emacs-lisp-eval 298 328)
(if runner (funcall runner beg end) (let ((quickrun-option-cmdkey lang)) (quickrun-region beg end)))
(let* ((runner (and t (or (alist-get runner-major-mode +eval-runners) (and (require 'quickrun nil t) (equal (setq lang ...) "emacs") (alist-get 'emacs-lisp-mode +eval-runners)))))) (if runner (funcall runner beg end) (let ((quickrun-option-cmdkey lang)) (quickrun-region beg end))))
(let (lang) (let* ((runner (and t (or (alist-get runner-major-mode +eval-runners) (and (require ... nil t) (equal ... "emacs") (alist-get ... +eval-runners)))))) (if runner (funcall runner beg end) (let ((quickrun-option-cmdkey lang)) (quickrun-region beg end)))))
(cond ((if (fboundp '+eval--ensure-in-repl-buffer) (condition-case nil (progn (get-buffer-window (or (+eval--ensure-in-repl-buffer) t))) (error nil))) (funcall (or (plist-get (cdr (alist-get runner-major-mode +eval-repls)) :send-region) #'+eval/send-region-to-repl) beg end)) ((let (lang) (let* ((runner (and t (or ... ...)))) (if runner (funcall runner beg end) (let ((quickrun-option-cmdkey lang)) (quickrun-region beg end)))))))
(let ((load-file-name buffer-file-name) (load-true-file-name (or buffer-file-truename (if buffer-file-name (file-truename buffer-file-name)))) (runner-major-mode (or runner-major-mode major-mode))) (cond ((if (fboundp '+eval--ensure-in-repl-buffer) (condition-case nil (progn (get-buffer-window (or ... t))) (error nil))) (funcall (or (plist-get (cdr (alist-get runner-major-mode +eval-repls)) :send-region) #'+eval/send-region-to-repl) beg end)) ((let (lang) (let* ((runner (and t ...))) (if runner (funcall runner beg end) (let (...) (quickrun-region beg end))))))))
+eval-region-as-major-mode(298 328)
+eval/region(298 328)
(if (and evil-inhibit-operator (called-interactively-p 'any)) nil (+eval/region beg end))
(let ((evil-inhibit-operator evil-inhibit-operator-value) (end-marker (make-marker))) (set-marker end-marker end) (if (and evil-inhibit-operator (called-interactively-p 'any)) nil (+eval/region beg end)) (evil-set-marker 91 (or beg (point-max))) (evil-set-marker 93 (max (or beg (point-max)) (1- (or (marker-position end-marker) (point-max))))) (set-marker end-marker nil))
(unwind-protect (let ((evil-inhibit-operator evil-inhibit-operator-value) (end-marker (make-marker))) (set-marker end-marker end) (if (and evil-inhibit-operator (called-interactively-p 'any)) nil (+eval/region beg end)) (evil-set-marker 91 (or beg (point-max))) (evil-set-marker 93 (max (or beg (point-max)) (1- (or (marker-position end-marker) (point-max))))) (set-marker end-marker nil)) (setq evil-inhibit-operator-value nil))
#f(lambda (beg end) [t] "Evaluate selection or sends it to the open REPL, if available." (interactive (let* ((props (evil-command-properties '+eval:region)) (evil-operator-range-motion (let ((p (plist-member props :motion))) (if p (progn (or (car (cdr p)) #'undefined))))) (evil-operator-range-type (plist-get props :type)) evil-operator-range-beginning evil-operator-range-end evil-inhibit-operator) (progn (setq evil-inhibit-operator-value nil) (setq evil-this-operator this-command) (setq evil-operator-start-col (current-column))) (prog1 (evil-operator-range) (setq evil-inhibit-operator-value evil-inhibit-operator) (if nil (if (evil-visual-state-p) (progn (evil-visual-expand-region))) (setq deactivate-mark t)) (cond ((evil-visual-state-p) (evil-visual-rotate 'upper-left)) ((plist-get props :move-point) (if evil-operator-range-beginning (progn (goto-char evil-operator-range-beginning)))))))) (unwind-protect (let ((evil-inhibit-operator evil-inhibit-operator-value) (end-marker (make-marker))) (set-marker end-marker end) (if (and evil-inhibit-operator (called-interactively-p 'any)) nil (+eval/region beg end)) (evil-set-marker 91 (or beg (point-max))) (evil-set-marker 93 (max (or beg (point-max)) (1- (or (marker-position end-marker) (point-max))))) (set-marker end-marker nil)) (setq evil-inhibit-operator-value nil)))(298 328)
apply(#f(lambda (beg end) [t] "Evaluate selection or sends it to the open REPL, if available." (interactive (let* ((props (evil-command-properties '+eval:region)) (evil-operator-range-motion (let (...) (if p ...))) (evil-operator-range-type (plist-get props :type)) evil-operator-range-beginning evil-operator-range-end evil-inhibit-operator) (progn (setq evil-inhibit-operator-value nil) (setq evil-this-operator this-command) (setq evil-operator-start-col (current-column))) (prog1 (evil-operator-range) (setq evil-inhibit-operator-value evil-inhibit-operator) (if nil (if (evil-visual-state-p) (progn ...)) (setq deactivate-mark t)) (cond ((evil-visual-state-p) (evil-visual-rotate ...)) ((plist-get props :move-point) (if evil-operator-range-beginning ...)))))) (unwind-protect (let ((evil-inhibit-operator evil-inhibit-operator-value) (end-marker (make-marker))) (set-marker end-marker end) (if (and evil-inhibit-operator (called-interactively-p 'any)) nil (+eval/region beg end)) (evil-set-marker 91 (or beg (point-max))) (evil-set-marker 93 (max (or beg (point-max)) (1- (or ... ...)))) (set-marker end-marker nil)) (setq evil-inhibit-operator-value nil))) (298 328))
+eval:region(298 328)
funcall-interactively(+eval:region 298 328)
command-execute(+eval:region) generated May 17, 2025 19:04:40
system Pop!_OS 22.04 LTS Linux 6.12.10-76061203-generic x86_64
emacs 30.1 EMACSDIR=~/.config/emacs/ EMACS=/usr/local/bin/emacs
doom 3.0.0-pre PROFILE=_default@0 HEAD -> master b70d137f 2025-05-06 01:39:11
-0400 ~/.config/doom/
shell /bin/bash
features ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ
IMAGEMAGICK JPEG LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 MODULES
NATIVE_COMP NOTIFY INOTIFY PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3
THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER XIM GTK3 ZLIB
traits batch server-running envvar-file custom-file
modules :config use-package :input (layout +azerty) :completion (corfu +orderless
+icons) (vertico +icons +childframe) :ui doom doom-dashboard hl-todo
indent-guides ligatures modeline nav-flash ophints (popup +defaults) unicode
(vc-gutter +pretty) window-select workspaces :editor (evil +everywhere)
file-templates fold (format +onsave) multiple-cursors rotate-text snippets
word-wrap :emacs (dired +icons +dirvish) electric (ibuffer +icons) undo :term
vterm :checkers syntax (spell +flyspell) grammar :tools (debugger +lsp) ein
(eval +overlay) lookup (lsp +peek) magit pdf tree-sitter :lang (cc +lsp
+tree-sitter) emacs-lisp markdown (org +brain +roam2 +pretty +present
+pomodoro +dragndrop +journal +brain) plantuml (python +lsp +conda +ein
+tree-sitter) (rust +lsp +tree-sitter) sh :email (mu4e +org +gmail) :app
calendar everywhere (rss +org) :config literate (default +bindings
+smartparens)
packages (catppuccin-theme) (olivetti) (org-roam-ui) (org-modern) (cmake-ide) (gptel)
(bug-hunter) (consult-omni :type 'core :recipe '(:host github :repo
armindarvish/consult-omni :files (sources/*.el consult-omni.el
consult-omni-embark.el) :build t)) (compiler-explorer :recipe '(:host github
:repo mkcms/compiler-explorer.el :build t)) (devdocs) (spotify) (multi-vterm)
(whisper.el :recipe '(:host github :repo natrys/whisper.el))
elpa with-editor wfnames systemd helm-systemd helm-core helm async
I didn't know about the convention for the foo/bar functions. In that's the case and while we're at it, shouldn't we prompt the user for the (defun doom/set-frame-opacity (opacity &optional all-frames?)
"Interactively change the current and all new frames' opacity.
OPACITY is an integer between 0 to 100, inclusive. If nil, prompt user
for value and if it should be applied to future frames.
ALL-FRAMES? is an optional that if non-nil defines sets OPACITY to all
future frames."
(interactive '(interactive))
(setq prompt-user? (eq opacity 'interactive))
(let* ((parameter
(if (eq window-system 'pgtk)
'alpha-background
'alpha))
(opacity
(if prompt-user?
(read-number "Opacity (0-100): "
(or (frame-parameter nil parameter)
100))
opacity)))
;; current frame
(set-frame-parameter nil parameter opacity)
(if prompt-user?
(setq all-frames? (y-or-n-p (format "Apply opacity %d to all future frames? " opacity))))
;; future frames
(if all-frames?
(setf (alist-get parameter default-frame-alist) opacity)
(modify-all-frames-parameters `((,parameter . ,opacity)))))) |
Improves doom/set-frame-opacity by adding 2 non-conflicting ways of setting the opacity for new frames.
Context
I use Emacs in daemon mode and wanted a way to set opacity to all new Emacs frames as soon as they're spawned.
Analysis
doom/set-frame-opacity only sets the current frame's opacity, but all new frames are not affected by it, and I couldn't find any other readily available way to do so.
I found two workarounds:
(add-hook! 'server-after-make-frame-hook (doom/set-frame-opacity opacity))
Would be a nice addition to the documentation somewhere in the UI readme's FAQ, but from what I gathered docs are DNP until the doom modules refactor is finished.
Proposed by this PR.
Previous work on opacity handling
Testing
Tested on PopOS 22.04, Wayland session.