fix: emacs popup frames resizing other windows

This commit is contained in:
Leon Schwarzäugl 2025-08-09 14:30:13 +02:00
parent 91334e26a5
commit 5440fd2c8a
Signed by: swarsel
GPG key ID: 26A54C31F2A4FD84
3 changed files with 100 additions and 53 deletions

View file

@ -13033,9 +13033,10 @@ Currently, I am too lazy to explain every option here, but most of it is very se
"${modifier}+Shift+F12" = "move scratchpad"; "${modifier}+Shift+F12" = "move scratchpad";
"${modifier}+F12" = "scratchpad show"; "${modifier}+F12" = "scratchpad show";
"${modifier}+Shift+c" = "exec qalculate-gtk"; "${modifier}+Shift+c" = "exec qalculate-gtk";
"${modifier}+c" = "emacsclient -e '(prot-window-popup-org-capture)'"; "${modifier}+c" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-org-capture)'";
"${modifier}+Shift+m" = "emacsclient -e '(prot-window-popup-mu4e)'"; "${modifier}+t" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-org-agenda)'";
"${modifier}+Shift+a" = "emacsclient -e '(prot-window-popup-swarsel/open-calendar)'"; "${modifier}+Shift+m" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-mu4e)'";
"${modifier}+Shift+a" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-swarsel/open-calendar)'";
"${modifier}+p" = "exec pass-fuzzel"; "${modifier}+p" = "exec pass-fuzzel";
"${modifier}+o" = "exec pass-fuzzel --otp"; "${modifier}+o" = "exec pass-fuzzel --otp";
"${modifier}+Shift+p" = "exec pass-fuzzel --type"; "${modifier}+Shift+p" = "exec pass-fuzzel --type";
@ -13168,7 +13169,8 @@ Currently, I am too lazy to explain every option here, but most of it is very se
{ title = "^Add$"; } { title = "^Add$"; }
{ title = "^Picture-in-Picture$"; } { title = "^Picture-in-Picture$"; }
{ title = "Syncthing Tray"; } { title = "Syncthing Tray"; }
{ title = "Emacs Popup Frame"; } { title = "^Emacs Popup Frame$"; }
{ title = "^Emacs Popup Anchor$"; }
{ title = "^spotifytui$"; } { title = "^spotifytui$"; }
{ title = "^kittyterm$"; } { title = "^kittyterm$"; }
{ app_id = "vesktop"; } { app_id = "vesktop"; }
@ -13219,6 +13221,18 @@ Currently, I am too lazy to explain every option here, but most of it is very se
title = "^Picture-in-Picture$"; title = "^Picture-in-Picture$";
}; };
} }
{
command = "resize set width 60 ppt height 60 ppt, opacity 0.99, sticky enable";
criteria = {
title = "^Emacs Popup Frame$";
};
}
{
command = "move container to scratchpad";
criteria = {
title = "^Emacs Popup Anchor$";
};
}
{ {
command = "resize set width 60 ppt height 60 ppt, opacity 0.8, sticky enable, border normal, move container to scratchpad"; command = "resize set width 60 ppt height 60 ppt, opacity 0.8, sticky enable, border normal, move container to scratchpad";
criteria = { criteria = {
@ -20465,6 +20479,7 @@ This sets up the =dashboard=, which is really quite useless. But, it looks cool
(add-hook 'comint-output-filter-functions 'comint-truncate-buffer) (add-hook 'comint-output-filter-functions 'comint-truncate-buffer)
#+end_src #+end_src
*** Popup frames *** Popup frames
#+begin_src emacs-lisp #+begin_src emacs-lisp
@ -20481,14 +20496,19 @@ This sets up the =dashboard=, which is really quite useless. But, it looks cool
,(format "Run `%s' in a popup frame with `prot-window-popup-frame' parameter. ,(format "Run `%s' in a popup frame with `prot-window-popup-frame' parameter.
Also see `prot-window-delete-popup-frame'." command) Also see `prot-window-delete-popup-frame'." command)
(interactive) (interactive)
(let ((frame (make-frame '((prot-window-popup-frame . t))))) (let ((frame (make-frame '((prot-window-popup-frame . t)
(title . "Emacs Popup Frame")))))
(unwind-protect
(progn
(select-frame frame) (select-frame frame)
(modify-frame-parameters nil '((title . "Emacs Popup Frame")))
(switch-to-buffer " prot-window-hidden-buffer-for-popup-frame") (switch-to-buffer " prot-window-hidden-buffer-for-popup-frame")
(condition-case nil (condition-case nil
(call-interactively ',command) (call-interactively ',command)
((quit error user-error) ((quit error user-error)
(delete-frame frame)))))) (delete-frame frame))))
(dolist (fr (frame-list))
(when (string= (frame-parameter fr 'name) "Emacs Popup Anchor")
(delete-frame fr)))))))
(declare-function org-capture "org-capture" (&optional goto keys)) (declare-function org-capture "org-capture" (&optional goto keys))
(defvar org-capture-after-finalize-hook) (defvar org-capture-after-finalize-hook)
@ -20506,6 +20526,10 @@ This sets up the =dashboard=, which is really quite useless. But, it looks cool
(prot-window-define-with-popup-frame swarsel/open-calendar) (prot-window-define-with-popup-frame swarsel/open-calendar)
(advice-add 'bury-buffer :after #'prot-window-delete-popup-frame) (advice-add 'bury-buffer :after #'prot-window-delete-popup-frame)
(declare-function org-agenda "org-agenda" (&optional goto keys))
;;;###autoload (autoload 'prot-window-popup-org-agenda "prot-window")
(prot-window-define-with-popup-frame org-agenda)
#+end_src #+end_src
* Appendix A: Noweb-Ref blocks * Appendix A: Noweb-Ref blocks

View file

@ -1712,7 +1712,7 @@ create a new one."
(defun prot-window-delete-popup-frame (&rest _) (defun prot-window-delete-popup-frame (&rest _)
"Kill selected selected frame if it has parameter `prot-window-popup-frame'. "Kill selected selected frame if it has parameter `prot-window-popup-frame'.
Use this function via a hook." Use this function via a hook."
(when (frame-parameter nil 'prot-window-popup-frame) (when (frame-parameter nil 'prot-window-popup-frame)
(delete-frame))) (delete-frame)))
@ -1723,27 +1723,36 @@ Make the new frame have the `prot-window-popup-frame' parameter."
,(format "Run `%s' in a popup frame with `prot-window-popup-frame' parameter. ,(format "Run `%s' in a popup frame with `prot-window-popup-frame' parameter.
Also see `prot-window-delete-popup-frame'." command) Also see `prot-window-delete-popup-frame'." command)
(interactive) (interactive)
(let ((frame (make-frame '((prot-window-popup-frame . t))))) (let ((frame (make-frame '((prot-window-popup-frame . t)
(title . "Emacs Popup Frame")))))
(unwind-protect
(progn
(select-frame frame) (select-frame frame)
(modify-frame-parameters nil '((title . "Emacs Popup Frame")))
(switch-to-buffer " prot-window-hidden-buffer-for-popup-frame") (switch-to-buffer " prot-window-hidden-buffer-for-popup-frame")
(condition-case nil (condition-case nil
(call-interactively ',command) (call-interactively ',command)
((quit error user-error) ((quit error user-error)
(delete-frame frame)))))) (delete-frame frame))))
(dolist (fr (frame-list))
(when (string= (frame-parameter fr 'name) "Emacs Popup Anchor")
(delete-frame fr)))))))
(declare-function org-capture "org-capture" (&optional goto keys)) (declare-function org-capture "org-capture" (&optional goto keys))
(defvar org-capture-after-finalize-hook) (defvar org-capture-after-finalize-hook)
;;;###autoload (autoload 'prot-window-popup-org-capture "prot-window") ;;;###autoload (autoload 'prot-window-popup-org-capture "prot-window")
(prot-window-define-with-popup-frame org-capture) (prot-window-define-with-popup-frame org-capture)
(add-hook 'org-capture-after-finalize-hook #'prot-window-delete-popup-frame) (add-hook 'org-capture-after-finalize-hook #'prot-window-delete-popup-frame)
(declare-function mu4e "mu4e" (&optional goto keys)) (declare-function mu4e "mu4e" (&optional goto keys))
;;;###autoload (autoload 'prot-window-popup-mu4e "prot-window") ;;;###autoload (autoload 'prot-window-popup-mu4e "prot-window")
(prot-window-define-with-popup-frame mu4e) (prot-window-define-with-popup-frame mu4e)
(advice-add 'mu4e-quit :after #'prot-window-delete-popup-frame) (advice-add 'mu4e-quit :after #'prot-window-delete-popup-frame)
(declare-function swarsel/open-calendar "swarsel/open-calendar" (&optional goto keys)) (declare-function swarsel/open-calendar "swarsel/open-calendar" (&optional goto keys))
;;;###autoload (autoload 'prot-window-popup-swarsel/open-calendar "prot-window") ;;;###autoload (autoload 'prot-window-popup-swarsel/open-calendar "prot-window")
(prot-window-define-with-popup-frame swarsel/open-calendar) (prot-window-define-with-popup-frame swarsel/open-calendar)
(advice-add 'bury-buffer :after #'prot-window-delete-popup-frame) (advice-add 'bury-buffer :after #'prot-window-delete-popup-frame)
(declare-function org-agenda "org-agenda" (&optional goto keys))
;;;###autoload (autoload 'prot-window-popup-org-agenda "prot-window")
(prot-window-define-with-popup-frame org-agenda)

View file

@ -126,9 +126,10 @@ in
"${modifier}+Shift+F12" = "move scratchpad"; "${modifier}+Shift+F12" = "move scratchpad";
"${modifier}+F12" = "scratchpad show"; "${modifier}+F12" = "scratchpad show";
"${modifier}+Shift+c" = "exec qalculate-gtk"; "${modifier}+Shift+c" = "exec qalculate-gtk";
"${modifier}+c" = "emacsclient -e '(prot-window-popup-org-capture)'"; "${modifier}+c" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-org-capture)'";
"${modifier}+Shift+m" = "emacsclient -e '(prot-window-popup-mu4e)'"; "${modifier}+t" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-org-agenda)'";
"${modifier}+Shift+a" = "emacsclient -e '(prot-window-popup-swarsel/open-calendar)'"; "${modifier}+Shift+m" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-mu4e)'";
"${modifier}+Shift+a" = "exec emacsclient -cF '((name . \"Emacs Popup Anchor\"))' -e '(prot-window-popup-swarsel/open-calendar)'";
"${modifier}+p" = "exec pass-fuzzel"; "${modifier}+p" = "exec pass-fuzzel";
"${modifier}+o" = "exec pass-fuzzel --otp"; "${modifier}+o" = "exec pass-fuzzel --otp";
"${modifier}+Shift+p" = "exec pass-fuzzel --type"; "${modifier}+Shift+p" = "exec pass-fuzzel --type";
@ -261,7 +262,8 @@ in
{ title = "^Add$"; } { title = "^Add$"; }
{ title = "^Picture-in-Picture$"; } { title = "^Picture-in-Picture$"; }
{ title = "Syncthing Tray"; } { title = "Syncthing Tray"; }
{ title = "Emacs Popup Frame"; } { title = "^Emacs Popup Frame$"; }
{ title = "^Emacs Popup Anchor$"; }
{ title = "^spotifytui$"; } { title = "^spotifytui$"; }
{ title = "^kittyterm$"; } { title = "^kittyterm$"; }
{ app_id = "vesktop"; } { app_id = "vesktop"; }
@ -312,6 +314,18 @@ in
title = "^Picture-in-Picture$"; title = "^Picture-in-Picture$";
}; };
} }
{
command = "resize set width 60 ppt height 60 ppt, opacity 0.99, sticky enable";
criteria = {
title = "^Emacs Popup Frame$";
};
}
{
command = "move container to scratchpad";
criteria = {
title = "^Emacs Popup Anchor$";
};
}
{ {
command = "resize set width 60 ppt height 60 ppt, opacity 0.8, sticky enable, border normal, move container to scratchpad"; command = "resize set width 60 ppt height 60 ppt, opacity 0.8, sticky enable, border normal, move container to scratchpad";
criteria = { criteria = {