From kde-commits Thu Sep 13 09:19:18 2018 From: David Edmundson Date: Thu, 13 Sep 2018 09:19:18 +0000 To: kde-commits Subject: [kwin] scripting: Avoid crash with on scripted window teardown with threaded quick render loop Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=153683037119901 Git commit d485dfe7ef1910a7f6652610388ae2d93cdec29f by David Edmundson. Committed on 13/09/2018 at 09:19. Pushed by davidedmundson into branch 'master'. Avoid crash with on scripted window teardown with threaded quick render loop Summary: Qt render loops behave quite differently to each other. KWin scripting as a workaround for another situation cleans (17553e5a1fb72a92dbbff3fa6bc7d55b8f1a0123) handles tracking of script windows by deleting the underlying window handle on hide. This currently happens before the window gets the hideEvent. Arguably this is a quirk with Qt, but in the current state: - QSGThreadedRenderLoop deletes the platform window and cleans up - We then get the hide() event. This no-ops because there's no window. (else branch of case WM_TryRelease in qsgthreadedrenderloop.cpp) - We carry on rendering animations despite having no platform - undefined behaviour Normally this isn't a problem as typically destruction of the platform wind= ow happens only when a window is being deleted, we're messing with Qt internals here. If we make sure the QHideEvent is processed by the render loop first, things seem fine. BUG: 397767 Test Plan: Ran QSG_RENDER_LOOP=3Dthreaded Read output with scenegraph logging rules on Reviewers: #kwin, broulik Reviewed By: broulik Subscribers: kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D15025 M +2 -2 scripting/scripting.cpp https://commits.kde.org/kwin/d485dfe7ef1910a7f6652610388ae2d93cdec29f diff --git a/scripting/scripting.cpp b/scripting/scripting.cpp index 4522ac81a..b1c6a98c2 100644 --- a/scripting/scripting.cpp +++ b/scripting/scripting.cpp @@ -628,11 +628,11 @@ QVariant KWin::JSEngineGlobalMethodsWrapper::readConf= ig(const QString &key, QVar = void KWin::JSEngineGlobalMethodsWrapper::registerWindow(QQuickWindow *wind= ow) { - connect(window, &QWindow::visibilityChanged, [window](QWindow::Visibil= ity visibility) { + connect(window, &QWindow::visibilityChanged, this, [window](QWindow::V= isibility visibility) { if (visibility =3D=3D QWindow::Hidden) { window->destroy(); } - }); + }, Qt::QueuedConnection); } = bool KWin::JSEngineGlobalMethodsWrapper::registerShortcut(const QString &n= ame, const QString &text, const QKeySequence& keys, QJSValue function)