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

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

[elpa] externals/posframe 04b91d5 2/2: Merge pull request #70 from tumas


From: Feng Shu
Subject: [elpa] externals/posframe 04b91d5 2/2: Merge pull request #70 from tumashu/hide
Date: Thu, 13 Aug 2020 00:47:01 -0400 (EDT)

branch: externals/posframe
commit 04b91d507ba8509a43aa268cc8cdd3a190e05849
Merge: 6d604a7 9a6e21b
Author: tumashu <tumashu@163.com>
Commit: GitHub <noreply@github.com>

    Merge pull request #70 from tumashu/hide
    
    Provide argument which will cause posframe to hide when user switches the 
buffer #69
---
 posframe.el | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/posframe.el b/posframe.el
index 60f7aed..c3068ac 100644
--- a/posframe.el
+++ b/posframe.el
@@ -398,6 +398,7 @@ This posframe's buffer is BUFFER-OR-NAME."
                          timeout
                          refresh
                          accept-focus
+                         hidehandler
                          &allow-other-keys)
   "Pop up a posframe and show STRING at POSITION.
 
@@ -508,6 +509,18 @@ every REFRESH seconds.
 When ACCEPT-FOCUS is non-nil, posframe will accept focus.
 be careful, you may face some bugs when set it to non-nil.
 
+HIDEHANDLER is a function, when it return t, posframe will be
+hide when `post-command-hook' is executed, this function has a
+plist argument:
+
+  (:posframe-buffer xxx
+   :posframe-parent-buffer xxx)
+
+The builtin hidehandler functions are listed below:
+
+1. `posframe-hidehandler-when-buffer-switch'
+
+
 You can use `posframe-delete-all' to delete all posframes."
   (let* ((position (or (funcall posframe-arghandler buffer-or-name :position 
position) (point)))
          (poshandler (funcall posframe-arghandler buffer-or-name :poshandler 
poshandler))
@@ -535,6 +548,7 @@ You can use `posframe-delete-all' to delete all posframes."
          (timeout (funcall posframe-arghandler buffer-or-name :timeout 
timeout))
          (refresh (funcall posframe-arghandler buffer-or-name :refresh 
refresh))
          (accept-focus (funcall posframe-arghandler buffer-or-name 
:accept-focus accept-focus))
+         (hidehandler (funcall posframe-arghandler buffer-or-name :hidehandler 
hidehandler))
          ;;-----------------------------------------------------
          (buffer (get-buffer-create buffer-or-name))
          (parent-window (selected-window))
@@ -643,6 +657,13 @@ You can use `posframe-delete-all' to delete all posframes."
       ;; Force raise the current posframe.
       (raise-frame posframe--frame)
 
+      ;; Hide posframe when switch buffer
+      (let* ((parent-buffer (window-buffer parent-window))
+             (parent-buffer-name (buffer-name parent-buffer)))
+        (set-frame-parameter posframe--frame 'posframe-hidehandler hidehandler)
+        (set-frame-parameter posframe--frame 'posframe-parent-buffer
+                             (cons parent-buffer-name parent-buffer)))
+
       ;; Return posframe
       posframe)))
 
@@ -813,6 +834,32 @@ BUFFER-OR-NAME can be a buffer or a buffer name."
                   (equal buffer-or-name (cdr buffer-info)))
           (posframe--make-frame-invisible frame))))))
 
+(defun posframe-run-hidehandler ()
+  "Run posframe hidehandler. this function is used in `post-command-hook'."
+  (while-no-input
+    (redisplay)
+    (dolist (frame (frame-list))
+      (let ((hidehandler (frame-parameter frame 'posframe-hidehandler))
+            (buffer (frame-parameter frame 'posframe-buffer))
+            (parent-buffer (frame-parameter frame 'posframe-parent-buffer)))
+        (when (and hidehandler
+                   (funcall hidehandler
+                            (list
+                             :posframe-buffer buffer
+                             :posframe-parent-buffer parent-buffer)))
+          (posframe--make-frame-invisible frame))))))
+
+(add-hook 'post-command-hook #'posframe-run-hidehandler)
+
+(defun posframe-hidehandler-when-buffer-switch (info)
+  "Posframe hidehandler function.
+
+This function let posframe hide when user switch buffer.
+Note: This function is called in `post-command-hook'."
+  (let ((parent-buffer (cdr (plist-get info :posframe-parent-buffer))))
+    (and (buffer-live-p parent-buffer)
+         (not (equal parent-buffer (current-buffer))))))
+
 (defun posframe-delete (buffer-or-name)
   "Delete posframe pertaining to BUFFER-OR-NAME and kill the buffer.
 BUFFER-OR-NAME can be a buffer or a buffer name."



reply via email to

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