Fix flicker in helm narrowing list and vterm output
ober
abaaf4abbf79240fb33b780600e671d4da601857
--- 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))) --- 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 --- 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)) --- 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) --- 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) {