From 44e37aacdf63056fc463de0eadabd949b5be75d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Fri, 5 Aug 2016 09:41:56 +0200 Subject: [PATCH] Set initial count of screens before calling Screens::init Screens::init sets up a Qt::QueuedConnection connect from countChanged to changed. This means that when first setting up the connection a changed signal will be delivered in the next event cycle. This can mess with other code. E.g. WaylandServer recreating outputs which can make Xwayland crash or KWin internally crash. To solve this problem we just need to make sure to set the output count to the initial value before performing the init. Reviewed-By: bshah --- plugins/platforms/drm/screens_drm.cpp | 2 +- plugins/platforms/virtual/screens_virtual.cpp | 2 +- screens.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/platforms/drm/screens_drm.cpp b/plugins/platforms/drm/screens_drm.cpp index 5ab27cdb45..8714bf0b1e 100644 --- a/plugins/platforms/drm/screens_drm.cpp +++ b/plugins/platforms/drm/screens_drm.cpp @@ -36,8 +36,8 @@ DrmScreens::~DrmScreens() = default; void DrmScreens::init() { - KWin::Screens::init(); updateCount(); + KWin::Screens::init(); emit changed(); } diff --git a/plugins/platforms/virtual/screens_virtual.cpp b/plugins/platforms/virtual/screens_virtual.cpp index 531c9c4e90..7cd2fdfb9a 100644 --- a/plugins/platforms/virtual/screens_virtual.cpp +++ b/plugins/platforms/virtual/screens_virtual.cpp @@ -33,6 +33,7 @@ VirtualScreens::~VirtualScreens() = default; void VirtualScreens::init() { + updateCount(); KWin::Screens::init(); connect(m_backend, &VirtualBackend::sizeChanged, this, &VirtualScreens::startChangedTimer); @@ -47,7 +48,6 @@ void VirtualScreens::init() } } ); - updateCount(); emit changed(); } diff --git a/screens.cpp b/screens.cpp index 3ffb22d6ee..a08245ee02 100644 --- a/screens.cpp +++ b/screens.cpp @@ -188,12 +188,12 @@ BasicScreens::~BasicScreens() = default; void BasicScreens::init() { + updateCount(); KWin::Screens::init(); #ifndef KWIN_UNIT_TEST connect(m_backend, &Platform::screenSizeChanged, this, &BasicScreens::startChangedTimer); #endif - updateCount(); emit changed(); }