[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.