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

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

[elpa] externals/corfu 8e6b5fd2ed 1/2: corfu-popupinfo: Fix popup size c


From: ELPA Syncer
Subject: [elpa] externals/corfu 8e6b5fd2ed 1/2: corfu-popupinfo: Fix popup size computation
Date: Sat, 19 Nov 2022 14:57:26 -0500 (EST)

branch: externals/corfu
commit 8e6b5fd2ed06b12eb9218a0ae919be7ba5d7758b
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    corfu-popupinfo: Fix popup size computation
---
 extensions/corfu-popupinfo.el | 74 +++++++++++++++++++++++--------------------
 1 file changed, 40 insertions(+), 34 deletions(-)

diff --git a/extensions/corfu-popupinfo.el b/extensions/corfu-popupinfo.el
index ab97ae3855..c426040d80 100644
--- a/extensions/corfu-popupinfo.el
+++ b/extensions/corfu-popupinfo.el
@@ -46,6 +46,7 @@
 
 (require 'corfu)
 (eval-when-compile
+  (require 'cl-lib)
   (require 'subr-x))
 
 (defface corfu-popupinfo
@@ -74,23 +75,23 @@ popup can be requested manually via 
`corfu-popupinfo-toggle',
 
 (defcustom corfu-popupinfo-hide t
   "Hide the popup during the transition between candidates."
-  :group 'corfu
-  :type 'boolean)
+  :type 'boolean
+  :group 'corfu)
 
-(defcustom corfu-popupinfo-max-width 70
+(defcustom corfu-popupinfo-max-width 80
   "The max width of the info popup in characters."
-  :group 'corfu
-  :type 'integer)
+  :type 'integer
+  :group 'corfu)
 
 (defcustom corfu-popupinfo-max-height 10
   "The max height of the info popup in characters."
-  :group 'corfu
-  :type 'integer)
+  :type 'integer
+  :group 'corfu)
 
 (defcustom corfu-popupinfo-resize t
   "Resize the info popup automatically if non-nil."
-  :group 'corfu
-  :type 'boolean)
+  :type 'boolean
+  :group 'corfu)
 
 (defvar corfu-popupinfo-map
   (let ((map (make-sparse-keymap)))
@@ -103,8 +104,7 @@ popup can be requested manually via 
`corfu-popupinfo-toggle',
   "Additional keymap activated in popupinfo mode.")
 
 (defvar corfu-popupinfo--buffer-parameters
-  '((line-move-visual . t)
-    (truncate-partial-width-windows . nil)
+  '((truncate-partial-width-windows . nil)
     (truncate-lines . nil)
     (left-margin-width . 1)
     (right-margin-width . 1)
@@ -186,24 +186,28 @@ all values are in pixels relative to the origin. See
                                             corfu-popupinfo-max-height)))
                        (funcall fun candidate)))))
     (with-current-buffer (or (car-safe res) res)
-      (setq res (replace-regexp-in-string
-                 "[\\s-\n]*\\[back\\][\\s-\n]*" ""
-                 (buffer-string)))
+      (setq res (string-trim
+                 (replace-regexp-in-string
+                  "[\\s-\n]*\\[back\\][\\s-\n]*" ""
+                  (buffer-string))))
       (and (not (string-blank-p res)) res))))
 
 (defun corfu-popupinfo--size ()
   "Return popup size as pair."
-  (let ((max-width (* (frame-char-width) corfu-popupinfo-max-width))
-        (max-height (* (default-line-height) corfu-popupinfo-max-height)))
-    (if corfu-popupinfo-resize
-        (pcase-let ((`(,width . ,height)
-                     (save-window-excursion
-                       (with-current-buffer " *corfu-popupinfo*"
-                         (set-window-dedicated-p nil nil)
-                         (set-window-buffer nil (current-buffer))
-                         (window-text-pixel-size nil (point-min) (point-max)
-                                                 (* 2 max-width) (* 2 
max-height))))))
-          (cons (min width max-width) (min height max-height)))
+  (let* ((cw (default-font-width))
+         (margin (* cw (+ (alist-get 'left-margin-width 
corfu--buffer-parameters)
+                          (alist-get 'right-margin-width 
corfu--buffer-parameters))))
+         (max-height (* (default-line-height) corfu-popupinfo-max-height))
+         (max-width (+ margin (* cw corfu-popupinfo-max-width))))
+      (if corfu-popupinfo-resize
+          (with-current-buffer " *corfu-popupinfo*"
+            (cl-letf* (((window-dedicated-p) nil)
+                       ((window-buffer) (current-buffer))
+                       (size (window-text-pixel-size
+                              nil (point-min) (point-max)
+                              (* 2 max-width) (* 2 max-height))))
+              (cons (min (+ margin (car size)) max-width)
+                    (min (cdr size) max-height))))
       (cons max-width max-height))))
 
 (defun corfu-popupinfo--frame-geometry (frame)
@@ -287,21 +291,19 @@ The pixel size of the info popup can be specified by 
WIDTH and HEIGHT.
 The calculated area is in the form (X Y WIDTH HEIGHT DIR).
 DIR indicates the position direction of the info popup relative to
 the candidate popup, its value is 'bottom, 'top, 'right or 'left."
+  (unless (and width height)
+    (let ((size (corfu-popupinfo--size)))
+      (setq width (car size)
+            height (cdr size))))
   ;; TODO Direction handling is incomplete. Fix not only horizontal/vertical,
   ;; but left/right/bottom/top.
   (cond
    ((memq dir '(right left))
-    (let ((size (corfu-popupinfo--size)))
-      (corfu-popupinfo--display-area-horizontal (car size) (cdr size))))
+    (corfu-popupinfo--display-area-horizontal width height))
    ((memq dir '(bottom top))
-    (let ((size (corfu-popupinfo--size)))
-      (corfu-popupinfo--display-area-vertical (car size) (cdr size))))
+    (corfu-popupinfo--display-area-vertical width height))
    (t
-    (pcase-let* ((`(,width . ,height)
-                  (if (and width height)
-                      (cons width height)
-                    (corfu-popupinfo--size)))
-                 ((and h-a `(,_h-x ,_h-y ,h-w ,h-h ,_h-d))
+    (pcase-let* (((and h-a `(,_h-x ,_h-y ,h-w ,h-h ,_h-d))
                   (corfu-popupinfo--display-area-horizontal width height))
                  ((and v-a `(,_v-x ,_v-y ,v-w ,v-h ,_v-d))
                   (corfu-popupinfo--display-area-vertical width height)))
@@ -324,6 +326,10 @@ the candidate popup, its value is 'bottom, 'top, 'right or 
'left."
       (when doc-changed
         (if-let (doc (funcall corfu-popupinfo--function candidate))
             (with-current-buffer (corfu--make-buffer " *corfu-popupinfo*" doc)
+              ;; TODO Could we somehow refill the buffer intelligently?
+              ;;(let ((inhibit-read-only t))
+              ;;  (setq fill-column corfu-popupinfo-max-width)
+              ;;  (fill-region (point-min) (point-max)))
               (dolist (var corfu-popupinfo--buffer-parameters)
                 (set (make-local-variable (car var)) (cdr var)))
               (setf face-remapping-alist (copy-tree face-remapping-alist)



reply via email to

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