branch: externals/corfu
commit 76f36e0d201cc14cc552cc1d4d8ea68186d9ec75
Author: Daniel Mendler <m...@daniel-mendler.de>
Commit: Daniel Mendler <m...@daniel-mendler.de>

    Emacs 29 flicker reduction
---
 corfu.el | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/corfu.el b/corfu.el
index 5c20ec94e5..76f061d9ed 100644
--- a/corfu.el
+++ b/corfu.el
@@ -375,6 +375,7 @@ FRAME is the existing frame."
     (set-frame-parameter frame 'corfu--hide-timer nil))
   (let* ((window-min-height 1)
          (window-min-width 1)
+         (inhibit-redisplay t)
          (x-gtk-resize-child-frames
           (let ((case-fold-search t))
             (and
@@ -417,19 +418,28 @@ FRAME is the existing frame."
       (set-window-parameter win 'no-other-window t)
       ;; Mark window as dedicated to prevent frame reuse (#60)
       (set-window-dedicated-p win t))
-    (set-frame-size frame width height t)
-    (if (frame-visible-p frame)
-        ;; XXX HACK Avoid flicker when frame is already visible.
-        ;; Redisplay, wait for resize and then move the frame.
-        (unless (equal (frame-position frame) (cons x y))
-          (redisplay 'force)
-          (sleep-for 0.01)
-          (set-frame-position frame x y))
-      ;; XXX HACK: Force redisplay, otherwise the popup sometimes does not
-      ;; display content.
-      (set-frame-position frame x y)
-      (redisplay 'force)
-      (make-frame-visible frame))
+    ;; XXX HACK: Child frame popup behavior improved on Emacs 29.
+    ;; It seems we may not need the Emacs 27/28 hacks anymore.
+    (if (eval-when-compile (< emacs-major-version 29))
+        (let (inhibit-redisplay)
+          (set-frame-size frame width height t)
+          (if (frame-visible-p frame)
+              ;; XXX HACK Avoid flicker when frame is already visible.
+              ;; Redisplay, wait for resize and then move the frame.
+              (unless (equal (frame-position frame) (cons x y))
+                (redisplay 'force)
+                (sleep-for 0.01)
+                (set-frame-position frame x y))
+            ;; XXX HACK: Force redisplay, otherwise the popup sometimes does 
not
+            ;; display content.
+            (set-frame-position frame x y)
+            (redisplay 'force)
+            (make-frame-visible frame)))
+      (set-frame-size frame width height t)
+      (unless (equal (frame-position frame) (cons x y))
+        (set-frame-position frame x y))
+      (unless (frame-visible-p frame)
+        (make-frame-visible frame)))
     (redirect-frame-focus frame parent)
     frame))
 

Reply via email to