Fix flicker in helm narrowing list and vterm output

ober

abaaf4abbf79240fb33b780600e671d4da601857

diff --git a/src/jerboa-emacs/qt/echo.ss b/src/jerboa-emacs/qt/echo.ss
index 51671b0..53b9808 100644
--- a/src/jerboa-emacs/qt/echo.ss
+++ b/src/jerboa-emacs/qt/echo.ss
@@ -228,12 +228,14 @@
                     (take filtered (* *mb-max-visible* 3))
                     filtered)))
       (set! *mb-filtered* (list->vector shown))
-      ;; Rebuild list widget
+      ;; Rebuild list widget — suppress repaints during bulk update
+      (qt-widget-set-updates-enabled! *mb-list* #f)
       (qt-list-widget-clear! *mb-list*)
       (for-each (lambda (c) (qt-list-widget-add-item! *mb-list* c)) shown)
       ;; Select first item
       (when (> (vector-length *mb-filtered*) 0)
         (qt-list-widget-set-current-row! *mb-list* 0))
+      (qt-widget-set-updates-enabled! *mb-list* #t)
       ;; Update prompt with count
       (let ((total (length *mb-all-candidates*))
             (matched (length filtered)))
diff --git a/src/jerboa-emacs/qt/sci-shim.ss b/src/jerboa-emacs/qt/sci-shim.ss
index dd492dc..0f412b8 100644
--- a/src/jerboa-emacs/qt/sci-shim.ss
+++ b/src/jerboa-emacs/qt/sci-shim.ss
@@ -117,6 +117,7 @@
   qt-widget-height qt-widget-hide! qt-widget-resize! qt-widget-set-focus!
   qt-widget-set-font-size! qt-widget-set-maximum-height! qt-widget-set-minimum-height!
   qt-widget-set-minimum-size! qt-widget-set-size-policy! qt-widget-set-style-sheet!
+  qt-widget-set-updates-enabled!
   qt-widget-show! qt-widget-show-fullscreen! qt-widget-show-maximized!
   qt-widget-show-minimized! qt-widget-show-normal! qt-widget-width qt-widget-window-state
   ;; Qt constants re-exported for modules that only import sci-shim
diff --git a/vendor/chez-qt-ffi-static.ss b/vendor/chez-qt-ffi-static.ss
index a5ccc70..d04dab4 100644
--- a/vendor/chez-qt-ffi-static.ss
+++ b/vendor/chez-qt-ffi-static.ss
@@ -17,6 +17,7 @@
     ffi-qt-widget-create ffi-qt-widget-show ffi-qt-widget-hide
     ffi-qt-widget-close ffi-qt-widget-set-enabled ffi-qt-widget-is-enabled
     ffi-qt-widget-set-visible ffi-qt-widget-is-visible
+    ffi-qt-widget-set-updates-enabled
     ffi-qt-widget-set-fixed-size ffi-qt-widget-set-minimum-size
     ffi-qt-widget-set-maximum-size
     ffi-qt-widget-set-minimum-width ffi-qt-widget-set-minimum-height
@@ -927,6 +928,9 @@
   (define ffi-qt-widget-is-visible
     (foreign-procedure "qt_widget_is_visible" (void*) int))
 
+  (define ffi-qt-widget-set-updates-enabled
+    (foreign-procedure "qt_widget_set_updates_enabled" (void* int) void))
+
   (define ffi-qt-widget-set-fixed-size
     (foreign-procedure "qt_widget_set_fixed_size" (void* int int) void))
 
diff --git a/vendor/chez-qt-qt.ss b/vendor/chez-qt-qt.ss
index e4673d3..86d648b 100644
--- a/vendor/chez-qt-qt.ss
+++ b/vendor/chez-qt-qt.ss
@@ -24,6 +24,7 @@
     qt-widget-create qt-widget-show! qt-widget-hide! qt-widget-close!
     qt-widget-set-enabled! qt-widget-enabled?
     qt-widget-set-visible! qt-widget-visible?
+    qt-widget-set-updates-enabled!
     qt-widget-set-fixed-size! qt-widget-set-minimum-size!
     qt-widget-set-maximum-size!
     qt-widget-set-minimum-width! qt-widget-set-minimum-height!
@@ -898,6 +899,9 @@
   (define (qt-widget-visible? w)
     (not (zero? (ffi-qt-widget-is-visible w))))
 
+  (define (qt-widget-set-updates-enabled! w enabled)
+    (ffi-qt-widget-set-updates-enabled w (if enabled 1 0)))
+
   (define (qt-widget-set-fixed-size! w width height)
     (ffi-qt-widget-set-fixed-size w width height))
   (define (qt-widget-set-minimum-size! w width height)
diff --git a/vendor/qt_shim.cpp b/vendor/qt_shim.cpp
index 6f83704..37a7516 100644
--- a/vendor/qt_shim.cpp
+++ b/vendor/qt_shim.cpp
@@ -565,6 +565,11 @@ extern "C" void qt_widget_set_visible(qt_widget_t w, int visible) {
     QT_VOID(static_cast<QWidget*>(w)->setVisible(visible != 0));
 }
 
+extern "C" void qt_widget_set_updates_enabled(qt_widget_t w, int enabled) {
+    QT_NULL_CHECK_VOID(w);
+    QT_VOID(static_cast<QWidget*>(w)->setUpdatesEnabled(enabled != 0));
+}
+
 extern "C" int qt_widget_is_visible(qt_widget_t w) {
     QT_NULL_CHECK_RET(w, 0);
     QT_RETURN(int, static_cast<QWidget*>(w)->isVisible() ? 1 : 0);
@@ -4709,7 +4714,12 @@ extern "C" qt_plain_text_edit_t qt_plain_text_edit_create(qt_widget_t parent) {
 extern "C" void qt_plain_text_edit_set_text(qt_plain_text_edit_t e,
                                               const char* text) {
     QT_NULL_CHECK_VOID(e);
-    QT_VOID(static_cast<QPlainTextEdit*>(e)->setPlainText(QString::fromUtf8(text)));
+    QT_VOID(
+        auto* pte = static_cast<QPlainTextEdit*>(e);
+        pte->setUpdatesEnabled(false);
+        pte->setPlainText(QString::fromUtf8(text));
+        pte->setUpdatesEnabled(true)
+    );
 }
 
 extern "C" const char* qt_plain_text_edit_text(qt_plain_text_edit_t e) {