https://bugs.kde.org/show_bug.cgi?id=427672
--- Comment #13 from David Edmundson <[email protected]> --- Git commit 320676ded0d47b52d8d910f1371f908fb6d67083 by David Edmundson, on behalf of Eduardo Cruz. Committed on 13/01/2022 at 11:53. Pushed by davidedmundson into branch 'master'. PlasmaQuick::Dialog - Fix flickering issues when resizing (specially in krunner) The goal is to fix the flickering issue with KRunner as reported in [BUG 427672](https://bugs.kde.org/show_bug.cgi?id=427672). The bug report deals with 2 issues: the quick reordering of the results list (that will be fixed by plasma/milou!37) and the quick rendering/flashing of frames with components in wrong positions. This MR deals with the latter. In PlasmaQuick::Dialog we have the slots `updateMinimumWidth`, `updateMinimumHeight`, `updateMaximumWidth`, `updateMaximumHeight` connected to their corresponding signals on the underlying layout object. Theses slots used to start a 0ms instantly-expired timer to condensate all four operations into one single execution of the method `updateLayoutParameters()`. It was seemingly done in an attempt to avoid flickering. However, it was apparently causing it instead of preventing it. We had no guarantee that the timer's action will be the next event executed in the GUI thread event loop. By returning control of the GUI thread to the event loop, we are vulnerable to the event loop deciding that a frame update is more important than the expired timer's action, and that's what was happening: a frame was being rendered before that timer's action was executed, and the frame was rendered with incorrect layout parameters, causing KRunner to be displayed in crazy ways for a few milliseconds. This code is old, 7 years ago. Maybe this timer mechanism was actually useful back then: there was a bug inside QT that caused flickering as reported in [this QT bug report](https://bugreports.qt.io/browse/QTBUG-46074), but is is now already solved since QT 5.12.5. I have deleted that timer and now I call `updateLayoutParameters()` instantly for each of the four slots. It is true that this method is now running 4 times, however that doesn't seem to be any problem at all. They run in the GUI thread, in the same pass of the event loop, so at the end of the loop's current pass we will reach our goal of having all layout parameters up-to-date before it gets a chance to decide to render the next frame. This reference helped me to understand more of the frame rendering cycle: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded With this patch applied, the flickering situation in KRunner is MUCH better, but not completely fixed. Some kinds of flicker seem to be gone at all: for example we will never see the search textbox being rendered out of place, nor the quick repositioning of the results lists. But we sometimes still see some result being rendered in the location of the textbox when we press backspace successively. I'd say the problem is now 90% fixed, there must be other causes of flicker lurking across the stack but it doesn't seem to be in PlasmaQuick::Dialog. M +11 -21 src/plasmaquick/dialog.cpp https://invent.kde.org/frameworks/plasma-framework/commit/320676ded0d47b52d8d910f1371f908fb6d67083 -- You are receiving this mail because: You are watching all bug changes.
