From bedd0fa5bec33a853b4f9ef140f463a586eee5bc Mon Sep 17 00:00:00 2001 From: Daniel Mendler Date: Wed, 10 Jul 2024 10:43:34 +0200 Subject: corfu-popupinfo: Compare candidates with equal-including-properties (Fix #476) --- corfu.el | 18 +++++++++++------- extensions/corfu-popupinfo.el | 3 ++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/corfu.el b/corfu.el index edb1a7a..660704d 100644 --- a/corfu.el +++ b/corfu.el @@ -590,6 +590,16 @@ FRAME is the existing frame." (eq t (compare-strings word 0 len it 0 len completion-ignore-case)))))) +(defalias 'corfu--equal-including-properties + ;; bug#6581: `equal-including-properties' uses `eq' to compare + ;; properties until 29.1. Approximate by comparing + ;; `text-properties-at' position 0. + (static-if (< emacs-major-version 29) + (lambda (x y) + (and (equal x y) + (equal (text-properties-at 0 x) (text-properties-at 0 y)))) + #'equal-including-properties)) + (defun corfu--delete-dups (list) "Delete `equal-including-properties' consecutive duplicates from LIST." (let ((beg list)) @@ -602,13 +612,7 @@ FRAME is the existing frame." (while (not (eq beg end)) (let ((dup beg)) (while (not (eq (cdr dup) end)) - ;; bug#6581: `equal-including-properties' uses `eq' to compare - ;; properties until 29.1. Approximate by comparing - ;; `text-properties-at' position 0. - (if (static-if (< emacs-major-version 29) - (equal (text-properties-at 0 (car beg)) - (text-properties-at 0 (cadr dup))) - (equal-including-properties (car beg) (cadr dup))) + (if (corfu--equal-including-properties (car beg) (cadr dup)) (setcdr dup (cddr dup)) (pop dup)))) (pop beg))))) diff --git a/extensions/corfu-popupinfo.el b/extensions/corfu-popupinfo.el index 3a09911..2d33672 100644 --- a/extensions/corfu-popupinfo.el +++ b/extensions/corfu-popupinfo.el @@ -345,7 +345,8 @@ form (X Y WIDTH HEIGHT DIR)." (when (and (corfu-popupinfo--visible-p corfu--frame)) (let* ((cand-changed (not (and (corfu-popupinfo--visible-p) - (equal candidate corfu-popupinfo--candidate)))) + (corfu--equal-including-properties + candidate corfu-popupinfo--candidate)))) (new-coords (frame-edges corfu--frame 'inner-edges)) (coords-changed (not (equal new-coords corfu-popupinfo--coordinates)))) (when cand-changed -- cgit v1.0