emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/posframe 62ca653b72 1/2: Add posframe--find-existing-po


From: ELPA Syncer
Subject: [elpa] externals/posframe 62ca653b72 1/2: Add posframe--find-existing-posframe and use it.
Date: Fri, 7 Jan 2022 01:57:42 -0500 (EST)

branch: externals/posframe
commit 62ca653b7256b6ad88cd7768d370eea483931168
Author: Feng Shu <tumashu@163.com>
Commit: Feng Shu <tumashu@163.com>

    Add posframe--find-existing-posframe and use it.
    
            * posframe.el (posframe--find-existing-posframe): New function.
            (posframe-delete-frame)
            (posframe--create-posframe): Use posframe--find-existing-posframe.
---
 posframe.el | 43 ++++++++++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 13 deletions(-)

diff --git a/posframe.el b/posframe.el
index 7f48cecd97..1f869d395e 100644
--- a/posframe.el
+++ b/posframe.el
@@ -203,7 +203,12 @@ ACCEPT-FOCUS."
       (add-hook 'kill-buffer-hook #'posframe-auto-delete nil t)
 
       ;; Create child-frame
-      (unless (and (frame-live-p posframe--frame)
+      (unless (and (frame-live-p (or posframe--frame
+                                     ;; Sometimes, the buffer of posframe will 
be
+                                     ;; recreated by other packages,
+                                     ;; so we should reuse exist
+                                     ;; posframe as far as possible.
+                                     (posframe--find-existing-posframe 
buffer-or-name)))
                    ;; For speed reason, posframe will reuse
                    ;; existing frame at possible, but when
                    ;; user change args, recreating frame
@@ -989,18 +994,30 @@ posframe is very very slowly, `posframe-hide' is more 
useful."
 (defun posframe-delete-frame (buffer-or-name)
   "Delete posframe pertaining to BUFFER-OR-NAME.
 BUFFER-OR-NAME can be a buffer or a buffer name."
-  (dolist (frame (frame-list))
-    (let ((buffer-info (frame-parameter frame 'posframe-buffer))
-          (buffer (get-buffer buffer-or-name)))
-      (when (or (equal buffer-or-name (car buffer-info))
-                (equal buffer-or-name (cdr buffer-info)))
-        (when buffer
-          (with-current-buffer buffer
-            (dolist (timer '(posframe--refresh-timer
-                             posframe--timeout-timer))
-              (when (timerp timer)
-                (cancel-timer timer)))))
-        (delete-frame frame)))))
+  (let* ((buffer (get-buffer buffer-or-name))
+         (posframe (posframe--find-existing-posframe buffer))
+         ;; NOTE: `delete-frame' runs ‘delete-frame-functions’ before
+         ;; actually deleting the frame, unless the frame is a
+         ;; tooltip, posframe is a child-frame, but its function like
+         ;; a tooltip.
+         (delete-frame-functions nil))
+    (when posframe
+      (when (buffer-live-p buffer)
+        (with-current-buffer buffer
+          (dolist (timer '(posframe--refresh-timer
+                           posframe--timeout-timer))
+            (when (timerp timer)
+              (cancel-timer timer)))))
+      (delete-frame posframe))))
+
+(defun posframe--find-existing-posframe (buffer-or-name)
+  "Find existing posframe of BUFFER-OR-NAME."
+  (cl-find-if
+   (lambda (frame)
+     (let ((buffer-info (frame-parameter frame 'posframe-buffer)))
+       (or (equal buffer-or-name (car buffer-info))
+           (equal buffer-or-name (cdr buffer-info)))))
+   (frame-list)))
 
 (defun posframe--kill-buffer (buffer-or-name)
   "Kill posframe's buffer: BUFFER-OR-NAME.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]