• David Edmundson's avatar
    Avoid crash with on scripted window teardown with threaded quick render loop · d485dfe7
    David Edmundson authored
    Summary:
    Qt render loops behave quite differently to each other.
    
    KWin scripting as a workaround for another situation cleans
    (17553e5a) 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 window
    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=threaded
    Read output with scenegraph logging rules on
    
    Reviewers: #kwin, broulik
    
    Reviewed By: broulik
    
    Subscribers: kwin
    
    Tags: #kwin
    
    Differential Revision: https://phabricator.kde.org/D15025
    d485dfe7
scripting.cpp 31.5 KB