Bug 357032 - KWin crashes after RubyMine sync window close
Summary: KWin crashes after RubyMine sync window close
Status: RESOLVED FIXED
Alias: None
Product: kwin
Classification: Plasma
Component: general (show other bugs)
Version: unspecified
Platform: openSUSE Linux
: NOR crash
Target Milestone: ---
Assignee: KWin default assignee
URL: https://git.reviewboard.kde.org/r/126...
Keywords: drkonqi
: 358004 (view as bug list)
Depends on:
Blocks:
 
Reported: 2015-12-22 10:50 UTC by Mykola Krachkovsky
Modified: 2016-01-18 21:37 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed In: 5.6
Sentry Crash Report:
thomas.luebking: ReviewRequest+


Attachments
KWin support info (6.46 KB, text/plain)
2015-12-26 21:04 UTC, Mykola Krachkovsky
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Mykola Krachkovsky 2015-12-22 10:50:17 UTC
Application: kwin_x11 (5.5.90)

Qt Version: 5.5.1
Operating System: Linux 4.1.13-5-default x86_64
Distribution: "openSUSE Leap 42.1 (x86_64)"

-- Information about the crash:
- What I was doing when the application crashed:
1. Open RubyMine synchronization window
2. Close it.
3. KWin crashes.

Haven't noticed if other apps' window closing has same effect.

The crash can be reproduced every time.

-- Backtrace:
Application: KWin (kwin_x11), signal: Segmentation fault
Using host libthread_db library "/lib64/libthread_db.so.1".
[Current thread is 1 (Thread 0x7f38211fa840 (LWP 6749))]

Thread 4 (Thread 0x7f37fe997700 (LWP 6762)):
#0  0x00007ffefe1eeb26 in clock_gettime ()
#1  0x00007f3820b90c9d in clock_gettime () at /lib64/libc.so.6
#2  0x00007f381e82f846 in  () at /usr/lib64/libQt5Core.so.5
#3  0x00007f381e9af3d9 in QTimerInfoList::updateCurrentTime() () at /usr/lib64/libQt5Core.so.5
#4  0x00007f381e9af965 in QTimerInfoList::timerWait(timespec&) () at /usr/lib64/libQt5Core.so.5
#5  0x00007f381e9aefc2 in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#6  0x00007f381e957da3 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#7  0x00007f381e77966a in QThread::exec() () at /usr/lib64/libQt5Core.so.5
#8  0x00007f3818c74e08 in  () at /usr/lib64/libQt5Qml.so.5
#9  0x00007f381e77e38f in  () at /usr/lib64/libQt5Core.so.5
#10 0x00007f38201b00a4 in start_thread () at /lib64/libpthread.so.0
#11 0x00007f3820b8404d in clone () at /lib64/libc.so.6

Thread 3 (Thread 0x7f37effff700 (LWP 6764)):
#0  0x00007f38201b405f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007f381d70386b in  () at /usr/lib64/libQt5Script.so.5
#2  0x00007f381d703899 in  () at /usr/lib64/libQt5Script.so.5
#3  0x00007f38201b00a4 in start_thread () at /lib64/libpthread.so.0
#4  0x00007f3820b8404d in clone () at /lib64/libc.so.6

Thread 2 (Thread 0x7f37ff5ef700 (LWP 6941)):
#0  0x00007f38201b405f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007f381e77f3ab in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007f38193664bb in  () at /usr/lib64/libQt5Quick.so.5
#3  0x00007f3819366953 in  () at /usr/lib64/libQt5Quick.so.5
#4  0x00007f381e77e38f in  () at /usr/lib64/libQt5Core.so.5
#5  0x00007f38201b00a4 in start_thread () at /lib64/libpthread.so.0
#6  0x00007f3820b8404d in clone () at /lib64/libc.so.6

Thread 1 (Thread 0x7f38211fa840 (LWP 6749)):
[KCrash Handler]
#6  0x00007f382074409d in  () at /usr/lib64/libkwin.so.5
#7  0x00007f3820742aee in  () at /usr/lib64/libkwin.so.5
#8  0x00007f3820752d93 in  () at /usr/lib64/libkwin.so.5
#9  0x00007f3820740155 in  () at /usr/lib64/libkwin.so.5
#10 0x00007f3820767140 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwin.so.5
#11 0x00007f381df1129f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwineffects.so.7
#12 0x00007f3820767100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwin.so.5
#13 0x00007f381df1129f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwineffects.so.7
#14 0x00007f3820767100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwin.so.5
#15 0x00007f381df1129f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwineffects.so.7
#16 0x00007f3820767100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwin.so.5
#17 0x00007f381df1129f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwineffects.so.7
#18 0x00007f3820767100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) () at /usr/lib64/libkwin.so.5
#19 0x00007f382073fdea in  () at /usr/lib64/libkwin.so.5
#20 0x00007f3820758147 in  () at /usr/lib64/libkwin.so.5
#21 0x00007f38207383f8 in KWin::Compositor::performCompositing() () at /usr/lib64/libkwin.so.5
#22 0x00007f381e98a8ec in QObject::event(QEvent*) () at /usr/lib64/libQt5Core.so.5
#23 0x00007f381f63ee7c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib64/libQt5Widgets.so.5
#24 0x00007f381f643cc8 in QApplication::notify(QObject*, QEvent*) () at /usr/lib64/libQt5Widgets.so.5
#25 0x00007f381e959ee5 in QCoreApplication::notifyInternal(QObject*, QEvent*) () at /usr/lib64/libQt5Core.so.5
#26 0x00007f381e9b079d in QTimerInfoList::activateTimers() () at /usr/lib64/libQt5Core.so.5
#27 0x00007f381e9aefe8 in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#28 0x00007f380705533d in  () at /usr/lib64/libQt5XcbQpa.so.5
#29 0x00007f381e957da3 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#30 0x00007f381e95f956 in QCoreApplication::exec() () at /usr/lib64/libQt5Core.so.5
#31 0x00007f3820e4ba23 in kdemain () at /usr/lib64/libkdeinit5_kwin_x11.so
#32 0x00007f3820ac0b05 in __libc_start_main () at /lib64/libc.so.6
#33 0x00000000004008ae in _start ()

Reported using DrKonqi
Comment 1 Thomas Lübking 2015-12-22 16:01:14 UTC
Lacks relevant debug symbols, can you please install the kwin-debuginfo package, and re-cause the crash? Then post the enriched backtrace.
Comment 2 Mykola Krachkovsky 2015-12-22 17:39:57 UTC
Only fullscreen sync window closing leads to crash. Backtrace from gdb (DrKonqi is hidden for some reason):

Thread 6 (Thread 0x7fffdd0af700 (LWP 5924)):
#0  0x00007ffff7908c1d in poll () at /lib64/libc.so.6
#1  0x00007ffff524b422 in  () at /usr/lib64/libxcb.so.1
#2  0x00007ffff524d00f in xcb_wait_for_event () at /usr/lib64/libxcb.so.1
#3  0x00007fffddd823c9 in  () at /usr/lib64/libQt5XcbQpa.so.5
#4  0x00007ffff550b38f in  () at /usr/lib64/libQt5Core.so.5
#5  0x00007ffff6f3d0a4 in start_thread () at /lib64/libpthread.so.0
#6  0x00007ffff791104d in clone () at /lib64/libc.so.6

Thread 5 (Thread 0x7fffd6551700 (LWP 5925)):
#0  0x00007ffff6f41408 in pthread_cond_timedwait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007ffff550c2f8 in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007ffff5508536 in  () at /usr/lib64/libQt5Core.so.5
#3  0x00007ffff550b38f in  () at /usr/lib64/libQt5Core.so.5
#4  0x00007ffff6f3d0a4 in start_thread () at /lib64/libpthread.so.0
#5  0x00007ffff791104d in clone () at /lib64/libc.so.6

Thread 4 (Thread 0x7fffd57e9700 (LWP 5926)):
#0  0x00007ffff790a2b3 in select () at /lib64/libc.so.6
#1  0x00007ffff573a199 in qt_safe_select(int, fd_set*, fd_set*, fd_set*, timespec const*) () at /usr/lib64/libQt5Core.so.5
#2  0x00007ffff573bb15 in QEventDispatcherUNIXPrivate::doSelect(QFlags<QEventLoop::ProcessEventsFlag>, timespec*) () at /usr/lib64/libQt5Core.so.5
#3  0x00007ffff573bf5b in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#4  0x00007ffff56e4da3 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#5  0x00007ffff550666a in QThread::exec() () at /usr/lib64/libQt5Core.so.5
#6  0x00007fffefa01e08 in  () at /usr/lib64/libQt5Qml.so.5
#7  0x00007ffff550b38f in  () at /usr/lib64/libQt5Core.so.5
#8  0x00007ffff6f3d0a4 in start_thread () at /lib64/libpthread.so.0
#9  0x00007ffff791104d in clone () at /lib64/libc.so.6

Thread 3 (Thread 0x7fffcffff700 (LWP 5927)):
#0  0x00007ffff6f41408 in pthread_cond_timedwait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007ffff550c2f8 in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007ffff5508536 in  () at /usr/lib64/libQt5Core.so.5
#3  0x00007ffff550b38f in  () at /usr/lib64/libQt5Core.so.5
#4  0x00007ffff6f3d0a4 in start_thread () at /lib64/libpthread.so.0
#5  0x00007ffff791104d in clone () at /lib64/libc.so.6

Thread 2 (Thread 0x7fffcec13700 (LWP 5928)):
#0  0x00007ffff6f4105f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007ffff449086b in  () at /usr/lib64/libQt5Script.so.5
#2  0x00007ffff4490899 in  () at /usr/lib64/libQt5Script.so.5
#3  0x00007ffff6f3d0a4 in start_thread () at /lib64/libpthread.so.0
#4  0x00007ffff791104d in clone () at /lib64/libc.so.6

Thread 1 (Thread 0x7ffff7f83840 (LWP 5918)):
#0  0x00007ffff74d109d in KWin::Scene::Window::buildQuads(bool) const (this=0x11c9ab0, force=<optimized out>)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene.cpp:830
#1  0x00007ffff74cfaee in KWin::Scene::paintSimpleScreen(int, QRegion) (this=this@entry=0x910d80, orig_mask=orig_mask@entry=0, region=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene.cpp:302
#2  0x00007ffff74dfd93 in KWin::SceneOpenGL2::paintSimpleScreen(int, QRegion) (this=this@entry=0x910d80, mask=mask@entry=0, region=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene_opengl.cpp:1100
#3  0x00007ffff74cd155 in KWin::Scene::finalPaintScreen(int, QRegion, KWin::ScreenPaintData&) (this=0x910d80, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene.cpp:200
#4  0x00007ffff74f4140 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=0x80ad20, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/effects.cpp:422
#5  0x00007ffff4c9e29f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=this@entry=0x826b60, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/libkwineffects/kwineffects.cpp:537
#6  0x00007ffff74f4100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=0x80ad20, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/effects.cpp:419
#7  0x00007ffff4c9e29f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=this@entry=0x8458a0, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/libkwineffects/kwineffects.cpp:537
#8  0x00007ffff74f4100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=0x80ad20, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/effects.cpp:419
#9  0x00007ffff4c9e29f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=this@entry=0x8064e0, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/libkwineffects/kwineffects.cpp:537
#10 0x00007ffff74f4100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=0x80ad20, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/effects.cpp:419
#11 0x00007ffff4c9e29f in KWin::Effect::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=this@entry=0x1187e80, mask=mask@entry=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/libkwineffects/kwineffects.cpp:537
#12 0x00007ffff74f4100 in KWin::EffectsHandlerImpl::paintScreen(int, QRegion, KWin::ScreenPaintData&) (this=0x80ad20, mask=0, region=..., data=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/effects.cpp:419
#13 0x00007ffff74ccdea in KWin::Scene::paintScreen(int*, QRegion const&, QRegion const&, QRegion*, QRegion*) (this=this@entry=0x910d80, mask=mask@entry=0x7fffffffd440, damage=..., repaint=..., updateRegion=updateRegion@entry=0x7fffffffd410, validRegion=validRegion@entry=0x7fffffffd420)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene.cpp:150
#14 0x00007ffff74e5147 in KWin::SceneOpenGL::paint(QRegion, QList<KWin::Toplevel*>) (this=0x910d80, damage=..., toplevels=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene_opengl.cpp:749
#15 0x00007ffff74c53f8 in KWin::Compositor::performCompositing() (this=0x794280) at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/composite.cpp:726
#16 0x00007ffff57178ec in QObject::event(QEvent*) () at /usr/lib64/libQt5Core.so.5
#17 0x00007ffff63cbe7c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib64/libQt5Widgets.so.5
#18 0x00007ffff63d0cc8 in QApplication::notify(QObject*, QEvent*) () at /usr/lib64/libQt5Widgets.so.5
#19 0x00007ffff56e6ee5 in QCoreApplication::notifyInternal(QObject*, QEvent*) () at /usr/lib64/libQt5Core.so.5
#20 0x00007ffff573d79d in QTimerInfoList::activateTimers() () at /usr/lib64/libQt5Core.so.5
#21 0x00007ffff573bfe8 in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#22 0x00007fffddde233d in  () at /usr/lib64/libQt5XcbQpa.so.5
#23 0x00007ffff56e4da3 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#24 0x00007ffff56ec956 in QCoreApplication::exec() () at /usr/lib64/libQt5Core.so.5
#25 0x00007ffff7bd8a23 in kdemain(int, char**) (argc=2, argv=0x7fffffffdcc8) at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/main_x11.cpp:315
#26 0x00007ffff784db05 in __libc_start_main () at /lib64/libc.so.6
#27 0x00000000004008ae in _start () at ../sysdeps/x86_64/start.S:122
Comment 3 Thomas Lübking 2015-12-22 21:21:52 UTC
Bad line is here:
/usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene.cpp:302

The stacking_order will contain a dangeling entry what implies it gets deleted during the paint phase - what should not happen.

Can you please
a) attach the output of "qdbus org.kde.KWin /KWin supportInformation"
b) apply this patch
diff --git a/scene.cpp b/scene.cpp
index a25dc8d..cebcbe9 100644
--- a/scene.cpp
+++ b/scene.cpp
@@ -421,6 +421,7 @@ void Scene::windowClosed(Toplevel *c, Deleted *deleted)
         }
         m_windows[ deleted ] = w;
     } else {
+        assert(stacking_order.isEmpty());
         delete m_windows.take(c);
         c->effectWindow()->setSceneWindow(NULL);
     }
@@ -428,6 +429,7 @@ void Scene::windowClosed(Toplevel *c, Deleted *deleted)
 
 void Scene::windowDeleted(Deleted *c)
 {
+    assert(stacking_order.isEmpty());
     assert(m_windows.contains(c));
     delete m_windows.take(c);
     c->effectWindow()->setSceneWindow(NULL);

and see whether you hit the assert (and on what backtrace)

The hanging instance is likely stopped by drkonqi, see bug #353428 - there's a *possible* patch to this in comment #33
Comment 4 Mykola Krachkovsky 2015-12-26 21:04:20 UTC
Created attachment 96303 [details]
KWin support info

There is KWin support information. It looks like KWin doesn't met asserts, just line number changed on 2:
Thread 1 (Thread 0x7ffff7f83840 (LWP 8891)):
#0  0x00007ffff74d109d in KWin::Scene::Window::buildQuads(bool) const (this=0x6e4140, force=<optimized out>)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene.cpp:832
#1  0x00007ffff74cfaee in KWin::Scene::paintSimpleScreen(int, QRegion) (this=this@entry=0x856520, orig_mask=orig_mask@entry=0, region=...)
    at /usr/src/debug/kwin-5.5.90git~20151218T172621~ecce036/scene.cpp:302

Should I add full stack trace?
Comment 5 Thomas Lübking 2015-12-26 21:22:04 UTC
Updated backtrace won't be necessary.

Do you get the crashes when disabling unredirection of fullscreen windows? ("kcmshell5 kwincompositing", "suspend compositing for fullscreen windows")
Comment 6 Mykola Krachkovsky 2015-12-26 21:51:40 UTC
Tried to switch it off, still crashes. Btw, windows aren't fullscreen, just maximized. Noticed, not only RubyMine is affected, NetBeans too. And I've got crash only when window was initially maximized (coincedense?) and window is closing immediatly, if app doing something and close after a while, kwin won't crash (also not sure, but it looks like that). Not java (swing?) windows aren't affected (at least all crashes I had was with RubyMine and NetBeans).
Comment 7 Thomas Lübking 2015-12-26 22:25:20 UTC
=> Tried to disable the maximize effect?

(I wasn't even aware about the maximization relation, just thought the unredirection might have caused a dangeling EffectWindow pointer there somewhen, hitting on later occasions)
Comment 8 Mykola Krachkovsky 2015-12-26 23:07:09 UTC
Disabled maximize effect — still crashes. Same for fade, blur, contrast, wobbly windows.
Comment 9 Mykola Krachkovsky 2015-12-31 11:47:53 UTC
I was wrong, not only java apps are affected, fullscreen games too (with or w/o disabling compositing on full screen apps).
Comment 10 Thomas Lübking 2016-01-15 17:47:25 UTC
*** Bug 358004 has been marked as a duplicate of this bug. ***
Comment 11 Thomas Lübking 2016-01-17 21:15:39 UTC
Sorry for the delay.

Does this fix it?

diff --git a/scene.cpp b/scene.cpp
index e673853..ad5ca6d 100644
--- a/scene.cpp
+++ b/scene.cpp
@@ -825,9 +825,8 @@ WindowQuadList Scene::Window::buildQuads(bool force) const
         AbstractClient *client = dynamic_cast<AbstractClient*>(toplevel);
         QRegion contents = clientShape();
         QRegion center = toplevel->transparentRect();
-        QRegion decoration = (client && true ?
-                              QRegion(client->decorationRect()) : shape()) - center;
-        ret = makeQuads(WindowQuadContents, contents, client->clientContentPos());
+        QRegion decoration = (client ? QRegion(client->decorationRect()) : shape()) - center;
+        ret = makeQuads(WindowQuadContents, contents, toplevel->clientContentPos());
 
         QRect rects[4];
         bool isShadedClient = false;
Comment 12 Mykola Krachkovsky 2016-01-18 12:53:18 UTC
Looks like this patch solves problem. I will check later other cases to be sure.
Comment 13 Mykola Krachkovsky 2016-01-18 20:51:54 UTC
All cases I met crashes now work properly. Thanks!
Comment 14 Thomas Lübking 2016-01-18 21:37:33 UTC
Git commit 95cbd7c1b3cdbe81fdee1682049bd08ab7fe99fb by Thomas Lübking.
Committed on 18/01/2016 at 21:34.
Pushed by luebking into branch 'master'.

prevent nullptr dereferentiation
FIXED-IN: 5.6
REVIEW: 126787

M  +2    -3    scene.cpp

http://commits.kde.org/kwin/95cbd7c1b3cdbe81fdee1682049bd08ab7fe99fb